package art.servers.fleetserver.controller;
|
|
import art.library.interop.InteropParameters;
|
import art.library.interop.InteropResponse;
|
import art.library.interop.serialization.Serialization;
|
import art.library.interop.web.HttpsRequest;
|
import art.library.model.devices.Device;
|
import art.library.model.devices.DeviceAction;
|
import art.library.model.devices.DeviceStatus;
|
import art.library.model.devices.dps.types.DPSPosition;
|
import art.library.model.devices.vehicle.Vehicle;
|
import art.library.model.devices.vehicle.VehiclePosition;
|
import art.library.model.devices.vehicle.VehicleRealtime;
|
import art.servers.fleetserver.Shared;
|
import art.servers.fleetserver.configuration.ConfigurationDPS;
|
import art.library.model.devices.application.*;
|
import art.library.model.devices.colors.controller.M.M_ControllerCommands;
|
import art.library.model.devices.colors.controller.M.commands.M_ControllerCommandsSpecialDemand;
|
import art.library.model.devices.vehicle.status.VehicleStatusBusPriority;
|
import art.library.osm.OSM;
|
import art.servers.fleetserver.configuration.Configuration;
|
import art.servers.fleetserver.configuration.ConfigurationBusAction;
|
import java.net.InetAddress;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
|
|
|
public class ControllerDPS extends art.servers.controller.Controller
|
{
|
public ConfigurationDPS configurationDPS = null;
|
private int status = DeviceStatus.STATUS_ALARM;
|
private List<Application> lapplication = new ArrayList<Application>();
|
private long timestampApplications = 0;
|
private String name = null;
|
|
|
public ControllerDPS(ConfigurationDPS configurationDPS)
|
{
|
this.configurationDPS = configurationDPS;
|
this.setName(this.getClass().getName() + " : " + configurationDPS.name);
|
this.name = this.getName();
|
}
|
|
|
|
public void run()
|
{
|
Shared.traceInformation(name, "Starting");
|
|
while ((isInterrupted() == false) && (exit == false))
|
{
|
long timestamp = System.currentTimeMillis();
|
|
try
|
{
|
|
if (configurationDPS.httpsURL != null)
|
{
|
requestHTTPS();
|
}
|
|
if (configurationDPS.service != null)
|
{
|
requestINTEROP();
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
|
long sleeptime = configurationDPS.polling - (System.currentTimeMillis() - timestamp);
|
|
if (sleeptime > 0);
|
{
|
try
|
{
|
sleep(sleeptime);
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
}
|
|
Shared.traceInformation(name, "Finishing");
|
}
|
|
|
|
|
|
private void requestHTTPS()
|
{
|
try
|
{
|
String request = configurationDPS.httpsURL + "/get?operation=getPositions";
|
String user = configurationDPS.user;
|
String password = configurationDPS.password;
|
byte[] body = new byte[0];
|
// byte[] data = HttpsRequest.requestBytes(request, user, password, body);
|
DPSPosition[] lposition = (DPSPosition[])Serialization.deserialize(DPSPosition[].class, body);
|
|
for (DPSPosition position : lposition)
|
{
|
update(position, true);
|
}
|
|
}
|
catch (Exception exception)
|
{
|
Shared.printstack(name, exception);
|
}
|
|
}
|
|
|
|
|
private void requestINTEROP()
|
{
|
try
|
{
|
long timestamp = System.currentTimeMillis();
|
|
// Get applications every 5 minutes
|
|
if ((timestamp - timestampApplications) > 300000)
|
{
|
lapplication = (List<Application>)(List<?>)Arrays.asList(art.servers.Shared.model.getDevicesExternal(Application.class.getName()));
|
timestampApplications = System.currentTimeMillis();
|
}
|
|
|
// Get positions from service applications
|
|
for (Application application : lapplication)
|
{
|
if (application.getDeviceInformation().serverServiceName.equalsIgnoreCase(configurationDPS.service))
|
{
|
try
|
{
|
InteropParameters parameters = new InteropParameters();
|
parameters.addParameter("service", "dps");
|
parameters.addParameter("operation", "getPositions");
|
String address = application.getDeviceInformation().serverAddress;
|
int port = application.getDeviceInformation().serverPort;
|
InteropResponse response = Serialization.invoke("get", parameters, address, port, configurationDPS.timeout);
|
Object[] lobject = response.getValue();
|
|
for (Object object : lobject)
|
{
|
update((DPSPosition)object, false);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
}
|
|
}
|
catch (Exception exception)
|
{
|
Shared.printstack(name, exception);
|
}
|
}
|
|
|
|
|
|
|
private void update (DPSPosition position, boolean isHttps)
|
{
|
VehicleStatusBusPriority busPriority = null;
|
|
try
|
{
|
Vehicle vehicle = getVehicle(position.vehicle);
|
|
VehiclePosition vehiclePosition = new VehiclePosition();
|
vehiclePosition.ISSI = position.vehicle;
|
vehiclePosition.accuracy = (position.validGPSReading == true) ? 100 : 0;
|
vehiclePosition.reason = 0;
|
vehiclePosition.direction = position.trackAngle;
|
vehiclePosition.latitude = position.latitude;
|
vehiclePosition.longitude = position.longitude;
|
vehiclePosition.speed = (float)position.speed;
|
vehiclePosition.timeElapsed = 0;
|
vehiclePosition.timestamp = position.timestamp;
|
|
VehicleRealtime realtime = new VehicleRealtime();
|
realtime.identifier = vehicle.getIdentifier();
|
realtime.position = vehiclePosition;
|
realtime.setLastTimestampUpdate(vehiclePosition.timestamp);
|
vehicle.realtime = realtime;
|
|
// Check position for bus priority
|
busPriority = checkPosition(vehiclePosition, isHttps);
|
loggerBusPriority(busPriority, vehiclePosition, Shared.logBus);
|
|
if (vehicle.getDeviceStatus().position == null)
|
{
|
if (vehicle.getStatus() != DeviceStatus.STATUS_ONLINE)
|
{
|
Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
}
|
else
|
{
|
if ((System.currentTimeMillis() - vehicle.getLastTimestampUpdate()) >= (vehicle.getDeviceInformation().polling * 1000))
|
{
|
Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
}
|
else
|
{
|
if (busPriority != null) Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
if ((Shared.logBus == true) && (busPriority != null))
|
{
|
Shared.println(this.configurationDPS.name,Device.getDate(System.currentTimeMillis())+";BusPriority1="+Device.getDate(busPriority.timestamp)+";"+busPriority.lightcontroller+";"+busPriority.latitude+";"+busPriority.longitude+";"+busPriority.direction+";"+busPriority.speed+";Demand="+busPriority.demand+";Operation="+busPriority.operation+";Green="+busPriority.greenTime+";"+Device.getDate(vehicle.getLastTimestampUpdate())+";"+vehicle.getDeviceInformation().polling);
|
}
|
}
|
}
|
}
|
else if (vehicle.getDeviceStatus().position.timestamp < vehiclePosition.timestamp)
|
{
|
if (vehicle.getStatus() != DeviceStatus.STATUS_ONLINE)
|
{
|
Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
}
|
else
|
{
|
if ((System.currentTimeMillis() - vehicle.getLastTimestampUpdate()) >= (vehicle.getDeviceInformation().polling * 1000))
|
{
|
Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
}
|
else
|
{
|
if (busPriority != null) Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
if ((Shared.logBus == true) && (busPriority != null))
|
{
|
Shared.println(this.configurationDPS.name,Device.getDate(System.currentTimeMillis())+";BusPriority2="+Device.getDate(busPriority.timestamp)+";"+busPriority.lightcontroller+";"+busPriority.latitude+";"+busPriority.longitude+";"+busPriority.direction+";"+busPriority.speed+";Demand="+busPriority.demand+";Operation="+busPriority.operation+";Green="+busPriority.greenTime+";"+Device.getDate(vehicle.getLastTimestampUpdate())+";"+vehicle.getDeviceInformation().polling);
|
}
|
}
|
}
|
}
|
else
|
{
|
if (busPriority != null)
|
{
|
Shared.getModel().updateDevice(vehicle, vehiclePosition, busPriority);
|
}
|
}
|
}
|
catch (Exception e)
|
{
|
if ((Shared.logBus == true) && (busPriority != null))
|
{
|
Shared.println(this.configurationDPS.name,Device.getDate(System.currentTimeMillis())+";BusPriorityException="+Device.getDate(busPriority.timestamp)+";"+busPriority.lightcontroller+";"+busPriority.latitude+";"+busPriority.longitude+";"+busPriority.direction+";"+busPriority.speed+";Demand="+busPriority.demand+";Operation="+busPriority.operation+";Green="+busPriority.greenTime+";"+e.toString());
|
}
|
}
|
|
}
|
|
|
|
|
private Vehicle getVehicle(String ISSI)
|
{
|
for (Device device : Shared.model.getDevices())
|
{
|
try
|
{
|
Vehicle vehicle = (Vehicle)device;
|
|
if (vehicle.getDeviceInformation().ISSI.equalsIgnoreCase(ISSI))
|
{
|
return vehicle;
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
return null;
|
}
|
|
|
|
|
private VehicleStatusBusPriority checkPosition(VehiclePosition position, boolean isHttps)
|
{
|
try
|
{
|
Configuration configuration = (Configuration)Shared.configuration;
|
|
long difference = Math.abs(System.currentTimeMillis()-position.timestamp);
|
if (difference > (configuration.detail.maximumTimeDifferenceCheckBus*1000L))
|
{
|
logger(position, isHttps, difference, Shared.logBus);
|
return null;
|
}
|
|
logger(position, isHttps, -1, Shared.logBus);
|
|
ConfigurationBusAction actionToSend = null;
|
int operation = VehicleStatusBusPriority.OPERATION_NOTHING;
|
for (int i=0; (i<configuration.detail.lbus.size()) && (actionToSend == null); i++)
|
{
|
ConfigurationBusAction action = configuration.detail.lbus.get(i);
|
operation = checkAction(position, action);
|
if (operation != VehicleStatusBusPriority.OPERATION_NOTHING)
|
{
|
actionToSend = action;
|
}
|
}
|
|
if (actionToSend != null)
|
{
|
// Enviar informacion
|
if (operation == VehicleStatusBusPriority.OPERATION_ACTIVATION)
|
{
|
double distance = OSM.mercator.getDistance(position.latitude, position.longitude, actionToSend.latitude, actionToSend.longitude);
|
double speed = position.speed * 0.27777f; // In m/s
|
double timeCalculatedBeforeK = distance / speed;
|
double timeCalculatedK = timeCalculatedBeforeK * actionToSend.K;
|
double time = timeCalculatedK;
|
if (timeCalculatedK < actionToSend.minimumTime) time = actionToSend.minimumTime;
|
if (timeCalculatedK > actionToSend.maximumTime) time = actionToSend.maximumTime;
|
|
logger(operation, actionToSend, distance, position, timeCalculatedBeforeK, timeCalculatedK, (int)time, Shared.logBus);
|
ControllerCommand controllerCommand = new ControllerCommand(operation, actionToSend, (int)time, this);
|
controllerCommand.start();
|
|
VehicleStatusBusPriority busPriority = new VehicleStatusBusPriority();
|
busPriority.demand = actionToSend.demand;
|
busPriority.direction = (int)position.direction;
|
busPriority.operation = operation;
|
busPriority.speed = (int)position.speed;
|
busPriority.k = (float)actionToSend.K;
|
busPriority.latitude = position.latitude;
|
busPriority.lightcontroller = actionToSend.controller;
|
busPriority.greenTime = (int)time;
|
busPriority.longitude = position.longitude;
|
busPriority.timestamp = System.currentTimeMillis();
|
return(busPriority);
|
}
|
else if (operation == VehicleStatusBusPriority.OPERATION_CANCELATION)
|
{
|
double distance = OSM.mercator.getDistance(position.latitude, position.longitude, actionToSend.latitude, actionToSend.longitude);
|
|
logger(operation, actionToSend, distance, position, 0, 0, 0, Shared.logBus);
|
ControllerCommand controllerCommand = new ControllerCommand(operation, actionToSend, 0, this);
|
controllerCommand.start();
|
|
VehicleStatusBusPriority busPriority = new VehicleStatusBusPriority();
|
busPriority.demand = actionToSend.demand;
|
busPriority.direction = (int)position.direction;
|
busPriority.operation = operation;
|
busPriority.speed = (int)position.speed;
|
busPriority.k = (float)actionToSend.K;
|
busPriority.latitude = position.latitude;
|
busPriority.lightcontroller = actionToSend.controller;
|
busPriority.greenTime = 0;
|
busPriority.longitude = position.longitude;
|
busPriority.timestamp = System.currentTimeMillis();
|
return(busPriority);
|
}
|
}
|
}
|
catch (Exception e)
|
{
|
art.servers.Shared.printstack(name, e);
|
}
|
|
return(null);
|
}
|
|
|
private int checkAction(VehiclePosition position, ConfigurationBusAction action)
|
{
|
try
|
{
|
if (action.isSelectionPosition(position) == true) return(VehicleStatusBusPriority.OPERATION_ACTIVATION);
|
if (action.isCancelPosition(position) == true) return(VehicleStatusBusPriority.OPERATION_CANCELATION);
|
}
|
catch (Exception exception)
|
{
|
art.servers.Shared.printstack(name, exception);
|
}
|
|
return(VehicleStatusBusPriority.OPERATION_NOTHING);
|
}
|
|
|
|
|
// <editor-fold defaultstate="collapsed" desc="Logger">
|
|
private void logger(VehiclePosition position, boolean isHttps, long difference, boolean condition)
|
{
|
try
|
{
|
if ((condition == true) && (isHttps == true))
|
{
|
String sdifference = "";
|
if (difference > 0)
|
{
|
sdifference = ";Diff=" + difference;
|
}
|
Shared.println(this.configurationDPS.name,"Bus="+Device.getDate(position.timestamp)+";"+position.ISSI+";"+position.latitude+";"+position.longitude+";Dir="+position.direction+";Speed="+position.speed+";Acc="+position.accuracy+sdifference);
|
}
|
else if ((condition == true) && (isHttps == false))
|
{
|
String sdifference = "";
|
if (difference > 0)
|
{
|
sdifference = ";Diff=" + difference;
|
}
|
Shared.println(this.configurationDPS.name,"Bus="+Device.getDate(position.timestamp)+";"+position.ISSI+";"+position.latitude+";"+position.longitude+";Dir="+position.direction+";Speed="+position.speed+";Acc="+position.accuracy+sdifference);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
private void loggerBusPriority(VehicleStatusBusPriority busPriority, VehiclePosition position, boolean condition)
|
{
|
try
|
{
|
if ((condition == true) && (busPriority != null))
|
{
|
Shared.println(this.configurationDPS.name,Device.getDate(System.currentTimeMillis())+";BusPriority="+Device.getDate(busPriority.timestamp)+";"+busPriority.lightcontroller+";"+busPriority.latitude+";"+busPriority.longitude+";"+busPriority.direction+";"+busPriority.speed+";Demand="+busPriority.demand+";Operation="+busPriority.operation+";Green="+busPriority.greenTime+";Bus="+position.ISSI);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
private void logger(int operation, ConfigurationBusAction action, double distance, VehiclePosition position, double timeBeforeK, double timeK, int time, boolean condition)
|
{
|
try
|
{
|
if ((condition == true) && (operation == VehicleStatusBusPriority.OPERATION_ACTIVATION))
|
{
|
Shared.println(this.configurationDPS.name,"Selection;Controller="+action.controller+";Demand="+action.demand+";"+position.ISSI+";"+position.latitude+";"+position.longitude+";"+action.latitude+";"+action.longitude+";Distance="+distance+"m;Speed="+position.speed+"km/h;TimeBeforeK="+timeBeforeK+"s;TimeK="+timeK+"s;Time="+time+"s");
|
}
|
else if ((condition == true) && (operation == VehicleStatusBusPriority.OPERATION_CANCELATION))
|
{
|
Shared.println(this.configurationDPS.name,"Cancel;Controller="+action.controller+";Demand="+action.demand+";Distance="+distance+"m;"+position.ISSI);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
// </editor-fold>
|
|
|
|
public class ControllerCommand extends Thread
|
{
|
private int operation = VehicleStatusBusPriority.OPERATION_NOTHING;
|
private ConfigurationBusAction action = null;
|
private int time = 0;
|
private ControllerDPS controller = null;
|
|
|
public ControllerCommand(int operation, ConfigurationBusAction action, int time, ControllerDPS controller)
|
{
|
this.operation = operation;
|
this.action = action;
|
this.time = time;
|
this.controller = controller;
|
}
|
|
|
public void run ()
|
{
|
try
|
{
|
M_ControllerCommands commands = new M_ControllerCommands();
|
if (operation == VehicleStatusBusPriority.OPERATION_ACTIVATION)
|
{
|
commands.specialDemandSelection = new M_ControllerCommandsSpecialDemand();
|
commands.specialDemandSelection.number = action.demand;
|
commands.specialDemandSelection.time = time;
|
logger(action, time, Shared.logBus, true);
|
}
|
else if (operation == VehicleStatusBusPriority.OPERATION_CANCELATION)
|
{
|
commands.specialDemandCancel = new M_ControllerCommandsSpecialDemand();
|
commands.specialDemandCancel.number = action.demand;
|
logger(action, time, Shared.logBus, false);
|
}
|
|
Device m_controller = Shared.model.getDeviceExternal(action.controller);
|
InteropParameters parameters = new InteropParameters();
|
parameters.addParameter("operation", "sendCommands");
|
parameters.addParameter("username", Shared.getApplicationName());
|
parameters.addParameter("computer", InetAddress.getLocalHost().getHostAddress());
|
parameters.addParameter("language", Shared.configuration.general.language);
|
parameters.addParameter("identifier", m_controller.getIdentifier());
|
parameters.addBodycontent(commands);
|
InteropResponse response = m_controller.invoke("set", parameters);
|
art.servers.fleetserver.Shared.hlastActionController.replace(action.controller, System.currentTimeMillis());
|
|
Object[] lobject = response.getValue();
|
List<DeviceAction> ldeviceAction = new ArrayList<DeviceAction>();
|
for (Object object : lobject)
|
{
|
if (object instanceof DeviceAction) ldeviceAction.add((DeviceAction)object);
|
}
|
|
if (ldeviceAction.size() > 0)
|
{
|
DeviceAction deviceAction = ldeviceAction.get(0);
|
logger(action, deviceAction, Shared.logBus, (operation==VehicleStatusBusPriority.OPERATION_ACTIVATION));
|
}
|
|
}
|
catch (Exception e)
|
{
|
art.servers.Shared.printstack(name, e);
|
}
|
}
|
|
|
private void logger(ConfigurationBusAction action, int time, boolean condition, boolean selection)
|
{
|
try
|
{
|
if ((condition == true) && (selection == true))
|
{
|
Shared.println(controller.configurationDPS.name, "Selection;Controller="+action.controller+";Demand="+action.demand+";Time="+time+"s");
|
}
|
else if ((condition == true) && (selection == false))
|
{
|
Shared.println(controller.configurationDPS.name, "Cancel;Controller="+action.controller+";Demand="+action.demand);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
|
private void logger(ConfigurationBusAction action, DeviceAction deviceAction, boolean condition, boolean selection)
|
{
|
try
|
{
|
if ((condition == true) && (selection == true))
|
{
|
Shared.println(controller.configurationDPS.name, "Selection;Controller="+action.controller+";Demand="+action.demand+";Time="+time+"s;Result="+deviceAction.resultCode);
|
}
|
else if ((condition == true) && (selection == false))
|
{
|
Shared.println(controller.configurationDPS.name, "Cancel;Controller="+action.controller+";Demand="+action.demand+";Result="+deviceAction.resultCode);
|
}
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
}
|
|
|
}
|