kopia lustrzana https://github.com/pimoroni/pimoroni-pico
				
				
				
			Badger 2040: Support for multiple QR codes.
Signed-off-by: James Sutton <1068763+jpwsutton@users.noreply.github.com>pull/333/head
							rodzic
							
								
									dbb9a3d181
								
							
						
					
					
						commit
						88040322da
					
				|  | @ -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() | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 James Sutton
						James Sutton