QR scanning works

This commit is contained in:
Thomas Farstrike
2025-06-01 09:41:22 +02:00
parent 079f4ea27d
commit 341f945446
2 changed files with 53 additions and 38 deletions
@@ -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
@@ -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()