Sleep after 15s or when ctrl button pressed

This commit is contained in:
2024-05-17 00:25:12 +01:00
parent ee869e5842
commit ffe842b69f
2 changed files with 61 additions and 31 deletions

84
app.py
View File

@@ -1,6 +1,6 @@
from machine import reset from machine import reset
from network import WLAN, STA_IF from network import WLAN, STA_IF
from time import sleep, localtime from time import sleep, localtime, time
from lcd import LCD from lcd import LCD
from font import cntr_st from font import cntr_st
from gc import collect, mem_free from gc import collect, mem_free
@@ -16,6 +16,7 @@ class App:
self.scr_n = -1 self.scr_n = -1
else: self.scr_n = 0 else: self.scr_n = 0
self.lcd = LCD() self.lcd = LCD()
self.last_cng = 0
def __connect(self) -> int: def __connect(self) -> int:
wlan = WLAN(STA_IF) wlan = WLAN(STA_IF)
@@ -43,15 +44,15 @@ class App:
pass pass
def __resetButtonStatuses(self) -> None: def __resetButtonStatuses(self) -> None:
self.lcd.keyA["v"] = False if (self.lcd.keyA["v"]): self.lcd.keyA["v"] = False
self.lcd.keyB["v"] = False if (self.lcd.keyB["v"]): self.lcd.keyB["v"] = False
self.lcd.keyX["v"] = False if (self.lcd.keyX["v"]): self.lcd.keyX["v"] = False
self.lcd.keyY["v"] = False if (self.lcd.keyY["v"]): self.lcd.keyY["v"] = False
self.lcd.left["v"] = False if (self.lcd.left["v"]): self.lcd.left["v"] = False
self.lcd.right["v"] = False if (self.lcd.right["v"]): self.lcd.right["v"] = False
self.lcd.up["v"] = False if (self.lcd.up["v"]): self.lcd.up["v"] = False
self.lcd.down["v"] = False if (self.lcd.down["v"]): self.lcd.down["v"] = False
self.lcd.ctrl["v"] = False if (self.lcd.ctrl["v"]): self.lcd.ctrl["v"] = False
def __manageButtons(self) -> None: def __manageButtons(self) -> None:
while (True): while (True):
@@ -102,9 +103,10 @@ class App:
self.scr_n -= 1 self.scr_n -= 1
self.lcd.left["v"] = False self.lcd.left["v"] = False
self.lcd.right["v"] = False self.lcd.right["v"] = False
if (c): self.last_cng = time()
return c return c
def handleButtons(self) -> bool: def handleButtons(self, o: bool = True) -> bool:
up = self.lcd.up["v"] up = self.lcd.up["v"]
down = self.lcd.down["v"] down = self.lcd.down["v"]
left = self.lcd.left["v"] left = self.lcd.left["v"]
@@ -115,12 +117,18 @@ class App:
keyX = self.lcd.keyX["v"] keyX = self.lcd.keyX["v"]
keyY = self.lcd.keyY["v"] keyY = self.lcd.keyY["v"]
self.__resetButtonStatuses() self.__resetButtonStatuses()
if (ctrl): if (o):
reset() c = self.s.handleButtons(up, down, left, right, keyA, keyB, keyX, keyY, ctrl)
return self.s.handleButtons(up, down, left, right, keyA, keyB, keyX, keyY, ctrl) if (c): self.last_cng = time()
return c
c = up or down or left or right or keyA or keyB or keyX or keyY or ctrl
if (c): self.last_cng = time()
return c
def __manageScreen(self) -> None: def __manageScreen(self) -> None:
started = False started = False
active = True
self.last_cng = time()
while (True): while (True):
print("Mem free before and after collecting:") print("Mem free before and after collecting:")
print(mem_free()) print(mem_free())
@@ -131,24 +139,40 @@ class App:
settime() settime()
except: except:
pass pass
changed = not started or self.__changeScreen() if (active and time() - self.last_cng > 15):
if (not started): started = True LCD.setDuty(0)
# if the screen has changed, redraw the whole screen active = False
if (changed): elif (active):
self.__resetButtonStatuses() if (self.lcd.ctrl["v"]):
collect() LCD.setDuty(0)
if (SCREENS[self.scr_n]["type"] == 0): active = False
self.s = LightsScreen(SCREENS[self.scr_n]["name"], SCREENS[self.scr_n]["entities"]) self.lcd.ctrl["v"] = False
elif (SCREENS[self.scr_n]["type"] == 1): continue
self.s = MediaScreen(SCREENS[self.scr_n]["name"], SCREENS[self.scr_n]["entity"]) changed = not started or self.__changeScreen()
# if the screen has changed, redraw the whole screen
if (changed):
self.last_cng = time()
if (not started): started = True
self.__resetButtonStatuses()
collect()
if (SCREENS[self.scr_n]["type"] == 0):
self.s = LightsScreen(SCREENS[self.scr_n]["name"], SCREENS[self.scr_n]["entities"])
elif (SCREENS[self.scr_n]["type"] == 1):
self.s = MediaScreen(SCREENS[self.scr_n]["name"], SCREENS[self.scr_n]["entity"])
else:
self.s = UnknownScreen("Unknown")
self.s.display(self.lcd)
# otherwise minimise the number of pixels being changed
else: else:
self.s = UnknownScreen("Unknown") b = self.handleButtons()
self.s.display(self.lcd) if (b):
# otherwise minimise the number of pixels being changed self.last_cng = time()
continue
self.s.update(self.lcd)
else: else:
b = self.handleButtons() if (self.handleButtons(False)):
if (b): continue LCD.setDuty()
self.s.update(self.lcd) active = True
def run(self) -> None: def run(self) -> None:
if (self.scr_n == None): return if (self.scr_n == None): return

8
lcd.py
View File

@@ -7,13 +7,14 @@ RST = 12
MOSI = 11 MOSI = 11
SCK = 10 SCK = 10
CS = 9 CS = 9
DUTY = 32768
# LCD driver # LCD driver
class LCD(FrameBuffer): class LCD(FrameBuffer):
def __init__(self): def __init__(self):
pwm = PWM(Pin(BL)) pwm = PWM(Pin(BL))
pwm.freq(1000) pwm.freq(1000)
pwm.duty_u16(32768) pwm.duty_u16(DUTY)
self.width = 240 self.width = 240
self.height = 240 self.height = 240
@@ -186,3 +187,8 @@ class LCD(FrameBuffer):
self.spi.write(self.buffer) self.spi.write(self.buffer)
self.cs(1) self.cs(1)
# END OF DRIVER # END OF DRIVER
@staticmethod
def setDuty(v: int = DUTY):
pwm = PWM(Pin(BL))
pwm.duty_u16(v)