************* Alarm Service ************* The AlarmService Device ======================= The ``AlarmService`` device keeps track of the alarming status of all the devices known to the distributed system (currently, this is a synonym for "every device in the same karabo topic of the ``AlarmService`` instance"). The ``AlarmService`` is considered to be a singleton, meaning that there is only one instance of this class in the same topic installation. The ``AlarmService`` performs a set of actions upon initialization in order to fullfil its responsibility. At its ``initialize`` method, it self registers as a monitor for ``InstanceNew`` and ``InstanceGone`` events. In response to ``InstanceNew`` events, the ``AlarmService`` connects its ``slotUpdateAlarm`` to the new device's ``signalAlarmUpdate``. A device is registered with the ``AlarmService`` after a successful connection to its ``signalAlarmUpdate``. It is possible for a "new" device to be already registered with the ``AlarmService`` - this happens, for instance, if the device crashed and then got reinstantiated before an ``InstanceGone`` could be generated due to a heartbeat timeout interval. For such "new" devices, the ``AlarmService`` requests an alarming status from the device by callings its ``slotReSubmitAlarms`` asynchronously. The reply from ``slotReSubmitAlarms`` is handled by ``slotUpdateAlarm``. ``slotUpdateAlarm`` maintains a ``Hash``, ``m_updateHash``, with the updates for alarming status of the devices. The ``AlarmService`` periodically emits ``signalAlarmServiceUpdate`` if its ``m_updateHash`` is not empty. In response to ``InstanceGone`` events, the ``AlarmService`` updates all pending alarms related to the device that is gone to be acknowledgeable. ``AlarmService`` periodically persists the alarming status for devices that it keeps internally to a file - ``$KARABO/var/data/Karabo_AlarmService.xml``. The alarming status of devices stored in this file are used by ``AlarmService`` at start time to set its initial alarming status information. As part of its initialization, the ``AlarmService`` also sends this restored alarming status data through a ``signalAlarmServiceUpdate``. Interactions with the GUI Server Device ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``GuiServerDevice`` connects to the ``AlarmService::signalAlarmServiceUpdate`` at its method ``connectPotentialAlarmService``. ``GuiServerDevice::connectPotentialAlarmService`` searches for the ``AlarmService`` in all the topology currently known to the ``GuiServerDevice``. As there may be no known ``AlarmService`` at the moment the ``GuiServerDevice`` is started, the ``GuiServerDevice`` calls this method both at initialization time and as part of the handling of any event of type ``InstanceNew`` event - just in case the new device is an ``AlarmService`` instance. A ``signalAlarmServiceUpdate`` is handled by ``GuiServer::slotAlarmSignalsUpdate``. The connection between the signal and the slot is performed by ``GuiServerDevice::connectPotentialAlarmService`` when its ``topologyEntry`` parameter is an ``AlarmService`` instance. Once a successful connection to the ``AlarmService`` signal is established, the ``GuiServerDevice::onRequestAlarms`` is called. This method will send an async request to ``AlarmService::slotRequestAlarmDump``. The reply for the async request is handled by ``GuiServerDevice::onRequestedAlarmsReply``. The handling of the reply consists of sending a message of type ``alarmInit`` with the updated alarms data to all the connected GUI clients. After this initial alarm snapshot, any changes in alarming conditions of devices instantiated in the topic will be updated by ``GuiServer::slotAlarmSignalsUpdate``. Further information about the Alarm Service can be found at **Karabo** > **Outdated Concepts** > **Alarm System**. The pieces of information in that page that are not outdated will be merged soon into this page.