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();
}
}
*/