import time
import importlib
from itertools import count
from vent.alarm import AlarmType, AlarmSeverity
[docs]class Alarm:
"""
Class used by the program to control and coordinate alarms.
Parameterized by a :class:`Alarm_Rule` and managed by :class:`Alarm_Manager`
"""
id_counter = count()
"""
:class:`itertools.count`: used to generate unique IDs for each alarm
"""
[docs] def __init__(self,
alarm_type: AlarmType,
severity: AlarmSeverity,
start_time: float = None,
latch = True,
persistent = True,
value=None,
message=None,
managed = False):
"""
Args:
alarm_type :
severity:
start_time:
value (int, float): optional - numerical value that generated the alarm
message (str): optional - override default text generated by :class:`~vent.gui.alarm_manager.AlarmManager`
managed (bool): if created by the alarm_manager, don't register
"""
self.id = next(Alarm.id_counter)
assert isinstance(severity, AlarmSeverity)
self._severity = severity
assert isinstance(alarm_type, AlarmType)
self._alarm_type = alarm_type
if start_time is None:
self.start_time = time.time()
else:
assert isinstance(start_time, float)
self.start_time = start_time
self.active = True
if self.severity.value == AlarmSeverity.OFF.value:
self.active = False
self.alarm_end_time = None
self.value = value
self.message = message
self.latch = latch
self.persistent = persistent
if not managed:
self.manager.register_alarm(self)
@property
def manager(self):
"""
have ta do it this janky way to avoid circular imports
"""
try:
return Alarm_Manager()
except:
# import into the module namespace
manager_module = importlib.import_module('vent.alarm.alarm_manager')
globals()['Alarm_Manager'] = getattr(manager_module, 'Alarm_Manager')
return Alarm_Manager()
@property
def severity(self):
# no setter, don't want to be able to change after instantiation
return self._severity
@property
def alarm_type(self):
return self._alarm_type
[docs] def deactivate(self):
if not self.active:
return
self.alarm_end_time = time.time()
self.active = False
# make sure the manager deactivates us.
# manager checks if this has already been done so doesn't recurse
self.manager.deactivate_alarm(self)