package context.arch.widget; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import context.arch.comm.DataObject; import context.arch.comm.DataObjects; import context.arch.comm.language.DecodeException; import context.arch.comm.language.EncodeException; import context.arch.comm.language.InvalidDecoderException; import context.arch.comm.language.InvalidEncoderException; import context.arch.connection.FactoryConnection; import context.arch.connection.SerialConnection; import context.arch.storage.AttributeNameValue; import context.arch.storage.Attributes; public abstract class ArduinoWidget extends Widget implements IArduinoWidget, SerialPortEventListener { public static final String UPDATE_ARDUINO = "updateArduino"; public static final String DEFAULT_ARDUINO_PORT = "COM3"; public static final String DEFAULT_ARDUINO_ID = "ArduinoWidget"; public static final int TYPE_SENSOR = 0; public static final int TYPE_ACTUATOR = 1; public static final int TYPE_SENSOR_AND_ACTUATOR = 2; protected SerialConnection connection; protected String arduinoId; protected int type; public ArduinoWidget(String id, int type, String serialPort, String arduinoId) { super(id,id); this.type = type; this.arduinoId = arduinoId; this.connection = (SerialConnection) FactoryConnection.getConnetion(FactoryConnection.SERIAL, serialPort); if (connection != null) { if(!connection.isOpen()) { connection.open(); } if (type == TYPE_SENSOR || type == TYPE_SENSOR_AND_ACTUATOR) { connection.addEventListener(this); } } } public ArduinoWidget(String id, int type, String serialPort) { this(id, type, serialPort,DEFAULT_ARDUINO_ID); } public ArduinoWidget(String id, int type) { this(id, type, DEFAULT_ARDUINO_PORT); } @Override public void serialEvent(SerialPortEvent arg0) { try { Attributes atts = Attributes.fromDataObject(decodeData(connection.read())); atts.put(TIMESTAMP, new AttributeNameValue<Long>(TIMESTAMP, System.currentTimeMillis())); updateData(this.nonConstantAttributes.getSubset(atts)); } catch (DecodeException e) { e.printStackTrace(); } catch (InvalidDecoderException e) { e.printStackTrace(); } } @Override public DataObject updateArduino(Attributes attributes) { if (connection != null) { if (!connection.isOpen()) { connection.open(); } try { DataObjects v = new DataObjects(); v.addElement(new DataObject(ID, arduinoId)); v.addElement(attributes.toDataObject()); DataObject data = new DataObject(UPDATE_ARDUINO, v); connection.write(encodeData(data)); } catch (EncodeException e) { e.printStackTrace(); } catch (InvalidEncoderException e) { e.printStackTrace(); } } return new DataObject(); } }