package art.servers.rtzserver.controller.RTZ32; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerCommands; import art.library.model.devices.colors.controller.RTZ32.commands.RTZ32_Commands_Computer; import art.library.model.devices.colors.controller.RTZ32.commands.RTZ32_Commands_Plan; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table; import art.library.utils.synchro.Mutex; import art.servers.Shared; import java.io.DataOutputStream; import java.net.Socket; import java.util.Calendar; public class RTZ32_Talker_Writer { private RTZ32_Talker talker = null; private DataOutputStream dosData = null; private DataOutputStream dosControl = null; private Writer writer = null; private Mutex mutexData = new Mutex(); private Mutex mutexControl = new Mutex(); private String name = null; public RTZ32_Talker_Writer(RTZ32_Talker talker, Socket socketData, Socket socketControl) throws Exception { this.talker = talker; this.dosData = new DataOutputStream(socketData.getOutputStream()); this.dosControl = new DataOutputStream(socketControl.getOutputStream()); this.writer = new Writer(); this.name = this.talker.name + " (Writer)"; } // public void CTRL_DC1() throws Exception { Shared.println(this.name, "> DC1"); dosControl.write(0x11); dosControl.flush(); } public void CTRL_ACK() throws Exception { Shared.println(this.name, "> ACK"); dosControl.write(0x06); dosControl.flush(); } public void CTRL_NACK() throws Exception { Shared.println(this.name, "> NACK"); dosControl.write(0x15); dosControl.flush(); } public void CTRL_DET() throws Exception { Shared.println(this.name, "> DET"); dosControl.write(0x20); dosControl.flush(); } public void CTRL_HTR() throws Exception { Shared.println(this.name, "> HTR"); dosControl.write(0x33); dosControl.flush(); } public void CTRL_SYNC() throws Exception { Shared.println(this.name, "> SYN"); dosControl.write(0x40); dosControl.flush(); } // // public void ORD_LOCAL_ORDENADOR(Integer control) throws Exception { mutexData.lockWrite(); try { if (control == RTZ32_ControllerCommands.CONTROL_LOCAL) { writer.initialise(0x31); writer.flush(dosData); } else if (control == RTZ32_ControllerCommands.CONTROL_COMPUTER) { writer.initialise(0x32); writer.flush(dosData); } } finally { mutexData.releaseWrite(); } } public void ORD_GRABACION(boolean value) throws Exception { mutexData.lockWrite(); try { // TODO: // Por donde llega la respuesta a esta orden? talker.mutex_ORD_GRABACION = new Mutex(); talker.mutex_ORD_GRABACION.lockWrite(); if (value == true) { writer.initialise(0x34); writer.flush(dosData); } else { writer.initialise(0x35); writer.flush(dosData); } talker.mutex_ORD_GRABACION.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void ORD_FH(long timestamp) throws Exception { mutexData.lockWrite(); try { writer.initialise(0x39); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp); writer.write(calendar.get(Calendar.SECOND)); writer.write(calendar.get(Calendar.MINUTE)); writer.write(calendar.get(Calendar.HOUR_OF_DAY)); writer.write(calendar.get(Calendar.DAY_OF_WEEK)); writer.write(calendar.get(Calendar.DATE)); writer.write(calendar.get(Calendar.MONTH + 1)); writer.write(calendar.get(Calendar.YEAR) - 2000); writer.flush(dosData); } finally { mutexData.releaseWrite(); } } public void ORD_DETECTORES(boolean value) throws Exception { mutexData.lockWrite(); try { if (value == true) { // TODO // for (RTZ32_Configuration_Detector detector : talker.controller.getController().getDeviceConfiguration().rtz32.detectors) // { // writer.initialise(0x3A); // writer.write(detector.number); // writer.flush(dosData); // } } else { writer.initialise(0x3B); writer.flush(dosData); } } finally { mutexData.releaseWrite(); } } public void ORD_PLAN(RTZ32_Commands_Plan plan) throws Exception { mutexData.lockWrite(); try { Shared.println(this.name, "> ORD PLAN " + plan.number + ", offset " + plan.offset); writer.initialise(0x41); writer.write(plan.number); writer.write(plan.offset); writer.flush(dosData); } finally { mutexData.releaseWrite(); } } public void ORD_COLORES(int value) throws Exception { mutexData.lockWrite(); try { switch (value) { case RTZ32_ControllerCommands.COLORS_MODE_COLORS: writer.initialise(0x44); writer.flush(dosData); break; case RTZ32_ControllerCommands.COLORS_MODE_FLASHING: writer.initialise(0x43); writer.flush(dosData); break; } } finally { mutexData.releaseWrite(); } } public void ORD_BORRADO_ALARMAS(boolean value) throws Exception { mutexData.lockWrite(); try { if (value == true) { writer.initialise(0x45); writer.flush(dosData); } } finally { mutexData.releaseWrite(); } } public void ORD_COMMS(boolean value) throws Exception { mutexData.lockWrite(); try { if (value == true) { writer.initialise(0x4C); writer.flush(dosData); } else { writer.initialise(0x4B); writer.flush(dosData); } } finally { mutexData.releaseWrite(); } } public void ORD_TIEMPO_REAL_CRUCE(boolean value) throws Exception { mutexData.lockWrite(); try { if (value == true) { writer.initialise(0x52); writer.flush(dosData); } else { writer.initialise(0x53); writer.flush(dosData); } talker.rtz32.getDeviceRealtime().rtz32.junctionRealtime = value; talker.listener.realtimeUpdate(); } finally { mutexData.releaseWrite(); } } public void ORD_ORDENADOR(RTZ32_Commands_Computer computer) throws Exception { mutexData.lockWrite(); try { writer.initialise(0x55); int value = computer.synchronism; if (computer.semiactuated == true) value = value + 0x08; if (computer.actuated == true) value = value + 0x10; value = computer.trolleyDemands << 6; writer.write(value); writer.flush(dosData); } finally { mutexData.releaseWrite(); } } public void ORD_TABLA(RTZ32_Configuration_Table table, byte[] data) throws Exception { mutexData.lockWrite(); try { talker.mutex_ORD_TABLA = new Mutex(); talker.mutex_ORD_TABLA.lockWrite(); writer.initialise(0x3E); writer.write(table.number); writer.write(data); writer.flush(dosData); talker.mutex_ORD_TABLA.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } // // public void PET_DETECTORES() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_DETECTORES = new Mutex(); talker.mutex_PET_DETECTORES.lockWrite(); writer.initialise(0x33); writer.flush(dosData); talker.mutex_PET_DETECTORES.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_PLAN_DESFASE() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_PLAN_DESFASE = new Mutex(); talker.mutex_PET_PLAN_DESFASE.lockWrite(); writer.initialise(0x36); writer.flush(dosData); talker.mutex_PET_PLAN_DESFASE.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_ESTADO() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_ESTADO = new Mutex(); talker.mutex_PET_ESTADO.lockWrite(); writer.initialise(0x37); writer.flush(dosData); talker.mutex_PET_ESTADO.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_ALARMAS(int code) throws Exception { mutexData.lockWrite(); try { Shared.println(this.name, "> PET_ALARMAS " + code); talker.mutex_PET_ALARMAS = new Mutex(); talker.mutex_PET_ALARMAS.lockWrite(); writer.initialise(0x5A); writer.write(code); writer.flush(dosData); talker.mutex_PET_ALARMAS.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_FH() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_FH = new Mutex(); talker.mutex_PET_FH.lockWrite(); writer.initialise(0x38); writer.flush(dosData); talker.mutex_PET_FH.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_TABLA(int tabla) throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_TABLA = new Mutex(); talker.mutex_PET_TABLA.lockWrite(); writer.initialise(0x3C); writer.write(tabla); writer.flush(dosData); talker.mutex_PET_TABLA.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_VERSION() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_VERSION = new Mutex(); talker.mutex_PET_VERSION.lockWrite(); writer.initialise(0x3F); writer.flush(dosData); talker.mutex_PET_VERSION.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_CONTADORES() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_CONTADORES = new Mutex(); talker.mutex_PET_CONTADORES.lockWrite(); writer.initialise(0x4F); writer.flush(dosData); talker.mutex_PET_CONTADORES.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_GRUPOS() throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_GRUPO = new Mutex(); talker.mutex_PET_GRUPO.lockWrite(); writer.initialise(0x50); writer.flush(dosData); talker.mutex_PET_GRUPO.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } public void PET_GRUPO(int grupo) throws Exception { mutexData.lockWrite(); try { talker.mutex_PET_GRUPO = new Mutex(); talker.mutex_PET_GRUPO.lockWrite(); writer.initialise(0x50); writer.write(grupo); writer.flush(dosData); talker.mutex_PET_GRUPO.lockWrite(talker.rtz32.getDeviceInformation().connection.readTimeout); } finally { mutexData.releaseWrite(); } } // private class Writer { private byte[] data = new byte[8192]; private int position = 0; private int CRC = 0; public Writer() { } public void initialise(int method) { position = 0; CRC = method; data[position++] = RTZ32_Talker.STX; data[position++] = (byte)(method + 0x80); } public void write(int value) throws Exception { CRC = CRC ^ value; data[position++] = (byte)(0x80 + value); } public void write(int[] value) throws Exception { for (int i=0; i