Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -37,7 +37,7 @@ class AlertManager:
|
|
37 |
def __init__(self, config):
|
38 |
self.cooldown_seconds = config.get("alert_cooldown_seconds", 5)
|
39 |
self.last_alert_time = 0
|
40 |
-
|
41 |
self._load_sound(config.get("alert_sound_path"))
|
42 |
|
43 |
def _load_sound(self, wav_path):
|
@@ -56,23 +56,27 @@ class AlertManager:
|
|
56 |
self.alert_data = None
|
57 |
|
58 |
def trigger_alert(self, level, lighting):
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
self.is_alert_active = False
|
63 |
-
return None
|
64 |
-
|
65 |
is_drowsy = level != "Awake"
|
66 |
is_good_light = lighting != "Low"
|
67 |
-
is_ready = (time.monotonic() - self.last_alert_time) > self.cooldown_seconds
|
68 |
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
return None
|
75 |
|
|
|
76 |
alert_manager = AlertManager(CFG.get("alerting", {}))
|
77 |
|
78 |
# βββββββββββββββββββββββββββββ Frame Processing for Tab 1 (Image Stream) - UPDATED
|
@@ -82,7 +86,7 @@ def process_live_frame(frame):
|
|
82 |
|
83 |
t0 = time.perf_counter()
|
84 |
try:
|
85 |
-
#
|
86 |
processed, indic = detector.process_frame(frame, draw_visuals=True)
|
87 |
except Exception as e:
|
88 |
logging.error(f"Error processing frame: {e}")
|
@@ -103,7 +107,6 @@ def process_live_frame(frame):
|
|
103 |
return processed, status_txt, gr.Audio(value=audio_payload, autoplay=True) if audio_payload else None
|
104 |
|
105 |
|
106 |
-
# βββββββββββββββββββββββββββββ Frame Processing for Tab 2 (Analysis-Only) - UPDATED
|
107 |
def process_for_stats_only(frame):
|
108 |
"""
|
109 |
Processes a frame but does not return any video/image output.
|
@@ -114,7 +117,7 @@ def process_for_stats_only(frame):
|
|
114 |
|
115 |
t0 = time.perf_counter()
|
116 |
try:
|
117 |
-
#
|
118 |
_, indic = detector.process_frame(frame, draw_visuals=False)
|
119 |
except Exception as e:
|
120 |
logging.error(f"Error processing frame: {e}")
|
|
|
37 |
def __init__(self, config):
|
38 |
self.cooldown_seconds = config.get("alert_cooldown_seconds", 5)
|
39 |
self.last_alert_time = 0
|
40 |
+
# --- FIX: The is_alert_active flag is no longer needed ---
|
41 |
self._load_sound(config.get("alert_sound_path"))
|
42 |
|
43 |
def _load_sound(self, wav_path):
|
|
|
56 |
self.alert_data = None
|
57 |
|
58 |
def trigger_alert(self, level, lighting):
|
59 |
+
"""
|
60 |
+
Triggers a repeating alert if drowsiness persists, governed by a cooldown.
|
61 |
+
"""
|
|
|
|
|
|
|
62 |
is_drowsy = level != "Awake"
|
63 |
is_good_light = lighting != "Low"
|
|
|
64 |
|
65 |
+
# --- FIX: New simplified logic for repeating alerts ---
|
66 |
+
# Check for drowsiness conditions first.
|
67 |
+
if is_drowsy and is_good_light and self.alert_data is not None:
|
68 |
+
# Then, check if the cooldown period has passed since the last alert.
|
69 |
+
cooldown_passed = (time.monotonic() - self.last_alert_time) > self.cooldown_seconds
|
70 |
+
if cooldown_passed:
|
71 |
+
# If conditions are met, fire the alert and reset the timer.
|
72 |
+
self.last_alert_time = time.monotonic()
|
73 |
+
logging.info(f"π Drowsiness alert! Repeating every {self.cooldown_seconds}s until 'Awake'.")
|
74 |
+
return (self.sample_rate, self.alert_data.copy())
|
75 |
+
|
76 |
+
# If conditions are not met (e.g., user is Awake or cooldown hasn't passed), do nothing.
|
77 |
return None
|
78 |
|
79 |
+
|
80 |
alert_manager = AlertManager(CFG.get("alerting", {}))
|
81 |
|
82 |
# βββββββββββββββββββββββββββββ Frame Processing for Tab 1 (Image Stream) - UPDATED
|
|
|
86 |
|
87 |
t0 = time.perf_counter()
|
88 |
try:
|
89 |
+
# Call with draw_visuals=True
|
90 |
processed, indic = detector.process_frame(frame, draw_visuals=True)
|
91 |
except Exception as e:
|
92 |
logging.error(f"Error processing frame: {e}")
|
|
|
107 |
return processed, status_txt, gr.Audio(value=audio_payload, autoplay=True) if audio_payload else None
|
108 |
|
109 |
|
|
|
110 |
def process_for_stats_only(frame):
|
111 |
"""
|
112 |
Processes a frame but does not return any video/image output.
|
|
|
117 |
|
118 |
t0 = time.perf_counter()
|
119 |
try:
|
120 |
+
# Call with draw_visuals=False. The first returned value will be None.
|
121 |
_, indic = detector.process_frame(frame, draw_visuals=False)
|
122 |
except Exception as e:
|
123 |
logging.error(f"Error processing frame: {e}")
|