package art.servers.sosserver.controller.musatel; import art.library.interop.serialization.Serialization; import art.library.model.devices.sos.Sos; import art.library.model.devices.sos.musatel.status.SosStatusMusatel; import art.library.model.devices.sos.musatel.status.SosStatusMusatelAudio; import art.library.utils.synchro.Mutex; import art.servers.Shared; import java.io.InputStream; public class ControllerSos_MusatelReceiver { private ControllerSos_Musatel controller = null; private String name = null; private Mutex mutex = new Mutex(); public ControllerSos_MusatelReceiver(ControllerSos_Musatel controller) { this.controller = controller; this.name = controller.getName(); } /** * Una vez reciba el poste ACK_DEM_USE, actuará el sintetizador con el mensaje de espera en cuatro idiomas
* Acabado el mensaje, actuará el tono de llamada durante un máximo de 2 minutos
* Si el poste no recibe en 5 segundos el ACK_DEM_USE enviará la demanda 3 veces, en tiempos de 5 * segundos. Si ninguno de los intentos fuera positivo pasará a estar en estado de "Fuera de Servicio" y * activará el sintetizador de voz con el mensaje oportuno durante 1 minuto
* El poste pasa a fonía y el sintetizador se desactiva. Para mantener la fonía activa el centro de control * debe enviar ORD_FON_ON periódicamente al poste en un intervalo inferior a dos minutos * En caso contrario el poste pasará automáticamente a reposo
* Se corta la fonía en el poste.El poste pasa a reposo. * * Poste Central * ------------------------------------ * DEM_USE ----> * <---- ACK_DEM_USE * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_OFF * ACK_FON_OFF ----> */ protected void DEM_USE(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); String message = "< DEM_USE, type = " + String.format("%02X", type); Shared.println(name, message); controller.sender.ACK_DEM_USE(); clone.getDeviceStatus().musatel.state = SosStatusMusatel.STATE_PENDING_USER_CALL; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } /** * Una vez reciba el poste ACK_DEM_SER, actuará el sintetizador con el mensaje de espera en cuatro idiomas
* Acabado el mensaje, actuará el tono de llamada durante un máximo de 2 minutos
* Si el poste no recibe en 5 segundos el ACK_DEM_SER enviará la demanda 3 veces, en tiempos de 5 * segundos. Si ninguno de los intentos fuera positivo pasará a estar en estado de "Fuera de Servicio" y * activará el sintetizador de voz con el mensaje oportuno durante 1 minuto
* El poste pasa a fonía y el sintetizador se desactiva.Para mantener la fonía activa el centro de control * debe enviar ORD_FON_ON periódicamente al poste en un intervalo inferior a dos minutos
* En caso contrario el poste pasará automáticamente a reposo
* Se corta la fonía en el poste.El poste pasa a reposo * * Poste Central * ------------------------------------ * DEM_SER ----> * <---- ACK_DEM_SER * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_ON * ACK_FON_ON ----> * <---- ORD_FON_OFF * ACK_FON_OFF ----> */ protected void DEM_SER(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); String message = "< DEM_SER, type = " + String.format("%02X", type); Shared.println(name, message); controller.sender.ACK_DEM_SER(); clone.getDeviceStatus().musatel.state = SosStatusMusatel.STATE_PENDING_SERVICE_CALL; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } /** *El poste envía solamente una vez cada alarma para evitar el envío repetitivo de alarmas
* El test demantenimiento al poste refresca el estado de las alarmas. El proceso es el siguiente:
* El poste enviará SOLAMENTE UNA VEZ la alarma (Puerta abierta, batería baja)
* - Cuando el operador haga un test de mantenimiento al poste emisor de la alarma, se * refrescará (reseteará) indicando en la respuesta el estado de la alarma en dicho momento
* - Suponiendo que una alarma, en el momento del test, se hubiera corregido * momentáneamente, en el resultado del test se reflejará como alarma OK, anulándose * automáticamente de la ventana de alarmas pendientes
* - Si después del test se volviese a producir de nuevo la misma alarma anterior, el poste volverá * a enviar de nuevo SOLAMENTE UNA VEZ dicha alarma reflejándose otra vez en la ventana * de alarmas pendientes
*/ protected void ENV_ALA(int stateMaster, int stateSlave) throws Exception { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); String message = "< ENV_ALA, primary state = " + String.format("%02X", stateMaster) + ", secondary state = " + String.format("%02X", stateSlave); Shared.println(name, message); controller.sender.ACK_ENV_ALA(); alarms(clone, stateMaster); controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_FON_ON(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< ACK_FON_ON"); clone.getDeviceStatus().musatel.state = SosStatusMusatel.STATE_ACTIVE_CALL; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_FON_OFF(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< ACK_FON_OFF"); clone.getDeviceStatus().musatel.currentConnection = null; clone.getDeviceStatus().musatel.state = SosStatusMusatel.STATE_IDLE; controller.setSosPriority(-1); controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_TON_ON(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< ACK_TON_ON"); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); clone.getDeviceStatus().musatel.audio.tone = SosStatusMusatelAudio.STATE_ON; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_TON_OFF(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< ACK_TON_OFF"); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); clone.getDeviceStatus().musatel.audio.tone = SosStatusMusatelAudio.STATE_OFF; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void RES_TST_FON(int type, int result) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< RES_TST_FON"); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void RES_TST_MAN(InputStream input) throws Exception { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); Shared.println(name, "< RES_TST_MAN"); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); /** * Bit 7 Batería baja * Bit 6 Puerta Abierta * Bit 5 No usado * Bit 4 No usado * Bit 3 Fonía ON * Bit 2 Tono ON * Bit 1 Pulsador bloqueado * Bit 0 - */ int stateMaster = input.read(); int stateSlave = input.read(); int attenuatorMaters = input.read(); // Not used int attenuatorSlave = input.read(); // Not used int volumeMaster = input.read(); int volumeSlave = input.read(); alarms(clone, stateMaster); clone.getDeviceStatus().musatel.audio.volume = (int)(((double)volumeMaster/7.0) * 100); // Update controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_VOZ_ON(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); Shared.println(name, "< ACK_VOZ_ON"); clone.getDeviceStatus().musatel.audio.audio = SosStatusMusatelAudio.STATE_ON; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_VOZ_OFF(int type) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); Shared.println(name, "< ACK_VOZ_OFF"); clone.getDeviceStatus().musatel.audio.audio = SosStatusMusatelAudio.STATE_OFF; controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void ACK_ADJ_VOL(int type, int volume) { mutex.lockWrite(); try { Sos clone = (Sos)Serialization.clone(controller.getDevice()); if (clone.getDeviceStatus().musatel.audio == null) clone.getDeviceStatus().musatel.audio = new SosStatusMusatelAudio(); Shared.println(name, "< ACK_ADJ_VOL"); clone.getDeviceStatus().musatel.audio.volume = (int)(((double)volume/7.0) * 100.0); controller.online(clone); } catch (Exception e) { Shared.printstack(name, e); } finally { mutex.releaseWrite(); } } protected void NACK(int reason) { // Causa: indica la razón por la cual se rechaza la orden. // En este caso tiene el valor OTRO_CC_ASIGNADO (bit 4 a 1, siendo el bit 0 el de menor peso). Shared.println(name, "< NACK"); } protected void UNKNOWN(int code) { Shared.println(name, "< UNKNOWN FUNCTION CODE (0x" + String.format("%02X", code) + ")"); } private void alarms(Sos sos, int state) { /** * Bit 7 Batería baja * Bit 6 Puerta Abierta * Bit 5 No usado * Bit 4 No usado * Bit 3 Fonía ON * Bit 2 Tono ON * Bit 1 Pulsador bloqueado * Bit 0 - */ sos.setAlarm("alarm_call_button_locked", (state & 0x02) > 0); if ((state & 0x04) > 0) { sos.getDeviceStatus().musatel.audio.tone = SosStatusMusatelAudio.STATE_ON; } else { sos.getDeviceStatus().musatel.audio.tone = SosStatusMusatelAudio.STATE_OFF; } if ((state & 0x08) > 0) { sos.getDeviceStatus().musatel.audio.audio = SosStatusMusatelAudio.STATE_ON; } else { sos.getDeviceStatus().musatel.audio.audio = SosStatusMusatelAudio.STATE_OFF; } sos.setAlarm("alarm_open_door", (state & 0x40) > 0); sos.setAlarm("alarm_batteries_low", (state & 0x80) > 0); } }