Merge pull request #333 from pimoroni/patch-jpw-multi-qrcodes

Badger 2040: Support for multiple QR codes.
This commit is contained in:
Philip Howard 2022-04-01 16:59:49 +01:00 committed by GitHub
commit 832d0f08dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 96 additions and 27 deletions

View File

@ -1,12 +1,20 @@
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:
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
@ -18,19 +26,30 @@ Scan this code to learn
more about Badger 2040.
""")
text.flush()
text = open("qrcode.txt", "r")
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,6 +67,21 @@ def draw_qr_code(ox, oy, size, code):
display.rectangle(ox + x * module_size, oy + y * module_size, module_size, module_size)
def draw_qr_file(n):
display.led(128)
file = CODES[n]
codetext = open("qrcodes/{}".format(file), "r")
lines = codetext.read().strip().split("\n")
code_text = lines.pop(0)
title_text = lines.pop(0)
detail_text = lines
# Clear the Display
display.pen(15) # Change this to 0 if a white background is used
display.clear()
display.pen(0)
code.set_text(code_text)
size, _ = measure_qr_code(128, code)
left = top = int((badger2040.HEIGHT / 2) - (size / 2))
@ -64,9 +98,44 @@ 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()
# 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.
badger_os.state_load("qrcodes", state)
changed = not badger2040.woken_by_button()
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()