From d4deabfde9ff9fa3b40510faead2b40719984969 Mon Sep 17 00:00:00 2001 From: Valentin Heiserer <73257760+Vale54321@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:47:04 +0100 Subject: [PATCH] rfid via usb (#21) * added second possible cardReader for windows * refactored * fixed checkstyle * fixed wrong port selection --- pom.xml | 6 ++ .../java/org/schafkopf/BackendServer.java | 20 ++++- .../org/schafkopf/cardreader/CardReader.java | 13 +++ .../GpioReader.java} | 15 ++-- .../schafkopf/cardreader/UsbCardReader.java | 80 +++++++++++++++++++ .../java/org/schafkopf/karte/KartenUtil.java | 2 +- 6 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/schafkopf/cardreader/CardReader.java rename src/main/java/org/schafkopf/{KartenLeser.java => cardreader/GpioReader.java} (87%) create mode 100644 src/main/java/org/schafkopf/cardreader/UsbCardReader.java diff --git a/pom.xml b/pom.xml index 32b39bd..7579deb 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,12 @@ + + com.fazecast + jSerialComm + 2.6.0 + + slf4j-api org.slf4j diff --git a/src/main/java/org/schafkopf/BackendServer.java b/src/main/java/org/schafkopf/BackendServer.java index 2b3e217..b1d99c4 100644 --- a/src/main/java/org/schafkopf/BackendServer.java +++ b/src/main/java/org/schafkopf/BackendServer.java @@ -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 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) diff --git a/src/main/java/org/schafkopf/cardreader/CardReader.java b/src/main/java/org/schafkopf/cardreader/CardReader.java new file mode 100644 index 0000000..1e7bdde --- /dev/null +++ b/src/main/java/org/schafkopf/cardreader/CardReader.java @@ -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; + } +} diff --git a/src/main/java/org/schafkopf/KartenLeser.java b/src/main/java/org/schafkopf/cardreader/GpioReader.java similarity index 87% rename from src/main/java/org/schafkopf/KartenLeser.java rename to src/main/java/org/schafkopf/cardreader/GpioReader.java index 3de38ff..7b8d225 100644 --- a/src/main/java/org/schafkopf/KartenLeser.java +++ b/src/main/java/org/schafkopf/cardreader/GpioReader.java @@ -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( () -> { diff --git a/src/main/java/org/schafkopf/cardreader/UsbCardReader.java b/src/main/java/org/schafkopf/cardreader/UsbCardReader.java new file mode 100644 index 0000000..217a530 --- /dev/null +++ b/src/main/java/org/schafkopf/cardreader/UsbCardReader.java @@ -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"); + } + } +} diff --git a/src/main/java/org/schafkopf/karte/KartenUtil.java b/src/main/java/org/schafkopf/karte/KartenUtil.java index b92080d..199008f 100644 --- a/src/main/java/org/schafkopf/karte/KartenUtil.java +++ b/src/main/java/org/schafkopf/karte/KartenUtil.java @@ -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;