package art.servers.lighting.lightstudsserver.controller; import art.library.interop.InteropParameters; import art.library.interop.serialization.Serialization; import art.library.interop.serialization.SerializationException; import art.library.model.devices.DeviceAction; import art.library.model.devices.DeviceActionResult; import art.library.model.devices.DeviceStatus; import art.library.model.devices.lighting.lightstuds.LightStuds; import art.library.model.devices.lighting.lightstuds.LightStudsCommands; import art.library.model.devices.lighting.lightstuds.alarms.LightStudsAlarms_BUSVAO; import art.library.model.devices.lighting.lightstuds.commands.LightStudsCommands_BUSVAO_Circuit; import art.library.model.devices.lighting.lightstuds.information.LightStudsInformation_BUSVAO_Circuit; import art.library.model.devices.lighting.lightstuds.status.LightStudsStatus_BUSVAO; import art.library.model.devices.lighting.lightstuds.status.LightStudsStatus_BUSVAO_Circuit; import art.library.model.devices.lighting.lightstuds.status.LightStudsStatus_BUSVAO_Circuit_Order; import art.library.model.devices.signalsboard.information.SignalInformation; import art.library.model.devices.signalsboard.information.SignalInformation_MODBUSTCP; import art.library.model.devices.signalsboard.information.SignalsInformation_MODBUSTCP; import art.library.net.modbus.ReaderModbus; import art.library.net.modbus.WriterModbus; import art.library.utils.synchro.Mutex; import art.servers.ServerException; import art.servers.Shared; import art.servers.lighting.lightstudsserver.configuration.Configuration; import art.servers.lighting.lightstudsserver.configuration.ConfigurationDetail; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class ControllerLigthStuds_BUSVAO extends ControllerLigthStuds { private String name = null; private Mutex mutex = new Mutex(); public ControllerLigthStuds_BUSVAO(LightStuds studs) { super(studs); this.name = Shared.getMessage("Controller light studs") + " " + studs.toString(); this.setName(name); } public void run() { Shared.traceInformation(name, "Starting"); while ((isInterrupted() == false) && (exit == false)) { long startTimestamp = System.currentTimeMillis(); try { if (art.servers.Shared.isServerEnabled() == true) { update(); } } catch (Exception e) { } // Wait long timetowait = (device.getDeviceInformation().BUSVAO.polling * 1000) - (System.currentTimeMillis() - startTimestamp); timetowait = Math.min(timetowait, (device.getDeviceInformation().BUSVAO.polling)); if (timetowait > 0) { try { sleep(timetowait); } catch (Exception e) { } } else { try{sleep(50);} catch (Exception e){}; } if (Shared.model.existsDevice(device.getIdentifier()) == false) { Shared.println(name, Shared.getMessage("Device no longer exists")); exit = true; } } Shared.traceInformation(name, "Finishing"); } // public DeviceAction[] sendCommands(InteropParameters parameters) throws ServerException, SerializationException, Exception { try { List result = new ArrayList(); LightStudsCommands commands = parameters.getBodyContentValue(LightStudsCommands.class); Shared.println(name, "\r\n\r\n" + Serialization.toPrettyString(commands)); LightStuds clone = Serialization.clone(device); if ((commands.busvao != null) && (commands.busvao.circuits != null)) { for (LightStudsCommands_BUSVAO_Circuit circuitCommand : commands.busvao.circuits) { result.add(sendCommand(parameters, clone, circuitCommand)); } Shared.model.updateDevice(device, clone); // Return result return result.toArray(new DeviceAction[result.size()]); } return result.toArray(new DeviceAction[0]); } catch (ServerException e) { Shared.printstack(name, e); throw e; } catch (SerializationException e) { Shared.printstack(name, e); throw e; } catch (Exception e) { Shared.printstack(name, e); throw e; } } private DeviceAction sendCommand(InteropParameters parameters, LightStuds device, LightStudsCommands_BUSVAO_Circuit command) { String language = (String)parameters.getParameter("language").getValue(); WriterModbus writer = null; DeviceAction action = new DeviceAction(device, parameters, command); action.actionName = command.getActionName(); try { ConfigurationDetail detail = ((Configuration)Shared.configuration).detail; Shared.println(name, "1.SendCommand: C" + command.number + " - L" + command.brightnessLevel); SignalsInformation_MODBUSTCP signals = (SignalsInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals; Shared.println(name, "2.SendCommand: C" + command.number + " - L" + command.brightnessLevel + " - Signals null: " + (signals==null)); writer = new WriterModbus(signals.address, signals.port, signals.timeout, signals.retries); Shared.println(name, "3.SendCommand: C" + command.number + " - L" + command.brightnessLevel + " - " + signals.address + ":" + signals.port + " - " + signals.timeout + " - " + signals.retries); if (command.brightnessLevel == 0) { SignalInformation_MODBUSTCP signalCircuit = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("circuit " + command.number); SignalInformation_MODBUSTCP signalOn = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("on"); SignalInformation_MODBUSTCP signalOff = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("off"); if ((signalCircuit.address == signalOn.address) && (signalOn.address == signalOff.address)) { int value = 0; value += (int)Math.pow(2, signalOff.bit); value += (int)Math.pow(2, signalCircuit.bit); write(writer, signalOff, value); } else if ((signalCircuit.address != signalOn.address) && (signalOn.address == signalOff.address)) { int value = 0; value += (int)Math.pow(2, signalOff.bit); write(writer, signalOff, value); value = 0; value += (int)Math.pow(2, signalCircuit.bit); write(writer, signalCircuit, value); } else { write(writer, "circuit " + command.number, 0); sleep(detail.timeBetweenOrders); write(writer, "on", 0); sleep(detail.timeBetweenOrders); write(writer, "off", 1); } LightStudsStatus_BUSVAO_Circuit circuitStatus = (LightStudsStatus_BUSVAO_Circuit)device.getDeviceStatus().BUSVAO.getCircuit(command.number); circuitStatus.order = new LightStudsStatus_BUSVAO_Circuit_Order(); circuitStatus.order.timestamp = System.currentTimeMillis(); circuitStatus.order.brightnessLevel = 0; circuitStatus.order.status = LightStudsStatus_BUSVAO_Circuit.STATUS_OFF; } else { SignalInformation_MODBUSTCP signalCircuit = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("circuit " + command.number); SignalInformation_MODBUSTCP signalOn = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("on"); SignalInformation_MODBUSTCP signalOff = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput("off"); String brightnessLevelName = "-"; if (command.brightnessLevel == 1) brightnessLevelName = "level 1"; if (command.brightnessLevel == 2) brightnessLevelName = "level 2"; if (command.brightnessLevel == 3) brightnessLevelName = "level 3"; if (command.brightnessLevel == 4) brightnessLevelName = "level 4"; if (command.brightnessLevel == 5) brightnessLevelName = "level 5"; SignalInformation_MODBUSTCP signalBrightness = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput(brightnessLevelName); Shared.println(name, "4.SendCommand: Circuit: " + signalCircuit.address + "." + signalCircuit.bit + " - On: " + signalOn.address + "." + signalOn.bit + " - Off: " + signalOff.address + "." + signalOff.bit + " - Brightness: " + signalBrightness.address + "." + signalBrightness.bit); if ((signalCircuit.address == signalOn.address) && (signalOn.address == signalOff.address) && (signalOff.address == signalBrightness.address)) { int value = 0; value += (int)Math.pow(2, signalOff.bit); value += (int)Math.pow(2, signalCircuit.bit); write(writer, signalOff, value); sleep(detail.timeBetweenOrders); value = 0; value += (int)Math.pow(2, signalOn.bit); value += (int)Math.pow(2, signalCircuit.bit); value += (int)Math.pow(2, signalBrightness.bit); write(writer, signalOn, value); } else if ((signalCircuit.address != signalOn.address) && (signalOn.address == signalOff.address)) { int value = 0; value += (int)Math.pow(2, signalOff.bit); write(writer, signalOff, value); value = 0; value += (int)Math.pow(2, signalCircuit.bit); write(writer, signalCircuit, value); sleep(detail.timeBetweenOrders); value = 0; value += (int)Math.pow(2, signalOn.bit); if (signalBrightness.address == signalOn.address) { value += (int)Math.pow(2, signalBrightness.bit); } write(writer, signalOn, value); value = 0; value += (int)Math.pow(2, signalCircuit.bit); if (signalBrightness.address == signalCircuit.address) { value += (int)Math.pow(2, signalBrightness.bit); } write(writer, signalCircuit, value); } else { write(writer, signalOff, 1); sleep(detail.timeBetweenOrders); if (command.brightnessLevel == 1) write(writer, "level 1", 1); if (command.brightnessLevel == 2) write(writer, "level 2", 1); if (command.brightnessLevel == 3) write(writer, "level 3", 1); if (command.brightnessLevel == 4) write(writer, "level 4", 1); if (command.brightnessLevel == 5) write(writer, "level 5", 1); sleep(detail.timeBetweenOrders); write(writer, "circuit " + command.number, 1); sleep(detail.timeBetweenOrders); write(writer, "off", 0); sleep(detail.timeBetweenOrders); write(writer, "on", 1); } LightStudsStatus_BUSVAO_Circuit circuitStatus = (LightStudsStatus_BUSVAO_Circuit)device.getDeviceStatus().BUSVAO.getCircuit(command.number); circuitStatus.order = new LightStudsStatus_BUSVAO_Circuit_Order(); circuitStatus.order.timestamp = System.currentTimeMillis(); circuitStatus.order.brightnessLevel = command.brightnessLevel; circuitStatus.order.status = LightStudsStatus_BUSVAO_Circuit.STATUS_ON; } DeviceActionResult actionResult = new DeviceActionResult(DeviceActionResult.RESULT_CORRECT); action.setResult(actionResult); Shared.model.addAction(action); return action; } catch (Exception exception) { DeviceActionResult actionResult = new DeviceActionResult(DeviceActionResult.RESULT_ERROR, Shared.getMessage(language, "Error sending lightstuds order") + ": " + exception.toString()); action.setResult(actionResult); Shared.model.addAction(action); return action; } finally { if (writer != null) writer.close(); } } // private void update() throws Exception { ReaderModbus reader = null; LightStuds studs = (LightStuds)getDevice(); // Clon initialitation LightStuds clone = Serialization.clone(studs); clone.getDeviceStatus().status = DeviceStatus.STATUS_ONLINE; clone.setAlarm("alarm_offline", false); boolean pair = true; for(LightStudsStatus_BUSVAO_Circuit circuit : clone.getDeviceStatus().BUSVAO.circuits) { circuit.brightnessLevel = pair ? 7 : 4; circuit.status = pair ? LightStudsStatus_BUSVAO_Circuit.STATUS_ON : LightStudsStatus_BUSVAO_Circuit.STATUS_OFF; circuit.alarmBrightnessLevel = System.currentTimeMillis(); pair = !pair; } Shared.model.updateDevice(studs, clone); if(true) return; clone.getDeviceStatus().BUSVAO = new LightStudsStatus_BUSVAO(); if (clone.getDeviceAlarms().busvao == null) clone.getDeviceAlarms().busvao = new LightStudsAlarms_BUSVAO(); for (LightStudsInformation_BUSVAO_Circuit circuitInformation : studs.getDeviceInformation().BUSVAO.circuits) { if (clone.getDeviceStatus().BUSVAO.circuits == null) { clone.getDeviceStatus().BUSVAO.circuits = new ArrayList(); } LightStudsStatus_BUSVAO_Circuit circuitStatus = clone.getDeviceStatus().BUSVAO.getCircuit(circuitInformation.number); if (circuitStatus == null) { circuitStatus = new LightStudsStatus_BUSVAO_Circuit(); circuitStatus.number = circuitInformation.number; clone.getDeviceStatus().BUSVAO.circuits.add(circuitStatus); } circuitStatus.status = LightStudsStatus_BUSVAO_Circuit.STATUS_UNKNOWN; } // Read MODBUS TCP HashMap mapvalues = new HashMap(); SignalsInformation_MODBUSTCP signals = (SignalsInformation_MODBUSTCP)studs.getDeviceInformation().BUSVAO.signals; reader = new ReaderModbus(signals.address, signals.port, signals.timeout, signals.retries); for (SignalInformation signal : studs.getDeviceInformation().BUSVAO.signals.inputs) { read(reader, (SignalInformation_MODBUSTCP)signal, mapvalues); } reader.close(); // Read data to update status long timestamp = System.currentTimeMillis(); try { // Read modbus tcp and update state int brightnessLevel = 0; boolean automatic_value = read(mapvalues, "Automatic"); boolean level1_value = read(mapvalues, "level 1"); if (level1_value == true) brightnessLevel = 1; boolean level2_value = read(mapvalues, "level 2"); if (level2_value == true) brightnessLevel = 2; boolean level3_value = read(mapvalues, "level 3"); if (level3_value == true) brightnessLevel = 3; boolean level4_value = read(mapvalues, "level 4"); if (level4_value == true) brightnessLevel = 4; boolean level5_value = read(mapvalues, "level 5"); if (level5_value == true) brightnessLevel = 5; boolean alarm_open_circuit = read(mapvalues, "Open circuit"); boolean alarm_overcurrent = read(mapvalues, "Overcurrent"); boolean alarm_overheat = read(mapvalues, "Overheat"); boolean alarm_LFD_warning = read(mapvalues, "LFD warning"); boolean alarm_LFD_alarm = read(mapvalues, "LFD alarm"); for (LightStudsStatus_BUSVAO_Circuit circuitStatus : clone.getDeviceStatus().BUSVAO.circuits) { boolean circuit_value = read(mapvalues, "circuit " + circuitStatus.number); if ((circuit_value == true) && (brightnessLevel > 0)) { circuitStatus.status = LightStudsStatus_BUSVAO_Circuit.STATUS_ON; circuitStatus.brightnessLevel = brightnessLevel; } else { circuitStatus.status = LightStudsStatus_BUSVAO_Circuit.STATUS_OFF; circuitStatus.brightnessLevel = 0; } if ((circuitStatus.order != null) && (circuitStatus.status == circuitStatus.order.status) && (circuitStatus.brightnessLevel == circuitStatus.order.brightnessLevel)) { circuitStatus.alarmBrightnessLevel = 0; clone.setAlarm("alarm_brightness_level", false); } else { if (circuitStatus.order == null) { circuitStatus.alarmBrightnessLevel = 0; clone.setAlarm("alarm_brightness_level", false); } else if ((System.currentTimeMillis() - circuitStatus.order.timestamp) < (device.getDeviceInformation().BUSVAO.polling * 2)) { circuitStatus.alarmBrightnessLevel = 0; clone.setAlarm("alarm_brightness_level", false); } else { clone.setAlarm("alarm_brightness_level", true, timestamp); if (circuitStatus.alarmBrightnessLevel == 0) { circuitStatus.alarmBrightnessLevel = timestamp; } else { circuitStatus.alarmBrightnessLevel = Math.min(circuitStatus.alarmBrightnessLevel, System.currentTimeMillis()); } } } } if (automatic_value == true) { clone.getDeviceStatus().BUSVAO.status = LightStudsStatus_BUSVAO.STATUS_AUTOMATIC; } else { clone.getDeviceStatus().BUSVAO.status = LightStudsStatus_BUSVAO.STATUS_MANUAL; } clone.setAlarm("alarm_open_circuit", alarm_open_circuit, timestamp); clone.setAlarm("alarm_overcurrent", alarm_overcurrent, timestamp); clone.setAlarm("alarm_overheat", alarm_overheat, timestamp); clone.setAlarm("alarm_LFD_warning", alarm_LFD_warning, timestamp); clone.setAlarm("alarm_LFD_alarm", alarm_LFD_alarm, timestamp); clone.setAlarm("alarm_invalid", false); clone.setAlarm("alarm_offline", false); if (this.device.getAlarm("alarm_offline") > 0) { Shared.println(name, "Online"); } } catch (Exception exception) { if (this.device.getAlarm("alarm_offline") <= 0) { Shared.println(name, "Offline: " + exception); } clone.setAlarm("alarm_offline", timestamp); } finally { if (reader != null) reader.close(); } } private void read(ReaderModbus reader, SignalInformation_MODBUSTCP signal, HashMap mapvalues) throws Exception { try { for (int i=signal.address; i<(signal.address + signal.words); i++) { if (mapvalues.containsKey("" + i) == false) { Shared.println(name, "Reading: @" + signal.address + " - Words: " + signal.words); reader.loadRegisters(signal.address, signal.words); Shared.println(name, "Read: @" + signal.address + " - Words: " + signal.words); for (int j=0; j 0); } private void write(WriterModbus writer, String name, int value) throws Exception { Shared.println(name, "1.Write: " + name + " - " + value); SignalInformation_MODBUSTCP signal = (SignalInformation_MODBUSTCP)device.getDeviceInformation().BUSVAO.signals.getOutput(name); Shared.println(name, "2.Write: " + name + " - " + value + " - " + signal); writer.setCoil(signal.bit, value); Shared.println(name, "3.Write: " + name + " - " + value + " - " + signal.bit); } private void write(WriterModbus writer, SignalInformation_MODBUSTCP signal, int value) throws Exception { Shared.println(name, "1.Write: " + signal.name + " - V: " + value + " - AddresS: " + signal.address); writer.setRegister(signal.address, value); Shared.println(name, "2.Write: " + signal.name + " - V: " + value + " - Address: " + signal.address); } }