From ffe842b69f1995990b1a566832cc4c92465de087 Mon Sep 17 00:00:00 2001 From: Matthew Grove Date: Fri, 17 May 2024 00:25:12 +0100 Subject: [PATCH] Sleep after 15s or when ctrl button pressed --- app.py | 84 +++++++++++++++++++++++++++++++++++++--------------------- lcd.py | 8 +++++- 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/app.py b/app.py index bcb236f..47e606e 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,6 @@ from machine import reset from network import WLAN, STA_IF -from time import sleep, localtime +from time import sleep, localtime, time from lcd import LCD from font import cntr_st from gc import collect, mem_free @@ -16,6 +16,7 @@ class App: self.scr_n = -1 else: self.scr_n = 0 self.lcd = LCD() + self.last_cng = 0 def __connect(self) -> int: wlan = WLAN(STA_IF) @@ -43,15 +44,15 @@ class App: pass def __resetButtonStatuses(self) -> None: - self.lcd.keyA["v"] = False - self.lcd.keyB["v"] = False - self.lcd.keyX["v"] = False - self.lcd.keyY["v"] = False - self.lcd.left["v"] = False - self.lcd.right["v"] = False - self.lcd.up["v"] = False - self.lcd.down["v"] = False - self.lcd.ctrl["v"] = False + if (self.lcd.keyA["v"]): self.lcd.keyA["v"] = False + if (self.lcd.keyB["v"]): self.lcd.keyB["v"] = False + if (self.lcd.keyX["v"]): self.lcd.keyX["v"] = False + if (self.lcd.keyY["v"]): self.lcd.keyY["v"] = False + if (self.lcd.left["v"]): self.lcd.left["v"] = False + if (self.lcd.right["v"]): self.lcd.right["v"] = False + if (self.lcd.up["v"]): self.lcd.up["v"] = False + if (self.lcd.down["v"]): self.lcd.down["v"] = False + if (self.lcd.ctrl["v"]): self.lcd.ctrl["v"] = False def __manageButtons(self) -> None: while (True): @@ -102,9 +103,10 @@ class App: self.scr_n -= 1 self.lcd.left["v"] = False self.lcd.right["v"] = False + if (c): self.last_cng = time() return c - def handleButtons(self) -> bool: + def handleButtons(self, o: bool = True) -> bool: up = self.lcd.up["v"] down = self.lcd.down["v"] left = self.lcd.left["v"] @@ -115,12 +117,18 @@ class App: keyX = self.lcd.keyX["v"] keyY = self.lcd.keyY["v"] self.__resetButtonStatuses() - if (ctrl): - reset() - return self.s.handleButtons(up, down, left, right, keyA, keyB, keyX, keyY, ctrl) + if (o): + c = 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: started = False + active = True + self.last_cng = time() while (True): print("Mem free before and after collecting:") print(mem_free()) @@ -131,24 +139,40 @@ class App: settime() except: pass - changed = not started or self.__changeScreen() - if (not started): started = True - # if the screen has changed, redraw the whole screen - if (changed): - 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"]) + if (active and time() - self.last_cng > 15): + LCD.setDuty(0) + active = False + elif (active): + if (self.lcd.ctrl["v"]): + LCD.setDuty(0) + active = False + self.lcd.ctrl["v"] = False + continue + 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: - self.s = UnknownScreen("Unknown") - self.s.display(self.lcd) - # otherwise minimise the number of pixels being changed + b = self.handleButtons() + if (b): + self.last_cng = time() + continue + self.s.update(self.lcd) else: - b = self.handleButtons() - if (b): continue - self.s.update(self.lcd) + if (self.handleButtons(False)): + LCD.setDuty() + active = True def run(self) -> None: if (self.scr_n == None): return diff --git a/lcd.py b/lcd.py index 86e4791..ce307dc 100644 --- a/lcd.py +++ b/lcd.py @@ -7,13 +7,14 @@ RST = 12 MOSI = 11 SCK = 10 CS = 9 +DUTY = 32768 # LCD driver class LCD(FrameBuffer): def __init__(self): pwm = PWM(Pin(BL)) pwm.freq(1000) - pwm.duty_u16(32768) + pwm.duty_u16(DUTY) self.width = 240 self.height = 240 @@ -186,3 +187,8 @@ class LCD(FrameBuffer): self.spi.write(self.buffer) self.cs(1) # END OF DRIVER + + @staticmethod + def setDuty(v: int = DUTY): + pwm = PWM(Pin(BL)) + pwm.duty_u16(v) \ No newline at end of file