package art.servers.colorsserver.controller; import art.library.model.devices.Device; import art.servers.colorsserver.Shared; 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_ControllerStatus; import art.library.model.devices.colors.controller.M.M_SubcontrollerConfiguration; import art.servers.ServerException; import art.servers.colorsserver.M.protocol.M_ControllerComunicator; import art.servers.colorsserver.M.protocol.M_Message; import art.servers.colorsserver.M.protocol.M_ProtocolConstructor; import art.servers.colorsserver.configuration.Configuration; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; public class ControllerTelventController extends ControllerController { private static final int MAX_RETRIES = 6; private SimpleDateFormat sdh = new SimpleDateFormat("HH:mm"); private long lastTimestamp = 0; private int status = DeviceStatus.STATUS_ALARM; private String name = null; public ControllerTelventController(M_Controller controller, boolean hasCRC) { super(controller, hasCRC); this.name = Shared.getMessage("Controller junction ") + " " + controller.information.name + " - " + controller.information.number; super.setName(this.name); } public ControllerTelventController(M_Controller controller, List lcontroller, boolean hasCRC) { super(controller, lcontroller, hasCRC); this.name = Shared.getMessage("Controller junction ") + " " + controller.information.name + " - " + controller.information.number; super.setName(this.name); } // public 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)); M_Controller controllerclone = null; if ((queryDetectorsRealtime == true) || (queryGroupsRealtime == true) || (queryStatus == true) || (queryTrafficData == true) || (queryTables == true)) { controllerclone = cloneController(); } try { controllerclone.getDeviceConfiguration().toAluvisa(); } catch (Exception e) { } if ((queryDetectorsRealtime == true) || (queryGroupsRealtime == true) || (queryStatus == true) || (queryTrafficData == true) || (queryTables == true)) { if (forceCentralized == 0) { disable(controllerclone); return; } } try { if (commandsConfiguration != null) { // Save SPTP tables to controller sendSPTPConfigurationToController(controllerclone.getDeviceInformation().subcontroller, commandsConfiguration); } if (commandsDemands != null) { getBusDemandsControllerReal(controllerclone.getDeviceInformation().subcontroller); } // TODO: Repasarlo porque los reguladores de Telvent de Almeria no // contestan igual que los Dynamic, comprobar que diferencia hay entre // los de Telvent y los Dynamic // if (queryTables == true) // { // controllerclone.configuration = readAllTables(); // lastQueryTables = System.currentTimeMillis(); // recreateStatus(controllerclone); // } if (queryDetectorsRealtime == true) { // b - 1 seg (Detectores presencia) // TODO Repasarlo, dan problemas los reguladores Telvent de Almeria // Los Rtac y Dynamic contestan correctamente, los Telvent no // getCurrentPresenceDetectors(controllerclone); lastQueryDetectorsRealtime = System.currentTimeMillis(); controllerclone.getDeviceRealtime().timestamp = lastQueryDetectorsRealtime; controllerclone.getDeviceRealtime().lastTimestampUpdate = lastQueryDetectorsRealtime; } if (queryGroupsRealtime == true) { try { // k - 1 seg (Estado grupos) getCurrentStatusGroups(controllerclone); lastQueryGroupsRealtime = System.currentTimeMillis(); controllerclone.getDeviceRealtime().timestamp = lastQueryGroupsRealtime; controllerclone.getDeviceRealtime().lastTimestampUpdate = lastQueryGroupsRealtime; } catch (Exception e) { Shared.printstack(name, e); } } if (queryStatus == true) { try { long[] result = getCurrentTime(controllerclone); long currenttime = result[0]; int weekdayController = (int)result[1]; Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); c1.setTimeInMillis(currenttime); c2.setTimeInMillis(System.currentTimeMillis()); long dif = c2.getTimeInMillis()-c1.getTimeInMillis(); if (dif < 0) dif = -dif; if (dif > ((Configuration)Shared.configuration).detail.maximumDifferenceTime) { /* TODO: DE MOMENTO QUITADO HASTA COMPROBAR QUE LO HACE BIEN */ M_Message request = M_ProtocolConstructor.setDateTime(0x00, System.currentTimeMillis()+1000, hasCRC); getControllerConnection().send(request.toByteArray()); M_Message requestHTR = M_ProtocolConstructor.HTR(); getControllerConnection().send(requestHTR.toByteArray()); } } catch (Exception exception) { } // estado subregulador - 5 seg getCurrentSubcontrollersState(controllerclone); // a - 1 seg (Plan en curso) getCurrentPlan(controllerclone); long current = System.currentTimeMillis(); controllerclone.getDeviceRealtime().timestamp = current; controllerclone.getDeviceRealtime().lastTimestampUpdate = current; // f - 5 seg (Alarmas) int result = getAlarms(controllerclone); if ((result & 0x01) != 0) { // g - 5 seg (Lampara fundida si activa en alarmas) getBlownLampAlarms(controllerclone); } else { clearBlownLampsGroupAlarms(controllerclone); } if ((result & 0x02) != 0) { // h - 5 seg (Grupo averiado si activa en alarmas) getDamagedGroupAlarms(controllerclone); } else { clearDamagedGroupAlarms(controllerclone); } if ((result & 0x04) != 0) { // i - 5 seg (Incompatibilidades si activa en alarmas) getIncompatibilityAlarms(controllerclone); } else { clearIncompatibilityGroupAlarms(controllerclone); } for (M_SubcontrollerConfiguration subcontrollerConfiguration : controllerclone.getDeviceConfiguration().lsubcontroller) { try { controllerclone.getDeviceStatus().getStatusSubcontroller(subcontrollerConfiguration.number).recordablePlan = getCurrentRecordablePlan(subcontrollerConfiguration.number); } catch (Exception e) { controllerclone.getDeviceStatus().getStatusSubcontroller(subcontrollerConfiguration.number).recordablePlan = null; } } lastQueryStatus = System.currentTimeMillis(); } if (queryTrafficData == true) { // TODO: Los reguladores de Telvent de Almeria no contestan // a la petición de datos de contaje de los detectores (Funcion B3) // if (controllerclone.getDeviceConfiguration().lstrategicalDetector.size() > 0) // { // // d - 1 min (Detectores contaje) // getCurrentCountingDetectors(controllerclone); // } // lastQueryTrafficData = System.currentTimeMillis(); } checkNewUpdateCommands(controllerclone); if ((queryDetectorsRealtime == true) || (queryGroupsRealtime == true) || (queryStatus == true) || (queryTrafficData == true) || (queryTables == true)) { if (forceCentralized == 0) { disable(controllerclone); } else { online(controllerclone); } } checkUpdateStatus(controllerclone); } catch (Exception exception) { offline(controllerclone); } } // }