Files
MXSC/src/main/java/ch/psi/mxsc/PuckDetection.java
2018-08-16 10:56:50 +02:00

193 lines
6.9 KiB
Java

package ch.psi.mxsc;
import ch.psi.pshell.core.JsonSerializer;
import ch.psi.pshell.device.DeviceBase;
import ch.psi.utils.Chrono;
import ch.psi.utils.State;
import ch.psi.utils.Threading;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
public class PuckDetection extends DeviceBase {
final String server;
public volatile Chrono chrono;
boolean debug;
public PuckDetection(String name, String server) {
super(name);
this.server = server.startsWith("tcp://") ? server : "tcp://" + server;
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean value) {
debug = value;
}
Thread thread;
Thread watchDog;
@Override
protected void doInitialize() throws IOException, InterruptedException {
doClose();
super.doInitialize();
chrono = new Chrono();
thread = new Thread(new Runnable() {
@Override
public void run() {
subscriberTask();
}
});
thread.setDaemon(true);
thread.start();
watchDog = new Thread(new Runnable() {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
if (chrono.isTimeout(3000)) {
if (!isSimulated()) {
setState(State.Offline);
if (Controller.getInstance() != null) {
Controller.getInstance().clearPuckStates();
}
}
}
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
getLogger().fine("Watch-dog thread interrupted");
} catch (Exception ex) {
getLogger().log(Level.WARNING, null, ex);
}
}
});
watchDog.setDaemon(true);
watchDog.start();
}
void subscriberTask() {
try {
setState(State.Ready);
if (isSimulated()) {
while (!Thread.currentThread().isInterrupted()) {
for (int address = 1; address <= Controller.NUMBER_OF_PUCKS; address++) {
Integer indDetector = ((address <= 6) || (address==30)) ? 1 : 0;
Integer mecDetector = ((address <= 6) || (address==29)) ? 1 : 0;
int index = Controller.getInstance().getPuckIndex(address);
PuckState puck = Controller.getInstance().getPuckState(index);
puck.set(mecDetector, indDetector);
}
if (Controller.getInstance() != null) {
Controller.getInstance().updateView();
}
chrono = new Chrono();
Thread.sleep(2000);
}
} else {
org.zeromq.ZMQ.Context context = org.zeromq.ZMQ.context(1);
org.zeromq.ZMQ.Socket subscriber = context.socket(org.zeromq.ZMQ.SUB);
subscriber.connect(server);
//subscriber.subscribe("Status".getBytes());
subscriber.subscribe("".getBytes());
try {
if (debug) {
System.out.println("Start listening");
}
while (!Thread.currentThread().isInterrupted()) {
//String type = subscriber.recvStr();
//System.out.println(type);
String contents = subscriber.recvStr();
if (debug) {
System.out.println(contents);
}
processMessage(contents);
if (Controller.getInstance() != null) {
Controller.getInstance().updateView();
}
setState(State.Ready);
chrono = new Chrono();
}
} finally {
if (debug) {
System.out.println("Stop listening");
}
if (Controller.getInstance() != null) {
Controller.getInstance().clearPuckStates();
}
subscriber.close();
context.term();
}
}
} catch (Exception ex) {
getLogger().log(Level.INFO, null, ex);
}
setState(State.Offline);
}
void processMessage(String str) {
try {
//System.out.println(str);
List<List> detection = (List) JsonSerializer.decode(str, List.class);
int address = 1;
for (List<List> bus : detection) {
for (List<Integer> sensor : bus) {
Integer indDetector = sensor.get(0);
Integer mecDetector = sensor.get(1);
int index = Controller.getInstance().getPuckIndex(address);
PuckState puck = Controller.getInstance().getPuckState(index);
puck.set(mecDetector, indDetector);
address++;
}
}
setCache(str);
} catch (Exception ex) {
getLogger().log(Level.INFO, null, ex);
}
}
public PuckState getPuckState(int id) throws Exception {
return Controller.getInstance().getPuckState(id);
}
public Puck getPuck(String name) throws Exception {
return Controller.getInstance().getPuck(name);
}
@Override
protected void doClose() {
if (watchDog != null) {
watchDog.interrupt();
watchDog = null;
}
if (thread != null) {
try {
Threading.stop(thread, true, 2000);
} catch (InterruptedException ex) {
//TODO: Filtering InterruptedException. But stop() should not throw InterruptedException;
getLogger().log(Level.WARNING, null, ex);
}
thread = null;
}
}
public static void main(String[] args) throws IOException, InterruptedException {
PuckDetection pd = new PuckDetection("PD", "129.129.110.99:5556");
//PuckDetection pd = new PuckDetection("PD","raspberrypi:5556");
pd.setDebug(true);
pd.initialize();
Thread.sleep(100000);
}
}