From 88040322da6624af4421345cb440aef513709afd Mon Sep 17 00:00:00 2001 From: James Sutton <1068763+jpwsutton@users.noreply.github.com> Date: Tue, 29 Mar 2022 20:53:08 +0100 Subject: [PATCH] Badger 2040: Support for multiple QR codes. Signed-off-by: James Sutton <1068763+jpwsutton@users.noreply.github.com> --- micropython/examples/badger2040/qrgen.py | 123 ++++++++++++++++++----- 1 file changed, 96 insertions(+), 27 deletions(-) diff --git a/micropython/examples/badger2040/qrgen.py b/micropython/examples/badger2040/qrgen.py index baf35a85..3786b438 100644 --- a/micropython/examples/badger2040/qrgen.py +++ b/micropython/examples/badger2040/qrgen.py @@ -1,13 +1,21 @@ import badger2040 import qrcode +import time +import os +import badger_os - -# Open the qrcode file +# Check that the qrcodes directory exists, if not, make it try: - text = open("qrcode.txt", "r") + os.mkdir("qrcodes") except OSError: - with open("qrcode.txt", "w") as text: - text.write("""https://pimoroni.com/badger2040 + pass + +# Check that there is a qrcode.txt, if not preload +try: + text = open("qrcodes/qrcode.txt", "r") +except OSError: + text = open("qrcodes/qrcode.txt", "w") + text.write("""https://pimoroni.com/badger2040 Badger 2040 * 296x128 1-bit e-ink * six user buttons @@ -17,20 +25,31 @@ Badger 2040 Scan this code to learn more about Badger 2040. """) - text.flush() - text = open("qrcode.txt", "r") + text.flush() + text.seek(0) + +# Load all available QR Code Files +try: + CODES = [f for f in os.listdir("/qrcodes") if f.endswith(".txt")] + TOTAL_CODES = len(CODES) +except OSError: + pass -lines = text.read().strip().split("\n") -code_text = lines.pop(0) -title_text = lines.pop(0) -detail_text = lines +print(f'There are {TOTAL_CODES} QR Codes available:') +for codename in CODES: + print(f'File: {codename}') display = badger2040.Badger2040() -display.led(128) + code = qrcode.QRCode() +state = { + "current_qr": 0 +} + + def measure_qr_code(size, code): w, h = code.get_size() module_size = int(size / w) @@ -48,25 +67,75 @@ def draw_qr_code(ox, oy, size, code): display.rectangle(ox + x * module_size, oy + y * module_size, module_size, module_size) -code.set_text(code_text) -size, _ = measure_qr_code(128, code) -left = top = int((badger2040.HEIGHT / 2) - (size / 2)) -draw_qr_code(left, top, 128, code) +def draw_qr_file(n): + display.led(128) + file = CODES[n] + codetext = open("qrcodes/{}".format(file), "r") -left = 128 + 5 + lines = codetext.read().strip().split("\n") + code_text = lines.pop(0) + title_text = lines.pop(0) + detail_text = lines -display.thickness(2) -display.text(title_text, left, 20, 0.5) -display.thickness(1) + # Clear the Display + display.pen(15) # Change this to 0 if a white background is used + display.clear() + display.pen(0) -top = 40 -for line in detail_text: - display.text(line, left, top, 0.4) - top += 10 + code.set_text(code_text) + size, _ = measure_qr_code(128, code) + left = top = int((badger2040.HEIGHT / 2) - (size / 2)) + draw_qr_code(left, top, 128, code) -display.update() + left = 128 + 5 + + display.thickness(2) + display.text(title_text, left, 20, 0.5) + display.thickness(1) + + top = 40 + for line in detail_text: + display.text(line, left, top, 0.4) + top += 10 + + if TOTAL_CODES > 1: + for i in range(TOTAL_CODES): + x = 286 + y = int((128 / 2) - (TOTAL_CODES * 10 / 2) + (i * 10)) + display.pen(0) + display.rectangle(x, y, 8, 8) + if state["current_qr"] != i: + display.pen(15) + display.rectangle(x + 1, y + 1, 6, 6) + display.update() + + +badger_os.state_load("qrcodes", state) +changed = not badger2040.woken_by_button() -# Call halt in a loop, on battery this switches off power. -# On USB, the app will exit when A+C is pressed because the launcher picks that up. while True: + if TOTAL_CODES > 1: + if display.pressed(badger2040.BUTTON_UP): + if state["current_qr"] > 0: + state["current_qr"] -= 1 + changed = True + + if display.pressed(badger2040.BUTTON_DOWN): + if state["current_qr"] < TOTAL_CODES - 1: + state["current_qr"] += 1 + changed = True + + if display.pressed(badger2040.BUTTON_B) or display.pressed(badger2040.BUTTON_C): + display.pen(15) + display.clear() + badger_os.warning(display, "To add QR codes, connect Badger2040 to a PC, load up Thonny, and see qrgen.py.") + time.sleep(4) + changed = True + + if changed: + draw_qr_file(state["current_qr"]) + badger_os.state_save("qrcodes", state) + changed = False + + # Halt the Badger to save power, it will wake up if any of the front buttons are pressed display.halt()