From 9e96fd7cb16e6df103256fa742a6f40bb5fc685d Mon Sep 17 00:00:00 2001 From: dekuNukem Date: Sun, 24 Aug 2025 22:42:02 +0100 Subject: [PATCH] restored stable code, current work in new branch --- user_program/bb_tester.py | 89 +++++++++++++++++++++++++++++++++++++ user_program/demo_opts.py | 16 +++++++ user_program/notes_2025.txt | 12 ----- user_program/usb4vc_main.py | 43 ++++++------------ user_program/usb4vc_ui.py | 2 +- 5 files changed, 120 insertions(+), 42 deletions(-) create mode 100644 user_program/bb_tester.py delete mode 100644 user_program/notes_2025.txt diff --git a/user_program/bb_tester.py b/user_program/bb_tester.py new file mode 100644 index 0000000..0a92f26 --- /dev/null +++ b/user_program/bb_tester.py @@ -0,0 +1,89 @@ +import os +import sys +import time +import RPi.GPIO as GPIO +from demo_opts import get_device +from luma.core.render import canvas +from PIL import ImageFont + +OLED_WIDTH = 128 +OLED_HEIGHT = 32 + +my_arg = ['--display', 'ssd1306', '--interface', 'spi', '--spi-port', '0', '--spi-device', '1', '--gpio-reset', '6', '--gpio-data-command', '5', '--width', str(OLED_WIDTH), '--height', str(OLED_HEIGHT), '--spi-bus-speed', '2000000'] +oled_device = get_device(my_arg) +time.sleep(0.5) +oled_device = get_device(my_arg) + +font_regular = ImageFont.truetype("ProggyTiny.ttf", 16) +font_medium = ImageFont.truetype("ChiKareGo2.ttf", 16) +font_large = ImageFont.truetype("ProggyTiny.ttf", 32) + +max_char_per_line = {font_regular:21, font_medium:17, font_large:11} +width_per_char = {font_regular:6, font_medium:7, font_large:12} + +def oled_print_centered(text, font, y, this_canvas): + text = text.strip()[:max_char_per_line[font]] + start_x = int((OLED_WIDTH - (len(text) * width_per_char[font]))/2) + if start_x < 0: + start_x = 0 + this_canvas.text((start_x, y), text, font=font, fill="white") + +class my_button(object): + def __init__(self, bcm_pin): + super(my_button, self).__init__() + self.pin_number = bcm_pin + GPIO.setup(self.pin_number, GPIO.IN, pull_up_down=GPIO.PUD_UP) + self.prev_state = GPIO.input(self.pin_number) + + def is_pressed(self): + result = False + current_state = GPIO.input(self.pin_number) + if self.prev_state == 1 and current_state == 0: + result = True + self.prev_state = current_state + return result + +PLUS_BUTTON_PIN = 27 +MINUS_BUTTON_PIN = 19 +ENTER_BUTTON_PIN = 22 +SHUTDOWN_BUTTON_PIN = 21 +PCARD_CS_PIN = 8 +SLEEP_LED_PIN = 26 + +GPIO.setup(SLEEP_LED_PIN, GPIO.OUT) +GPIO.output(SLEEP_LED_PIN, GPIO.LOW) +GPIO.setup(PCARD_CS_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + +plus_button = my_button(PLUS_BUTTON_PIN) +minus_button = my_button(MINUS_BUTTON_PIN) +enter_button = my_button(ENTER_BUTTON_PIN) +shutdown_button = my_button(SHUTDOWN_BUTTON_PIN) + +loop_count = 0 +def print_pattern(): + global loop_count + loop_count = (loop_count + 1) % 2 + oled_device = get_device(my_arg) + if loop_count: + GPIO.output(SLEEP_LED_PIN, GPIO.HIGH) + with canvas(oled_device) as draw: + draw.text((0, 0), "ABCDEFGHIJKLMNO", font=font_medium, fill="white") + draw.text((0, 15), "PQRSTUVWXYZ0123", font=font_medium, fill="white") + else: + GPIO.output(SLEEP_LED_PIN, GPIO.LOW) + with canvas(oled_device) as draw: + draw.text((0, 0), "===================", font=font_medium, fill="white") + draw.text((0, 15), "===================", font=font_medium, fill="white") + +print_pattern() + +while 1: + time.sleep(0.05) + if GPIO.input(PCARD_CS_PIN) == 0: + GPIO.output(SLEEP_LED_PIN, GPIO.LOW) + exit() + if plus_button.is_pressed() or \ + minus_button.is_pressed() or \ + enter_button.is_pressed() or \ + shutdown_button.is_pressed(): + print_pattern() diff --git a/user_program/demo_opts.py b/user_program/demo_opts.py index c9886ba..5ea01ea 100644 --- a/user_program/demo_opts.py +++ b/user_program/demo_opts.py @@ -1,6 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2014-18 Richard Hull and contributors +# See LICENSE.rst for details. + import sys +import logging + from luma.core import cmdline, error + +# logging +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)-15s - %(message)s' +) +# ignore PIL debug messages +logging.getLogger('PIL').setLevel(logging.ERROR) + + def display_settings(device, args): """ Display a short summary of the settings. diff --git a/user_program/notes_2025.txt b/user_program/notes_2025.txt deleted file mode 100644 index 0d18ebe..0000000 --- a/user_program/notes_2025.txt +++ /dev/null @@ -1,12 +0,0 @@ -USB4VC 2025 notes -Raspberry Pi 5 - -changelog - -whats new - -rpi5 support (no bt, 64bit kernel etc) -newest system version -web based dashboard - -todo: diff --git a/user_program/usb4vc_main.py b/user_program/usb4vc_main.py index 5888512..a443c2a 100644 --- a/user_program/usb4vc_main.py +++ b/user_program/usb4vc_main.py @@ -7,8 +7,6 @@ import usb4vc_usb_scan import usb4vc_ui import subprocess -# usb4vc_ui.reset_pboard() - def get_current_rpi_model(): current_model = 'Unknown' try: @@ -40,13 +38,7 @@ def check_rpi_model(): stored_model = get_stored_rpi_model() print('current_model', current_model) print('stored_model', stored_model) - - if "Raspberry Pi 5".lower() in current_model.lower(): - usb4vc_ui.oled_print_model_changed() - os.system("cd /home/pi/xpadneo/; sudo ./uninstall.sh") - save_rpi_model(current_model) - return - elif current_model != stored_model: + if current_model != stored_model: usb4vc_ui.oled_print_model_changed() for x in range(20): print("!!!!!!!!!! DO NOT UNPLUG UNTIL I REBOOT !!!!!!!!!!") @@ -64,18 +56,12 @@ def check_rpi_model(): check_rpi_model() -cmdline_path = "/boot/firmware/cmdline.txt" try: - boot_config = os.popen(f'cat {cmdline_path}').read() + boot_config = os.popen('cat /boot/cmdline.txt').read() if "usbhid.mousepoll".lower() not in boot_config.lower(): - print(f"@@@@@@@@@@@@ writing usbhid.mousepoll to {cmdline_path} @@@@@@@@@@@@") + print("@@@@@@@@@@@@ writing usbhid.mousepoll to /boot/cmdline.txt @@@@@@@@@@@@") new_config = boot_config.replace('\r', '').replace('\n', '').strip() + ' usbhid.mousepoll=8\n' - with open(cmdline_path, 'w') as ffff: - ffff.write(new_config) - elif "usbhid.mousepoll=0" in boot_config: - print(f"@@@@@@@@@@@@ writing usbhid.mousepoll to {cmdline_path} @@@@@@@@@@@@") - new_config = boot_config.replace('\r', '').replace('\n', '').strip().replace("usbhid.mousepoll=0", "usbhid.mousepoll=8") - with open(cmdline_path, 'w') as ffff: + with open('/boot/cmdline.txt', 'w') as ffff: ffff.write(new_config) except Exception as e: print('usbhid.mousepoll exception:', e) @@ -84,17 +70,16 @@ usb4vc_ui.ui_init() usb4vc_ui.ui_thread.start() usb4vc_usb_scan.usb_device_scan_thread.start() -# usb4vc_usb_scan.raw_input_event_parser_thread.start() +usb4vc_usb_scan.raw_input_event_parser_thread.start() while 1: time.sleep(2) - if os.path.exists("/sys/module/bluetooth/parameters/disable_ertm"): - try: - ertm_status = subprocess.getoutput("cat /sys/module/bluetooth/parameters/disable_ertm").replace('\n', '').replace('\r', '').strip() - if ertm_status != 'Y': - # print('ertm_status:', ertm_status) - # print("Disabling ERTM....") - subprocess.call('echo Y > /sys/module/bluetooth/parameters/disable_ertm') - # print("DONE") - except Exception: - continue + try: + ertm_status = subprocess.getoutput("cat /sys/module/bluetooth/parameters/disable_ertm").replace('\n', '').replace('\r', '').strip() + if ertm_status != 'Y': + print('ertm_status:', ertm_status) + print("Disabling ERTM....") + subprocess.call('echo 1 > /sys/module/bluetooth/parameters/disable_ertm') + print("DONE") + except Exception: + continue diff --git a/user_program/usb4vc_ui.py b/user_program/usb4vc_ui.py index b0393ba..4a01ff5 100644 --- a/user_program/usb4vc_ui.py +++ b/user_program/usb4vc_ui.py @@ -384,7 +384,7 @@ def pair_device(mac_addr): def get_paired_devices(): dev_set = set() try: - device_str = subprocess.getoutput(f"timeout 5 bluetoothctl --agent NoInputNoOutput devices Paired") + device_str = subprocess.getoutput(f"timeout 5 bluetoothctl --agent NoInputNoOutput paired-devices") for line in device_str.replace('\r', '').split('\n'): if 'device' not in line.lower(): continue