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);
}
}