Active alarms almost work. They just look ugly.

This commit is contained in:
Kalzu Rekku 2025-01-27 11:26:45 +02:00
parent 6fd172ce2e
commit 8690532c19
3 changed files with 33 additions and 7 deletions

View File

@ -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

View File

@ -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():

View File

@ -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', {})