From 226e37a4251d7168af4ce6244e86cbfba2ceff14 Mon Sep 17 00:00:00 2001 From: cybermaus Date: Thu, 15 Jul 2021 12:50:37 +0200 Subject: [PATCH 1/2] Support autodetect on old DVI monitors I have 10 old DVI monitors that result in tvservice yielding "state 0x6 [DVI CUSTOM RGB full unknown AR], 1440x900 @ 60.00Hz, progressive" which is not properly processed by utils.py. Since tvservice does this for every resolution the monitors support, rather then keep changing the config, I traced the source. Sidenote: tvservice does normally read and list the monitors mode. Only when asking the active status does it list custom. So the root problem is probably somewhere in tvservice: pi@raspberrypi:~ $ tvservice --device 2 -s state 0x6 [DVI CUSTOM RGB full unknown AR], 1440x900 @ 60.00Hz, progressive pi@raspberrypi:~ $ tvservice --device 2 -m DMT Group DMT has 16 modes: mode 4: 640x480 @ 60Hz 4:3, clock:25MHz progressive mode 5: 640x480 @ 72Hz 4:3, clock:31MHz progressive mode 6: 640x480 @ 75Hz 4:3, clock:31MHz progressive mode 8: 800x600 @ 56Hz 4:3, clock:36MHz progressive mode 9: 800x600 @ 60Hz 4:3, clock:40MHz progressive mode 10: 800x600 @ 72Hz 4:3, clock:50MHz progressive mode 11: 800x600 @ 75Hz 4:3, clock:49MHz progressive mode 16: 1024x768 @ 60Hz 4:3, clock:65MHz progressive mode 17: 1024x768 @ 70Hz 4:3, clock:75MHz progressive mode 18: 1024x768 @ 75Hz 4:3, clock:78MHz progressive mode 21: 1152x864 @ 75Hz 4:3, clock:108MHz progressive mode 32: 1280x960 @ 60Hz 4:3, clock:108MHz progressive mode 35: 1280x1024 @ 60Hz 5:4, clock:108MHz progressive mode 36: 1280x1024 @ 75Hz 5:4, clock:135MHz progressive (prefer) mode 47: 1440x900 @ 60Hz 16:10, clock:106MHz progressive mode 48: 1440x900 @ 75Hz 16:10, clock:136MHz progressive --- camplayer/utils/utils.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/camplayer/utils/utils.py b/camplayer/utils/utils.py index 7c651ea..087762f 100644 --- a/camplayer/utils/utils.py +++ b/camplayer/utils/utils.py @@ -157,6 +157,13 @@ def get_display_mode(display=2): res_width = int(tmp.group(3)) res_height = int(tmp.group(4)) framerate = int(tmp.group(5)) + else: + tmp = re.search('^state.+(CUSTOM).*[\s*\S*]* (\d+)x(\d+).+@ (\d+)', response) + if tmp: + hdmi_group = tmp.group(1) + res_width = int(tmp.group(2)) + res_height = int(tmp.group(3)) + framerate = int(tmp.group(4)) response = subprocess.check_output( ['tvservice', '--device', str(display), '--name'], From 4caaff1653e719bf3aa51129e1283a4336c381f8 Mon Sep 17 00:00:00 2001 From: Maurits van Dueren den Hollander Date: Fri, 23 Jul 2021 22:38:25 +0200 Subject: [PATCH 2/2] Use fbset to detect portrait rotated framebuffer --- camplayer/utils/utils.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/camplayer/utils/utils.py b/camplayer/utils/utils.py index 087762f..3b5b1cf 100644 --- a/camplayer/utils/utils.py +++ b/camplayer/utils/utils.py @@ -174,6 +174,25 @@ def get_display_mode(display=2): except: pass + try: + # correct/get resolution from framebuffer in case of 90 degree rotated screens + # In fact I wonder if we even need above tvservice call as fbset also works + # when HDMI is disconnected or blanked, and it works if only HDMI1 is connected + # without having to configure such in config.ini + # TODO nicer way to link hardware device and framebuffer + framebuffer = '/dev/fb0' + if display == 7: + framebuffer = '/dev/fb1' + response = subprocess.check_output( + ['fbset', '-fb', framebuffer, '--show'], + stderr=subprocess.STDOUT).decode() + tmp = re.search('geometry\s(\d+)\s(\d+)', response) + if tmp: + res_width = int(tmp.group(1)) + res_height = int(tmp.group(2)) + except: + pass + return {'hdmi_group': hdmi_group, 'hdmi_mode': hdmi_mode, 'res_width': res_width, 'res_height': res_height, 'framerate': framerate, 'device_name': device_name}