package art.servers.colorsserver.M.protocol; import art.library.model.devices.Device; import art.library.model.devices.DeviceCommands; import art.library.model.devices.colors.controller.M.M_ControllerStatusSubcontroller; import art.library.model.devices.colors.controller.M.commands.M_ControllerCommandsSpecialDemand; import art.library.model.devices.colors.controller.M.configuration.ALUVISA_Phase; import art.library.model.devices.colors.controller.M.configuration.ALUVISA_Plan; import art.servers.colorsserver.controller.ControllerRtacController; import java.util.Calendar; import java.util.List; public class M_ProtocolConstructor { public static M_Message readTableMessage(int controllerCode, int tableCode, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); writer.write(writer.M_READ_TABLE_FULL); writer.write(tableCode); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message readTableMessagePartial(int controllerCode, int tableCode, boolean hasCRC, int blockNumber) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); writer.write(writer.M_READ_TABLE_PARTIAL); // writer.write(blockNumber); writer.write(tableCode); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message writeTableMessage(int controllerCode, List lTableContent, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); int pointer = 1; for (;pointer<2; pointer++) writer.write(lTableContent.get(pointer).byteValue()); writer.write(writer.M_WRITE_TABLE_FULL); for (;pointer= 0)) writer.writeEOB(data); else writer.write(data); } writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message startRecordingTablesMessage(int controllerCode, String communicationsPassword, String controllerNumber, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); writer.write(writer.M_START_RECORDING); if (communicationsPassword.length() < 12) { for (int i=0; i<(12-communicationsPassword.length()); i++) writer.write(0x30); } for (int i=0; i> 7) & 0x7F); writer.write(recordablePlan.offset & 0x7F); writer.write(recordablePlan.controlMode); for (ALUVISA_Phase phase : recordablePlan.lPhase) writer.write(phase.maximumTime); writer.ETX(hasCRC); return(writer.createMessage(subcontroller)); } public static M_Message getRecordablePlan(int subcontrollerNumber, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(subcontrollerNumber); writer.write(writer.M_RECORDABLE_PLAN_QUERY); writer.ETX(hasCRC); return(writer.createMessage(subcontrollerNumber)); } public static M_Message setPlan(int plan, long referenceTime, int subcontroller, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(referenceTime); if (referenceTime == 0) { writer.STX(); writer.write(subcontroller); writer.write(writer.M_SELECT_PLAN); writer.write(plan); writer.write(0x00); writer.write(0x00); writer.write(0x00); writer.ETX(hasCRC); } else { writer.STX(); writer.write(subcontroller); writer.write(writer.M_SELECT_PLAN); writer.write(plan); writer.write(calendar.get(Calendar.HOUR_OF_DAY)); writer.write(calendar.get(Calendar.MINUTE)); writer.write(calendar.get(Calendar.SECOND)); writer.ETX(hasCRC); } return(writer.createMessage(subcontroller)); } public static M_Message selectSpecialDemand(M_ControllerCommandsSpecialDemand specialDemand, int subcontroller, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(subcontroller); writer.write(writer.M_SELECT_SPECIAL_DEMAND); writer.write(specialDemand.number); writer.write(specialDemand.time); writer.ETX(hasCRC); return(writer.createMessage(subcontroller)); } public static M_Message cancelSpecialDemand(M_ControllerCommandsSpecialDemand specialDemand, int subcontroller, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(subcontroller); writer.write(writer.M_CANCEL_SPECIAL_DEMAND); writer.write(specialDemand.number); writer.ETX(hasCRC); return(writer.createMessage(subcontroller)); } public static M_Message setState(int subcontroller, int colorsMode, int planSelection, int adaptative, int adaptativeDetectors, int coordinationMode, int centralizedMode, int manualControl, int controlComputerDirectGroups, int operationMode, int sptpOperation, int emergency, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); int controlMode = 0x00; int coordination = 0x00; int operation = 0x00; // Control mode byte calculation if (planSelection == M_ControllerStatusSubcontroller.PLANSELECTION_TIMETABLE) { controlMode = controlMode + 0x00; } else if (planSelection == M_ControllerStatusSubcontroller.PLANSELECTION_EXTERNAL_PLANS) { controlMode = controlMode + 0x01; } else if (planSelection == M_ControllerStatusSubcontroller.PLANSELECTION_ICF) { controlMode = controlMode + 0x02; } else if (planSelection == M_ControllerStatusSubcontroller.PLANSELECTION_COMPUTER) { controlMode = controlMode + 0x04; } if (adaptative == DeviceCommands.CONDITION_YES) { controlMode = controlMode + 0x08; } if (adaptativeDetectors == DeviceCommands.CONDITION_YES) { controlMode = controlMode + 0x10; } // Coordination byte calculation if (coordinationMode == M_ControllerStatusSubcontroller.COORDINATION_EXTERNAL) { coordination = coordination + 0x00; } else if (coordinationMode == M_ControllerStatusSubcontroller.COORDINATION_INTERNAL_CLOCK) { coordination = coordination + 0x01; } else if (coordinationMode == M_ControllerStatusSubcontroller.COORDINATION_COMPUTER) { coordination = coordination + 0x02; } if (centralizedMode == DeviceCommands.CONDITION_YES) { coordination = coordination + 0x04; } if (manualControl == DeviceCommands.CONDITION_YES) { coordination = coordination + 0x04; } if (controlComputerDirectGroups == DeviceCommands.CONDITION_YES) { coordination = coordination + 0x10; } // Operation byte calculation if (operationMode == M_ControllerStatusSubcontroller.OPERATIONMODE_FIXED) { operation = operation + 0x00; } else if (operationMode == M_ControllerStatusSubcontroller.OPERATIONMODE_SEMIACTUATED) { operation = operation + 0x01; } else if (operationMode == M_ControllerStatusSubcontroller.OPERATIONMODE_ACTUATED) { operation = operation + 0x02; } if (emergency == DeviceCommands.CONDITION_YES) { operation = operation + 0x04; } if (sptpOperation == M_ControllerStatusSubcontroller.SPTP_OPERATION_LOCAL) { operation = operation + 0x08; } else if (sptpOperation == M_ControllerStatusSubcontroller.SPTP_OPERATION_COORDINATED) { operation = operation + 0x10; } writer.STX(); writer.write(subcontroller); writer.write(writer.M_SET_STATE); writer.write(colorsMode); writer.write(controlMode); writer.write(coordination); writer.write(operation); writer.ETX(hasCRC); return(writer.createMessage(subcontroller)); } public static M_Message setDateTime(int controllerCode, long timestamp, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); // 02 80 D2 83 8B 97 9D 8E 83 92 03 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp); int weekday = calendar.get(Calendar.DAY_OF_WEEK) - 1; if (weekday == 0) weekday = 1; // Sunday int hour = calendar.get(Calendar.HOUR_OF_DAY); int minutes = calendar.get(Calendar.MINUTE); int seconds = calendar.get(Calendar.SECOND); int day = calendar.get(Calendar.DATE); int month = calendar.get(Calendar.MONTH) + 1; int year = calendar.get(Calendar.YEAR) - 2000; writer.STX(); writer.write(controllerCode); writer.write(writer.M_SET_TIME); writer.write(weekday); writer.write(hour); writer.write(minutes); writer.write(seconds); writer.write(day); writer.write(month); writer.write(year); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message setDateTimeRTAC(ControllerRtacController controller, int controllerCode, long timestamp, int weekday, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); // 02 80 D2 83 8B 97 9D 8E 83 92 03 controller.writeLog("\t" + controller.getController().getIdentifier() + " - 1.SETTIME: CurrentWeekday: " + weekday); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp); calendar.set(Calendar.YEAR, 2008); // int weekdayCalendar = calendar.get(Calendar.DAY_OF_WEEK); int weekdayCalendar = calendar.get(Calendar.DAY_OF_WEEK); int weekdayTimestamp = 0; switch (weekdayCalendar) { case Calendar.MONDAY: case Calendar.TUESDAY: case Calendar.WEDNESDAY: case Calendar.THURSDAY: case Calendar.FRIDAY: case Calendar.SATURDAY: { weekdayTimestamp = weekdayCalendar - 2; } break; case Calendar.SUNDAY: { weekdayTimestamp = 6; } break; } controller.writeLog("\t" + controller.getController().getIdentifier() + " - 2.SETTIME: Weekday: " + weekday + " - WeekdayCalendar: " + weekdayCalendar + " - WeekdayTimestamp: " + weekdayTimestamp + " - " + Device.getDate(timestamp)); if (weekdayTimestamp != weekday) { long dif = getSumDays(weekday, weekdayTimestamp); long ts = calendar.getTimeInMillis() + ((long)(dif)*(24L*60*60L*1000L)); calendar.setTimeInMillis(ts); controller.writeLog("\t" + controller.getController().getIdentifier() + " - 3.SETTIME: Weekday: " + weekday + " - WeekdayCalendar: " + weekdayCalendar + " - WeekdayTimestamp: " + weekdayTimestamp + " - DIF: " + dif + " - " + Device.getDate(ts)); weekdayCalendar = calendar.get(Calendar.DAY_OF_WEEK); weekdayTimestamp = 0; switch (weekdayCalendar) { case Calendar.MONDAY: case Calendar.TUESDAY: case Calendar.WEDNESDAY: case Calendar.THURSDAY: case Calendar.FRIDAY: case Calendar.SATURDAY: { weekdayTimestamp = weekdayCalendar - 2; } break; case Calendar.SUNDAY: { weekdayTimestamp = 6; } break; } controller.writeLog("\t" + controller.getController().getIdentifier() + " - 4.SETTIME: Weekday: " + weekday + " - WeekdayCalendar: " + weekdayCalendar + " - WeekdayTimestamp: " + weekdayTimestamp + " - DIF: " + dif); } int hour = calendar.get(Calendar.HOUR_OF_DAY); int minutes = calendar.get(Calendar.MINUTE); int seconds = calendar.get(Calendar.SECOND); int day = calendar.get(Calendar.DATE); int month = calendar.get(Calendar.MONTH) + 1; int year = calendar.get(Calendar.YEAR) - 2000; controller.writeLog("\t" + controller.getController().getIdentifier() + " - 5.SETTIME: Weekday timestamp: " + weekdayTimestamp + " - " + Device.getDate(calendar.getTimeInMillis())); writer.STX(); writer.write(controllerCode); writer.write(writer.M_SET_TIME); writer.write(weekdayTimestamp); writer.write(hour); writer.write(minutes); writer.write(seconds); writer.write(day); writer.write(month); writer.write(year); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message HTR() { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.writeRaw(writer.HTR); return(writer.createMessage(0x00)); } public static M_Message PRH() { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.writeRaw(writer.PRH); return(writer.createMessage(0x00)); } public static M_Message setRealtimeDetectors(int controllerCode, List ldetectors, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); writer.write(writer.M_SET_REALTIME_DETECTORS); int pointer = 0; for (Integer detector : ldetectors) { writer.write(detector); pointer++; } if (ldetectors.size() > 0) { for (int i=pointer; i<4; i++) writer.write(ldetectors.get(0)); } writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message clearAlarms(int controllerCode, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); writer.write(writer.M_ERASE_ALARMS); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } public static M_Message phaseChanging(int subcontroller, int source, int destination, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(subcontroller); writer.write(writer.M_PHASE_CHANGING); writer.write(source); writer.write(destination); writer.write(0); writer.ETX(hasCRC); return(writer.createMessage(subcontroller)); } // // // public static M_Message setDirectGroupOutput(int controllerCode, List ldirectGroupOutput, boolean hasCRC) // { // M_ProtocolWriter writer = new M_ProtocolWriter(); // // writer.STX(); // writer.write(controllerCode); // writer.write(writer.M_DIRECT_GROUP_OUTPUT); // for (M_ControllerCommandsDirectGroupOutput directGroupOutput : ldirectGroupOutput) // { // writer.write(directGroupOutput.group); // writer.write(directGroupOutput.color); // } // writer.ETX(hasCRC); // // return(writer.createMessage(controllerCode)); // } public static M_Message setGroupsRealtime(int controllerCode, int realtime, boolean hasCRC) { M_ProtocolWriter writer = new M_ProtocolWriter(); writer.STX(); writer.write(controllerCode); if (realtime == DeviceCommands.CONDITION_YES) writer.write(writer.M_GROUPS_REALTIME_ENABLE); else writer.write(writer.M_GROUPS_REALTIME_DISABLE); writer.ETX(hasCRC); return(writer.createMessage(controllerCode)); } private static long getSumDays(int weekdayTimestamp, int weekday) { switch (weekdayTimestamp) { case 0: // LUNES { switch (weekday) { case 1: return(-1); case 2: return(-2); case 3: return(-3); case 4: return(-4); case 5: return(-5); case 6: return(-6); } }; break; case 1: // MARTES { switch (weekday) { case 0: return(1); case 2: return(-1); case 3: return(-2); case 4: return(-3); case 5: return(-4); case 6: return(-5); } }; break; case 2: // MIERCOLES { switch (weekday) { case 0: return(2); case 1: return(1); case 3: return(-1); case 4: return(-2); case 5: return(-3); case 6: return(-4); } }; break; case 3: // JUEVES { switch (weekday) { case 0: return(3); case 1: return(2); case 2: return(1); case 4: return(-1); case 5: return(-2); case 6: return(-3); } }; break; case 4: // VIERNES { switch (weekday) { case 0: return(4); case 1: return(3); case 2: return(2); case 3: return(1); case 5: return(-1); case 6: return(-2); } }; break; case 5: // SABADO { switch (weekday) { case 0: return(-2); case 1: return(-3); case 2: return(-4); case 3: return(-5); case 4: return(-6); case 6: return(-1); } }; break; case 6: // DOMINGO { switch (weekday) { case 0: return(-1); case 1: return(-2); case 2: return(-3); case 3: return(-4); case 4: return(-5); case 5: return(-6); } }; break; } return(weekday); } }