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<br>
|
* Acabado el mensaje, actuará el tono de llamada durante un máximo de 2 minutos<br>
|
* 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<br>
|
* 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<br>
|
* 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<br>
|
* Acabado el mensaje, actuará el tono de llamada durante un máximo de 2 minutos<br>
|
* 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<br>
|
* 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<br>
|
* En caso contrario el poste pasará automáticamente a reposo<br>
|
* 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<br>
|
* El test demantenimiento al poste refresca el estado de las alarmas. El proceso es el siguiente:<br>
|
* El poste enviará SOLAMENTE UNA VEZ la alarma (Puerta abierta, batería baja)<br>
|
* - 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<br>
|
* - 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<br>
|
* - 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<br>
|
*/
|
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);
|
}
|
|
|
}
|