package art.servers.etdserver.controller; import art.library.model.devices.DeviceStatus; import art.library.model.devices.etd.Etd; import art.library.interop.serialization.Serialization; import art.library.model.transactions.traces.Trace; import art.servers.etdserver.Shared; import art.servers.etdserver.protocols.diamond.configuration.DIAMOND_SpeedBinnedData; import static java.lang.Thread.sleep; public class ControllerVirtualEtd extends ControllerEtd { private int status = DeviceStatus.STATUS_ALARM; private boolean firstTime = true; public ControllerVirtualEtd(Etd etd) { super(etd); this.device = etd; this.name = Shared.getMessage("Controller etd") + " " + etd.information.name; } public void run() { // art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Starting"), art.servers.Shared.getMessage("Success")), true); // status = DeviceStatus.STATUS_ONLINE; while ((isInterrupted() == false) && (exit == false)) { long startTimestamp = System.currentTimeMillis(); try { if (art.servers.Shared.isServerEnabled() == true) { update(); } } catch (Exception e) { e.printStackTrace(); } if (startTimestamp > System.currentTimeMillis()) { startTimestamp = System.currentTimeMillis(); } long stopTimestamp = startTimestamp + (device.getDeviceInformation().polling * 1000); while ((System.currentTimeMillis() < stopTimestamp) && (exit == false)) { try { sleep(50); } catch (Exception e) { } } if (art.servers.Shared.model.existsDevice(device.getIdentifier()) == false) { art.servers.Shared.println(name, art.servers.Shared.getMessage("Device no longer exists")); exit = true; } } // art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Finishing"), art.servers.Shared.getMessage("Success")), true); // } /* Private controller functions */ private void update() throws Exception { Etd etdclone = (Etd)Serialization.clone(device); try { String externalIdentifier = device.getDeviceInformation().associatedDevice; Etd etdExternal = (Etd)Shared.model.getDeviceExternal(externalIdentifier); etdclone = (Etd)Serialization.clone(etdExternal); etdclone.information = device.information; etdclone.getDeviceInformation().lSpeedClassification = etdExternal.getDeviceInformation().lSpeedClassification; etdclone.configuration = device.configuration; online(etdclone); return; } catch (Exception exception) { if ((etdclone.alarms.alarm_offline <= 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Etd offline"); art.servers.Shared.println(name, exception); } offline(etdclone); } } private boolean isError() { errorsNumber = errorsNumber + 1; if (errorsNumber >= maxErrorsNumber) { return(true); } return(false); } private void offline(Etd etdclone)throws Exception { if (isError() == true) { if (etdclone.getAlarm("alarm_offline") <= 0) { etdclone.getDeviceAlarms().clear(); } etdclone.setAlarm("alarm_offline", true); Shared.model.updateDevice(device, etdclone); } } private void online(Etd etdclone) throws Exception { errorsNumber = 0; if ((etdclone.alarms.alarm_offline > 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Etd online"); art.servers.Shared.println(name, message); } etdclone.setAlarm("alarm_offline", false); etdclone.setAlarm("alarm_invalid", false); Shared.model.updateDevice(device, etdclone); } private DIAMOND_SpeedBinnedData createSpeedBinTable() throws Exception { if ((this.device.getIdentifier().equalsIgnoreCase("etd-wisznice-1") == false) && (this.device.getIdentifier().equalsIgnoreCase("etd-sławatycze-1") == false)) { DIAMOND_SpeedBinnedData speedBinnedData = new DIAMOND_SpeedBinnedData(); speedBinnedData.numberOfBins = 17; // 16; speedBinnedData.fileName = "POLONIA.SPD"; // "DEFAULTX.SPD"; speedBinnedData.createBins(); return speedBinnedData; } DIAMOND_SpeedBinnedData speedBinnedData = new DIAMOND_SpeedBinnedData(); speedBinnedData.numberOfBins = 16; speedBinnedData.fileName = "DEFAULTX.SPD"; speedBinnedData.createBinsOld(); return speedBinnedData; } }