You've already forked MicroPythonOS
mirror of
https://github.com/m5stack/MicroPythonOS.git
synced 2026-05-20 11:51:27 -07:00
QR scanning works
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user