mirror of
https://github.com/Vale54321/schafkopf-bot.git
synced 2025-12-15 11:19:33 +01:00
rfid via usb (#21)
* added second possible cardReader for windows * refactored * fixed checkstyle * fixed wrong port selection
This commit is contained in:
committed by
GitHub
parent
1376fe645a
commit
d4deabfde9
6
pom.xml
6
pom.xml
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
13
src/main/java/org/schafkopf/cardreader/CardReader.java
Normal file
13
src/main/java/org/schafkopf/cardreader/CardReader.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
() -> {
|
||||
80
src/main/java/org/schafkopf/cardreader/UsbCardReader.java
Normal file
80
src/main/java/org/schafkopf/cardreader/UsbCardReader.java
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user