2022-02-22 13:45:11 +00:00
|
|
|
import gc
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
import math
|
|
|
|
import machine
|
|
|
|
import badger2040
|
2022-02-24 16:02:25 +00:00
|
|
|
from badger2040 import WIDTH
|
2022-02-23 16:08:06 +00:00
|
|
|
import launchericons
|
2022-02-22 13:45:11 +00:00
|
|
|
|
2022-02-24 12:18:10 +00:00
|
|
|
MAX_BATTERY_VOLTAGE = 4.0
|
|
|
|
MIN_BATTERY_VOLTAGE = 3.2
|
|
|
|
|
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
page = 0
|
2022-02-23 16:08:06 +00:00
|
|
|
font_size = 1
|
|
|
|
|
|
|
|
icons = bytearray(launchericons.data())
|
2022-02-22 13:45:11 +00:00
|
|
|
|
|
|
|
examples = [
|
2022-02-23 16:08:06 +00:00
|
|
|
("clock.py", 0),
|
|
|
|
("fonts.py", 1),
|
|
|
|
("ebook.py", 2),
|
|
|
|
("image.py", 3),
|
|
|
|
("list.py", 4),
|
|
|
|
("badge.py", 5)
|
2022-02-22 13:45:11 +00:00
|
|
|
]
|
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
font_sizes = (0.5, 0.7, 0.9)
|
|
|
|
|
|
|
|
# Approximate center lines for buttons A, B and C
|
|
|
|
centers = (41, 147, 253)
|
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
MAX_PAGE = math.ceil(len(examples) / 3)
|
|
|
|
|
|
|
|
button_a = machine.Pin(badger2040.BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN)
|
|
|
|
button_b = machine.Pin(badger2040.BUTTON_B, machine.Pin.IN, machine.Pin.PULL_DOWN)
|
|
|
|
button_c = machine.Pin(badger2040.BUTTON_C, machine.Pin.IN, machine.Pin.PULL_DOWN)
|
|
|
|
button_up = machine.Pin(badger2040.BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN)
|
|
|
|
button_down = machine.Pin(badger2040.BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN)
|
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
# Inverted. For reasons.
|
|
|
|
button_user = machine.Pin(badger2040.BUTTON_USER, machine.Pin.IN, machine.Pin.PULL_UP)
|
2022-02-22 13:45:11 +00:00
|
|
|
|
2022-02-24 12:18:10 +00:00
|
|
|
# Battery measurement
|
|
|
|
vbat_adc = machine.ADC(badger2040.PIN_BATTERY)
|
|
|
|
vref_adc = machine.ADC(badger2040.PIN_1V2_REF)
|
|
|
|
vref_en = machine.Pin(badger2040.PIN_VREF_POWER)
|
|
|
|
vref_en.init(machine.Pin.OUT)
|
|
|
|
vref_en.value(0)
|
|
|
|
|
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
display = badger2040.Badger2040()
|
2022-02-22 13:45:11 +00:00
|
|
|
|
|
|
|
|
2022-02-24 12:18:10 +00:00
|
|
|
def map_value(input, in_min, in_max, out_min, out_max):
|
|
|
|
return (((input - in_min) * (out_max - out_min)) / (in_max - in_min)) + out_min
|
|
|
|
|
|
|
|
|
|
|
|
def get_battery_level():
|
|
|
|
# Enable the onboard voltage reference
|
|
|
|
vref_en.value(1)
|
|
|
|
|
|
|
|
# Calculate the logic supply voltage, as will be lower that the usual 3.3V when running off low batteries
|
|
|
|
vdd = 1.24 * (65535 / vref_adc.read_u16())
|
|
|
|
vbat = (vbat_adc.read_u16() / 65535) * 3 * vdd # 3 in this is a gain, not rounding of 3.3V
|
|
|
|
|
|
|
|
# Disable the onboard voltage reference
|
|
|
|
vref_en.value(0)
|
|
|
|
|
|
|
|
# Convert the voltage to a level to display onscreen
|
|
|
|
return int(map_value(vbat, MIN_BATTERY_VOLTAGE, MAX_BATTERY_VOLTAGE, 0, 4))
|
|
|
|
|
|
|
|
|
|
|
|
def draw_battery(level, x, y):
|
|
|
|
# Outline
|
|
|
|
display.thickness(1)
|
|
|
|
display.pen(15)
|
|
|
|
display.rectangle(x, y, 19, 10)
|
|
|
|
# Terminal
|
|
|
|
display.rectangle(x + 19, y + 3, 2, 4)
|
|
|
|
display.pen(0)
|
|
|
|
display.rectangle(x + 1, y + 1, 17, 8)
|
2022-02-24 14:30:42 +00:00
|
|
|
if level < 1:
|
|
|
|
display.pen(0)
|
|
|
|
display.line(x + 3, y, x + 3 + 10, y + 10)
|
|
|
|
display.line(x + 3 + 1, y, x + 3 + 11, y + 10)
|
|
|
|
display.pen(15)
|
|
|
|
display.line(x + 2 + 2, y - 1, x + 4 + 12, y + 11)
|
|
|
|
display.line(x + 2 + 3, y - 1, x + 4 + 13, y + 11)
|
|
|
|
return
|
2022-02-24 12:18:10 +00:00
|
|
|
# Battery Bars
|
|
|
|
display.pen(15)
|
|
|
|
for i in range(4):
|
|
|
|
if level / 4 > (1.0 * i) / 4:
|
|
|
|
display.rectangle(i * 4 + x + 2, y + 2, 3, 6)
|
|
|
|
|
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
def render():
|
2022-02-23 16:08:06 +00:00
|
|
|
display.pen(15)
|
|
|
|
display.clear()
|
|
|
|
display.pen(0)
|
|
|
|
display.thickness(2)
|
2022-02-22 14:39:45 +00:00
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
max_icons = min(3, len(examples[(page * 3):]))
|
|
|
|
|
|
|
|
for i in range(max_icons):
|
2022-02-23 16:08:06 +00:00
|
|
|
x = centers[i]
|
|
|
|
label, icon = examples[i + (page * 3)]
|
|
|
|
label = label.replace(".py", "")
|
|
|
|
display.pen(0)
|
|
|
|
display.icon(icons, icon, 384, 64, x - 32, 24)
|
|
|
|
w = display.measure_text(label, font_sizes[font_size])
|
|
|
|
display.text(label, x - int(w / 2), 16 + 80, font_sizes[font_size])
|
2022-02-22 14:39:45 +00:00
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
for i in range(MAX_PAGE):
|
|
|
|
x = 286
|
|
|
|
y = int((128 / 2) - (MAX_PAGE * 10 / 2) + (i * 10))
|
2022-02-23 16:08:06 +00:00
|
|
|
display.pen(0)
|
|
|
|
display.rectangle(x, y, 8, 8)
|
2022-02-22 13:45:11 +00:00
|
|
|
if page != i:
|
2022-02-23 16:08:06 +00:00
|
|
|
display.pen(15)
|
|
|
|
display.rectangle(x + 1, y + 1, 6, 6)
|
2022-02-22 13:45:11 +00:00
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
display.pen(0)
|
2022-02-24 12:18:10 +00:00
|
|
|
display.rectangle(0, 0, WIDTH, 16)
|
|
|
|
draw_battery(get_battery_level(), WIDTH - 22 - 3, 3)
|
|
|
|
display.pen(15)
|
|
|
|
display.text("badgerOS", 3, 8, 0.4)
|
2022-02-23 16:08:06 +00:00
|
|
|
|
|
|
|
display.update()
|
2022-02-22 13:45:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
def launch(file):
|
|
|
|
for k in locals().keys():
|
|
|
|
if k not in ("gc", "file"):
|
|
|
|
del locals()[k]
|
|
|
|
gc.collect()
|
|
|
|
__import__(file)
|
2022-02-23 16:08:06 +00:00
|
|
|
sys.exit(0)
|
2022-02-22 13:45:11 +00:00
|
|
|
|
2022-02-22 14:39:45 +00:00
|
|
|
|
|
|
|
def launch_example(index):
|
2022-02-22 13:45:11 +00:00
|
|
|
try:
|
2022-02-23 16:08:06 +00:00
|
|
|
launch(examples[(page * 3) + index][0])
|
2022-02-22 14:39:45 +00:00
|
|
|
return True
|
2022-02-22 13:45:11 +00:00
|
|
|
except IndexError:
|
2022-02-22 14:39:45 +00:00
|
|
|
return False
|
2022-02-22 13:45:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
def button(pin):
|
2022-02-23 16:08:06 +00:00
|
|
|
global page, font_size
|
|
|
|
if pin == button_user:
|
|
|
|
font_size += 1
|
|
|
|
if font_size == len(font_sizes):
|
|
|
|
font_size = 0
|
|
|
|
render()
|
2022-02-22 13:45:11 +00:00
|
|
|
if pin == button_a:
|
2022-02-22 14:39:45 +00:00
|
|
|
launch_example(0)
|
2022-02-22 13:45:11 +00:00
|
|
|
if pin == button_b:
|
2022-02-22 14:39:45 +00:00
|
|
|
launch_example(1)
|
2022-02-22 13:45:11 +00:00
|
|
|
if pin == button_c:
|
2022-02-22 14:39:45 +00:00
|
|
|
launch_example(2)
|
2022-02-22 13:45:11 +00:00
|
|
|
if pin == button_up:
|
|
|
|
if page > 0:
|
|
|
|
page -= 1
|
|
|
|
render()
|
|
|
|
if pin == button_down:
|
|
|
|
if page < MAX_PAGE - 1:
|
|
|
|
page += 1
|
|
|
|
render()
|
|
|
|
|
|
|
|
|
2022-02-25 13:37:35 +00:00
|
|
|
display.update_speed(badger2040.UPDATE_MEDIUM)
|
2022-02-22 20:26:00 +00:00
|
|
|
render()
|
2022-02-25 13:37:35 +00:00
|
|
|
display.update_speed(badger2040.UPDATE_FAST)
|
2022-02-24 16:02:25 +00:00
|
|
|
|
2022-02-22 20:26:00 +00:00
|
|
|
|
|
|
|
# Wait for wakeup button to be released
|
|
|
|
while button_a.value() or button_b.value() or button_c.value() or button_up.value() or button_down.value():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2022-02-22 13:45:11 +00:00
|
|
|
while True:
|
2022-02-23 16:08:06 +00:00
|
|
|
if button_a.value():
|
|
|
|
button(button_a)
|
|
|
|
if button_b.value():
|
|
|
|
button(button_b)
|
|
|
|
if button_c.value():
|
|
|
|
button(button_c)
|
2022-02-24 12:18:10 +00:00
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
if button_up.value():
|
|
|
|
button(button_up)
|
|
|
|
if button_down.value():
|
|
|
|
button(button_down)
|
2022-02-24 12:18:10 +00:00
|
|
|
|
2022-02-23 16:08:06 +00:00
|
|
|
if not button_user.value():
|
|
|
|
button(button_user)
|
|
|
|
|
|
|
|
time.sleep(0.01)
|