package art.servers.tickermachineserver.controller; import art.library.interop.InteropParameter; import art.library.interop.InteropParameters; import art.library.interop.InteropResponse; import art.library.interop.serialization.Serialization; import art.library.interop.serialization.SerializationException; import art.library.model.devices.Device; import art.library.model.devices.DeviceAction; import art.library.model.devices.DeviceRealtime; import art.library.model.devices.DeviceStatus; import art.library.model.devices.ticketmachine.TicketMachine; import art.library.model.devices.ticketmachine.TicketMachineAlarms; import art.library.model.devices.ticketmachine.TicketMachineRealtime; import art.library.model.devices.ticketmachine.information.TickeMachineInformationConnection; import art.servers.Shared; import art.servers.controller.ControllerDevice; import java.net.Socket; import java.util.Arrays; import java.util.Date; public class ControllerTicketMachine extends ControllerDevice { private Socket socket = null; private TicketMachine device = null; private String name = null; private long lastUpdateTimestampDevices = 0; private long lastUpdateTimestampDevicesRealtime = 0; private boolean connected = false; private boolean firstTime = false; public ControllerTicketMachine(Device device) { super(device); this.device = (TicketMachine)device; this.name = Shared.getMessage("Controller ticketmachine") + " " + device.information.name; } public TicketMachine getTicketMachine() { return device; } public void run() { art.servers.Shared.traceInformation(name, "Starting"); while ((isInterrupted() == false) && (exit == false)) { long startTimestamp = System.currentTimeMillis(); lastUpdateTimestampDevices = updateStatus(lastUpdateTimestampDevices); long stopTimestamp = startTimestamp + (device.getDeviceInformation().polling * 1000); while ((System.currentTimeMillis() < stopTimestamp) && (exit == false)) { try { sleep(50); } catch (Exception e) { } } if (Shared.model.existsDevice(device.getIdentifier()) == false) { Shared.println(name, Shared.getMessage("Device no longer exists")); exit = true; } } art.servers.Shared.traceInformation(name, "Finishing"); } // public DeviceAction[] sendCommands(InteropParameters parameters) throws SerializationException { return new DeviceAction[0]; } // private void connect() throws Exception { try { if (socket != null) { if (this.connected == true) { return; } } TickeMachineInformationConnection connection = device.getDeviceInformation().connection; socket = new Socket(connection.address, connection.port); socket.setSoTimeout(connection.timeout); this.connected = true; } catch (Exception e) { e.printStackTrace(); try{disconnect();} catch (Exception ex){}; throw e; } } private void disconnect() { try { socket.close(); }catch (Exception e) {} socket = null; this.connected = false; } private long updateStatus(long timestamp) { TicketMachine deviceclone = (TicketMachine)Shared.model.cloneDevice(device.getIdentifier()); try { System.out.println(new Date().toString() + " - 1.UpdateStatus: " + device.getIdentifier()); connect(); InteropParameters parameters = new InteropParameters(); parameters.addParameter(new InteropParameter("service", name)); parameters.addParameter(new InteropParameter("operation", "getDevices")); parameters.addParameter(new InteropParameter("language", Shared.configuration.general.language)); parameters.addParameter(new InteropParameter("timestamp", String.valueOf(timestamp))); InteropResponse response = (InteropResponse)Serialization.invoke("get", parameters, socket); System.out.println(new Date().toString() + " - 2.UpdateStatus: " + device.getIdentifier()); Device[] devices = Arrays.copyOf(response.getValue(), response.getValue().length, Device[].class); System.out.println(new Date().toString() + " - 3.UpdateStatus: " + device.getIdentifier() + " - " + devices.length); long lastTimestampUpdate = timestamp; for (Device device : devices) { lastTimestampUpdate = Math.max(lastTimestampUpdate, device.getLastTimestampUpdate()); TicketMachine ticketmachine = (TicketMachine)device; TicketMachineAlarms alarms = ticketmachine.getDeviceAlarms(); deviceclone.setAlarm("alarm_printer_offline", ticketmachine.getDeviceAlarms().alarm_printer_offline); deviceclone.setAlarm("alarm_printer_paper_warning", ticketmachine.getDeviceAlarms().alarm_printer_paper_warning); deviceclone.setAlarm("alarm_printer_paper_alarm", ticketmachine.getDeviceAlarms().alarm_printer_paper_alarm); deviceclone.setAlarm("alarm_printer_paper_drag_motor", ticketmachine.getDeviceAlarms().alarm_printer_paper_drag_motor); deviceclone.setAlarm("alarm_printer_paper_drag_motor", ticketmachine.getDeviceAlarms().alarm_printer_emitter_motor); deviceclone.setAlarm("alarm_printer_cover", ticketmachine.getDeviceAlarms().alarm_printer_cover); deviceclone.setAlarm("alarm_printer_notch_place_over_sensor", ticketmachine.getDeviceAlarms().alarm_printer_notch_place_over_sensor); deviceclone.setAlarm("alarm_printer_spooling", ticketmachine.getDeviceAlarms().alarm_printer_spooling); deviceclone.setAlarm("alarm_printer_head_temperature", ticketmachine.getDeviceAlarms().alarm_printer_head_temperature); deviceclone.setAlarm("alarm_printer_power_supply_voltage", ticketmachine.getDeviceAlarms().alarm_printer_power_supply_voltage); deviceclone.setAlarm("alarm_printer_paper_jam", ticketmachine.getDeviceAlarms().alarm_printer_paper_jam); deviceclone.setAlarm("alarm_printer_notch_search", ticketmachine.getDeviceAlarms().alarm_printer_notch_search); deviceclone.setAlarm("alarm_printer_cutter", ticketmachine.getDeviceAlarms().alarm_printer_cutter); deviceclone.setAlarm("alarm_printer_bulkhead_paper_path", ticketmachine.getDeviceAlarms().alarm_printer_bulkhead_paper_path); deviceclone.setAlarm("alarm_printer_ram", ticketmachine.getDeviceAlarms().alarm_printer_ram); deviceclone.setAlarm("alarm_printer_eprom", ticketmachine.getDeviceAlarms().alarm_printer_eprom); deviceclone.setAlarm("alarm_printer_emitter", ticketmachine.getDeviceAlarms().alarm_printer_emitter); if ((alarms.alarm_printer_paper_alarm > 0) || (alarms.alarm_printer_paper_warning > 0) || (alarms.alarm_printer_paper_jam > 0)) { deviceclone.getDeviceStatus().paper = DeviceStatus.STATE_YES; } else { deviceclone.getDeviceStatus().paper = DeviceStatus.STATE_NONE; } if ((alarms.alarm_printer_paper_drag_motor > 0) || (alarms.alarm_printer_emitter_motor > 0)) { deviceclone.getDeviceStatus().hardware = DeviceStatus.STATE_YES; } else { deviceclone.getDeviceStatus().hardware = DeviceStatus.STATE_NONE; } if ((alarms.alarm_printer_offline > 0) || (alarms.alarm_printer_cover > 0) || (alarms.alarm_printer_notch_place_over_sensor > 0) || (alarms.alarm_printer_spooling > 0) || (alarms.alarm_printer_head_temperature > 0) || (alarms.alarm_printer_power_supply_voltage > 0) || (alarms.alarm_printer_notch_search > 0) || (alarms.alarm_printer_cutter > 0) || (alarms.alarm_printer_bulkhead_paper_path > 0) || (alarms.alarm_printer_ram > 0) || (alarms.alarm_printer_eprom > 0) || (alarms.alarm_printer_emitter > 0)) { deviceclone.getDeviceStatus().printer = DeviceStatus.STATE_YES; } else { deviceclone.getDeviceStatus().printer = DeviceStatus.STATE_NONE; } } // Update realtime lastUpdateTimestampDevicesRealtime = getDeviceRealtime(deviceclone, lastUpdateTimestampDevicesRealtime); online(deviceclone); return lastTimestampUpdate; } catch (Exception exception) { exception.printStackTrace(); disconnect(); try{offline(deviceclone);} catch (Exception e){}; } return(timestamp); } private long getDeviceRealtime(TicketMachine deviceclone, long timestamp) { try { InteropParameters parameters = new InteropParameters(); parameters.addParameter(new InteropParameter("service", name)); parameters.addParameter(new InteropParameter("operation", "getDeviceRealtime")); parameters.addParameter(new InteropParameter("language", Shared.configuration.general.language)); parameters.addParameter(new InteropParameter("identifier", deviceclone.getIdentifier())); parameters.addParameter(new InteropParameter("timestamp", String.valueOf(timestamp))); InteropResponse response = (InteropResponse)Serialization.invoke("get", parameters, socket); System.out.println(new Date().toString() + " - 1.UpdateRealtime: " + device.getIdentifier()); DeviceRealtime[] devices = Arrays.copyOf(response.getValue(), response.getValue().length, DeviceRealtime[].class); System.out.println(new Date().toString() + " - 2.UpdateRealtime: " + device.getIdentifier() + " - " + devices.length); long lastTimestampUpdate = timestamp; for (DeviceRealtime device : devices) { TicketMachineRealtime ticketmachine = (TicketMachineRealtime)device; lastTimestampUpdate = Math.max(lastTimestampUpdate, ticketmachine.paper.timestampLastChange); deviceclone.realtime = ticketmachine; } return lastTimestampUpdate; } catch (Exception e) { e.printStackTrace(); } return(timestamp); } private void offline(TicketMachine deviceclone) throws SerializationException { if ((device.alarms.alarm_offline <= 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("TicketMachine offline"); art.servers.Shared.println(name, message); } deviceclone.setAlarm("alarm_offline", System.currentTimeMillis()); Shared.model.updateDevice(device, deviceclone); } private void online(TicketMachine deviceclone) throws SerializationException { if ((device.alarms.alarm_offline > 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("TicketMachine online"); art.servers.Shared.println(name, message); } deviceclone.setAlarm("alarm_offline", false); deviceclone.setAlarm("alarm_invalid", false); Shared.model.updateDevice(device, deviceclone); } }