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 lapplication = new ArrayList(); 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)(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 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); } // 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) { } } // 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 ldeviceAction = new ArrayList(); 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) { } } } }