Add screen activity signaler to prevent display sleep
- Added signal_screen_activity() method to SignagePlayer class - Runs every 20 seconds automatically - Also triggered on any touch/user input events Multiple methods used to keep display awake: - xset s reset - Resets screensaver timer - xset dpms force on - Forces display on - xdotool - Subtle mouse movement to trigger activity This complements the system-level power management: - Works alongside display power management settings - Non-blocking and non-critical (fails gracefully) - Signals every 20 seconds + on user input - Prevents display from sleeping during playback Screen should now remain active throughout media playback.
This commit is contained in:
@@ -1 +1 @@
|
|||||||
1768669315.640205
|
1768670593.7002711
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"count": 2,
|
"count": 3,
|
||||||
"player_id": 1,
|
"player_id": 1,
|
||||||
"player_name": "TVacasa",
|
"player_name": "TVacasa",
|
||||||
"playlist": [
|
"playlist": [
|
||||||
@@ -7,15 +7,21 @@
|
|||||||
"file_name": "2026efvev-1428673176.jpg",
|
"file_name": "2026efvev-1428673176.jpg",
|
||||||
"url": "media/2026efvev-1428673176.jpg",
|
"url": "media/2026efvev-1428673176.jpg",
|
||||||
"duration": 50,
|
"duration": 50,
|
||||||
"edit_on_player": false
|
"edit_on_player": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"file_name": "4k1.jpg",
|
"file_name": "4k1.jpg",
|
||||||
"url": "media/4k1.jpg",
|
"url": "media/4k1.jpg",
|
||||||
"duration": 30,
|
"duration": 30,
|
||||||
|
"edit_on_player": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file_name": "1416529-hd_1920_1080_30fps.mp4",
|
||||||
|
"url": "media/1416529-hd_1920_1080_30fps.mp4",
|
||||||
|
"duration": 13,
|
||||||
"edit_on_player": false
|
"edit_on_player": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"playlist_id": 1,
|
"playlist_id": 1,
|
||||||
"playlist_version": 29
|
"playlist_version": 33
|
||||||
}
|
}
|
||||||
33
src/main.py
33
src/main.py
@@ -910,6 +910,8 @@ class SignagePlayer(Widget):
|
|||||||
self.schedule_hide_controls()
|
self.schedule_hide_controls()
|
||||||
# Start heartbeat monitoring
|
# Start heartbeat monitoring
|
||||||
Clock.schedule_interval(self.update_heartbeat, 10) # Update every 10 seconds
|
Clock.schedule_interval(self.update_heartbeat, 10) # Update every 10 seconds
|
||||||
|
# Start screen activity signaler (keep display awake)
|
||||||
|
Clock.schedule_interval(self.signal_screen_activity, 20) # Signal every 20 seconds
|
||||||
|
|
||||||
def _update_size(self, instance, value):
|
def _update_size(self, instance, value):
|
||||||
self.size = value
|
self.size = value
|
||||||
@@ -925,6 +927,31 @@ class SignagePlayer(Widget):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
Logger.warning(f"SignagePlayer: Failed to update heartbeat: {e}")
|
Logger.warning(f"SignagePlayer: Failed to update heartbeat: {e}")
|
||||||
|
|
||||||
|
def signal_screen_activity(self, dt):
|
||||||
|
"""Signal screen activity to prevent power saving/sleep
|
||||||
|
|
||||||
|
Uses multiple methods to keep display awake:
|
||||||
|
1. xset s reset - Reset screensaver timeout
|
||||||
|
2. xset dpms force on - Force display on
|
||||||
|
3. xdotool - Move mouse to trigger activity
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Method 1: Reset screensaver timer using xset
|
||||||
|
os.system('xset s reset 2>/dev/null')
|
||||||
|
|
||||||
|
# Method 2: Force display on
|
||||||
|
os.system('xset dpms force on 2>/dev/null')
|
||||||
|
|
||||||
|
# Method 3: Move mouse slightly (subtle, user won't notice)
|
||||||
|
if os.system('xdotool mousemove_relative 1 1 2>/dev/null') == 0:
|
||||||
|
os.system('xdotool mousemove_relative -1 -1 2>/dev/null')
|
||||||
|
|
||||||
|
Logger.debug("SignagePlayer: Screen activity signal sent (display kept awake)")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
Logger.debug(f"SignagePlayer: Screen activity signal failed (non-critical): {e}")
|
||||||
|
# Non-critical - continue if this fails
|
||||||
|
|
||||||
def initialize_player(self, dt):
|
def initialize_player(self, dt):
|
||||||
"""Initialize the player - load config and start playlist checking"""
|
"""Initialize the player - load config and start playlist checking"""
|
||||||
Logger.info("SignagePlayer: Initializing player...")
|
Logger.info("SignagePlayer: Initializing player...")
|
||||||
@@ -1502,12 +1529,14 @@ class SignagePlayer(Widget):
|
|||||||
self.ids.status_label.opacity = 1
|
self.ids.status_label.opacity = 1
|
||||||
|
|
||||||
def on_touch_down(self, touch):
|
def on_touch_down(self, touch):
|
||||||
"""Handle touch - show controls"""
|
"""Handle touch - show controls and signal screen activity"""
|
||||||
|
self.signal_screen_activity(0) # Keep display awake on user input
|
||||||
self.show_controls()
|
self.show_controls()
|
||||||
return super(SignagePlayer, self).on_touch_down(touch)
|
return super(SignagePlayer, self).on_touch_down(touch)
|
||||||
|
|
||||||
def on_touch_move(self, touch):
|
def on_touch_move(self, touch):
|
||||||
"""Handle touch move - show controls"""
|
"""Handle touch move - show controls and signal screen activity"""
|
||||||
|
self.signal_screen_activity(0) # Keep display awake on user input
|
||||||
self.show_controls()
|
self.show_controls()
|
||||||
return super(SignagePlayer, self).on_touch_move(touch)
|
return super(SignagePlayer, self).on_touch_move(touch)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user