package org.thingml.generated.network;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import org.thingml.generated.messages.*;
import org.thingml.java.*;
import org.thingml.java.ext.*;
import java.util.Arrays;
public class /*$NAME$*/ extends Component {
private final /*$SERIALIZER$*/ formatter = new /*$SERIALIZER$*/();
private final String port;
private final int baudrate;
private final SerialPort serialPort;
private final byte START_BYTE = 0x12;
private final byte STOP_BYTE = 0x13;
private final byte ESCAPE_BYTE = 0x7D;
/*$MESSAGE TYPES$*/
/*$PORTS$*/
public /*$NAME$*/(final String port, final int baudrate) {
this.port = port;
this.baudrate = baudrate;
serialPort = new SerialPort(port);
try {
serialPort.openPort();
serialPort.setParams(baudrate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE,false,true);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.addEventListener(new SerialPortReader());
} catch (SerialPortException ex) {
System.out.println(ex);
}
}
private void send(final byte[] payload) {
try {
serialPort.writeByte(START_BYTE);
for (byte b : payload) {
if (b == START_BYTE || b == STOP_BYTE || b == ESCAPE_BYTE) {
serialPort.writeByte(ESCAPE_BYTE);
}
serialPort.writeByte(b);
}
serialPort.writeByte(STOP_BYTE);
} catch (Exception e) {
e.printStackTrace();
}
}
private void parse(final byte[] payload) {
/*$PARSING CODE$*/
}
@Override
public void run() {
while (active.get()) {
try {
final Event e = queue.take();//should block if queue is empty, waiting for a message
final byte[] payload = JavaBinaryHelper.toPrimitive((Byte[])formatter.format(e));
if (payload != null)
send(payload);
} catch (InterruptedException e) {
//e.printStackTrace();
}
}
}
@Override
public Component buildBehavior(String id, Component root) {
/*$INIT PORTS$*/
final java.util.List < AtomicState > states = new java.util.ArrayList < AtomicState > ();
final AtomicState init = new AtomicState("Init");
states.add(init);
behavior = new CompositeState("default", states, init, java.util.Collections.EMPTY_LIST);
return this;
}
class SerialPortReader implements SerialPortEventListener {
public static final int RCV_WAIT = 0;
public static final int RCV_MSG = 1;
public static final int RCV_ESC = 2;
protected int buffer_idx = 0;
protected int state = RCV_WAIT;
private byte[] buffer = new byte[256];
public void serialEvent(SerialPortEvent event) {
try {
if (event.isRXCHAR() && event.getEventValue() > 0) {
byte[] received = serialPort.readBytes();
for (byte data : received) {
if (state == RCV_WAIT) { // it should be a start byte or we just ignore it
if (data == START_BYTE) {
state = RCV_MSG;
buffer_idx = 0;
}
} else if (state == RCV_MSG) {
if (data == ESCAPE_BYTE) {
state = RCV_ESC;
} else if (data == STOP_BYTE) {
parse(Arrays.copyOf(buffer, buffer_idx));
state = RCV_WAIT;
} else if (data == START_BYTE) {
// Should not happen but we reset just in case
state = RCV_MSG;
buffer_idx = 0;
} else { // it is just a byte to store
buffer[buffer_idx] = (byte) data;
buffer_idx++;
}
} else if (state == RCV_ESC) {
// Store the byte without looking at it
buffer[buffer_idx] = (byte) data;
buffer_idx++;
state = RCV_MSG;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}