171 lines
4.9 KiB
Python
171 lines
4.9 KiB
Python
import time
|
|
import machine
|
|
from picographics import PicoGraphics, DISPLAY_INKY_PACK
|
|
|
|
|
|
# Buttons
|
|
button_a = machine.Pin(12, machine.Pin.IN, pull=machine.Pin.PULL_UP)
|
|
button_b = machine.Pin(13, machine.Pin.IN, pull=machine.Pin.PULL_UP)
|
|
button_c = machine.Pin(14, machine.Pin.IN, pull=machine.Pin.PULL_UP)
|
|
|
|
# Display
|
|
graphics = PicoGraphics(DISPLAY_INKY_PACK)
|
|
WIDTH, HEIGHT = graphics.get_bounds()
|
|
graphics.set_update_speed(3)
|
|
graphics.set_font("gothic")
|
|
|
|
# RTC
|
|
rtc = machine.RTC()
|
|
|
|
cursors = ["hour", "minute", "year", "month", "day", "finish"]
|
|
set_clock = False
|
|
cursor = 0
|
|
last = 0
|
|
|
|
|
|
def days_in_month(month, year):
|
|
if month == 2 and ((year % 4 == 0 and year % 100 != 0) or year % 400 == 0):
|
|
return 29
|
|
return (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[month - 1]
|
|
|
|
|
|
# Button handling function
|
|
def button(pin):
|
|
global last, set_clock, cursor, year, month, day, hour, minute
|
|
|
|
adjust = 0
|
|
changed = False
|
|
|
|
time.sleep(0.01)
|
|
if pin.value():
|
|
return
|
|
|
|
if pin == button_b and not set_clock:
|
|
cursor = 0
|
|
set_clock = True
|
|
draw_clock()
|
|
return
|
|
|
|
if set_clock:
|
|
if pin == button_b:
|
|
cursor += 1
|
|
cursor %= len(cursors)
|
|
changed = True
|
|
|
|
if pin == button_a:
|
|
adjust = 1
|
|
changed = True
|
|
|
|
if pin == button_c:
|
|
adjust = -1
|
|
changed = True
|
|
|
|
if cursors[cursor] == "finish":
|
|
if adjust != 0:
|
|
set_clock = False
|
|
changed = True
|
|
if not set_clock:
|
|
rtc.datetime((year, month, day, 0, hour, minute, second, 0))
|
|
|
|
if cursors[cursor] == "year":
|
|
year += adjust
|
|
year = max(year, 2022)
|
|
day = min(day, days_in_month(month, year))
|
|
|
|
if cursors[cursor] == "month":
|
|
month += adjust
|
|
month = min(max(month, 1), 12)
|
|
day = min(day, days_in_month(month, year))
|
|
|
|
if cursors[cursor] == "day":
|
|
day += adjust
|
|
day = min(max(day, 1), days_in_month(month, year))
|
|
|
|
if cursors[cursor] == "hour":
|
|
hour += adjust
|
|
hour %= 24
|
|
|
|
if cursors[cursor] == "minute":
|
|
minute += adjust
|
|
minute %= 60
|
|
|
|
if changed:
|
|
draw_clock()
|
|
|
|
|
|
button_a.irq(trigger=machine.Pin.IRQ_FALLING, handler=button)
|
|
button_b.irq(trigger=machine.Pin.IRQ_FALLING, handler=button)
|
|
button_c.irq(trigger=machine.Pin.IRQ_FALLING, handler=button)
|
|
|
|
|
|
def draw_clock():
|
|
hms = "{:02}:{:02}:{:02}".format(hour, minute, second)
|
|
ymd = "{:04}/{:02}/{:02}".format(year, month, day)
|
|
|
|
hms_width = graphics.measure_text(hms, 1.8)
|
|
hms_offset = int((WIDTH / 2) - (hms_width / 2))
|
|
h_width = graphics.measure_text(hms[0:2], 1.8)
|
|
mi_width = graphics.measure_text(hms[3:5], 1.8)
|
|
mi_offset = graphics.measure_text(hms[0:3], 1.8)
|
|
|
|
ymd_width = graphics.measure_text(ymd, 1.0)
|
|
ymd_offset = int((WIDTH / 2) - (ymd_width / 2))
|
|
y_width = graphics.measure_text(ymd[0:4], 1.0)
|
|
m_width = graphics.measure_text(ymd[5:7], 1.0)
|
|
m_offset = graphics.measure_text(ymd[0:5], 1.0)
|
|
d_width = graphics.measure_text(ymd[8:10], 1.0)
|
|
d_offset = graphics.measure_text(ymd[0:8], 1.0)
|
|
|
|
graphics.set_pen(15)
|
|
graphics.clear()
|
|
graphics.set_pen(0)
|
|
|
|
# No "thickness" setting in PG so, uh, fake it!
|
|
graphics.text(hms, hms_offset, 40, scale=1.8)
|
|
graphics.text(hms, hms_offset, 41, scale=1.8)
|
|
graphics.text(hms, hms_offset + 1, 40, scale=1.8)
|
|
graphics.text(hms, hms_offset - 1, 40, scale=1.8)
|
|
|
|
# Double up the text to fill out the lines
|
|
graphics.text(ymd, ymd_offset, 100, scale=1.0)
|
|
graphics.text(ymd, ymd_offset, 101, scale=1.0)
|
|
|
|
if set_clock:
|
|
if cursors[cursor] == "year":
|
|
graphics.line(ymd_offset, 120, ymd_offset + y_width, 120)
|
|
|
|
if cursors[cursor] == "month":
|
|
graphics.line(ymd_offset + m_offset, 120, ymd_offset + m_offset + m_width, 120)
|
|
|
|
if cursors[cursor] == "day":
|
|
graphics.line(ymd_offset + d_offset, 120, ymd_offset + d_offset + d_width, 120)
|
|
|
|
if cursors[cursor] == "hour":
|
|
graphics.line(hms_offset, 70, hms_offset + h_width, 70)
|
|
|
|
if cursors[cursor] == "minute":
|
|
graphics.line(hms_offset + mi_offset, 70, hms_offset + mi_offset + mi_width, 70)
|
|
|
|
done_width = graphics.measure_text("done", scale=0.5)
|
|
graphics.text("done", WIDTH - done_width - 5, HEIGHT - 15, scale=0.5)
|
|
if cursors[cursor] == "finish":
|
|
graphics.line(WIDTH - done_width - 5, HEIGHT - 5, WIDTH - 5, HEIGHT - 5)
|
|
|
|
graphics.update()
|
|
|
|
|
|
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
|
|
|
|
if (year, month, day) == (2021, 1, 1):
|
|
rtc.datetime((2022, 2, 28, 0, 12, 0, 0, 0))
|
|
|
|
last_second = second
|
|
|
|
while True:
|
|
if not set_clock:
|
|
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
|
|
if second != last_second:
|
|
draw_clock()
|
|
last_second = second
|
|
time.sleep(0.01)
|