package art.servers.colorsserver.controller; import art.servers.colorsserver.Shared; import art.library.interop.serialization.Serialization; import art.library.model.devices.Device; import art.library.model.devices.DeviceCommands; import art.library.model.devices.DeviceStatus; import art.library.model.devices.colors.controller.M.M_Controller; import art.library.model.devices.colors.controller.M.M_ControllerCommands; import art.library.model.devices.colors.controller.M.M_ControllerRealtime; import art.library.model.devices.colors.controller.M.M_ControllerStatus; import art.library.model.devices.colors.controller.M.M_ControllerStatusSubcontroller; import art.library.model.devices.colors.controller.M.M_SubcontrollerConfiguration; import art.library.model.devices.colors.controller.M.configuration.M_Plan; import art.library.model.devices.colors.controller.M.realtime.M_ControllerRealtimeSubcontroller; import art.servers.ServerException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class ControllerRtacController extends ControllerController { private SimpleDateFormat sdh = new SimpleDateFormat("HH:mm"); private long lastTimestamp = 0; private int status = DeviceStatus.STATUS_ALARM; private long lastQueryDetectorsRealtime = 0; private long lastQueryGroupsRealtime = 0; private long lastQueryStatus = 0; private long lastQueryTrafficData = 0; private long lastQueryTables = 0; private boolean firstTime = true; public ControllerRtacController(M_Controller controller, boolean hasCRC) { super(controller, hasCRC); this.name = Shared.getMessage("Controller junction ") + " " + controller.information.name; super.setName(this.name); } public void run() { String message = Shared.getMessage("Running"); Shared.controllerStatus.setStatus(DeviceStatus.STATUS_ONLINE, name, message); Shared.logger.saveAnnotation(name, Shared.getMessage("Running")); while ((isInterrupted() == false) && (exit == false)) { long startTimestamp = System.currentTimeMillis(); try { if (art.servers.Shared.isServerEnabled() == true) { update(); } } catch (Exception e) { } try { long stopTimestamp = startTimestamp + 1000; while ((System.currentTimeMillis() < stopTimestamp) && (exit == false)) { try { sleep(50); } catch (Exception e) { } } try{sleep(50);}catch (Exception e){}; } catch (Exception e) { try { sleep(1000); } catch (Exception ex) { } } } Shared.controllerStatus.removeStatus(name); message = art.servers.Shared.getMessage("Interrupted"); } // private void update() throws ServerException, Exception { boolean queryDetectorsRealtime = (((System.currentTimeMillis()-lastQueryDetectorsRealtime) >= (controller.getDeviceInformation().pollingRealtime*1000L)) && (controller.getDeviceStatus().detectorsRealtime == M_ControllerStatus.YES)); boolean queryGroupsRealtime = (((System.currentTimeMillis()-lastQueryGroupsRealtime) >= (controller.getDeviceInformation().pollingRealtime*1000L)) && (controller.getDeviceStatus().groupsRealtime == M_ControllerStatus.YES)); boolean queryStatus = ((System.currentTimeMillis()-lastQueryStatus) >= (controller.getDeviceInformation().pollingStatus*1000L)); boolean queryTrafficData = (((System.currentTimeMillis()-lastQueryTrafficData) >= (controller.getDeviceInformation().pollingTrafficData*1000L))); // && (controller.getDeviceStatus().realTime == true)); boolean queryTables = ((System.currentTimeMillis()-lastQueryTables) >= (controller.getDeviceInformation().pollingTables*1000L)); // System.out.println(controller.getIdentifier() + " - " + (System.currentTimeMillis()-lastQueryTables) + " - " + (controller.getDeviceInformation().pollingTables*1000L)); M_Controller controllerclone = null; if ((queryDetectorsRealtime == true) || (queryGroupsRealtime == true) || (queryStatus == true) || (queryTrafficData == true) || (queryTables == true)) { controllerclone = (M_Controller)Serialization.clone(controller); controllerclone.realtime = controller.realtime; if (controllerclone.realtime == null) { controllerclone.realtime = new M_ControllerRealtime(); } controllerclone.getDeviceRealtime().identifier = controllerclone.getIdentifier(); if (controllerclone.getDeviceRealtime().lastTimestampUpdate <= 0) { controllerclone.getDeviceRealtime().lastTimestampUpdate = System.currentTimeMillis(); } if (forceRealtime == 0) { controllerclone.getDeviceStatus().detectorsRealtime = M_ControllerStatus.NO; controllerclone.getDeviceStatus().groupsRealtime = M_ControllerStatus.NO; controllerclone.getDeviceRealtime().lpresence.clear(); controllerclone.getDeviceRealtime().lgroup.clear(); forceRealtime = -1; } else if (forceRealtime == 1) { controllerclone.getDeviceStatus().detectorsRealtime = M_ControllerStatus.YES; controllerclone.getDeviceStatus().groupsRealtime = M_ControllerStatus.YES; forceRealtime = -1; } for (int i=0; i 0) { // d - 1 min (Detectores contaje) getCurrentCountingDetectors(controllerclone); } lastQueryTrafficData = System.currentTimeMillis(); } checkNewUpdateCommands(controllerclone); if ((queryDetectorsRealtime == true) || (queryGroupsRealtime == true) || (queryStatus == true) || (queryTrafficData == true) || (queryTables == true)) { online(controllerclone); } checkUpdateStatus(controllerclone); } catch (Exception exception) { offline(controllerclone); } } private void offline(M_Controller controllerclone)throws Exception { if (this.lcontroller.size() == 0) { if ((controllerclone.alarms.alarm_offline <= 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Controller offline"); art.servers.Shared.controllerStatus.setStatus(DeviceStatus.STATUS_ALARM, name, message); art.servers.Shared.logger.saveAnnotation(name, message); } controllerclone.setAlarm("alarm_offline", System.currentTimeMillis()); if (controllerclone.getDeviceStatus().lsubcontrollerUpdate != null) { if (controllerclone.getDeviceStatus().lsubcontrollerUpdate.size() <= 0) { controllerclone.getDeviceStatus().lsubcontrollerUpdate = null; } } try { controllerclone.getDeviceRealtime().lcounting.clear(); controllerclone.getDeviceRealtime().lgroup.clear(); controllerclone.getDeviceRealtime().lpresence.clear(); } catch (Exception e) { } Shared.model.updateDevice(controller, controllerclone); } else if (this.lcontroller.size() > 0) { if ((controllerclone.alarms.alarm_offline <= 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Controller offline"); art.servers.Shared.controllerStatus.setStatus(DeviceStatus.STATUS_ALARM, name, message); art.servers.Shared.logger.saveAnnotation(name, message); } controllerclone.setAlarm("alarm_offline", System.currentTimeMillis()); controllerclone.getDeviceInformation().serverAddress = art.servers.Shared.configuration.listener.address; controllerclone.getDeviceInformation().serverPort = art.servers.Shared.configuration.listener.port; controllerclone.getDeviceInformation().serverAddressExternal = art.servers.Shared.configuration.listener.addressExternal; controllerclone.getDeviceInformation().serverPortExternal = art.servers.Shared.configuration.listener.portExternal; controllerclone.getDeviceInformation().serverServiceName = art.servers.Shared.controllerStatus.getApplication().getDeviceInformation().serverServiceName; if (controllerclone.getDeviceStatus().lsubcontrollerUpdate != null) { if (controllerclone.getDeviceStatus().lsubcontrollerUpdate.size() <= 0) { controllerclone.getDeviceStatus().lsubcontrollerUpdate = null; } } try { controllerclone.getDeviceRealtime().lcounting.clear(); controllerclone.getDeviceRealtime().lgroup.clear(); controllerclone.getDeviceRealtime().lpresence.clear(); } catch (Exception e) { } this.controller.updateDevice(controllerclone); // Have more than one subcontroller // Must be clone for every subcontroller for (M_Controller m_controllerSubcontroller : this.lcontroller) { int subcontroller = m_controllerSubcontroller.getDeviceInformation().subcontroller; M_Controller m_subcontroller = Serialization.clone(controllerclone); m_subcontroller.realtime = Serialization.clone(controllerclone.getDeviceRealtime()); m_subcontroller.getDeviceRealtime().identifier = m_controllerSubcontroller.getIdentifier(); // Update M_ControllerInformation with subcontroller information m_subcontroller.information = m_controllerSubcontroller.getDeviceInformation(); // Remove from M_ControllerConfiguration.lsubcontroller the other subcontrollers List lremoveConfiguration = new ArrayList(); for (M_SubcontrollerConfiguration subcontrollerConfiguration : m_subcontroller.getDeviceConfiguration().lsubcontroller) { if (subcontrollerConfiguration.number != subcontroller) { lremoveConfiguration.add(subcontrollerConfiguration); } } m_subcontroller.getDeviceConfiguration().lsubcontroller.removeAll(lremoveConfiguration); // Remove from M_ControllerStatus.lsubcontroller the other subcontrollers List lremoveStatus = new ArrayList(); for (M_ControllerStatusSubcontroller subcontrollerStatus : m_subcontroller.getDeviceStatus().lsubcontroller) { if (subcontrollerStatus.number != subcontroller) { lremoveStatus.add(subcontrollerStatus); } } m_subcontroller.getDeviceStatus().lsubcontroller.removeAll(lremoveStatus); if (m_subcontroller.getDeviceStatus().lsubcontrollerUpdate != null) { // Remove from M_ControllerStatus.lsubcontrollerUpdate the other subcontrollers List lremoveStatusUpdate = new ArrayList(); for (M_ControllerStatusSubcontroller subcontrollerStatusUpdate : m_subcontroller.getDeviceStatus().lsubcontrollerUpdate) { if (subcontrollerStatusUpdate.number != subcontroller) { lremoveStatusUpdate.add(subcontrollerStatusUpdate); } } m_subcontroller.getDeviceStatus().lsubcontrollerUpdate.removeAll(lremoveStatusUpdate); } // Remove from M_ControllerRealtime.lsubcontroller the other subcontrollers List lremoveRealtime = new ArrayList(); for (M_ControllerRealtimeSubcontroller subcontrollerRealtime : m_subcontroller.getDeviceRealtime().lsubcontroller) { if (subcontrollerRealtime.number != subcontroller) { lremoveRealtime.add(subcontrollerRealtime); } } m_subcontroller.getDeviceRealtime().lsubcontroller.removeAll(lremoveRealtime); if (controllerclone.getDeviceStatus().lsubcontrollerUpdate != null) { if (controllerclone.getDeviceStatus().lsubcontrollerUpdate.size() <= 0) { controllerclone.getDeviceStatus().lsubcontrollerUpdate = null; } } Shared.model.updateDevice(m_controllerSubcontroller, m_subcontroller); } try { this.controller.getDeviceConfiguration().toAluvisa(); } catch (Exception e) { } } lastQueryDetectorsRealtime = 0; lastQueryGroupsRealtime = 0; lastQueryStatus = 0; lastQueryTrafficData = 0; lastQueryTables = 0; } private void online(M_Controller controllerclone) throws ServerException, Exception { if (this.lcontroller.size() == 0) { // Only have one subcontroller, so it works how until now if ((controllerclone.alarms.alarm_offline > 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Controller online"); art.servers.Shared.controllerStatus.setStatus(DeviceStatus.STATUS_ONLINE, name, message); art.servers.Shared.logger.saveAnnotation(name, message); } controllerclone.setAlarm("alarm_offline", false); controllerclone.setAlarm("alarm_invalid", false); // Update alarm_off and alarm_flashing boolean alarm_off = false; boolean alarm_flashing = false; for (M_ControllerStatusSubcontroller statusSubcontroller : controllerclone.getDeviceStatus().lsubcontroller) { if (statusSubcontroller.colorsMode == M_ControllerStatusSubcontroller.COLORS_OFF) alarm_off = true; if (statusSubcontroller.colorsMode == M_ControllerStatusSubcontroller.COLORS_FLASHING) alarm_flashing = true; } controllerclone.setAlarm("alarm_off", alarm_off); controllerclone.setAlarm("alarm_flashing", alarm_flashing); if (controllerclone.getAlarm("alarm_manual_control") > 0) { for (M_ControllerStatusSubcontroller statusSubcontroller : controllerclone.getDeviceStatus().lsubcontroller) { statusSubcontroller.localControl = DeviceCommands.CONDITION_YES; } } else if (controllerclone.getAlarm("alarm_manual_control") <= 0) { for (M_ControllerStatusSubcontroller statusSubcontroller : controllerclone.getDeviceStatus().lsubcontroller) { if (statusSubcontroller.userControlManual == DeviceCommands.CONDITION_NO) statusSubcontroller.localControl = DeviceCommands.CONDITION_NO; } } for (M_SubcontrollerConfiguration subcontrollerConfiguration : controllerclone.getDeviceConfiguration().lsubcontroller) { for (M_Plan m_plan : subcontrollerConfiguration.lplan) { m_plan.cycleTime = calculateCycleTime(m_plan, controllerclone, subcontrollerConfiguration.number); } } Shared.model.updateDevice(controller, controllerclone); try { this.controller.getDeviceConfiguration().toAluvisa(); } catch (Exception e) { } } else if (this.lcontroller.size() > 0) { if ((controllerclone.alarms.alarm_offline > 0) || (firstTime == true)) { firstTime = false; String message = art.servers.Shared.getMessage("Controller online"); art.servers.Shared.controllerStatus.setStatus(DeviceStatus.STATUS_ONLINE, name, message); art.servers.Shared.logger.saveAnnotation(name, message); } controllerclone.setAlarm("alarm_offline", false); controllerclone.setAlarm("alarm_invalid", false); controllerclone.getDeviceInformation().serverAddress = art.servers.Shared.configuration.listener.address; controllerclone.getDeviceInformation().serverPort = art.servers.Shared.configuration.listener.port; controllerclone.getDeviceInformation().serverAddressExternal = art.servers.Shared.configuration.listener.addressExternal; controllerclone.getDeviceInformation().serverPortExternal = art.servers.Shared.configuration.listener.portExternal; controllerclone.getDeviceInformation().serverServiceName = art.servers.Shared.controllerStatus.getApplication().getDeviceInformation().serverServiceName; for (M_SubcontrollerConfiguration subcontrollerConfiguration : controllerclone.getDeviceConfiguration().lsubcontroller) { for (M_Plan m_plan : subcontrollerConfiguration.lplan) { m_plan.cycleTime = calculateCycleTime(m_plan, controllerclone, subcontrollerConfiguration.number); } } this.controller.updateDevice(controllerclone); // Have more than one subcontroller // Must be clone for every subcontroller for (M_Controller m_controllerSubcontroller : this.lcontroller) { int subcontroller = m_controllerSubcontroller.getDeviceInformation().subcontroller; M_Controller m_subcontroller = Serialization.clone(controllerclone); m_subcontroller.realtime = Serialization.clone(controllerclone.getDeviceRealtime()); m_subcontroller.getDeviceRealtime().identifier = m_controllerSubcontroller.getIdentifier(); // Update M_ControllerInformation with subcontroller information m_subcontroller.information = m_controllerSubcontroller.getDeviceInformation(); // Remove from M_ControllerConfiguration.lsubcontroller the other subcontrollers List lremoveConfiguration = new ArrayList(); for (M_SubcontrollerConfiguration subcontrollerConfiguration : m_subcontroller.getDeviceConfiguration().lsubcontroller) { if (subcontrollerConfiguration.number != subcontroller) { lremoveConfiguration.add(subcontrollerConfiguration); } } m_subcontroller.getDeviceConfiguration().lsubcontroller.removeAll(lremoveConfiguration); // Remove from M_ControllerStatus.lsubcontroller the other subcontrollers List lremoveStatus = new ArrayList(); for (M_ControllerStatusSubcontroller subcontrollerStatus : m_subcontroller.getDeviceStatus().lsubcontroller) { if (subcontrollerStatus.number != subcontroller) { lremoveStatus.add(subcontrollerStatus); } } m_subcontroller.getDeviceStatus().lsubcontroller.removeAll(lremoveStatus); // Remove from M_ControllerStatus.lsubcontrollerUpdate the other subcontrollers List lremoveStatusUpdate = new ArrayList(); for (M_ControllerStatusSubcontroller subcontrollerStatusUpdate : m_subcontroller.getDeviceStatus().lsubcontrollerUpdate) { if (subcontrollerStatusUpdate.number != subcontroller) { lremoveStatusUpdate.add(subcontrollerStatusUpdate); } } m_subcontroller.getDeviceStatus().lsubcontrollerUpdate.removeAll(lremoveStatusUpdate); // Remove from M_ControllerRealtime.lsubcontroller the other subcontrollers List lremoveRealtime = new ArrayList(); for (M_ControllerRealtimeSubcontroller subcontrollerRealtime : m_subcontroller.getDeviceRealtime().lsubcontroller) { if (subcontrollerRealtime.number != subcontroller) { lremoveRealtime.add(subcontrollerRealtime); } } m_subcontroller.getDeviceRealtime().lsubcontroller.removeAll(lremoveRealtime); // Update alarm_off and alarm_flashing boolean alarm_off = false; boolean alarm_flashing = false; for (M_ControllerStatusSubcontroller statusSubcontroller : m_subcontroller.getDeviceStatus().lsubcontroller) { if (statusSubcontroller.colorsMode == M_ControllerStatusSubcontroller.COLORS_OFF) alarm_off = true; if (statusSubcontroller.colorsMode == M_ControllerStatusSubcontroller.COLORS_FLASHING) alarm_flashing = true; } m_subcontroller.setAlarm("alarm_off", alarm_off); m_subcontroller.setAlarm("alarm_flashing", alarm_flashing); if (controllerclone.getAlarm("alarm_manual_control") > 0) { for (M_ControllerStatusSubcontroller statusSubcontroller : controllerclone.getDeviceStatus().lsubcontroller) { statusSubcontroller.localControl = DeviceCommands.CONDITION_YES; } } else if (controllerclone.getAlarm("alarm_manual_control") <= 0) { for (M_ControllerStatusSubcontroller statusSubcontroller : controllerclone.getDeviceStatus().lsubcontroller) { if (statusSubcontroller.userControlManual == DeviceCommands.CONDITION_NO) statusSubcontroller.localControl = DeviceCommands.CONDITION_NO; } } Shared.model.updateDevice(m_controllerSubcontroller, m_subcontroller); } try { this.controller.getDeviceConfiguration().toAluvisa(); } catch (Exception e) { } } } // }