package art.servers.etdserver.protocols.diamond; 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.status.EtdStatusLane; import art.library.interop.serialization.Serialization; import art.library.model.devices.etd.status.EtdStatusVehicle; import art.servers.etdserver.Shared; import art.servers.etdserver.controller.ControllerEtd; import art.servers.etdserver.protocols.diamond.configuration.DIAMOND_LengthBinnedData; import art.servers.etdserver.protocols.diamond.configuration.DIAMOND_SpeedBinnedData; import art.servers.etdserver.protocols.diamond.file.DIAMOND_Binned; import art.servers.etdserver.protocols.diamond.file.DIAMOND_File; import art.servers.etdserver.protocols.diamond.files.DIAMOND_Directory; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.StringTokenizer; public class Diamond_ProtocolAnalyser { public static final int MASK_CHAR = 0x7D; public static final int FLAG_CHAR = 0x7E; public static int[] getData(int[] command) { int[] result = new int[command.length-3]; System.arraycopy(command, 1, result, 0, result.length); return(unapplyMask(result)); } public static int[] unapplyMask(int[] command) { try { int newLength = 0; for (int i=0; i analyseVehicleResponse(Etd device, String response) throws Exception { try { List lvehicle = new ArrayList(); // System.out.println(device.getIdentifier() + " - ResponseVehicles: " + response); StringTokenizer strtokVehicles = new StringTokenizer(response, "\n"); int countVehicles = strtokVehicles.countTokens(); for (int c=0; c -1) && (str.indexOf(".") < 0)) { vehicle.lane = Integer.parseInt(str.replaceAll("\\*", "").replaceAll(":", "")); } else if ((str.indexOf(":") > -1) && (str.indexOf(".") > -1)) { String stime = str + "0"; StringTokenizer strtokTime = new StringTokenizer(stime, ":"); int count2 = strtokTime.countTokens(); int hour = Integer.parseInt(strtokTime.nextToken()); int min = Integer.parseInt(strtokTime.nextToken()); String ssec = strtokTime.nextToken(); StringTokenizer strtokSeconds = new StringTokenizer(ssec, "."); int seconds = Integer.parseInt(strtokSeconds.nextToken()); int milliseconds = Integer.parseInt(strtokSeconds.nextToken()); Calendar calCurrent = Calendar.getInstance(); calCurrent.setTimeInMillis(System.currentTimeMillis()); if ((calCurrent.get(Calendar.HOUR_OF_DAY) == 0) && (hour == 23)) { // Es un vehiculo detectado en el cambio de día Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(calCurrent.getTimeInMillis()); cal.set(Calendar.DATE, cal.get(Calendar.DATE)-1); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, min); cal.set(Calendar.SECOND, seconds); cal.set(Calendar.MILLISECOND, milliseconds); vehicle.timestamp = cal.getTimeInMillis(); } else { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(calCurrent.getTimeInMillis()); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, min); cal.set(Calendar.SECOND, seconds); cal.set(Calendar.MILLISECOND, milliseconds); vehicle.timestamp = cal.getTimeInMillis(); } } else { if (str.indexOf("kph") > -1) { vehicle.speed = Double.parseDouble(str.substring(0, str.indexOf("kph"))); } else if (str.indexOf("cm") > -1) { vehicle.length = Integer.parseInt(str.substring(0, str.indexOf("cm"))); } else if (str.indexOf("SnMis") > -1) { vehicle.speed = 0d; vehicle.length = 0; vehicle.axles = 0; vehicle.axlesSpacing = new int[0]; } else if (str.indexOf("S#") > -1) { // vehicle.speedBin = Integer.parseInt(str.substring(str.indexOf("S#")+2)); } else if (str.indexOf("L#") > -1) { // vehicle.lengthBin = Integer.parseInt(str.substring(str.indexOf("L#")+2)); } } } lvehicle.add(vehicle); } else { } } return(lvehicle); } catch (Exception e) { throw e; } } public static boolean analyseRetrieveFileDataContent(Etd etdoriginal, Etd etd, DIAMOND_File file, DIAMOND_LengthBinnedData lengthBinnedData, DIAMOND_SpeedBinnedData speedBinnedData) throws Exception { long millis = System.currentTimeMillis(); boolean delete = false; EtdInformation information = etd.getDeviceInformation(); int periods = file.ltimestamps.size(); periods = Math.min(periods, file.lbinnedSpeed.size()); periods = Math.min(periods, file.lbinnedLength.size()); DiamondLengthRelation[] lengthRelations8 = createLengthRelations8(); DiamondLengthRelation[] lengthRelations9 = createLengthRelations9(); DiamondLengthRelation[] lengthRelations11 = createLengthRelations11(); Shared.println(etd.information.name, "1.ANALYSE: #periods: " + periods + " - DIF: " + (System.currentTimeMillis()-millis)); for (int i=0; i lastTimestamp) { Shared.println(etd.information.name, "2.ANALYSE: period[" + i + "] LAST: " + new Date(lastTimestamp).toString() + " PERIOD: " + new Date(timestampPeriod).toString() + " - DIF: " + (System.currentTimeMillis()-millis)); Etd etdData = (Etd)Serialization.clone(etd); EtdStatus status = etdData.getDeviceStatus(); status.period = etdData.getDeviceInformation().period; if (status.llane.size() < information.lLane.size()) { for (int f=status.llane.size(); f information.lLane.size()) { for (int f=status.llane.size()-1; f>=information.lLane.size(); f--) { status.llane.remove(status.llane.size()-1); } } for (int f=0; f information.lSection.size()) { for (int f=status.lsection.size()-1; f>=information.lSection.size(); f--) { status.lsection.remove(status.lsection.size()-1); } } for (int f=0; f 0) { status.llane.get(l).speed = (int)((speed / (float)total) / 10); } } } else if ((nlanes*2) == file.llaneConfiguration.size()) { // With directional lanes DIAMOND_Binned binnedSpeed = file.lbinnedSpeed.get(i); for (int l=0; l= 0) { speeds2 = binnedSpeed.valores[oppositeLane]; } int total = 0; for (int s=0; s 0) { status.llane.get(l).speed = (int)((speed / (float)total) / 10); } } } } catch (Exception e) { e.printStackTrace(); } try { int nlanes = etdData.getDeviceInformation().lLane.size(); if (nlanes == file.llaneConfiguration.size()) { // Without directional lanes DIAMOND_Binned binnedLength = file.lbinnedLength.get(i); for (int l=0; l= 0) { lengths2 = binnedLength.valores[oppositeLane]; } DiamondLengthRelation[] relations = null; if (lengths1.length == 8) relations = lengthRelations8; if (lengths1.length == 9) relations = lengthRelations9; if (lengths1.length == 11) relations = lengthRelations11; for (int s=0; s 0) { String message = art.servers.Shared.getMessage("Etd online"); try { art.servers.Shared.println(((ControllerEtd)art.servers.Shared.getDeviceController(etdData.getIdentifier())).getControllerName(), message); } catch (Exception e) { e.printStackTrace(); } } etdData.setAlarm("alarm_offline", false); etdData.setAlarm("alarm_invalid", false); // if (i == periods-1) { // CHECK // Shared.model.updateDeviceStatus(etdData, etdData.getDeviceStatus().measurementTimestamp); etdData.setLastTimestampStatusUpdate(etdData.getDeviceStatus().measurementTimestamp); Shared.println(etd.information.name, "3.ANALYSE: period[" + i + "] LAST: " + new Date(lastTimestamp).toString() + " PERIOD: " + etdData.getDeviceStatus().getMeasurementTimestamp() + " - DIF: " + (System.currentTimeMillis()-millis)); } // Fill maxSpeed, overspeedCars, heavyTrucks int speedLimit = etdData.getDeviceInformation().speedLimit; if (speedLimit <= 0) { speedLimit = getSpeedLimit(etd.getIdentifier()); } for (int l=0; l= 7) { if ((j == 3) || (j == 4) || (j == 5)) totalTrucksLane += laneStatus.lengths[j]; } } laneStatus.overspeedCars = 0; for (int k=0; k 0) { laneStatus.maxSpeed = (double)((double)etdData.getDeviceInformation().lSpeedClassification.get(k).upperLimit + (double)etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit) / 2d; if (etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit >= speedLimit) { laneStatus.overspeedCars += laneStatus.speeds[k]; } } } if (totalVehiclesLane > 0) { laneStatus.heavyTrucks = (float)((float)totalTrucksLane / (float)totalVehiclesLane) * 100f; int heavyTrucks = (int)(laneStatus.heavyTrucks*100f); laneStatus.heavyTrucks = (float)((float)heavyTrucks / 100f); } if (laneStatus.maxSpeed > 0) { int maxSpeed = (int)(laneStatus.maxSpeed*100d); laneStatus.maxSpeed = (double)((double)maxSpeed / 100d); } } for (int s=0; s= 7) { if ((j == 3) || (j == 4) || (j == 5)) totalTrucksLane += sectionStatus.lengths[j]; } } sectionStatus.overspeedCars = 0; for (int k=0; k 0) { sectionStatus.maxSpeed = (double)((double)etdData.getDeviceInformation().lSpeedClassification.get(k).upperLimit + (double)etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit) / 2d; if (etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit >= speedLimit) { sectionStatus.overspeedCars += sectionStatus.speeds[k]; } } } if (totalVehiclesLane > 0) { sectionStatus.heavyTrucks = (float)((float)totalTrucksLane / (float)totalVehiclesLane) * 100f; int heavyTrucks = (int)(sectionStatus.heavyTrucks*100f); sectionStatus.heavyTrucks = (float)((float)heavyTrucks / 100f); } if (sectionStatus.maxSpeed > 0) { int maxSpeed = (int)(sectionStatus.maxSpeed*100d); sectionStatus.maxSpeed = (double)((double)maxSpeed / 100d); } } EtdStatusLane totalStatus = etdData.getDeviceStatus().total; int totalTrucksLane = 0; int totalVehiclesLane = totalStatus.counting; for (int j=0; j= 7) { if ((j == 3) || (j == 4) || (j == 5)) totalTrucksLane += totalStatus.lengths[j]; } } totalStatus.overspeedCars = 0; for (int k=0; k 0) { totalStatus.maxSpeed = (double)((double)etdData.getDeviceInformation().lSpeedClassification.get(k).upperLimit + (double)etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit) / 2d; if (etdData.getDeviceInformation().lSpeedClassification.get(k).lowerLimit >= speedLimit) { totalStatus.overspeedCars += totalStatus.speeds[k]; } } } if (totalVehiclesLane > 0) { totalStatus.heavyTrucks = (float)((float)totalTrucksLane / (float)totalVehiclesLane) * 100f; int heavyTrucks = (int)(totalStatus.heavyTrucks*100f); totalStatus.heavyTrucks = (float)((float)heavyTrucks / 100f); } if (totalStatus.maxSpeed > 0) { int maxSpeed = (int)(totalStatus.maxSpeed*100d); totalStatus.maxSpeed = (double)((double)maxSpeed / 100d); } Shared.println(etd.information.name, "4.ANALYSE: period[" + i + "] LAST: " + new Date(lastTimestamp).toString() + " PERIOD: " + etdData.getDeviceStatus().getMeasurementTimestamp() + " - DIF: " + (System.currentTimeMillis()-millis) + " - " + new Date(etdoriginal.getLastTimestampStatusUpdate()) + " - " + new Date(etdData.getLastTimestampStatusUpdate())); Shared.model.updateDevice(etdoriginal, etdData); Shared.println(etd.information.name, "5.ANALYSE: period[" + i + "] LAST: " + new Date(lastTimestamp).toString() + " PERIOD: " + etdData.getDeviceStatus().getMeasurementTimestamp() + " - DIF: " + (System.currentTimeMillis()-millis) + " - " + new Date(etdoriginal.getLastTimestampStatusUpdate()) + " - " + new Date(etdData.getLastTimestampStatusUpdate())); delete = true; } } catch (Exception e) { e.printStackTrace(); } } if (delete == false) { if (etd.alarms.alarm_offline > 0) { String message = art.servers.Shared.getMessage("Etd online"); art.servers.Shared.println(((ControllerEtd)art.servers.Shared.getDeviceController(etd.getIdentifier())).getControllerName(), message); } etd.setAlarm("alarm_offline", false); etd.setAlarm("alarm_invalid", false); Shared.model.updateDevice(etdoriginal, etd); } try { ((ControllerEtd)art.servers.Shared.getDeviceController(etd.getIdentifier())).errorsNumber = 0; String message = "Errors=0"; art.servers.Shared.println(((ControllerEtd)art.servers.Shared.getDeviceController(etd.getIdentifier())).getControllerName(), message); } catch (Exception e) { } return(delete); } private static DiamondLengthRelation[] createLengthRelations8() { DiamondLengthRelation[] result = new DiamondLengthRelation[8]; for (int i=0; i= 0x30) && (firstChar <= 0x39))) && (response.indexOf(":") > -1)) { return(true); } } catch (Exception e) { } return(false); } private static int getSpeedLimit(String etdIdentifier) { try { if (etdIdentifier.equalsIgnoreCase("etd-krzewica-1")) return(90); if (etdIdentifier.equalsIgnoreCase("etd-terespol-1")) return(90); if (etdIdentifier.equalsIgnoreCase("etd-wólkaokopska-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-żyrzyn-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-piaski-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-łopienniknadrzeczny-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-izbica-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-łabuniereforma-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-polanówka-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-hrebenne-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-międzyrzecpodlaski-1")) return(100); if (etdIdentifier.equalsIgnoreCase("etd-radzyńpodlaski-1")) return(90); if (etdIdentifier.equalsIgnoreCase("etd-sobieszyn-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-annopol-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-szczebrzeszyn-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-miączyn-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-łęczna-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-włodawa-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-wisznice-1")) return(70); if (etdIdentifier.equalsIgnoreCase("etd-sławatycze-1")) return(50); if (etdIdentifier.equalsIgnoreCase("etd-staraprawda-1")) return(60); } catch (Exception e) { e.printStackTrace(); } return(70); } }