firmware/shared/q1.py

90 lines
2.3 KiB
Python

# (c) Copyright 2023 by Coinkite Inc. This file is covered by license found in COPYING-CC.
#
# q1.py - Q1 specific code, not needed on earlier devices.
#
# NOTE: Lots of hardware overlap with Mk4, so see mk4.py too!
#
import os, sys, pyb, ckcc, version, glob, uctypes
# value must exist in battery_idle_timeout_chooser() choices
DEFAULT_BATT_IDLE_TIMEOUT = const(30*60)
def init0():
# called very early
from mk4 import init0 as mk4_init0
# replace drawing code.
import lcd_display as display
sys.modules['display'] = display
mk4_init0()
# Setup various hardware features of the Q1
# - try to continue in case of errors/hardware faults
try:
from scanner import QRScanner
glob.SCAN = QRScanner()
except: pass
try:
import battery
battery.setup_battery()
#print('Batt volt: %s' % get_batt_level())
except: pass
async def scan_and_bag(*a):
# Mk4 took a bag number over USB from a prod test station,
# but on Q we can scan the barcode ourselves.
from pincodes import pa
from glob import dis, settings
import callgate
from ux import ux_show_story
from ux_q1 import QRScannerInteraction
from uasyncio import sleep
try:
assert settings.get('tested', False), 'Not tested yet'
assert pa.is_blank() or version.is_factory_mode, 'Bad mode'
except Exception as exc:
await ux_show_story(str(exc), 'Cannot Bag')
return
zz = QRScannerInteraction()
while 1:
# Get our bag number
got = await zz.scan_text('Scan barcode on new bag.')
if not got:
return
if not got.isdigit() or not (8 <= len(got) <= 32):
# bad scan/not a bag
await ux_show_story(got, "Bad Scan")
continue
break
bag_num = got
# do the change
failed = callgate.set_bag_number(bag_num.encode())
assert not failed
# lock down bootrom against further changes.
callgate.set_rdp_level(2)
# set genuine light
pa.greenlight_firmware()
# we are done.
dis.real_clear()
dis.text(None, 3, bag_num, invert=1)
dis.text(None, 6, "Put into bag and seal now.")
dis.show()
# lockup but keep the power btn working...
while 1:
await sleep(10)
# EOF