Author: [log in to unmask]
Date: Thu Mar 19 13:51:35 2015
New Revision: 2495
Log:
Add thread which can process ET events using an EtStation.
Added:
java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java
Added: java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java Thu Mar 19 13:51:35 2015
@@ -0,0 +1,142 @@
+package org.hps.record.et;
+
+import java.io.IOException;
+
+import org.jlab.coda.et.EtAttachment;
+import org.jlab.coda.et.EtConstants;
+import org.jlab.coda.et.EtEvent;
+import org.jlab.coda.et.EtStation;
+import org.jlab.coda.et.EtStationConfig;
+import org.jlab.coda.et.EtSystem;
+import org.jlab.coda.et.EtSystemOpenConfig;
+import org.jlab.coda.et.enums.Mode;
+import org.jlab.coda.et.enums.Modify;
+import org.jlab.coda.et.exception.EtBusyException;
+import org.jlab.coda.et.exception.EtClosedException;
+import org.jlab.coda.et.exception.EtDeadException;
+import org.jlab.coda.et.exception.EtEmptyException;
+import org.jlab.coda.et.exception.EtException;
+import org.jlab.coda.et.exception.EtTimeoutException;
+import org.jlab.coda.et.exception.EtTooManyException;
+import org.jlab.coda.et.exception.EtWakeUpException;
+
+
+/**
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EtStationThread extends Thread {
+
+ EtSystem system;
+ EtEventProcessor processor;
+ int stationPosition;
+ String name;
+
+ EtStation station;
+ EtAttachment attachment;
+
+ public EtStationThread(EtEventProcessor processor, EtSystem system, String name, int stationPosition) {
+ if (processor == null) {
+ throw new IllegalArgumentException("processor is null");
+ }
+ if (system == null) {
+ throw new IllegalArgumentException("system is null");
+ }
+ if (name == null) {
+ throw new IllegalArgumentException("name is null");
+ }
+ if (stationPosition < 1) {
+ throw new IllegalArgumentException("stationPosition must be > 0");
+ }
+ this.processor = processor;
+ try {
+ this.system = new EtSystem(new EtSystemOpenConfig(system.getConfig()));
+ } catch (EtException e) {
+ throw new RuntimeException("Error setting up station.", e);
+ }
+ this.stationPosition = stationPosition;
+ this.name = name;
+ }
+
+ protected void setup() {
+
+ if (!system.alive()) {
+ try {
+ system.open();
+ } catch (IOException | EtException | EtTooManyException e) {
+ throw new RuntimeException("Failed to open ET system.", e);
+ }
+ }
+
+ try {
+ // Create the basic station configuration.
+ EtStationConfig stationConfig = new EtStationConfig();
+ stationConfig.setFlowMode(EtConstants.stationSerial);
+ stationConfig.setBlockMode(EtConstants.stationNonBlocking);
+
+ // Create station and attach to the ET system.
+ station = system.createStation(stationConfig, name, stationPosition);
+ attachment = system.attach(station);
+
+ } catch (Exception e) {
+ // Any errors during setup are re-thrown.
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void run() {
+
+ // FIXME: Should be called independently?
+ setup();
+
+ try {
+ for (;;) {
+
+ EtEvent[] events;
+
+ try {
+ events = system.getEvents(attachment, Mode.SLEEP, Modify.NOTHING, 0, 1 /* read 1 event */);
+ system.putEvents(attachment, events);
+ } catch (EtWakeUpException e) {
+ e.printStackTrace();
+ break;
+ } catch (EtException | EtDeadException |
+ EtClosedException | EtEmptyException |
+ EtBusyException | EtTimeoutException |
+ IOException e) {
+ e.printStackTrace();
+ break;
+ }
+
+ try {
+ // Process the events.
+ for (EtEvent event : events) {
+ processor.process(event);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ continue;
+ }
+
+ // Disconnect if interrupted.
+ if (Thread.currentThread().isInterrupted()) {
+ break;
+ }
+ }
+ } finally {
+ disconnect();
+ }
+ }
+
+ synchronized void disconnect() {
+ if (system.alive()) {
+ if (attachment.isUsable()) {
+ try {
+ system.detach(attachment);
+ } catch (IOException | EtException | EtClosedException | EtDeadException e) {
+ e.printStackTrace();
+ }
+ }
+ system.close();
+ }
+ }
+}
|