Skip to content

Commit 341f945

Browse files
QR scanning works
1 parent 079f4ea commit 341f945

File tree

2 files changed

+53
-38
lines changed

2 files changed

+53
-38
lines changed

internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/captureqr.py

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
import lvgl as lv
99
import time
1010

11+
try:
12+
import webcam
13+
except Exception as e:
14+
print(f"Info: could not import webcam module: {e}")
15+
16+
1117
import mpos.apps
1218
import mpos.clipboard
1319
import mpos.ui
@@ -19,16 +25,20 @@
1925
width = 240
2026
height = 240
2127

28+
cam = None
2229
# Variable to hold the current memoryview to prevent garbage collection
2330
current_cam_buffer = None
2431
image_dsc = None
2532
image = None
2633
qr_label = None
34+
scanqr_callback = None
2735

2836
use_webcam = False
2937
qr_button = None
3038
snap_button = None
3139

40+
capture_timer = None
41+
3242
status_label = None
3343
status_label_cont = None
3444
status_label_text = "No camera found."
@@ -56,11 +66,11 @@ def remove_bom(buffer):
5666
return buffer
5767

5868
def qrdecode_one():
59-
global status_label, status_label_text
69+
global status_label, status_label_text, scanqr_callback
6070
try:
6171
import qrdecode
6272
result = qrdecode.qrdecode_rgb565(current_cam_buffer, width, height)
63-
result = bytearray("INSERT_QR_HERE", "utf-8")
73+
#result = bytearray("INSERT_QR_HERE", "utf-8")
6474
if not result:
6575
status_label.set_text(status_label_text_searching)
6676
else:
@@ -71,6 +81,7 @@ def qrdecode_one():
7181
stop_qr_decoding()
7282
mpos.clipboard.add(f"Result: {result}")
7383
mpos.ui.back_screen()
84+
scanqr_callback(True,result)
7485
except ValueError as e:
7586
print("QR ValueError: ", e)
7687
status_label.set_text(status_label_text_searching)
@@ -134,7 +145,7 @@ def qr_button_click(e):
134145

135146
def try_capture(event):
136147
#print("capturing camera frame")
137-
global current_cam_buffer, image_dsc, image, use_webcam
148+
global current_cam_buffer, image_dsc, image, use_webcam, cam
138149
try:
139150
if use_webcam:
140151
current_cam_buffer = webcam.capture_frame(cam, "rgb565")
@@ -211,7 +222,6 @@ def build_ui():
211222
status_label.set_style_text_color(lv.color_white(), 0)
212223
status_label.set_width(lv.pct(100))
213224
status_label.center()
214-
mpos.ui.load_screen(main_screen)
215225

216226

217227
def init_cam():
@@ -259,28 +269,31 @@ def check_running(timer):
259269
print("camtest.py cleanup done.")
260270

261271

262-
263-
build_ui()
264-
265-
cam = init_cam()
266-
if cam:
267-
image.set_rotation(900) # internal camera is rotated 90 degrees
268-
else:
269-
print("camtest.py: no internal camera found, trying webcam on /dev/video0")
270-
try:
271-
import webcam
272-
cam = webcam.init("/dev/video0")
273-
use_webcam = True
274-
except Exception as e:
275-
print(f"camtest.py: webcam exception: {e}")
276-
277-
if cam:
278-
print("Camera initialized, continuing...")
279-
check_running_timer = lv.timer_create(check_running, 500, None)
280-
qr_button.remove_flag(lv.obj.FLAG.HIDDEN)
281-
#snap_button.remove_flag(lv.obj.FLAG.HIDDEN)
282-
status_label_cont.add_flag(lv.obj.FLAG.HIDDEN)
283-
capture_timer = lv.timer_create(try_capture, 100, None)
284-
start_qr_decoding()
285-
else:
286-
print("No camera found, stopping camtest.py")
272+
def scanqr(scanqr_cb):
273+
global scanqr_callback, cam, use_webcam, check_running_timer, status_label_cont, capture_timer, main_screen
274+
scanqr_callback = scanqr_cb
275+
build_ui()
276+
cam = init_cam()
277+
if cam:
278+
image.set_rotation(900) # internal camera is rotated 90 degrees
279+
else:
280+
print("camtest.py: no internal camera found, trying webcam on /dev/video0")
281+
try:
282+
cam = webcam.init("/dev/video0")
283+
use_webcam = True
284+
except Exception as e:
285+
print(f"camtest.py: webcam exception: {e}")
286+
if cam:
287+
print("Camera initialized, continuing...")
288+
check_running_timer = lv.timer_create(check_running, 500, None)
289+
#qr_button.remove_flag(lv.obj.FLAG.HIDDEN)
290+
#snap_button.remove_flag(lv.obj.FLAG.HIDDEN)
291+
status_label_cont.add_flag(lv.obj.FLAG.HIDDEN)
292+
capture_timer = lv.timer_create(try_capture, 100, None)
293+
start_qr_decoding()
294+
return main_screen
295+
else:
296+
print("No camera found, stopping camtest.py")
297+
scanqr_callback(False,"")
298+
return None
299+

internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
settings_screen = None
1111
settings_screen_detail = None
1212
qr_screen = None
13+
qr_scanner_screen = None
1314

1415
# widgets
1516
receive_qr = None
@@ -142,17 +143,18 @@ def create_radio_button(self, parent, text, index):
142143
cb.add_style(style_radio_chk, lv.PART.INDICATOR | lv.STATE.CHECKED)
143144
return cb
144145

146+
def gotqr_callback(self, success, data):
147+
print(f"gotqr_callback {success}, {data}")
148+
if success:
149+
self.textarea.set_text(data)
150+
145151
def cambutton_cb(self, event):
152+
global qr_scanner_screen
146153
print("cambutton clicked!")
147154
import captureqr
148-
print("after import captureqr")
149-
#while True: this hangs the entire thing - not good...
150-
clip = mpos.clipboard.get()
151-
print(f"clip is: {clip}")
152-
if clip and clip.startsWith("Result:"):
153-
print("Got result from QR code scanner!")
154-
#break
155-
time.sleep(0.25)
155+
qr_scanner_screen = captureqr.scanqr(self.gotqr_callback)
156+
if qr_scanner_screen:
157+
mpos.ui.load_screen(qr_scanner_screen)
156158

157159
def open_edit_popup(self, setting):
158160
global settings_screen_detail
@@ -369,7 +371,7 @@ def janitor_cb(timer):
369371
wallet.start(redraw_balance_cb, redraw_payments_cb)
370372
else:
371373
print("ERROR: could not start any wallet!") # maybe call the error callback to show the error to the user
372-
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:
374+
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:
373375
print("app backgrounded, cleaning up...")
374376
janitor.delete()
375377
wallet.stop()

0 commit comments

Comments
 (0)