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);
}
}