Active alarms almost work. They just look ugly.
This commit is contained in:
parent
6fd172ce2e
commit
8690532c19
@ -152,6 +152,11 @@ class AlarmSiren:
|
|||||||
# Check for alarms to trigger
|
# Check for alarms to trigger
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
for alarm_id, alarm_info in list(self.active_alarms.items()):
|
for alarm_id, alarm_info in list(self.active_alarms.items()):
|
||||||
|
# Check if alarm is more than 1 hour late
|
||||||
|
if now > alarm_info['trigger_time'] + timedelta(hours=1):
|
||||||
|
logger.warning(f"Alarm {alarm_id} is over 1 hour late. Disabling.")
|
||||||
|
del self.active_alarms[alarm_id]
|
||||||
|
continue
|
||||||
if now >= alarm_info['trigger_time']:
|
if now >= alarm_info['trigger_time']:
|
||||||
# Trigger alarm if not already active
|
# Trigger alarm if not already active
|
||||||
if alarm_info['process'] is None:
|
if alarm_info['process'] is None:
|
||||||
@ -179,7 +184,14 @@ class AlarmSiren:
|
|||||||
logger.info(f"Removing non-repeating alarm {alarm_id}.")
|
logger.info(f"Removing non-repeating alarm {alarm_id}.")
|
||||||
del self.active_alarms[alarm_id]
|
del self.active_alarms[alarm_id]
|
||||||
|
|
||||||
time.sleep(1) # Prevent tight loop
|
# Actively clean up zombie processes
|
||||||
|
for alarm_id, alarm_info in list(self.active_alarms.items()):
|
||||||
|
process = alarm_info.get('process')
|
||||||
|
if process and process.poll() is not None:
|
||||||
|
# Remove terminated processes
|
||||||
|
alarm_info['process'] = None
|
||||||
|
|
||||||
|
time.sleep(0.5) # Prevent tight loop
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error in playback worker: {e}")
|
logger.error(f"Error in playback worker: {e}")
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@ -230,13 +242,19 @@ def dismiss_alarm(self, alarm_id: int):
|
|||||||
logger.warning(f"Cannot dismiss alarm {alarm_id} - not found in active alarms")
|
logger.warning(f"Cannot dismiss alarm {alarm_id} - not found in active alarms")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Stop playback
|
# Stop playback and terminate any running process
|
||||||
alarm_info = self.active_alarms.pop(alarm_id, None)
|
alarm_info = self.active_alarms.pop(alarm_id, None)
|
||||||
process = alarm_info.get('process')
|
if alarm_info and alarm_info.get('process'):
|
||||||
if process:
|
try:
|
||||||
process.terminate()
|
alarm_info['process'].terminate()
|
||||||
process.wait()
|
alarm_info['process'].wait(timeout=2)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error terminating alarm process: {e}")
|
||||||
|
# Force kill if terminate fails
|
||||||
|
try:
|
||||||
|
alarm_info['process'].kill()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
logger.info(f"Dismissed alarm {alarm_id}.")
|
logger.info(f"Dismissed alarm {alarm_id}.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import threading
|
|||||||
import logging
|
import logging
|
||||||
from http.server import HTTPServer
|
from http.server import HTTPServer
|
||||||
from multiprocessing import Queue
|
from multiprocessing import Queue
|
||||||
|
import subprocess
|
||||||
|
|
||||||
# Import our custom modules
|
# Import our custom modules
|
||||||
from alarm_api import AlertApi, run as run_api
|
from alarm_api import AlertApi, run as run_api
|
||||||
@ -153,6 +154,12 @@ class AlarmSystemManager:
|
|||||||
if self.api_thread and self.api_thread.is_alive():
|
if self.api_thread and self.api_thread.is_alive():
|
||||||
self.api_thread.join(timeout=2)
|
self.api_thread.join(timeout=2)
|
||||||
|
|
||||||
|
# Kill any remaining mpg123 processes
|
||||||
|
try:
|
||||||
|
subprocess.run(['pkill', 'mpg123'], check=False)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error killing mpg123 processes: {e}")
|
||||||
|
|
||||||
logger.info("Alarm System shutdown complete")
|
logger.info("Alarm System shutdown complete")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -29,6 +29,7 @@ def _draw_error(stdscr, error_message):
|
|||||||
|
|
||||||
def _draw_active_alarms(stdscr, context):
|
def _draw_active_alarms(stdscr, context):
|
||||||
"""Draw the active alarms screen"""
|
"""Draw the active alarms screen"""
|
||||||
|
_init_colors()
|
||||||
height, width = stdscr.getmaxyx()
|
height, width = stdscr.getmaxyx()
|
||||||
|
|
||||||
active_alarms = context.get('active_alarms', {})
|
active_alarms = context.get('active_alarms', {})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user