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.devices.Device; import art.library.model.devices.dps.DPS; import art.library.model.devices.dps.types.DPSVehicle; import art.library.model.devices.etd.EtdStatus; import art.library.model.devices.etd.information.EtdClassification; import art.library.model.devices.etd.information.EtdInformationLane; import art.library.model.devices.etd.information.EtdInformationSection; import art.library.model.devices.etd.status.EtdStatusLane; import art.library.model.transactions.traces.Trace; import art.library.utils.common.TimeUtils; import art.servers.etdserver.Shared; import art.servers.etdserver.configuration.Configuration; import art.servers.etdserver.configuration.ConfigurationEtd; import art.servers.etdserver.configuration.EtdConfigurationLaneDPS; import static java.lang.Thread.sleep; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class ControllerEtdDPS extends ControllerEtd { private SimpleDateFormat sdh = new SimpleDateFormat("HH:mm"); private long lastTimestamp = 0; private int status = DeviceStatus.STATUS_ALARM; private boolean firstTime = true; public ControllerEtdDPS(Etd etd) { super(etd); this.device = etd; this.name = Shared.getMessage("Controller etd") + " " + etd.information.name; this.setName(name); } public void run() { String message = Shared.getMessage("Running"); // 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 deviceclone = (Etd)Serialization.clone(device); try { readAlarms(deviceclone); if (deviceclone.getAlarm("alarm_offline") > 0) { offline(deviceclone); return; } readCurrentTrafficData(deviceclone); online(deviceclone); } catch (Exception exception) { exception.printStackTrace(); offline(deviceclone); } } private void readAlarms(Etd deviceclone) throws Exception { try { Configuration configuration = (Configuration)Shared.configuration; ConfigurationEtd configurationEtd = configuration.getConfigurationEtd(deviceclone.getIdentifier()); ControllerDPS controllerDPS = Shared.getControllerDPS(configurationEtd.dpsIdentifier); DPS dps = controllerDPS.getDPS(); if (dps.getAlarm("alarm_offline") > 0) { if (allDpsLanesOffline(deviceclone) == true) { deviceclone.getDeviceAlarms().clear(); deviceclone.setAlarm("alarm_offline", true); return; } } deviceclone.setAlarm("alarm_offline", false); deviceclone.setAlarm("alarm_batteries_disconnected", dps.getAlarm("alarm_battery")); deviceclone.setAlarm("alarm_power_stopped", dps.getAlarm("alarm_magnetometer")); } catch (Exception e) { e.printStackTrace(); throw e; } } private boolean allDpsLanesOffline(Etd deviceclone) throws Exception { try { Configuration configuration = (Configuration)Shared.configuration; ConfigurationEtd configurationEtd = configuration.getConfigurationEtd(deviceclone.getIdentifier()); for (EtdConfigurationLaneDPS laneDPS : configurationEtd.llanesDPS) { ControllerDPS controllerDPS = Shared.getControllerDPS(laneDPS.dps); if (controllerDPS == null) { System.out.println(Device.getDate(System.currentTimeMillis()) + " DPS LANES NULL: " + deviceclone.getIdentifier() + " - DPS: " + laneDPS.dps + " - Lane: " + laneDPS.lane); } DPS dps = controllerDPS.getDPS(); if (dps.getAlarm("alarm_offline") <= 0) { return(false); } } } catch (Exception e) { e.printStackTrace(); } return(true); } private void readCurrentTrafficData(Etd deviceclone) throws Exception { try { long tsPeriod = TimeUtils.thisperiod(deviceclone.getDeviceInformation().period); long tsPeriodFrom = tsPeriod - (deviceclone.getDeviceInformation().period*1000L); Configuration configuration = (Configuration)Shared.configuration; ConfigurationEtd configurationEtd = configuration.getConfigurationEtd(deviceclone.getIdentifier()); List lvehicles = new ArrayList(); for (EtdConfigurationLaneDPS laneDPS : configurationEtd.llanesDPS) { ControllerDPS controllerDPS = Shared.getControllerDPS(laneDPS.dps); try { if (controllerDPS == null) { System.out.println(Device.getDate(System.currentTimeMillis()) + " DPS NULL: " + deviceclone.getIdentifier() + " - DPS: " + laneDPS.dps + " - Lane: " + laneDPS.lane); } lvehicles.addAll(controllerDPS.getVehicles(tsPeriodFrom, tsPeriod, laneDPS.dpsLane)); } catch (Exception e) { } } // lvehicles contains all vehicles of etd lanes initialiseStatus(deviceclone, tsPeriod); for (DPSVehicle vehicle : lvehicles) { try { addVehicleLane(vehicle, deviceclone, configurationEtd); addVehicleLaneTotal(vehicle, deviceclone, configurationEtd); addVehicleLaneSection(vehicle, deviceclone, configurationEtd); } catch (Exception e) { e.printStackTrace(); } } for (EtdStatusLane laneStatus : deviceclone.getDeviceStatus().llane) { int classified = laneStatus.counting - laneStatus.unclassified; if (classified > 0) { laneStatus.length = (laneStatus.length / classified); int length = (int)(laneStatus.length*10); laneStatus.length = (double)((double)length / 10d); laneStatus.speed = (int)(laneStatus.speed / classified); } if (deviceclone.getDeviceInformation().period > 0) { if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 1.Lane: " + laneStatus.number + " - Occ: " + laneStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } laneStatus.occupancy = (float)((laneStatus.occupancy * 100f) / (float)(deviceclone.getDeviceInformation().period*1000)); if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 2.Lane: " + laneStatus.number + " - Occ: " + laneStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } int occupancy = (int)(laneStatus.occupancy*10); laneStatus.occupancy = (float)((float)occupancy / 10f); if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 3.Lane: " + laneStatus.number + " - Occ: " + laneStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } if (laneStatus.occupancy > 100f) laneStatus.occupancy = 100f; } } for (EtdStatusLane sectionStatus : deviceclone.getDeviceStatus().lsection) { int classified = sectionStatus.counting - sectionStatus.unclassified; if (classified > 0) { sectionStatus.length = (sectionStatus.length / classified); int length = (int)(sectionStatus.length*10); sectionStatus.length = (double)((double)length / 10d); sectionStatus.speed = (int)(sectionStatus.speed / classified); } if (deviceclone.getDeviceInformation().period > 0) { if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 1.Section: " + sectionStatus.number + " - Occ: " + sectionStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } sectionStatus.occupancy = (float)((sectionStatus.occupancy * 100f) / (float)(deviceclone.getDeviceInformation().period*1000)); if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 2.Section: " + sectionStatus.number + " - Occ: " + sectionStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } EtdInformationSection sectionInformation = deviceclone.getDeviceInformation().getSection(sectionStatus.number); sectionStatus.occupancy = (float)((sectionStatus.occupancy) / (float)(sectionInformation.llane.size())); int occupancy = (int)(sectionStatus.occupancy*10); sectionStatus.occupancy = (float)((float)occupancy / 10f); if (deviceclone.getIdentifier().indexOf("21022") > -1) { System.out.println(deviceclone.getIdentifier() + " 3.Section: " + sectionStatus.number + " - Occ: " + sectionStatus.occupancy + " - Period: " + deviceclone.getDeviceInformation().period); } if (sectionStatus.occupancy > 100f) sectionStatus.occupancy = 100f; } } int classified = deviceclone.getDeviceStatus().total.counting - deviceclone.getDeviceStatus().total.unclassified; if (classified > 0) { deviceclone.getDeviceStatus().total.length = deviceclone.getDeviceStatus().total.length / classified; int length = (int)(deviceclone.getDeviceStatus().total.length*10); deviceclone.getDeviceStatus().total.length = (double)((double)length / 10d); deviceclone.getDeviceStatus().total.speed = (int)(deviceclone.getDeviceStatus().total.speed / classified); } if (deviceclone.getDeviceInformation().period > 0) { deviceclone.getDeviceStatus().total.occupancy = (float)((deviceclone.getDeviceStatus().total.occupancy * 100f) / (float)(deviceclone.getDeviceInformation().period*1000)); deviceclone.getDeviceStatus().total.occupancy = (float)((deviceclone.getDeviceStatus().total.occupancy) / (float)(deviceclone.getDeviceInformation().lLane.size())); int occupancy = (int)(deviceclone.getDeviceStatus().total.occupancy*10); deviceclone.getDeviceStatus().total.occupancy = (float)((float)occupancy / 10f); if (deviceclone.getDeviceStatus().total.occupancy > 100f) deviceclone.getDeviceStatus().total.occupancy = 100f; } deviceclone.setLastTimestampStatusUpdate(deviceclone.getDeviceStatus().measurementTimestamp); } catch (Exception e) { throw e; } } private void offline(Etd etdclone)throws Exception { if ((device.alarms.alarm_offline <= 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Etd offline"); art.servers.Shared.println(name, message); } 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 { if ((device.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 void initialiseStatus (Etd deviceclone, long tsperiod) { if (deviceclone.getDeviceStatus() == null) { deviceclone.status = new EtdStatus(); for (EtdInformationLane laneInformation : deviceclone.getDeviceInformation().lLane) { EtdStatusLane laneStatus = new EtdStatusLane(); laneStatus.number = laneInformation.number; laneStatus.correctMeasurements = 1; laneStatus.totalMeasurements = 1; laneStatus.status = DeviceStatus.STATUS_ONLINE; deviceclone.getDeviceStatus().llane.add(laneStatus); } for (EtdInformationSection sectionInformation : deviceclone.getDeviceInformation().lSection) { EtdStatusLane sectionStatus = new EtdStatusLane(); sectionStatus.number = sectionInformation.number; sectionStatus.correctMeasurements = 1; sectionStatus.totalMeasurements = 1; sectionStatus.status = DeviceStatus.STATUS_ONLINE; deviceclone.getDeviceStatus().lsection.add(sectionStatus); } deviceclone.getDeviceStatus().total = new EtdStatusLane(); } if (deviceclone.getDeviceStatus().total == null) { deviceclone.getDeviceStatus().total = new EtdStatusLane(); } deviceclone.getDeviceStatus().total.status = DeviceStatus.STATUS_ONLINE; deviceclone.getDeviceStatus().llane.clear(); deviceclone.getDeviceStatus().lsection.clear(); for (EtdInformationLane laneInformation : deviceclone.getDeviceInformation().lLane) { EtdStatusLane laneStatus = new EtdStatusLane(); laneStatus.number = laneInformation.number; laneStatus.totalMeasurements = 1; laneStatus.correctMeasurements = 1; laneStatus.status = DeviceStatus.STATUS_ONLINE; laneStatus.lengths = new int[deviceclone.getDeviceInformation().lLengthClassification.size()]; for (int l=0; l llaneStatus = getEtdStatusLane(deviceclone, vehicle, configurationEtd); if ((llaneStatus == null) || (llaneStatus.size() == 0)) return; for (EtdStatusLane laneStatus : llaneStatus) { laneStatus.counting = laneStatus.counting + 1; if (vehicle.speed > -1) laneStatus.speed = laneStatus.speed + vehicle.speed; if (vehicle.length > -1) laneStatus.length = laneStatus.length + ((double)vehicle.length); laneStatus.occupancy = laneStatus.occupancy + vehicle.occupancy; if (vehicle.length <= 0) laneStatus.unclassified = laneStatus.unclassified + 1; laneStatus.totalMeasurements = 1; laneStatus.correctMeasurements = 1; } // int lengthPosition = getClassificationPosition(((double)vehicle.length/100d), deviceclone.getDeviceInformation().lLengthClassification); // laneStatus.lengths[lengthPosition] = laneStatus.lengths[lengthPosition] + 1; // int speedPosition = getClassificationPosition(vehicle.speed, deviceclone.getDeviceInformation().lSpeedClassification); // laneStatus.speeds[speedPosition] = laneStatus.speeds[speedPosition] + 1; // laneStatus.speedxlength[speedPosition][lengthPosition] = laneStatus.speedxlength[speedPosition][lengthPosition] + 1; } catch (Exception e) { e.printStackTrace(); } } private int getClassificationPosition(double value, List lclassification) { int position = 0; try { for (int i=0; i 0) return(lclassification.size()-1); } catch (Exception e) { } return(position); } private void addVehicleLaneTotal(DPSVehicle vehicle, Etd deviceclone, ConfigurationEtd configurationEtd) { try { List llaneStatus = getEtdStatusLane(deviceclone, vehicle, configurationEtd); int number = 1; if ((llaneStatus == null) || (llaneStatus.size() == 0)) number = 1; else number = llaneStatus.size(); deviceclone.getDeviceStatus().total.counting = deviceclone.getDeviceStatus().total.counting + number; if (vehicle.speed > -1) { for (int i=0; i -1) { for (int i=0; i lsectionStatus = getEtdStatusSection(vehicle, deviceclone, configurationEtd); if ((lsectionStatus == null) || (lsectionStatus.size() == 0)) return; for (EtdStatusLane sectionStatus : lsectionStatus) { sectionStatus.counting = sectionStatus.counting + 1; if (vehicle.speed > -1) sectionStatus.speed = sectionStatus.speed + vehicle.speed; if (vehicle.length > -1) sectionStatus.length = sectionStatus.length + ((double)vehicle.length); sectionStatus.occupancy = sectionStatus.occupancy + vehicle.occupancy; if (vehicle.length <= 0) sectionStatus.unclassified = sectionStatus.unclassified + 1; sectionStatus.totalMeasurements = 1; sectionStatus.correctMeasurements = 1; } // int lengthPosition = getClassificationPosition(((double)vehicle.length/100d), deviceclone.getDeviceInformation().lLengthClassification); // sectionStatus.lengths[lengthPosition] = sectionStatus.lengths[lengthPosition] + 1; // int speedPosition = getClassificationPosition(vehicle.speed, deviceclone.getDeviceInformation().lSpeedClassification); // sectionStatus.speeds[speedPosition] = sectionStatus.speeds[speedPosition] + 1; // sectionStatus.speedxlength[speedPosition][lengthPosition] = sectionStatus.speedxlength[speedPosition][lengthPosition] + 1; } catch (Exception e) { e.printStackTrace(); } } private List getEtdStatusLane(Etd deviceclone, DPSVehicle vehicle, ConfigurationEtd configurationEtd) { List llanes = new ArrayList(); try { List list = configurationEtd.getLaneEtd(vehicle.device, vehicle.lane); if ((list == null) || (list.size() == 0)) System.out.println(deviceclone.getIdentifier() + " - LANE NULL: " + vehicle.device + " - " + vehicle.lane); for (EtdConfigurationLaneDPS lane : list) { for (EtdStatusLane laneStatus : deviceclone.getDeviceStatus().llane) { if (laneStatus.number == lane.lane) llanes.add(laneStatus); } } } catch (Exception e) { } return(llanes); } private List getEtdStatusSection(DPSVehicle vehicle, Etd deviceclone, ConfigurationEtd configurationEtd) { List lsections = new ArrayList(); try { List lsection = getEtdInformationSection(deviceclone, vehicle, configurationEtd); for (EtdInformationSection section : lsection) { for (EtdStatusLane sectionStatus : deviceclone.getDeviceStatus().lsection) { if (section.number == sectionStatus.number) lsections.add(sectionStatus); } } } catch (Exception e) { } if ((lsections == null) || (lsections.size() == 0)) System.out.println(deviceclone.getIdentifier() + " - LANE_SECTION_STATUS NULL: " + vehicle.device + " - " + vehicle.lane); return(lsections); } private List getEtdInformationSection(Etd deviceclone, DPSVehicle vehicle, ConfigurationEtd configurationEtd) { List lsections = new ArrayList(); try { List list = configurationEtd.getLaneEtd(vehicle.device, vehicle.lane); if ((list == null) || (list.size() == 0)) System.out.println(deviceclone.getIdentifier() + " - LANE_SECTION NULL: " + vehicle.device + " - " + vehicle.lane); for (EtdConfigurationLaneDPS lane : list) { for (EtdInformationSection sectionInformation : deviceclone.getDeviceInformation().lSection) { for (Integer number : sectionInformation.llane) { if (number == lane.lane) lsections.add(sectionInformation); } } } } catch (Exception e) { } return(lsections); } }