package art.servers.colorsserver.controller; import art.library.interop.serialization.SerializationException; 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.ColorsServer; import art.servers.ServerException; import art.servers.colorsserver.M.protocol.M_Message; import art.servers.colorsserver.M.protocol.M_ProtocolConstructor; import art.servers.colorsserver.configuration.Configuration; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Calendar; 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 BufferedWriter out = null; public ControllerRtacController(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 ControllerRtacController(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 { if (ColorsServer.REQUEST_RTAC == false) return; 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 (queryTables == true) { // TODO // View how to query tables for RTAC controllers // In Mataro we have problems when reading tables, that sometimes RTAC controllers lose tables configuration // controllerclone.configuration = readAllTables(); // lastQueryTables = System.currentTimeMillis(); // recreateStatus(controllerclone); } if (queryDetectorsRealtime == true) { // b - 1 seg (Detectores presencia) // getCurrentPresenceDetectors(controllerclone); // // lastQueryDetectorsRealtime = System.currentTimeMillis(); // controllerclone.getDeviceRealtime().timestamp = lastQueryDetectorsRealtime; // controllerclone.getDeviceRealtime().lastTimestampUpdate = lastQueryDetectorsRealtime; } if (queryGroupsRealtime == true) { // k - 1 seg (Estado grupos) getCurrentStatusGroups(controllerclone); lastQueryGroupsRealtime = System.currentTimeMillis(); controllerclone.getDeviceRealtime().timestamp = lastQueryGroupsRealtime; controllerclone.getDeviceRealtime().lastTimestampUpdate = lastQueryGroupsRealtime; } if (queryStatus == true) { // time - 1 seg 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()); // int weekdayController = c1.get(Calendar.DAY_OF_WEEK); int weekdayCurrent = c2.get(Calendar.DAY_OF_WEEK); c1.set(Calendar.DATE, 1); c1.set(Calendar.MONTH, 1); c1.set(Calendar.YEAR, 2008); c1.set(Calendar.MILLISECOND, 0); c2.set(Calendar.DATE, 1); c2.set(Calendar.MONTH, 1); c2.set(Calendar.YEAR, 2008); c2.set(Calendar.MILLISECOND, 0); long dif = c2.getTimeInMillis()-c1.getTimeInMillis(); if (dif < 0) dif = -dif; int current = 0; if (weekdayCurrent == Calendar.MONDAY) current = 0; if (weekdayCurrent == Calendar.TUESDAY) current = 1; if (weekdayCurrent == Calendar.WEDNESDAY) current = 2; if (weekdayCurrent == Calendar.THURSDAY) current = 3; if (weekdayCurrent == Calendar.FRIDAY) current = 4; if (weekdayCurrent == Calendar.SATURDAY) current = 5; if (weekdayCurrent == Calendar.SUNDAY) current = 6; if ((dif > ((Configuration)Shared.configuration).detail.maximumDifferenceTime) || (weekdayController != current)) { writeLog("\t" + controllerclone.getIdentifier() + " - 1.DIFTIME: " + dif + " - " + weekdayController + " - " + current + " - Controller: " + Device.getDate(c1.getTimeInMillis()) + " - Server: " + Device.getDate(c2.getTimeInMillis())); int currentWeekday = 0; Calendar c3 = Calendar.getInstance(); c3.setTimeInMillis(System.currentTimeMillis()); int weekday = c3.get(Calendar.DAY_OF_WEEK); // c1.get(Calendar.DAY_OF_WEEK); if (weekday == Calendar.MONDAY) currentWeekday = 0; if (weekday == Calendar.TUESDAY) currentWeekday = 1; if (weekday == Calendar.WEDNESDAY) currentWeekday = 2; if (weekday == Calendar.THURSDAY) currentWeekday = 3; if (weekday == Calendar.FRIDAY) currentWeekday = 4; if (weekday == Calendar.SATURDAY) currentWeekday = 5; if (weekday == Calendar.SUNDAY) currentWeekday = 6; writeLog("\t" + controllerclone.getIdentifier() + " - 3.DIFTIME: " + dif + " - CurrentWeekday: " + currentWeekday); setTime(currentWeekday); } } catch (Exception e) { } // 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) { // long query = System.currentTimeMillis(); // 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) { if ((controllerclone.alarms.alarm_offline <= 0) || (firstTime == true)) { Shared.println(name, this.controller.getIdentifier() + " - EXCEPTION RTAC OFFLINE: " + exception.toString()); Shared.printstack(name, exception); } offline(controllerclone); } } public void setTime(int weekday) throws SerializationException { try { M_Message request = M_ProtocolConstructor.setDateTimeRTAC(this, 0x00, System.currentTimeMillis()+1000, weekday, hasCRC); getControllerConnection().send(request.toByteArray()); M_Message requestHTR = M_ProtocolConstructor.HTR(); getControllerConnection().send(requestHTR.toByteArray()); } catch (Exception exception) { Shared.printstack(name, exception); } } // private void createLog () { try { if (ColorsServer.LOG_TIME == true) { File fdir = new File("Logs/" + this.controller.getIdentifier()); fdir.mkdirs(); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fdir.getAbsolutePath() + "/" + System.currentTimeMillis() + ".log"))); } } catch (Exception e) { } } public void writeLog (String message) { try { if (ColorsServer.LOG_TIME == true) { if (out == null) { createLog(); } String s = Device.getDate(System.currentTimeMillis()) + " - " + message; out.write(s); out.newLine(); out.flush(); } } catch (Exception e) { } } }