rfid via usb (#21)

* added second possible cardReader for windows

* refactored

* fixed checkstyle

* fixed wrong port selection
This commit is contained in:
Valentin Heiserer
2024-02-27 17:47:04 +01:00
committed by GitHub
parent 1376fe645a
commit d4deabfde9
6 changed files with 124 additions and 12 deletions

View File

@@ -72,6 +72,12 @@
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.6.0</version> <!-- Check for the latest version on the official repository -->
</dependency>
<dependency>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>

View File

@@ -16,13 +16,16 @@ import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlets.CrossOriginFilter;
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
import org.schafkopf.cardreader.CardReader;
import org.schafkopf.cardreader.GpioReader;
import org.schafkopf.cardreader.UsbCardReader;
/** Main Class that represents the Backend Server. */
public class BackendServer {
private final Server server;
private final ServerConnector connector;
private final Schafkopf schafkopfGame;
private final KartenLeser nfcLeser;
private final CardReader nfcLeser;
private final List<FrontendEndpoint> frontendEndpoints = new ArrayList<>();
private CountDownLatch nfcLatch = new CountDownLatch(1);
private Boolean readingMode = false;
@@ -39,7 +42,20 @@ public class BackendServer {
server.addConnector(connector);
schafkopfGame = new Schafkopf(this);
nfcLeser = new KartenLeser(this);
// nfcLeser = new RaspberryKartenLeser(this);
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("win")) {
// Windows
nfcLeser = new UsbCardReader(this);
} else if (osName.contains("nix") || osName.contains("nux") || osName.contains("mac")) {
// Unix/Linux/Mac
// You can add additional checks for specific Linux distributions or macOS versions if needed
// For now, assuming Raspberry Pi is running Linux
nfcLeser = new GpioReader(this);
} else {
// Other OS
throw new RuntimeException("Unsupported OS: " + osName);
}
// Setup the basic application "context" for this application at "/"
// This is also known as the handler tree (in jetty speak)

View File

@@ -0,0 +1,13 @@
package org.schafkopf.cardreader;
import org.schafkopf.BackendServer;
/** Class that represents one Card Reader. */
public abstract class CardReader {
protected static BackendServer server;
public CardReader(BackendServer server) {
this.server = server;
}
}

View File

@@ -1,4 +1,4 @@
package org.schafkopf;
package org.schafkopf.cardreader;
import com.pi4j.io.i2c.I2C;
import java.io.IOException;
@@ -6,21 +6,18 @@ import mk.hsilomedus.pn532.Pn532ContextHelper;
import mk.hsilomedus.pn532.Pn532I2c;
import mk.hsilomedus.pn532.Pn532SamThread;
import mk.hsilomedus.pn532.Pn532SamThread.Pn532SamThreadListener;
import org.schafkopf.BackendServer;
/**
* Class that represents the NFC Reader.
*/
public final class KartenLeser {
private static BackendServer server;
/** Class that represents the NFC Reader. */
public final class GpioReader extends CardReader {
/**
* Creates an Instance of the KartenLeser.
*
* @param server Backend Server to call methods on.
*/
public KartenLeser(BackendServer server) {
this.server = server;
public GpioReader(BackendServer server) {
super(server);
new Thread(
() -> {

View File

@@ -0,0 +1,80 @@
package org.schafkopf.cardreader;
import com.fazecast.jSerialComm.SerialPort;
import java.io.UnsupportedEncodingException;
import org.schafkopf.BackendServer;
/** Class that represents the NFC Reader. */
public class UsbCardReader extends CardReader {
private volatile boolean isRunning = true;
/**
* Creates an Instance of the KartenLeser.
*
* @param server Backend Server to call methods on.
*/
public UsbCardReader(BackendServer server) {
super(server);
new Thread(this::run).start();
}
public void stop() {
isRunning = false;
}
/** run the reader. */
public void run() {
SerialPort[] ports = SerialPort.getCommPorts();
SerialPort selectedPort = null;
for (SerialPort port : ports) {
if (port.getSystemPortName().equals("COM16")) {
selectedPort = port;
break;
}
}
if (selectedPort == null) {
System.out.println("COM6 not found");
return;
}
if (ports.length == 0) {
System.out.println("No serial ports found");
return;
}
SerialPort serialPort = selectedPort; // You may need to adjust this based on your setup
serialPort.setBaudRate(115200);
if (serialPort.openPort()) {
System.out.println("Serial port opened successfully");
try {
while (isRunning) {
if (serialPort.bytesAvailable() > 0) {
byte[] buffer = new byte[serialPort.bytesAvailable()];
int bytesRead = serialPort.readBytes(buffer, buffer.length);
String data = new String(buffer, 0, bytesRead, "UTF-8").trim();
server.nfcGelesen(data);
}
// Optional: Add a delay to avoid consuming too much CPU
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} finally {
serialPort.closePort();
System.out.println("Serial port closed");
}
} else {
System.out.println("Failed to open serial port");
}
}
}

View File

@@ -44,7 +44,7 @@ public class KartenUtil {
*/
public static Karte getIdOfUid(String uid) {
return switch (uid) {
case "04A56BB4780000" -> Karte.EICHEL_7;
case "04E7A9C2126F80" -> Karte.EICHEL_7;
case "04A46BB4780000" -> Karte.EICHEL_8;
case "04A26BB4780000" -> Karte.EICHEL_9;
case "04A16BB4780000" -> Karte.EICHEL_X;