pimoroni-pico/micropython/examples/inky_frame/inkylauncher/inky_helper.py

155 wiersze
3.8 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.config(pm=0xa11140) # Turn WiFi power saving off for some slow APs
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)