Skip to content

Commit 024adfa

Browse files
Merge remote-tracking branch 'upstream/main'
2 parents 21a609b + 738caa5 commit 024adfa

File tree

13 files changed

+143
-44
lines changed

13 files changed

+143
-44
lines changed

main-ui/devices/abstract_device.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,4 +419,10 @@ def get_about_info_entries(self):
419419

420420
@abstractmethod
421421
def startup_init(self, include_wifi):
422-
pass
422+
pass
423+
424+
@abstractmethod
425+
def might_require_surface_format_conversion(self):
426+
pass
427+
428+

main-ui/devices/device.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,11 @@ def get_core_name_overrides(core_name):
461461
def get_core_for_game(game_system_config, rom_file_path):
462462
return Device._impl.get_core_for_game(game_system_config, rom_file_path)
463463

464-
465464
@staticmethod
466465
def startup_init(include_wifi):
467466
return Device._impl.startup_init(include_wifi)
467+
468+
@staticmethod
469+
def might_require_surface_format_conversion():
470+
return Device._impl.might_require_surface_format_conversion()
471+

main-ui/devices/device_common.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11

22

3+
import os
34
import socket
45
import subprocess
56
import sys
67
import time
78
from audio.audio_player_none import AudioPlayerNone
89
from controller.controller_inputs import ControllerInput
910
from devices.abstract_device import AbstractDevice
11+
from devices.miyoo.system_config import SystemConfig
1012
from devices.utils.process_runner import ProcessRunner
1113
from devices.wifi.wifi_status import WifiStatus
1214
from display.display import Display
1315
from display.font_purpose import FontPurpose
1416
from utils import throttle
17+
from utils.config_copier import ConfigCopier
1518
from utils.logger import PyUiLogger
1619

1720

@@ -452,4 +455,17 @@ def get_about_info_entries(self):
452455
return about_info_entries
453456

454457
def startup_init(self, include_wifi):
455-
pass
458+
pass
459+
460+
def might_require_surface_format_conversion(self):
461+
return False
462+
463+
def _load_system_config(self, config_path, config_if_missing):
464+
ConfigCopier.ensure_config(config_path, config_if_missing)
465+
try:
466+
self.system_config = SystemConfig(config_path)
467+
except Exception as e:
468+
PyUiLogger.get_logger().error(f"Failed to load system config, resetting config: {e}")
469+
os.remove(config_path)
470+
ConfigCopier.ensure_config(config_path, config_if_missing)
471+
self.system_config = SystemConfig(config_path)

main-ui/devices/miyoo/flip/miyoo_a30.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ def __init__(self, device_name, main_ui_mode):
3636
self.audio_player = AudioPlayerDelegateSdl2()
3737
script_dir = Path(__file__).resolve().parent
3838
source = script_dir / 'a30-system.json'
39-
ConfigCopier.ensure_config("/mnt/SDCARD/Saves/a30-system.json", source)
40-
self.system_config = SystemConfig("/mnt/SDCARD/Saves/a30-system.json")
39+
self._load_system_config("/mnt/SDCARD/Saves/a30-system.json", source)
4140

4241
if(main_ui_mode):
4342
self.miyoo_games_file_parser = MiyooGamesFileParser()

main-ui/devices/miyoo/flip/miyoo_flip.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ def __init__(self, device_name, main_ui_mode):
7676

7777
script_dir = Path(__file__).resolve().parent
7878
source = script_dir / 'flip-system.json'
79-
ConfigCopier.ensure_config("/mnt/SDCARD/Saves/flip-system.json", source)
80-
self.system_config = SystemConfig("/mnt/SDCARD/Saves/flip-system.json")
79+
self._load_system_config("/mnt/SDCARD/Saves/flip-system.json", source)
8180

8281
if(main_ui_mode):
8382
self.miyoo_games_file_parser = MiyooGamesFileParser()

main-ui/devices/miyoo/mini/miyoo_mini_common.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ def __init__(self, device_name, main_ui_mode, miyoo_mini_specific_model_variable
4545
self.miyoo_mini_specific_model_variables = miyoo_mini_specific_model_variables
4646
self.controller_interface = self.build_controller_interface()
4747

48-
ConfigCopier.ensure_config("/mnt/SDCARD/Saves/mini-flip-system.json", Path(__file__).resolve().parent / 'mini-flip-system.json')
49-
self.system_config = SystemConfig("/mnt/SDCARD/Saves/mini-flip-system.json")
48+
self._load_system_config("/mnt/SDCARD/Saves/mini-flip-system.json", Path(__file__).resolve().parent / 'mini-flip-system.json')
5049

5150
if(main_ui_mode):
5251
self.miyoo_mini_flip_shared_memory_writer = MiyooMiniFlipSharedMemoryWriter()

main-ui/devices/muos/muos_device.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ def setup_system_config(self):
3737
self.parent_dir = os.path.dirname(base_dir)
3838
source = os.path.join(self.script_dir,"muos-system.json")
3939
system_json_path = os.path.join(self.parent_dir,"muos-system.json")
40-
ConfigCopier.ensure_config(system_json_path, Path(source))
41-
self.system_config = SystemConfig(system_json_path)
40+
self._load_system_config(system_json_path, Path(source))
4241

4342
def sleep(self):
4443
ProcessRunner.run(["/opt/muos/script/system/suspend.sh"])

main-ui/devices/trimui/trim_ui_brick.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import math
12
from pathlib import Path
3+
import subprocess
24
import threading
35
from audio.audio_player_delegate_sdl2 import AudioPlayerDelegateSdl2
46
from controller.controller_inputs import ControllerInput
@@ -10,10 +12,14 @@
1012
from devices.miyoo.system_config import SystemConfig
1113
from devices.miyoo_trim_common import MiyooTrimCommon
1214
from devices.trimui.trim_ui_device import TrimUIDevice
15+
from devices.utils.file_watcher import FileWatcher
16+
from devices.utils.process_runner import ProcessRunner
17+
from display.display import Display
1318
from utils import throttle
1419

1520
from utils.config_copier import ConfigCopier
1621
from utils.ffmpeg_image_utils import FfmpegImageUtils
22+
from utils.logger import PyUiLogger
1723
from utils.py_ui_config import PyUiConfig
1824

1925
class TrimUIBrick(TrimUIDevice):
@@ -25,8 +31,7 @@ def __init__(self, device_name, main_ui_mode):
2531
self.audio_player = AudioPlayerDelegateSdl2()
2632
script_dir = Path(__file__).resolve().parent
2733
source = script_dir / 'brick-system.json'
28-
ConfigCopier.ensure_config("/mnt/SDCARD/Saves/trim-ui-brick-system.json", source)
29-
self.system_config = SystemConfig("/mnt/SDCARD/Saves/trim-ui-brick-system.json")
34+
self._load_system_config("/mnt/SDCARD/Saves/trim-ui-brick-system.json", source)
3035

3136
if(main_ui_mode):
3237
trim_stock_json_file = script_dir / 'stock/brick.json'
@@ -37,6 +42,8 @@ def __init__(self, device_name, main_ui_mode):
3742
self.ensure_wpa_supplicant_conf()
3843
threading.Thread(target=self.monitor_wifi, daemon=True).start()
3944
threading.Thread(target=self.startup_init, daemon=True).start()
45+
self.config_watcher_thread, self.config_watcher_thread_stop_event = FileWatcher().start_file_watcher(
46+
"/mnt/SDCARD/Saves/trim-ui-brick-system.json", self.on_system_config_changed, interval=0.2, repeat_trigger_for_mtime_granularity_issues=True)
4047
if(PyUiConfig.enable_button_watchers()):
4148
from controller.controller import Controller
4249
#/dev/miyooio if we want to get rid of miyoo_inputd
@@ -48,6 +55,7 @@ def __init__(self, device_name, main_ui_mode):
4855
self.power_key_watcher = KeyWatcher("/dev/input/event1")
4956
power_key_polling_thread = threading.Thread(target=self.power_key_watcher.poll_keyboard, daemon=True)
5057
power_key_polling_thread.start()
58+
# Done to try to account for external systems editting the config file
5159

5260
super().__init__()
5361

@@ -60,7 +68,7 @@ def startup_init(self, include_wifi=True):
6068
self._set_hue_to_config()
6169
config_volume = self.system_config.get_volume()
6270
self._set_volume(config_volume)
63-
71+
6472
#Untested
6573
@throttle.limit_refresh(5)
6674
def is_hdmi_connected(self):
@@ -157,3 +165,31 @@ def get_audio_system(self):
157165

158166
def get_core_name_overrides(self, core_name):
159167
return [core_name, core_name+"-64"]
168+
169+
def _set_volume(self, user_volume):
170+
from display.display import Display
171+
if(user_volume < 0):
172+
user_volume = 0
173+
elif(user_volume > 100):
174+
user_volume = 100
175+
volume = math.ceil(user_volume * 255//100)
176+
177+
try:
178+
179+
ProcessRunner.run(
180+
["amixer", "cset", f"numid=17", str(int(volume))],
181+
check=True
182+
)
183+
184+
except Exception as e:
185+
PyUiLogger.get_logger().error(f"Failed to set volume: {e}")
186+
187+
self.system_config.reload_config()
188+
self.system_config.set_volume(user_volume)
189+
self.system_config.save_config()
190+
Display.volume_changed(user_volume)
191+
return user_volume
192+
193+
194+
def might_require_surface_format_conversion(self):
195+
return True # RA save state images don't seem to load w/o conversion?

main-ui/devices/trimui/trim_ui_device.py

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from devices.miyoo_trim_common import MiyooTrimCommon
1313
from devices.utils.process_runner import ProcessRunner
1414
from devices.wifi.wifi_connection_quality_info import WiFiConnectionQualityInfo
15+
from display.display import Display
1516
from games.utils.device_specific.miyoo_trim_game_system_utils import MiyooTrimGameSystemUtils
1617
from games.utils.game_entry import GameEntry
1718
from menus.games.utils.rom_info import RomInfo
@@ -26,6 +27,13 @@ def __init__(self):
2627
self.game_utils = MiyooTrimGameSystemUtils()
2728
self.sdl2_controller_interface = Sdl2ControllerInterface()
2829

30+
def on_system_config_changed(self):
31+
old_volume = self.system_config.get_volume()
32+
self.system_config.reload_config()
33+
new_volume = self.system_config.get_volume()
34+
if(old_volume != new_volume):
35+
Display.volume_changed(new_volume)
36+
2937
def get_controller_interface(self):
3038
return self.sdl2_controller_interface
3139

@@ -78,30 +86,6 @@ def _set_brightness_to_config(self):
7886
def _set_hue_to_config(self):
7987
with open("/sys/devices/virtual/disp/disp/attr/color_temperature", "w") as f:
8088
f.write(str((self.system_config.hue * 5) - 50))
81-
82-
def _set_volume(self, user_volume):
83-
from display.display import Display
84-
if(user_volume < 0):
85-
user_volume = 0
86-
elif(user_volume > 100):
87-
user_volume = 100
88-
volume = math.ceil(user_volume * 255//100)
89-
90-
try:
91-
92-
ProcessRunner.run(
93-
["amixer", "cset", f"numid=17", str(int(volume))],
94-
check=True
95-
)
96-
97-
except subprocess.CalledProcessError as e:
98-
PyUiLogger.get_logger().error(f"Failed to set volume: {e}")
99-
100-
self.system_config.reload_config()
101-
self.system_config.set_volume(user_volume)
102-
self.system_config.save_config()
103-
Display.volume_changed(user_volume)
104-
return user_volume
10589

10690
def get_volume(self):
10791
return self.system_config.get_volume()

main-ui/devices/trimui/trim_ui_smart_pro.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import subprocess
2+
import math
13
from pathlib import Path
24
import threading
35
from audio.audio_player_delegate_sdl2 import AudioPlayerDelegateSdl2
@@ -10,10 +12,13 @@
1012
from devices.miyoo.system_config import SystemConfig
1113
from devices.miyoo_trim_common import MiyooTrimCommon
1214
from devices.trimui.trim_ui_device import TrimUIDevice
15+
from devices.utils.file_watcher import FileWatcher
16+
from devices.utils.process_runner import ProcessRunner
1317
from utils import throttle
1418
from utils.config_copier import ConfigCopier
1519

1620
from utils.ffmpeg_image_utils import FfmpegImageUtils
21+
from utils.logger import PyUiLogger
1722
from utils.py_ui_config import PyUiConfig
1823

1924
class TrimUISmartPro(TrimUIDevice):
@@ -25,8 +30,7 @@ def __init__(self, device_name,main_ui_mode):
2530

2631
script_dir = Path(__file__).resolve().parent
2732
source = script_dir / 'brick-system.json'
28-
ConfigCopier.ensure_config("/mnt/SDCARD/Saves/trim-ui-smart-pro-system.json", source)
29-
self.system_config = SystemConfig("/mnt/SDCARD/Saves/trim-ui-smart-pro-system.json")
33+
self._load_system_config("/mnt/SDCARD/Saves/trim-ui-smart-pro-system.json", source)
3034
if(main_ui_mode):
3135
trim_stock_json_file = script_dir / 'stock/brick.json'
3236
ConfigCopier.ensure_config(TrimUISmartPro.TRIMUI_STOCK_CONFIG_LOCATION, trim_stock_json_file)
@@ -36,6 +40,8 @@ def __init__(self, device_name,main_ui_mode):
3640
self.ensure_wpa_supplicant_conf()
3741
threading.Thread(target=self.monitor_wifi, daemon=True).start()
3842
threading.Thread(target=self.startup_init, daemon=True).start()
43+
self.config_watcher_thread, self.config_watcher_thread_stop_event = FileWatcher().start_file_watcher(
44+
"/mnt/SDCARD/Saves/trim-ui-smart-pro-system.json", self.on_system_config_changed, interval=0.2, repeat_trigger_for_mtime_granularity_issues=True)
3945
if(PyUiConfig.enable_button_watchers()):
4046
from controller.controller import Controller
4147
#/dev/miyooio if we want to get rid of miyoo_inputd
@@ -160,3 +166,31 @@ def get_audio_system(self):
160166

161167
def get_core_name_overrides(self, core_name):
162168
return [core_name, core_name+"-64"]
169+
170+
171+
def _set_volume(self, user_volume):
172+
from display.display import Display
173+
if(user_volume < 0):
174+
user_volume = 0
175+
elif(user_volume > 100):
176+
user_volume = 100
177+
volume = math.ceil(user_volume * 255//100)
178+
179+
try:
180+
181+
ProcessRunner.run(
182+
["amixer", "set", f"'Soft Volume Master'", str(int(volume))],
183+
check=True
184+
)
185+
186+
except Exception as e:
187+
PyUiLogger.get_logger().error(f"Failed to set volume: {e}")
188+
189+
self.system_config.reload_config()
190+
self.system_config.set_volume(user_volume)
191+
self.system_config.save_config()
192+
Display.volume_changed(user_volume)
193+
return user_volume
194+
195+
def might_require_surface_format_conversion(self):
196+
return True # RA save state images don't seem to load w/o conversion?

0 commit comments

Comments
 (0)