package art.servers.signalsboardserver.controller.pollers; import art.library.interop.InteropParameter; import art.library.interop.InteropParameters; import art.library.interop.InteropResponse; import art.library.interop.serialization.Serialization; import art.library.model.devices.Device; import art.library.model.devices.eru.status.inout.InputStatus; import art.library.model.devices.signalsboard.SignalsBoard; import art.library.model.devices.signalsboard.SignalsBoardStatus; import art.library.model.devices.signalsboard.alarms.SignalAlarm; import art.library.model.devices.signalsboard.alarms.SignalAlarm_ERU; import art.library.model.devices.signalsboard.alarms.SignalAlarm_SNMP; import art.library.model.devices.signalsboard.information.SignalInformation; import art.library.model.devices.signalsboard.information.SignalInformation_ERU; import art.library.model.devices.signalsboard.information.SignalsInformation_ERU; import art.library.model.devices.signalsboard.status.SignalStatus; import art.library.model.devices.signalsboard.status.SignalStatusGroup; import art.servers.Shared; import art.servers.signalsboardserver.configuration.ConfigurationDetail_Definition; import art.servers.signalsboardserver.configuration.ConfigurationDetail_Model; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class PollerERU extends Thread { private SignalsBoard device = null; private SignalsInformation_ERU signalsInformation_ERU = null; private ConfigurationDetail_Model model = null; private ScriptEngineManager factory = new ScriptEngineManager(); private ScriptEngine engine = factory.getEngineByName("JavaScript"); private String name = null; public PollerERU(String name, ConfigurationDetail_Model model, SignalsBoard device, SignalsInformation_ERU signalsInformation_ERU) { this.name = name; this.model = model; this.device = device; this.signalsInformation_ERU = signalsInformation_ERU; } public void run() { try { update(); } catch (Exception exception) { } } public boolean update() throws Exception { try { SignalsBoardStatus status = device.getDeviceStatus(); boolean result = true; // Inputs Device eru = Shared.model.getDeviceExternal(signalsInformation_ERU.eru); if (signalsInformation_ERU.inputs != null) { List groups = new ArrayList(); result = result & read(eru, groups, signalsInformation_ERU.inputs); if (groups.size() > 0) { if (status.inputs == null) { status.inputs = new ArrayList(); } status.inputs.addAll(groups); } } // Inouts if (signalsInformation_ERU.inouts != null) { List groups = new ArrayList(); result = result & read(eru, groups, signalsInformation_ERU.inouts); if (groups.size() > 0) { if (status.inouts == null) { status.inouts = new ArrayList(); } status.inouts.addAll(groups); } } // Alarms if (signalsInformation_ERU.alarms != null) { result = result & read(eru, signalsInformation_ERU.alarms, status); } return result; } catch (Exception exception) { Shared.traceError(name + ", " + this.signalsInformation_ERU.eru, Shared.getMessage("Update"), exception); return false; } finally { } } private boolean read(Device eru, List groups, List signalsInformation) { HashMap mapGroups = new HashMap(); HashMap mapSignalsStatus = new HashMap(); // Initialise all status signals for (SignalInformation signalInformation : signalsInformation) { SignalStatus signalStatus = new SignalStatus(); signalStatus.name = signalInformation.name; signalStatus.units = signalInformation.units; signalStatus.description = signalInformation.description; mapSignalsStatus.put(signalStatus.name, signalStatus); SignalStatusGroup group = mapGroups.get(signalInformation.group); if (group == null) { group = new SignalStatusGroup(); group.name = signalInformation.group; group.signals = new ArrayList(); groups.add(group); mapGroups.put(group.name, group); } group.signals.add(signalStatus); } // Read all signals try { for (SignalInformation signal : signalsInformation) { if (signal instanceof SignalInformation_ERU) { SignalInformation_ERU signalInformation = (SignalInformation_ERU)signal; SignalStatus signalStatus = mapSignalsStatus.get(signalInformation.name); read(eru, signalInformation, signalStatus); } } return true; } catch (Exception exception) { return false; } } private boolean read(Device eru, List signalsAlarm, SignalsBoardStatus status) { try { for (SignalAlarm signalAlarm : signalsAlarm) { if (signalAlarm instanceof SignalAlarm_ERU) { read(eru, (SignalAlarm_ERU)signalAlarm); } else if (signalAlarm instanceof SignalAlarm) { read(eru, signalAlarm, status); } } return true; } catch (Exception exception) { return false; } finally { } } private void read(Device eru, SignalInformation_ERU signalInformation, SignalStatus signalStatus) throws Exception { try { InteropParameters parameters = new InteropParameters(); parameters.addParameter(new InteropParameter("operation", "getInput")); parameters.addParameter(new InteropParameter("device", eru.getIdentifier())); parameters.addParameter(new InteropParameter("inputs", "" + signalInformation.number)); InteropResponse response = (InteropResponse)Serialization.invoke("get", parameters, eru.getDeviceInformation().serverAddress, eru.getDeviceInformation().serverPort, 15000); InputStatus inputStatus = (InputStatus)response.getValue()[0]; ConfigurationDetail_Definition definition = model.getDefinition(signalInformation.name); if (definition != null) { signalStatus.format = SignalStatus.FORMAT_STRING; signalStatus.value = definition.values.get(Integer.parseInt(inputStatus.value)); if (signalStatus.value == null) signalStatus.value = inputStatus.value; return; } if (signalInformation.format == SignalInformation.FORMAT_DOUBLE) { if (signalInformation.conversion != null) { double receivedFactor = (signalInformation.conversion.maximumReceivedValue-signalInformation.conversion.minimumReceivedValue); double signalFactor = (signalInformation.conversion.maximumSignalValue-signalInformation.conversion.minimumSignalValue); double factor = (signalFactor / receivedFactor); double value = Double.parseDouble(inputStatus.value) - signalInformation.conversion.minimumReceivedValue; value = (value * factor); int v = (int)value * 100; value = (double)v / 100d; signalStatus.value = "" + value; } else if (signalInformation.factor != 1.0d) { signalStatus.value = "" + Double.parseDouble(inputStatus.value) * signalInformation.factor; } else { signalStatus.value = inputStatus.value; } } else { signalStatus.value = inputStatus.value; } } catch (Exception exception) { Shared.printstack(name, exception); Shared.println(name, "Group: " + signalInformation.group + " Name: " + signalInformation.name + " Eru: " + eru.getIdentifier() + " Number: " + signalInformation.number); } } private void read(Device eru, SignalAlarm_ERU signalAlarm) throws Exception { InteropParameters parameters = new InteropParameters(); parameters.addParameter(new InteropParameter("operation", "getInput")); parameters.addParameter(new InteropParameter("device", eru.getIdentifier())); parameters.addParameter(new InteropParameter("inputs", "" + signalAlarm.number)); InteropResponse response = (InteropResponse)Serialization.invoke("get", parameters, eru.getDeviceInformation().serverAddress, eru.getDeviceInformation().serverPort, 15000); InputStatus inputStatus = (InputStatus)response.getValue()[0]; if (signalAlarm.eval != null) { String assignment = Double.parseDouble(inputStatus.value) + " " + signalAlarm.eval; device.setAlarm(signalAlarm.name, (Boolean)engine.eval(assignment)); } else { device.setAlarm(signalAlarm.name, Double.parseDouble(inputStatus.value) > 0); } } private void read(Device eru, SignalAlarm signalAlarm, SignalsBoardStatus status) throws Exception { SignalStatus signalStatus = status.getSignal(signalAlarm.signal); if (signalStatus.value == null) device.setAlarm(signalAlarm.name, true); if (signalAlarm.eval != null) { String assignment = Double.parseDouble(signalStatus.value) + " " + signalAlarm.eval; device.setAlarm(signalAlarm.name, (Boolean)engine.eval(assignment)); } else { device.setAlarm(signalAlarm.name, Double.parseDouble(signalStatus.value) > 0); } } }