From 341f9454460183b764e7b547c619840fec9594ed Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Sun, 1 Jun 2025 09:41:22 +0200 Subject: [PATCH] QR scanning works --- .../assets/captureqr.py | 71 +++++++++++-------- .../assets/displaywallet.py | 20 +++--- 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/captureqr.py b/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/captureqr.py index 0951e1c0..9b0b691a 100644 --- a/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/captureqr.py +++ b/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/captureqr.py @@ -8,6 +8,12 @@ import lvgl as lv import time +try: + import webcam +except Exception as e: + print(f"Info: could not import webcam module: {e}") + + import mpos.apps import mpos.clipboard import mpos.ui @@ -19,16 +25,20 @@ keepliveqrdecoding = False width = 240 height = 240 +cam = None # Variable to hold the current memoryview to prevent garbage collection current_cam_buffer = None image_dsc = None image = None qr_label = None +scanqr_callback = None use_webcam = False qr_button = None snap_button = None +capture_timer = None + status_label = None status_label_cont = None status_label_text = "No camera found." @@ -56,11 +66,11 @@ def remove_bom(buffer): return buffer def qrdecode_one(): - global status_label, status_label_text + global status_label, status_label_text, scanqr_callback try: import qrdecode result = qrdecode.qrdecode_rgb565(current_cam_buffer, width, height) - result = bytearray("INSERT_QR_HERE", "utf-8") + #result = bytearray("INSERT_QR_HERE", "utf-8") if not result: status_label.set_text(status_label_text_searching) else: @@ -71,6 +81,7 @@ def qrdecode_one(): stop_qr_decoding() mpos.clipboard.add(f"Result: {result}") mpos.ui.back_screen() + scanqr_callback(True,result) except ValueError as e: print("QR ValueError: ", e) status_label.set_text(status_label_text_searching) @@ -134,7 +145,7 @@ def qr_button_click(e): def try_capture(event): #print("capturing camera frame") - global current_cam_buffer, image_dsc, image, use_webcam + global current_cam_buffer, image_dsc, image, use_webcam, cam try: if use_webcam: current_cam_buffer = webcam.capture_frame(cam, "rgb565") @@ -211,7 +222,6 @@ def build_ui(): status_label.set_style_text_color(lv.color_white(), 0) status_label.set_width(lv.pct(100)) status_label.center() - mpos.ui.load_screen(main_screen) def init_cam(): @@ -259,28 +269,31 @@ def check_running(timer): print("camtest.py cleanup done.") - -build_ui() - -cam = init_cam() -if cam: - image.set_rotation(900) # internal camera is rotated 90 degrees -else: - print("camtest.py: no internal camera found, trying webcam on /dev/video0") - try: - import webcam - cam = webcam.init("/dev/video0") - use_webcam = True - except Exception as e: - print(f"camtest.py: webcam exception: {e}") - -if cam: - print("Camera initialized, continuing...") - check_running_timer = lv.timer_create(check_running, 500, None) - qr_button.remove_flag(lv.obj.FLAG.HIDDEN) - #snap_button.remove_flag(lv.obj.FLAG.HIDDEN) - status_label_cont.add_flag(lv.obj.FLAG.HIDDEN) - capture_timer = lv.timer_create(try_capture, 100, None) - start_qr_decoding() -else: - print("No camera found, stopping camtest.py") +def scanqr(scanqr_cb): + global scanqr_callback, cam, use_webcam, check_running_timer, status_label_cont, capture_timer, main_screen + scanqr_callback = scanqr_cb + build_ui() + cam = init_cam() + if cam: + image.set_rotation(900) # internal camera is rotated 90 degrees + else: + print("camtest.py: no internal camera found, trying webcam on /dev/video0") + try: + cam = webcam.init("/dev/video0") + use_webcam = True + except Exception as e: + print(f"camtest.py: webcam exception: {e}") + if cam: + print("Camera initialized, continuing...") + check_running_timer = lv.timer_create(check_running, 500, None) + #qr_button.remove_flag(lv.obj.FLAG.HIDDEN) + #snap_button.remove_flag(lv.obj.FLAG.HIDDEN) + status_label_cont.add_flag(lv.obj.FLAG.HIDDEN) + capture_timer = lv.timer_create(try_capture, 100, None) + start_qr_decoding() + return main_screen + else: + print("No camera found, stopping camtest.py") + scanqr_callback(False,"") + return None + diff --git a/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py b/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py index 48701a6e..277c46d0 100644 --- a/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py +++ b/internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py @@ -10,6 +10,7 @@ main_screen = None settings_screen = None settings_screen_detail = None qr_screen = None +qr_scanner_screen = None # widgets receive_qr = None @@ -142,17 +143,18 @@ class SettingsScreen(): cb.add_style(style_radio_chk, lv.PART.INDICATOR | lv.STATE.CHECKED) return cb + def gotqr_callback(self, success, data): + print(f"gotqr_callback {success}, {data}") + if success: + self.textarea.set_text(data) + def cambutton_cb(self, event): + global qr_scanner_screen print("cambutton clicked!") import captureqr - print("after import captureqr") - #while True: this hangs the entire thing - not good... - clip = mpos.clipboard.get() - print(f"clip is: {clip}") - if clip and clip.startsWith("Result:"): - print("Got result from QR code scanner!") - #break - time.sleep(0.25) + qr_scanner_screen = captureqr.scanqr(self.gotqr_callback) + if qr_scanner_screen: + mpos.ui.load_screen(qr_scanner_screen) def open_edit_popup(self, setting): global settings_screen_detail @@ -369,7 +371,7 @@ def janitor_cb(timer): wallet.start(redraw_balance_cb, redraw_payments_cb) else: print("ERROR: could not start any wallet!") # maybe call the error callback to show the error to the user - elif lv.screen_active() != main_screen and lv.screen_active() != settings_screen and lv.screen_active() != qr_screen and lv.screen_active() != settings_screen_detail: + elif lv.screen_active() != main_screen and lv.screen_active() != settings_screen and lv.screen_active() != qr_screen and lv.screen_active() != settings_screen_detail and lv.screen_active() != qr_scanner_screen: print("app backgrounded, cleaning up...") janitor.delete() wallet.stop()