package art.servers.etdserver.protocols.dgt; 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.EtdInformation; 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.utils.common.NumberUtils; import art.library.utils.common.TimeUtils; import art.servers.Shared; public class EtdDgtProtocolAnalyser { public EtdDgtProtocolAnalyser () { } public void analyseResponseEyA (Etd device, int[] information) throws Exception { if (device.status == null) { device.status = createEtdStatus(device); } if ((device.getDeviceStatus().llane.size() != device.getDeviceInformation().lLane.size()) || (device.getDeviceStatus().lsection.size() != device.getDeviceInformation().lSection.size())) { device.status = createEtdStatus(device); } int status = information[0]; int alarms = information[1]; int numberOfSensors = information[2]; int[] sensorsType = new int[numberOfSensors]; int[] sensorsAlarms = new int[numberOfSensors]; int pointer = 3; EtdStatus etdStatus = device.getDeviceStatus(); boolean existSensorAlarm = false; for (int i=0; i 0) { etdStatus.total.speed = (int)(etdStatus.total.speed / etdStatus.total.counting); etdStatus.total.length = (etdStatus.total.length / etdStatus.total.counting); etdStatus.total.distance = (etdStatus.total.speed / etdStatus.total.counting); etdStatus.total.occupancy = (etdStatus.total.occupancy / etdStatus.total.counting); etdStatus.total.occupancy = NumberUtils.ajustarDecimales(etdStatus.total.occupancy, 1); etdStatus.total.length = NumberUtils.ajustarDecimales((float)(etdStatus.total.length/10d), 1); etdStatus.total.distance = NumberUtils.ajustarDecimales((float)etdStatus.total.distance, 1); if (etdStatus.total.occupancy > 100) etdStatus.total.occupancy = 100; if (etdStatus.total.occupancy < 0) etdStatus.total.occupancy = 0; if (etdStatus.total.length < 0) etdStatus.total.length = 0; if (etdStatus.total.distance < 0) etdStatus.total.distance = 0; if (etdStatus.total.speed < 0) etdStatus.total.speed = 0; } for (EtdStatusLane sectionStatus : etdStatus.lsection) { sectionStatus.speed = (int)(sectionStatus.speed / sectionStatus.counting); sectionStatus.length = (sectionStatus.length / sectionStatus.counting); sectionStatus.distance = (sectionStatus.speed / sectionStatus.counting); sectionStatus.occupancy = (sectionStatus.occupancy / sectionStatus.counting); sectionStatus.occupancy = NumberUtils.ajustarDecimales(sectionStatus.occupancy, 1); sectionStatus.length = NumberUtils.ajustarDecimales((float)(sectionStatus.length/10d), 1); sectionStatus.distance = NumberUtils.ajustarDecimales((float)sectionStatus.distance, 1); if (sectionStatus.occupancy > 100) sectionStatus.occupancy = 100; if (sectionStatus.occupancy < 0) sectionStatus.occupancy = 0; if (sectionStatus.length < 0) sectionStatus.length = 0; if (sectionStatus.distance < 0) sectionStatus.distance = 0; if (sectionStatus.speed < 0) sectionStatus.speed = 0; } } private int fillDoubleDetectors (Etd device, EtdStatus etdStatus, int[] information, int index) throws Exception { int pointer = index; try { int numberOfSensors = information[pointer++]; for (int j=0; j 100) laneStatus.occupancy = 100; if (laneStatus.occupancy < 0) laneStatus.occupancy = 0; if (laneStatus.length < 0) laneStatus.length = 0; if (laneStatus.distance < 0) laneStatus.distance = 0; if (laneStatus.speed < 0) laneStatus.speed = 0; int numberOfClassifications = information[pointer++]; if (device.getIdentifier().equalsIgnoreCase("01etd02-a2") == true) { System.out.println(Device.getDate(System.currentTimeMillis()) + " - " + device.getIdentifier() + " - #Classif: " + detectorNumber); } for (int k=0; k 100) laneStatus.occupancy = 100; if (laneStatus.occupancy < 0) laneStatus.occupancy = 0; laneStatus.congestionDetection = (information[pointer++]==0x01); addLaneToTotal(device, laneStatus, etdStatus); EtdInformationSection sectionInformation = getSectionInformationLane(device.getDeviceInformation(), laneStatus.number); if (sectionInformation != null) { EtdStatusLane sectionStatus = etdStatus.getSection(sectionInformation.number); addLaneToSection(device, laneStatus, sectionStatus); } } } catch (Exception e) { e.printStackTrace(); } return(pointer); } private void addLaneToTotal (Etd device, EtdStatusLane laneStatus, EtdStatus etdStatus) { etdStatus.total.status = DeviceStatus.STATUS_ONLINE; etdStatus.total.correctMeasurements += 1; etdStatus.total.counting += laneStatus.counting; etdStatus.total.speed += (laneStatus.counting*laneStatus.speed); etdStatus.total.occupancy += (laneStatus.counting*laneStatus.occupancy); etdStatus.total.length += (laneStatus.counting*laneStatus.length); etdStatus.total.distance += (laneStatus.counting*laneStatus.distance); etdStatus.total.unclassified += laneStatus.unclassified; for (int i=0; i 0) && (device.getDeviceInformation().lSpeedClassification.size() > numberOfValues)) { EtdInformation etdInformation = device.getDeviceInformation(); etdInformation.lSpeedClassification.clear(); for (int i=0; i