package art.servers.rtzserver.controller; import art.library.interop.InteropParameters; import art.library.interop.serialization.Serialization; import art.library.interop.serialization.SerializationException; import art.library.model.devices.DeviceAction; import art.library.model.devices.colors.controller.RTZ32.RTZ32_Controller; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerAlarms; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerCommands; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerConfiguration; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerRealtime; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerStatus; import art.library.model.devices.colors.controller.RTZ32.alarms.RTZ32_Alarms; import art.library.model.devices.colors.controller.RTZ32.commands.RTZ32_Commands_Configuration_Write; import art.library.model.devices.colors.controller.RTZ32.configuration.RTZ32_Configuration; import art.library.model.devices.colors.controller.RTZ32.configuration.RTZ32_Configuration_Group; import art.library.model.devices.colors.controller.RTZ32.configuration.RTZ32_Configuration_Program; import art.library.model.devices.colors.controller.RTZ32.configuration.constants.RTZ32_Constants; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_1; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_11_28; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_2; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_3; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_31; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_32; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_33; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_34; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_35; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_36; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_37; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_38_40; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_4; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_42; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_43; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_44; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_45; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_46; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_5; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_6; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.RTZ32_Configuration_Table_7; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.eprom.RTZ32_Configuration_Table_91; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.eprom.RTZ32_Configuration_Table_92; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.eprom.RTZ32_Configuration_Table_93; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.eprom.RTZ32_Configuration_Table_94; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.eprom.RTZ32_Configuration_Table_95; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.microregulation.RTZ32_Configuration_Table_65; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.microregulation.RTZ32_Configuration_Table_66; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.microregulation.RTZ32_Configuration_Table_67; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.microregulation.RTZ32_Configuration_Table_68; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.microregulation.RTZ32_Configuration_Table_69; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.timetables.RTZ32_Configuration_Table_50; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.timetables.RTZ32_Configuration_Table_51; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.timetables.RTZ32_Configuration_Table_52; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.timetables.RTZ32_Configuration_Table_53_60; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_70; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_71; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_72; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_73; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_74; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_75; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_78; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_79; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_80; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_81; import art.library.model.devices.colors.controller.RTZ32.configuration.tables.trolleygroups.RTZ32_Configuration_Table_82_85; import art.library.model.devices.colors.controller.RTZ32.information.RTZ32_Information_Program; import art.library.model.devices.colors.controller.RTZ32.realtime.RTZ32_Realtime; import art.library.model.devices.colors.controller.RTZ32.realtime.RTZ32_Realtime_Reading; import art.library.model.devices.colors.controller.RTZ32.realtime.RTZ32_Realtime_Writing; import art.library.model.devices.colors.controller.RTZ32.status.RTZ32_Status; import art.library.model.devices.colors.controller.RTZ32.status.RTZ32_Status_Forcings; import art.library.model.devices.colors.controller.RTZ32.status.RTZ32_Status_Pendings; import art.library.model.devices.colors.controller.RTZ32.types.RTZ32_Persistent_Configuration; import art.library.model.devices.colors.controller.RTZ32.types.RTZ32_Report_Information; import art.library.model.devices.etd.EtdStatus; import art.library.model.devices.etd.status.EtdStatusLane; import art.library.utils.common.StringUtils; import art.library.utils.common.TimeUtils; import art.library.utils.synchro.Mutex; import art.servers.ServerException; import art.servers.Shared; import art.servers.rtzserver.controller.RTZ32.RTZ32_Talker; import art.servers.rtzserver.controller.RTZ32.RTZ32_Talker_Listener; import art.servers.rtzserver.reports.Report_CCT_Juzgados; import art.servers.rtzserver.reports.Report_Configuration; import static java.lang.Thread.sleep; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Timer; import java.util.TimerTask; public class Controller_RTZ32 extends Controller { public String name = null; protected RTZ32_Controller device_rtz32 = null; protected RTZ32_Talker talker = null; protected Mutex mutexUpdate = new Mutex(); private boolean forceUpdate = false; private boolean updatingStatus = false; private boolean readingTables = false; private List ltrafficData = new ArrayList(); protected Boolean realtime_junction = null; protected Boolean realtime_groups = null; protected Boolean realtime_phases = null; public Controller_RTZ32(RTZ32_Controller device_rtz32) { super(device_rtz32); this.device_rtz32 = device_rtz32; this.name = art.servers.Shared.getMessage("Controller") + " " + this.device_rtz32.getDeviceInformation().name; this.setName(this.name); try { // this.device_rtz32.configuratfion = ((RTZ32_Controller)Serialization.deserialize(RTZ32_Controller.class, new File("controller-zaragoza-90020_v1.json"))).configuration; // this.device_rtz32.status = new RTZ32_ControllerStatus(); // this.device_rtz32.getDeviceStatus().rtz32 = new RTZ32_Status(); // this.device_rtz32.getDeviceStatus().rtz32.realtime = new RTZ32_Status_Realtime(); // this.device_rtz32.getDeviceStatus().rtz32.realtime.junction = true; // Controller_RTZ32_Factory_Configuration factory = new Controller_RTZ32_Factory_Configuration(this.device_rtz32.getDeviceConfiguration().rtz32); // factory.serialize(); // Serialization.serialize(this.device_rtz32.getDeviceConfiguration().rtz32, new File("test1.json")); // RTZ32_Configuration config = factory.deserialize(); // Serialization.serialize(config, new File("test2.json")); // RTZ32_Window_Realtime window = new RTZ32_Window_Realtime(device_rtz32); // window.setSize(new Dimension(1024, 768)); // window.setLocation(0, 0); // window.setVisible(true); // RTZ32_Window window2 = new RTZ32_Window(device_rtz32, null); // window2.setSize(new Dimension(1024, 768)); // window2.setLocation(0, 0); // window2.setVisible(true); } catch (Exception exception) { exception.printStackTrace(); } // Initialise if ((this.device_rtz32.status == null) || (this.device_rtz32.getDeviceStatus().rtz32 == null)) { this.device_rtz32.status = new RTZ32_ControllerStatus(); this.device_rtz32.getDeviceStatus().rtz32 = new RTZ32_Status(); } if ((this.device_rtz32.alarms == null) || (this.device_rtz32.getDeviceAlarms().rtz32 == null)) { this.device_rtz32.alarms = new RTZ32_ControllerAlarms(); this.device_rtz32.getDeviceAlarms().rtz32 = new RTZ32_Alarms(); this.device_rtz32.setAlarm("alarm_offline", System.currentTimeMillis()); } if ((this.device_rtz32.realtime == null) || (this.device_rtz32.getDeviceRealtime().rtz32 == null)) { this.device_rtz32.realtime = new RTZ32_ControllerRealtime(); this.device_rtz32.getDeviceRealtime().rtz32 = new RTZ32_Realtime(); } if ((this.device_rtz32.configuration == null) || (this.device_rtz32.getDeviceConfiguration().rtz32 == null)) { this.device_rtz32.configuration = new RTZ32_ControllerConfiguration(); } if (this.device_rtz32.getDeviceStatus().rtz32.forcings == null) this.device_rtz32.getDeviceStatus().rtz32.forcings = new RTZ32_Status_Forcings(); if (this.device_rtz32.getDeviceStatus().rtz32.pendings == null) this.device_rtz32.getDeviceStatus().rtz32.pendings = new RTZ32_Status_Pendings(); // Start talker talker = new RTZ32_Talker(name, this.device_rtz32, this); talker.setListener(new RTZ32_Talker_Listener() { public void connected() { if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "1.Listener connected"); } Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); forceUpdate = true; if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "2.Listener connected"); } } public void disconnected() { { talker.rtz32.setAlarm("alarm_offline", true); Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); forceUpdate = true; } } public void realtimeUpdate() { long timestamp = System.currentTimeMillis(); device_rtz32.getDeviceRealtime().lastTimestampUpdate = timestamp; } public void statusUpdate() { if ((updatingStatus == false) && (readingTables == false)) { if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "1.Listener status update"); } mutexUpdate.lockWrite(); { if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "2.Listener status update"); } Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "3.Listener status update"); } } mutexUpdate.releaseWrite(); if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "4.Listener status update"); } } } public void configurationUpdate() { if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "1.Listener configuration update"); } if ((updatingStatus == false) && (readingTables == false)) { mutexUpdate.lockWrite(); { if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "2.Listener configuration update"); } Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "3.Listener configuration update"); } } mutexUpdate.releaseWrite(); } if (device_rtz32.getDeviceInformation().number <= 9003) { Shared.println(name, "4.Listener configuration update"); } } }); } public RTZ32_Controller getController() { return this.device_rtz32; } public void run() { Shared.traceInformation(name, "Starting"); try { if (Shared.isServerEnabled() == true) { update(); } long delay = 0; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); long ts = TimeUtils.thisperiod(device_rtz32.getDeviceInformation().polling) + (device_rtz32.getDeviceInformation().polling * 1000L); delay = ts-calendar.getTimeInMillis(); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run () { try { if (talker.isConnected() == true) { talker.writer.CTRL_DET(); } else { // Este periodo se ha de guardar el EtdStatus sin datos addEtdStatus(createEtdStatus()); } } catch (Exception exception) { } } }, delay, device_rtz32.getDeviceInformation().polling * 1000); long timestamp1 = System.currentTimeMillis(); while ((isInterrupted() == false) && (exit == false)) { long timestamp2 = timestamp1 + (device_rtz32.getDeviceInformation().polling * 1000); if ((System.currentTimeMillis() > timestamp2) || (forceUpdate == true)) { try { forceUpdate = false; if (Shared.isServerEnabled() == true) { update(); } } catch (Exception exception) { } timestamp1 = timestamp1 + device_rtz32.getDeviceInformation().polling * 1000; } sleep(1000); if (Shared.model.existsDevice(device_rtz32.getIdentifier()) == false) { Shared.println(name, Shared.getMessage("Device no longer exists")); Shared.traceInformation(name, "Device no longer exists"); exit = true; } } } catch (Exception exception) { } Shared.traceInformation(name, "Finishing"); } public byte[] printConfiguration(RTZ32_Report_Information reportInformation, String format, String language) throws ServerException { byte[] data = null; try { Report_Configuration report = new Report_Configuration(language); data = report.generate(format, reportInformation); } catch (ServerException e) { throw e; } catch (Exception e) { throw new ServerException(e); } return(data); } public byte[] printCCT(RTZ32_Report_Information reportInformation, String format, String language) throws ServerException { byte[] data = null; try { Report_CCT_Juzgados report = new Report_CCT_Juzgados(language); data = report.generateCCT(format, reportInformation, this.device_rtz32); } catch (ServerException e) { throw e; } catch (Exception e) { throw new ServerException(e); } return(data); } public byte[] printJuzgados(RTZ32_Report_Information reportInformation, String format, String language) throws ServerException { byte[] data = null; try { Report_CCT_Juzgados report = new Report_CCT_Juzgados(language); data = report.generateJuzgados(format, reportInformation, this.device_rtz32); } catch (ServerException e) { throw e; } catch (Exception e) { throw new ServerException(e); } return(data); } // public DeviceAction[] sendCommands(InteropParameters parameters) throws ServerException, SerializationException, Exception { RTZ32_ControllerCommands commands = parameters.getBodyContentValue(RTZ32_ControllerCommands.class); return Controller_RTZ32_Actions.sendCommands(this, parameters, commands); } // public void addEtdStatus(EtdStatus etdStatus) { // Añadir el EtdStatus del periodo actual ltrafficData.add(etdStatus); if (ltrafficData.size() >= 1440) ltrafficData.remove(0); } public List getTrafficData(long timestamp) { List lresult = new ArrayList(); try { for (EtdStatus etdStatus : ltrafficData) { if (etdStatus.measurementTimestamp >= timestamp) lresult.add(etdStatus); } } catch (Exception e) { } return(lresult); } public EtdStatus createEtdStatus() { EtdStatus etdStatus = new EtdStatus(); etdStatus.period = device_rtz32.getDeviceInformation().polling; etdStatus.measurementTimestamp = TimeUtils.thisperiod(device_rtz32.getDeviceInformation().polling); etdStatus.status = EtdStatus.STATUS_OFFLINE; etdStatus.llane = new ArrayList(); etdStatus.total = new EtdStatusLane(); return(etdStatus); } // boolean init = true; public void forceUpdate() { this.forceUpdate = true; } protected void update() throws Exception { RTZ32_Controller rtz32 = getController(); // Tables try { if (talker.isConnected() == true) { if ((rtz32.getDeviceConfiguration().rtz32 == null)) // || (rtz32.getDeviceConfiguration().rtz32.isValid() == false)) { configurationRead(Shared.getApplicationName(), Shared.getMessage("System initialization"), true, new ArrayList()); } } } catch (Exception exception) { } // States and alarms mutexUpdate.lockWrite(); updatingStatus = true; try { if (talker.isConnected() == true) { talker.writer.PET_ESTADO(); talker.writer.PET_ALARMAS(0x01); talker.writer.PET_ALARMAS(0x02); talker.writer.PET_ALARMAS(0x03); talker.writer.PET_ALARMAS(0x04); talker.writer.PET_ALARMAS(0x05); talker.writer.PET_ALARMAS(0x06); talker.writer.PET_ALARMAS(0x07); talker.writer.PET_ALARMAS(0x08); talker.writer.PET_ALARMAS(0x09); talker.writer.PET_ALARMAS(0x0A); talker.writer.PET_ALARMAS(0x0F); talker.writer.PET_PLAN_DESFASE(); talker.writer.PET_FH(); talker.writer.PET_VERSION(); RTZ32_Status_Pendings pendings = talker.rtz32.getDeviceStatus().rtz32.pendings; if ((pendings != null) && (pendings.hasPendings() == true)) { pendings.update(talker.rtz32.getDeviceStatus().rtz32); } Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); } else { RTZ32_Status_Pendings pendings = talker.rtz32.getDeviceStatus().rtz32.pendings; if ((pendings != null) && (pendings.hasPendings() == true)) { pendings.update(talker.rtz32.getDeviceStatus().rtz32); } Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); } } catch (Exception exception) { } finally { updatingStatus = false; mutexUpdate.releaseWrite(); } } // public void adjustConfiguration (RTZ32_Information_Program program, RTZ32_Information_Program program0) throws ServerException { try { { RTZ32_Controller rtz32 = Serialization.clone(this.device_rtz32); for (RTZ32_Configuration_Group group : program.configuration.rtz32.groups) { program0.configuration.rtz32.getGroup(group.number).setType(group.type); } Controller_RTZ32_Database.addProgram(program0); } } catch (Exception e) { } } public void adjustConfigurationPrograms (RTZ32_Information_Program program0) throws ServerException { try { for (int i=1; i<=RTZ32_Constants.MAXIMUM_NUMBER_PROGRAMS; i++) { try { RTZ32_Information_Program programI = Controller_RTZ32_Database.getProgram(this.device_rtz32.getIdentifier(), "" + i); RTZ32_Configuration_Program programCfg = programI.configuration.rtz32.getProgram(i); RTZ32_Configuration_Program program0Cfg = program0.configuration.rtz32.getProgram(i); // programI.configuration.rtz32.programs[i-1].subtableApproachingTimesTW = program0Cfg.subtableApproachingTimesTW; // programI.configuration.rtz32.programs[i-1].subtableGroupTransitions = program0Cfg.subtableGroupTransitions; // programI.configuration.rtz32.programs[i-1].subtableToleranceTimesTW = program0Cfg.subtableToleranceTimesTW; for (int j=1; j<=RTZ32_Constants.MAXIMUM_NUMBER_GROUPS; j++) { try { programI.configuration.rtz32.groups[j-1].transitions = program0.configuration.rtz32.groups[j-1].transitions; } catch (Exception e) { } } Controller_RTZ32_Database.addProgram(programI); } catch (Exception e) { } } } catch (Exception e) { } } // public void configurationRead(String username, String description, boolean update, List programsDescriptions) throws ServerException { if ((device_rtz32.getDeviceRealtime().rtz32.reading != null) && (device_rtz32.getDeviceRealtime().rtz32.reading.status == RTZ32_Realtime_Reading.READING_IN_PROGRESS)) { // Already reading throw new ServerException(Shared.getMessage("Already reading tables")); } if ((device_rtz32.getDeviceRealtime().rtz32.writing != null) && (device_rtz32.getDeviceRealtime().rtz32.writing.status == RTZ32_Realtime_Writing.WRITING_IN_PROGRESS)) { // Already writing throw new ServerException(Shared.getMessage("Controller is writing tables")); } if (device_rtz32.getDeviceRealtime().rtz32.reading == null) device_rtz32.getDeviceRealtime().rtz32.reading = new RTZ32_Realtime_Reading(); device_rtz32.getDeviceRealtime().rtz32.reading.status = RTZ32_Realtime_Reading.READING_IN_PROGRESS; device_rtz32.getDeviceRealtime().rtz32.reading.timestamp = System.currentTimeMillis(); device_rtz32.getDeviceRealtime().rtz32.reading.progress = 0f; device_rtz32.getDeviceRealtime().rtz32.reading.table = 0; device_rtz32.getDeviceRealtime().rtz32.reading.configuration = null; device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); long millis = System.currentTimeMillis(); mutexUpdate.lockWrite(45000); if ((System.currentTimeMillis()-millis) >= 45000) { Shared.println(name, "LOCK READ TIMEOUT"); device_rtz32.getDeviceRealtime().rtz32.reading.status = RTZ32_Realtime_Reading.READING_ERROR; mutexUpdate.releaseWrite(); return; } try { readingTables = true; for (int i=1; i<=7; i++) PET_TABLA(i); for (int i=11; i<=28; i++) PET_TABLA(i); for (int i=31; i<=40; i++) PET_TABLA(i); for (int i=42; i<=46; i++) PET_TABLA(i); for (int i=50; i<=60; i++) PET_TABLA(i); for (int i=65; i<=75; i++) PET_TABLA(i); for (int i=78; i<=85; i++) PET_TABLA(i); for (int i=91; i<=95; i++) PET_TABLA(i); talker.rtz32.getDeviceConfiguration().rtz32.valid = true; Shared.println(name, Shared.getMessage("Tables downloaded") + "!!!!!!!!!!!!!!!!!!"); long recordingTimestamp = System.currentTimeMillis(); if (update == true) { talker.rtz32.getDeviceConfiguration().rtz32.description = description; talker.rtz32.getDeviceConfiguration().rtz32.recordingTimestamp = recordingTimestamp; for (int i=0; i i) && (programsDescriptions.get(i) != null)) talker.rtz32.getDeviceConfiguration().rtz32.programs[i].description = programsDescriptions.get(i); else talker.rtz32.getDeviceConfiguration().rtz32.programs[i].description = description; talker.rtz32.getDeviceConfiguration().rtz32.programs[i].recordingTimestamp = recordingTimestamp; } } // Si lee todas las tablas correctamente se actualiza la configuracion Shared.model.updateDevice(device_rtz32, Serialization.clone(talker.rtz32)); // Tables readed, insert in historical RTZ32_Persistent_Configuration configuration = new RTZ32_Persistent_Configuration(); configuration.device = device_rtz32.getIdentifier(); configuration.datetime = new Date(); configuration.username = username; configuration.action = Shared.getMessage("Tables downloading"); configuration.operation = Shared.getMessage("All"); configuration.distribution = Shared.getMessage("All"); configuration.description = description; configuration.configuration = talker.rtz32.getDeviceConfiguration(); Controller_RTZ32_Database.addConfiguration(configuration); } else { device_rtz32.getDeviceRealtime().rtz32.reading.configuration = talker.rtz32.getDeviceConfiguration().rtz32; talker.rtz32 = Serialization.clone(device_rtz32); // Cambio 09092022 } device_rtz32.getDeviceRealtime().rtz32.reading.status = RTZ32_Realtime_Reading.READING_OK; device_rtz32.getDeviceRealtime().rtz32.reading.table = 0; } catch (Exception exception) { device_rtz32.getDeviceRealtime().rtz32.reading.status = RTZ32_Realtime_Reading.READING_ERROR; device_rtz32.getDeviceRealtime().rtz32.reading.configuration = null; throw new ServerException(exception.getMessage()); } finally { // device_rtz32.getDeviceRealtime().rtz32.reading = null; device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); readingTables = false; mutexUpdate.releaseWrite(); } } private void PET_TABLA(int number) throws Exception { device_rtz32.getDeviceRealtime().rtz32.reading.table = number; long timestamp1 = System.currentTimeMillis(); { talker.writer.PET_TABLA(number); } long timestamp2 = System.currentTimeMillis(); if ((timestamp2-timestamp1) > talker.rtz32.getDeviceInformation().connection.readTimeout) { throw new Exception("Timeout"); } device_rtz32.getDeviceRealtime().rtz32.reading.progress = device_rtz32.getDeviceRealtime().rtz32.reading.progress + 1.35f; device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); } // // public void configurationWrite(String username, RTZ32_Commands_Configuration_Write command) throws ServerException { if ((device_rtz32.getDeviceRealtime().rtz32.writing != null) && (device_rtz32.getDeviceRealtime().rtz32.writing.status == RTZ32_Realtime_Writing.WRITING_IN_PROGRESS)) { // Already writing throw new ServerException("Already writing tables"); } if ((device_rtz32.getDeviceRealtime().rtz32.reading != null) && (device_rtz32.getDeviceRealtime().rtz32.reading.status == RTZ32_Realtime_Reading.READING_IN_PROGRESS)) { // Already writing throw new ServerException("Conntroller is reading tables"); } if (device_rtz32.getDeviceRealtime().rtz32.writing == null) device_rtz32.getDeviceRealtime().rtz32.writing = new RTZ32_Realtime_Writing(); device_rtz32.getDeviceRealtime().rtz32.writing.timestamp = System.currentTimeMillis(); device_rtz32.getDeviceRealtime().rtz32.writing.status = RTZ32_Realtime_Writing.WRITING_IN_PROGRESS; device_rtz32.getDeviceRealtime().rtz32.writing.progress = 0f; device_rtz32.getDeviceRealtime().rtz32.writing.table = 0; device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); long millis = System.currentTimeMillis(); mutexUpdate.lockWrite(45000); if ((System.currentTimeMillis()-millis) >= 45000) { Shared.println(name, "LOCK WRITE TIMEOUT"); device_rtz32.getDeviceRealtime().rtz32.writing.status = RTZ32_Realtime_Writing.WRITING_ERROR; mutexUpdate.releaseWrite(); return; } updatingStatus = true; try { // Tables write, insert in historical Shared.println(name, "############################################# CLONING"); talker.rtz32 = Serialization.clone(device_rtz32); talker.rtz32.realtime = device_rtz32.realtime; Shared.println(name, "############################################# CLONED"); RTZ32_Persistent_Configuration configuration = new RTZ32_Persistent_Configuration(); configuration.device = device_rtz32.getIdentifier(); configuration.datetime = new Date(); configuration.username = username; configuration.action = "Uploaded tables"; if (command.operationTables == true) configuration.operation = "All"; else configuration.operation = "None"; if (command.distributionTables == true) { if ((command.programs == null) || (command.programs.size() == 0)) { configuration.distribution = "All"; } else { configuration.distribution = command.getProgramsTables(); } } else { configuration.distribution = "None"; } // Antes de enviar las tablas se ha de poner el regulador en Grabacion:ON (pagina 7 protocolo) // Si al grabar una tabla devuelve 0(ok) se pasa a la siguiente, si devuelve 1(Error), no se puede enviar la siguiente // (Mirar pagina 9 protocolo) // Que hacer si da error? // Al acabar de grabar todas las tablas se ha de enviar Grabacion:OFF // Si todo ha ido bien (se ha activado grabacion, se han enviado todas las tablas correctamente, se ha desactivado grabacion) // entonces se ha de borrar la copia de trabajo enviada // Activar grabacion { SEND_GRABACION(true); } int[] programsTables = new int[0]; // Enviar tablas { if (command.operationTables == true) { // Send all tables less distribution tables for (int i=1; i<=7; i++) SEND_TABLA(i, command.configuration); if (configuration.distribution.equalsIgnoreCase("All") == true) { programsTables = new int[18]; // Send all tables 11 to 28 for (int i=11; i<=28; i++) { programsTables[i-11] = i; SEND_TABLA(i, command.configuration); } configuration.action = "Enviadas tablas de reparto y de funcionamiento"; } else if (configuration.distribution.equalsIgnoreCase("None") == true) { // Nothing to do configuration.action = "Enviadas tablas de funcionamiento"; } else { // Send all tables 11 to 28 indicated in configuration.distribution configuration.action = "Enviadas tablas de repartos ("; programsTables = StringUtils.obtenerTokensInt(configuration.distribution, ","); for (int i=0; i talker.rtz32.getDeviceInformation().connection.readTimeout) { throw new Exception("Timeout"); } device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); } private void SEND_TABLA(int tableNumber, RTZ32_Configuration configuration) throws Exception { device_rtz32.getDeviceRealtime().rtz32.writing.table = tableNumber; long timestamp1 = System.currentTimeMillis(); { RTZ32_Configuration_Table table = getTable(tableNumber); if (table != null) { byte[] data = table.serialize(configuration); talker.writer.ORD_TABLA(table, data); } } long timestamp2 = System.currentTimeMillis(); if ((timestamp2-timestamp1) > talker.rtz32.getDeviceInformation().connection.readTimeout) { throw new Exception("Timeout"); } if (device_rtz32.getDeviceRealtime().rtz32.writing.tableWrittenCorrect == false) { throw new Exception("Error writing table"); } device_rtz32.getDeviceRealtime().rtz32.writing.progress = device_rtz32.getDeviceRealtime().rtz32.writing.progress + 1.41f; device_rtz32.getDeviceRealtime().setLastTimestampUpdate(System.currentTimeMillis()); } private RTZ32_Configuration_Table getTable(int tableNumber) { RTZ32_Configuration_Table table = null; if ((tableNumber >= 11) && (tableNumber) <= 28) { table = new RTZ32_Configuration_Table_11_28(tableNumber); } else if ((tableNumber >= 38) && (tableNumber) <= 40) { table = new RTZ32_Configuration_Table_38_40(tableNumber); } else if ((tableNumber >= 53) && (tableNumber) <= 60) { table = new RTZ32_Configuration_Table_53_60(tableNumber); } else if ((tableNumber >= 82) && (tableNumber) <= 85) { table = new RTZ32_Configuration_Table_82_85(tableNumber); } else { switch (tableNumber) { case 1: table = new RTZ32_Configuration_Table_1(tableNumber); break; case 2: table = new RTZ32_Configuration_Table_2(tableNumber); break; case 3: table = new RTZ32_Configuration_Table_3(tableNumber); break; case 4: table = new RTZ32_Configuration_Table_4(tableNumber); break; case 5: table = new RTZ32_Configuration_Table_5(tableNumber); break; case 6: table = new RTZ32_Configuration_Table_6(tableNumber); break; case 7: table = new RTZ32_Configuration_Table_7(tableNumber); break; case 31: table = new RTZ32_Configuration_Table_31(tableNumber); break; case 32: table = new RTZ32_Configuration_Table_32(tableNumber); break; case 33: table = new RTZ32_Configuration_Table_33(tableNumber); break; case 34: table = new RTZ32_Configuration_Table_34(tableNumber); break; case 35: table = new RTZ32_Configuration_Table_35(tableNumber); break; case 36: table = new RTZ32_Configuration_Table_36(tableNumber); break; case 37: table = new RTZ32_Configuration_Table_37(tableNumber); break; case 42: table = new RTZ32_Configuration_Table_42(tableNumber); break; case 43: table = new RTZ32_Configuration_Table_43(tableNumber); break; case 44: table = new RTZ32_Configuration_Table_44(tableNumber); break; case 45: table = new RTZ32_Configuration_Table_45(tableNumber); break; case 46: table = new RTZ32_Configuration_Table_46(tableNumber); break; case 50: table = new RTZ32_Configuration_Table_50(tableNumber); break; case 51: table = new RTZ32_Configuration_Table_51(tableNumber); break; case 52: table = new RTZ32_Configuration_Table_52(tableNumber); break; case 65: table = new RTZ32_Configuration_Table_65(tableNumber); break; case 66: table = new RTZ32_Configuration_Table_66(tableNumber); break; case 67: table = new RTZ32_Configuration_Table_67(tableNumber); break; case 68: table = new RTZ32_Configuration_Table_68(tableNumber); break; case 69: table = new RTZ32_Configuration_Table_69(tableNumber); break; case 70: table = new RTZ32_Configuration_Table_70(tableNumber); break; case 71: table = new RTZ32_Configuration_Table_71(tableNumber); break; case 72: table = new RTZ32_Configuration_Table_72(tableNumber); break; case 73: table = new RTZ32_Configuration_Table_73(tableNumber); break; case 74: table = new RTZ32_Configuration_Table_74(tableNumber); break; case 75: table = new RTZ32_Configuration_Table_75(tableNumber); break; case 78: table = new RTZ32_Configuration_Table_78(tableNumber); break; case 79: table = new RTZ32_Configuration_Table_79(tableNumber); break; case 80: table = new RTZ32_Configuration_Table_80(tableNumber); break; case 81: table = new RTZ32_Configuration_Table_81(tableNumber); break; case 91: table = new RTZ32_Configuration_Table_91(tableNumber); break; case 92: table = new RTZ32_Configuration_Table_92(tableNumber); break; case 93: table = new RTZ32_Configuration_Table_93(tableNumber); break; case 94: table = new RTZ32_Configuration_Table_94(tableNumber); break; case 95: table = new RTZ32_Configuration_Table_95(tableNumber); break; default: table = new RTZ32_Configuration_Table(tableNumber); break; } } return(table); } // }