154 lines
3.7 KiB
Python
154 lines
3.7 KiB
Python
from pimoroni_i2c import PimoroniI2C
|
|
from pcf85063a import PCF85063A
|
|
import math
|
|
from machine import Pin, PWM, Timer
|
|
import time
|
|
import inky_frame
|
|
import json
|
|
import network
|
|
import os
|
|
|
|
# Pin setup for VSYS_HOLD needed to sleep and wake.
|
|
HOLD_VSYS_EN_PIN = 2
|
|
hold_vsys_en_pin = Pin(HOLD_VSYS_EN_PIN, Pin.OUT)
|
|
|
|
# intialise the pcf85063a real time clock chip
|
|
I2C_SDA_PIN = 4
|
|
I2C_SCL_PIN = 5
|
|
i2c = PimoroniI2C(I2C_SDA_PIN, I2C_SCL_PIN, 100000)
|
|
rtc = PCF85063A(i2c)
|
|
|
|
led_warn = Pin(6, Pin.OUT)
|
|
|
|
# set up for the network LED
|
|
network_led_pwm = PWM(Pin(7))
|
|
network_led_pwm.freq(1000)
|
|
network_led_pwm.duty_u16(0)
|
|
|
|
|
|
# set the brightness of the network led
|
|
def network_led(brightness):
|
|
brightness = max(0, min(100, brightness)) # clamp to range
|
|
# gamma correct the brightness (gamma 2.8)
|
|
value = int(pow(brightness / 100.0, 2.8) * 65535.0 + 0.5)
|
|
network_led_pwm.duty_u16(value)
|
|
|
|
|
|
network_led_timer = Timer(-1)
|
|
network_led_pulse_speed_hz = 1
|
|
|
|
|
|
def network_led_callback(t):
|
|
# updates the network led brightness based on a sinusoid seeded by the current time
|
|
brightness = (math.sin(time.ticks_ms() * math.pi * 2 / (1000 / network_led_pulse_speed_hz)) * 40) + 60
|
|
value = int(pow(brightness / 100.0, 2.8) * 65535.0 + 0.5)
|
|
network_led_pwm.duty_u16(value)
|
|
|
|
|
|
# set the network led into pulsing mode
|
|
def pulse_network_led(speed_hz=1):
|
|
global network_led_timer, network_led_pulse_speed_hz
|
|
network_led_pulse_speed_hz = speed_hz
|
|
network_led_timer.deinit()
|
|
network_led_timer.init(period=50, mode=Timer.PERIODIC, callback=network_led_callback)
|
|
|
|
|
|
# turn off the network led and disable any pulsing animation that's running
|
|
def stop_network_led():
|
|
global network_led_timer
|
|
network_led_timer.deinit()
|
|
network_led_pwm.duty_u16(0)
|
|
|
|
|
|
def sleep(t):
|
|
# Time to have a little nap until the next update
|
|
rtc.clear_timer_flag()
|
|
rtc.set_timer(t, ttp=rtc.TIMER_TICK_1_OVER_60HZ)
|
|
rtc.enable_timer_interrupt(True)
|
|
|
|
# Set the HOLD VSYS pin to an input
|
|
# this allows the device to go into sleep mode when on battery power.
|
|
hold_vsys_en_pin.init(Pin.IN)
|
|
|
|
# Regular time.sleep for those powering from USB
|
|
time.sleep(60 * t)
|
|
|
|
|
|
# Turns off the button LEDs
|
|
def clear_button_leds():
|
|
inky_frame.button_a.led_off()
|
|
inky_frame.button_b.led_off()
|
|
inky_frame.button_c.led_off()
|
|
inky_frame.button_d.led_off()
|
|
inky_frame.button_e.led_off()
|
|
|
|
|
|
def network_connect(SSID, PSK):
|
|
# Enable the Wireless
|
|
wlan = network.WLAN(network.STA_IF)
|
|
wlan.active(True)
|
|
|
|
# Number of attempts to make before timeout
|
|
max_wait = 10
|
|
|
|
# Sets the Wireless LED pulsing and attempts to connect to your local network.
|
|
pulse_network_led()
|
|
wlan.connect(SSID, PSK)
|
|
|
|
while max_wait > 0:
|
|
if wlan.status() < 0 or wlan.status() >= 3:
|
|
break
|
|
max_wait -= 1
|
|
print('waiting for connection...')
|
|
time.sleep(1)
|
|
|
|
stop_network_led()
|
|
network_led_pwm.duty_u16(30000)
|
|
|
|
# Handle connection error. Switches the Warn LED on.
|
|
if wlan.status() != 3:
|
|
stop_network_led()
|
|
led_warn.on()
|
|
|
|
|
|
state = {"run": None}
|
|
app = None
|
|
|
|
|
|
def file_exists(filename):
|
|
try:
|
|
return (os.stat(filename)[0] & 0x4000) == 0
|
|
except OSError:
|
|
return False
|
|
|
|
|
|
def clear_state():
|
|
if file_exists("state.json"):
|
|
os.remove("state.json")
|
|
|
|
|
|
def save_state(data):
|
|
with open("/state.json", "w") as f:
|
|
f.write(json.dumps(data))
|
|
f.flush()
|
|
|
|
|
|
def load_state():
|
|
global state
|
|
data = json.loads(open("/state.json", "r").read())
|
|
if type(data) is dict:
|
|
state = data
|
|
|
|
|
|
def update_state(running):
|
|
global state
|
|
state['run'] = running
|
|
save_state(state)
|
|
|
|
|
|
def launch_app(app_name):
|
|
global app
|
|
app = __import__(app_name)
|
|
print(app)
|
|
update_state(app_name)
|