package art.servers.etdserver.controller; import art.library.interop.serialization.Serialization; import art.library.model.devices.Device; import art.library.model.devices.DeviceStatus; import art.library.model.devices.etd.Etd; 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.devices.etd.status.EtdStatusVehicle; import art.library.model.transactions.traces.Trace; import art.library.utils.common.TimeUtils; import art.servers.etdserver.Shared; import static java.lang.Thread.sleep; import java.util.Calendar; import java.util.Date; import java.util.List; public class ControllerDataIntegration extends art.servers.controller.Controller { private int status = DeviceStatus.STATUS_ALARM; private boolean firstTime = true; protected ControllerEtd controller = null; protected String name = null; private long lastPeriodQuery = 0; public ControllerDataIntegration(ControllerEtd controller) { this.controller = controller; this.name = "Controller Data integration: " + controller.device.getIdentifier(); this.setName(this.name); } public void run () { boolean firstTime = true; // 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)) { try { if (art.servers.Shared.isServerEnabled() == true) { if (firstTime == false) { integratePeriod(); } } } catch (Exception e) { e.printStackTrace(); } Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); while ((calendar.get(Calendar.SECOND) != 0) && (exit == false)) { try { sleep(50); } catch (Exception e) { } } firstTime = false; if (art.servers.Shared.model.existsDevice(controller.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 void integratePeriod () { Etd deviceclone = Serialization.clone(controller.device); try { sleep(15000); if (controller instanceof ControllerDiamondRaw) { if (((ControllerDiamondRaw)controller).isConnected() == false) { offline(deviceclone); return; } } int period = controller.device.getDeviceInformation().period; long tsPeriod = TimeUtils.thisperiod(controller.device.getDeviceInformation().period) - (controller.device.getDeviceInformation().period*1000L); long tsPeriodEnd = tsPeriod + (controller.device.getDeviceInformation().period*1000L); List lvehicle = controller.getVehiclesPeriod(tsPeriod, tsPeriodEnd); System.out.println(deviceclone.getIdentifier() + " - 1.DataIntegration: " + Device.getDate(tsPeriod) + " to " + Device.getDate(tsPeriodEnd) + " - Vehicles: " + lvehicle.size()); System.out.println(deviceclone.getIdentifier() + " - 2.DataIntegration: " + Device.getDate(deviceclone.getDeviceStatus().measurementTimestamp)); initialiseStatus(deviceclone, tsPeriod); System.out.println(deviceclone.getIdentifier() + " - 3.DataIntegration: " + Device.getDate(deviceclone.getDeviceStatus().measurementTimestamp)); for (EtdStatusVehicle vehicle : lvehicle) { try { addVehicleLane(vehicle, deviceclone); addVehicleLaneTotal(vehicle, deviceclone); addVehicleLaneSection(vehicle, deviceclone); } 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 (controller.device.getDeviceInformation().period > 0) { laneStatus.occupancy = (float)((laneStatus.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); int occupancy = (int)(laneStatus.occupancy*10); laneStatus.occupancy = (float)((float)occupancy / 10f); 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 (controller.device.getDeviceInformation().period > 0) { sectionStatus.occupancy = (float)((sectionStatus.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); int occupancy = (int)(sectionStatus.occupancy*10); sectionStatus.occupancy = (float)((float)occupancy / 10f); 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 (controller.device.getDeviceInformation().period > 0) { deviceclone.getDeviceStatus().total.occupancy = (float)((deviceclone.getDeviceStatus().total.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); 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); System.out.println(deviceclone.getIdentifier() + " - 4.DataIntegration: " + Device.getDate(deviceclone.getDeviceStatus().measurementTimestamp) + " - " + deviceclone.getDeviceStatus().llane.size() + " - " + deviceclone.getDeviceStatus().lsection.size() + " - " + deviceclone.getDeviceStatus().period + " - " + deviceclone.getDeviceStatus().total); online(deviceclone); } catch (Exception exception) { try{offline(deviceclone);} catch (Exception e){}; exception.printStackTrace(); } } 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; 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; deviceclone.getDeviceStatus().lsection.add(sectionStatus); } deviceclone.getDeviceStatus().total = new EtdStatusLane(); } if (deviceclone.getDeviceStatus().total == null) { deviceclone.getDeviceStatus().total = new EtdStatusLane(); } 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.lengths = new int[deviceclone.getDeviceInformation().lLengthClassification.size()]; for (int l=0; l 0) laneStatus.occupancy += ((((double)vehicle.length/10.0)/((double)vehicle.speed/3.6)) * 1000.0); laneStatus.counting = laneStatus.counting + 1; laneStatus.speed = laneStatus.speed + vehicle.speed; laneStatus.length = laneStatus.length + ((double)vehicle.length/100d); 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) { if (controller.device.getIdentifier().equalsIgnoreCase("etdtc-rzeszów-2") == true) { e.printStackTrace(); Shared.println("Data Integration", e); } } } 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(EtdStatusVehicle vehicle, Etd deviceclone) { try { if (vehicle.speed > 0) deviceclone.getDeviceStatus().total.occupancy += ((((double)vehicle.length/10.0)/((double)vehicle.speed/3.6)) * 1000.0); deviceclone.getDeviceStatus().total.counting = deviceclone.getDeviceStatus().total.counting + 1; deviceclone.getDeviceStatus().total.speed = deviceclone.getDeviceStatus().total.speed + vehicle.speed; deviceclone.getDeviceStatus().total.length = deviceclone.getDeviceStatus().total.length + ((double)vehicle.length/100d); if (vehicle.length <= 0) deviceclone.getDeviceStatus().total.unclassified = deviceclone.getDeviceStatus().total.unclassified + 1; deviceclone.getDeviceStatus().total.totalMeasurements = 1; deviceclone.getDeviceStatus().total.correctMeasurements = 1; int lengthPosition = getClassificationPosition(((double)vehicle.length/100d), deviceclone.getDeviceInformation().lLengthClassification); deviceclone.getDeviceStatus().total.lengths[lengthPosition] = deviceclone.getDeviceStatus().total.lengths[lengthPosition] + 1; int speedPosition = getClassificationPosition(vehicle.speed, deviceclone.getDeviceInformation().lSpeedClassification); deviceclone.getDeviceStatus().total.speeds[speedPosition] = deviceclone.getDeviceStatus().total.speeds[speedPosition] + 1; deviceclone.getDeviceStatus().total.speedxlength[speedPosition][lengthPosition] = deviceclone.getDeviceStatus().total.speedxlength[speedPosition][lengthPosition] + 1; } catch (Exception e) { if (controller.device.getIdentifier().equalsIgnoreCase("etdtc-rzeszów-2") == true) { e.printStackTrace(); Shared.println("Data Integration", e); } } } private void addVehicleLaneSection(EtdStatusVehicle vehicle, Etd deviceclone) { try { EtdStatusLane sectionStatus = getEtdStatusSection(vehicle, deviceclone); if (sectionStatus == null) return; if (vehicle.speed > 0) sectionStatus.occupancy += ((((double)vehicle.length/10.0)/((double)vehicle.speed/3.6)) * 1000.0); sectionStatus.counting = sectionStatus.counting + 1; sectionStatus.speed = sectionStatus.speed + vehicle.speed; sectionStatus.length = sectionStatus.length + ((double)vehicle.length/100d); 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) { if (controller.device.getIdentifier().equalsIgnoreCase("etdtc-rzeszów-2") == true) { e.printStackTrace(); Shared.println("Data Integration", e); } } } private void offline(Etd deviceclone)throws Exception { if (deviceclone.getAlarm("alarm_offline") <= 0) { deviceclone.getDeviceAlarms().clear(); } deviceclone.setAlarm("alarm_offline", true); boolean modified = Shared.model.updateDevice(controller.device, deviceclone); System.out.println(deviceclone.getIdentifier() + " - OFFLINE.DataIntegration: DIF: " + modified); } private void online(Etd deviceclone) throws Exception { if ((deviceclone.alarms.alarm_offline > 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Etd online"); art.servers.Shared.println(name, message); } deviceclone.setAlarm("alarm_offline", false); deviceclone.setAlarm("alarm_invalid", false); boolean modified = Shared.model.updateDevice(controller.device, deviceclone); System.out.println(deviceclone.getIdentifier() + " - ONLINE.DataIntegration: " + Device.getDate(controller.device.getDeviceStatus().measurementTimestamp) + " - " + controller.device.getDeviceStatus().llane.size() + " - " + controller.device.getDeviceStatus().lsection.size() + " - " + controller.device.getDeviceStatus().period + " - " + controller.device.getDeviceStatus().total + " - DIF: " + modified); } } /* private void integratePeriod () { Etd deviceclone = Serialization.clone(controller.device); try { sleep(1000); List lvehicle = controller.getVehiclesPeriod(lastPeriodQuery, System.currentTimeMillis()); if (lvehicle.size() > 0) { EtdStatusVehicle vehicle0 = lvehicle.get(0); int period = controller.device.getDeviceInformation().period; long tsperiod = TimeUtils.thisperiod(period, vehicle0.timestamp); long tsPeriodEnd = tsperiod + (period*1000L); initialiseStatus(deviceclone, tsperiod); boolean end = false; long maxTimestamp = vehicle0.timestamp; for (int i=0; (end==false) && (i 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 (controller.device.getDeviceInformation().period > 0) { laneStatus.occupancy = (float)((laneStatus.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); int occupancy = (int)(laneStatus.occupancy*10); laneStatus.occupancy = (float)((float)occupancy / 10f); 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 (controller.device.getDeviceInformation().period > 0) { sectionStatus.occupancy = (float)((sectionStatus.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); int occupancy = (int)(sectionStatus.occupancy*10); sectionStatus.occupancy = (float)((float)occupancy / 10f); 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 (controller.device.getDeviceInformation().period > 0) { deviceclone.getDeviceStatus().total.occupancy = (float)((deviceclone.getDeviceStatus().total.occupancy * 100f) / (float)(controller.device.getDeviceInformation().period*1000)); 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); online(deviceclone); long nextTsPeriod = TimeUtils.thisperiod(period, maxTimestamp); long tsperiodEmpty = tsperiod + (period * 1000L); while (tsperiodEmpty < nextTsPeriod) { try { Etd deviceclone2 = Serialization.clone(controller.device); initialiseStatus(deviceclone2, tsperiodEmpty); deviceclone2.setLastTimestampStatusUpdate(deviceclone2.getDeviceStatus().measurementTimestamp); online(deviceclone2); } catch (Exception e) { if (controller.device.getIdentifier().equalsIgnoreCase("etdtc-rzeszów-2") == true) { String message = controller.device.getIdentifier() + " - EX.5.IntegratePeriod: " + period + " - " + Device.getDate(nextTsPeriod) + " - " + Device.getDate(tsperiodEmpty); Shared.println("Data Integration", message, e); } } tsperiodEmpty = tsperiodEmpty + (period * 1000L); } } } catch (Exception exception) { try{offline(deviceclone);} catch (Exception e){}; exception.printStackTrace(); } } */