Commit ae43a249 authored by Alyx's avatar Alyx
Browse files

added multi menu support, added tick pulse, condensed multiple threads into the one tick thread

parent 19d1722f
Loading
Loading
Loading
Loading
+81 −43
Original line number Diff line number Diff line
@@ -17,11 +17,18 @@ class Kronk:
        self.last_space_status_change = time.time()

        self.last_interaction_time = int(time.time())
        self.selector = 0

        self.temperature = 0
        self.last_sensor_poll = int(time.time())
        self.clock_force_draw = 0

        self.menu_index = 0
        self.selector = 0

        self.menus = ["STATUS", "DOORHOLD"]
        self.status_options = ["OPEN", "CLOSED", "INVISIBLE"]
        self.doorhold_options = ["TRUE", "FALSE"]

        self.tasks = []
        self.running = True

@@ -50,15 +57,26 @@ class Kronk:
            url = "https://devhack.net/spaceapi.json"
            sensors = requests.get(url, headers=headers).json()
            self.temperature = sensors["sensors"]["temperature"][0]["value"]
            self.ppm = sensors["sensors"]["humidity"][1]["value"]
        except (IndexError, requests.exceptions.RequestException) as e:
            print(f"error polling: {e}")
            self.temperature = 0
            self.ppm = 0
        self.last_sensor_poll = int(time.time())

    def draw_space_update_menu(self, option):
    def draw_space_update_menu(self, option=None):
        if (self.menus[self.menu_index] == "STATUS"):
            self.full_draw(0)
            self.panel.write_line(7, "                        ")
            self.panel.write_line(7, f"==SET SPACE STATUS==")
            self.panel.write_line(8, "                        ")
            self.panel.write_line(8, f"SET SPACE TO {self.status_options[self.selector]}?")
        if (self.menus[self.menu_index] == "DOORHOLD"):
            self.full_draw(0)
            self.panel.write_line(7, "                        ")
            self.panel.write_line(7, f"==SET DOORHOLD STATUS==")
            self.panel.write_line(8, "                        ")
        self.panel.write_line(8, f"SET SPACE TO {option}?")
            self.panel.write_line(8, f"doorhold menu")

    def set_space_status_led(self):
        if self.space_status == "OPEN":
@@ -70,13 +88,18 @@ class Kronk:

    def wakeup(self):
        print("WAKING UP")
        self.menu_index = 0
        self.panel.display_backlight_on(0)  # Full brightness
        self.panel.set_keypad_backlight_brightness(255)

    def partial_draw_clock(self):
        now = datetime.datetime.now()
        time = now.strftime("%Y-%m-%d %H:%M:%S")
        self.panel.write_line(7, f"{time}")
        timestr = now.strftime("%Y-%m-%d %H:%M:%S")
        if int(time.time()) % 2 == 0:
            self.panel.write_line(1, f"  /dev/hack is {self.space_status}")
        else:
            self.panel.write_line(1, f"# /dev/hack is {self.space_status}")
        self.panel.write_line(6, f"{timestr}")
        # a force draw variable, in case someone does a remote close,
        # since partial clock draw is run regularly we will do that here
        if self.clock_force_draw == 1:
@@ -86,14 +109,13 @@ class Kronk:
    def full_draw(self, clear=1):
        if clear == 1:
            self.panel.clear_display()
        self.panel.write_line(1, f"# /dev/hack is {self.space_status}")

        self.panel.write_line(2, f"Temp: {self.temperature}F, {self.ppm} PPM CO2")
        self.set_space_status_led()
        self.airquality_update()
        self.partial_draw_clock()

    def on_button_press(self, char):
        options = ["OPEN", "CLOSED", "INVISIBLE"]
        print(f"Button pressed: {char}")
        print(self.panel_status)
        # wake up backlights on button press if not already awake
@@ -101,14 +123,30 @@ class Kronk:
            self.wakeup()
        # if a button is pressed, update the last interaction time
        self.last_interaction_time = int(time.time())
        # if right or up are pressed, increment through the list
        # corner buttons!
        # up corner button increments menu index
        self.panel_status = "in_menu"
        if (char == "A" or char == "G"):
            self.selector = 0
            if (char == "A"):
                self.menu_index = self.menu_index + 1;
                if (self.menu_index > len(self.menus) - 1):
                    self.menu_index = 0  # loop back if we reach the end
            # down corner button decrements menu index
            if (char == "G"):
                self.menu_index = self.menu_index - 1;
                if (self.menu_index < 0):
                    self.menu_index = len(self.menus) - 1  # loop back if we reach the end
            self.draw_space_update_menu()

        if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "STATUS"):
            if char == "B" or char == "C":
                self.panel_status = "in_menu"
                self.selector = self.selector + 1
                # loop back around
                if self.selector > 2:
                    self.selector = 0
            self.draw_space_update_menu(options[self.selector])
                self.draw_space_update_menu()
            # if left or down are pressed, decrement through the list
            if char == "H" or char == "D":
                self.panel_status = "in_menu"
@@ -116,21 +154,24 @@ class Kronk:
                # loop back around
                if self.selector < 0:
                    self.selector = 2
            self.draw_space_update_menu(options[self.selector])
                self.draw_space_update_menu()
            # if we're in a menu, and the enter key is pressed, set that
            if char == "E" and self.panel_status == "in_menu":
                # update the space status
            self.space_status = options[self.selector]
            print(f"STATUS CHANGED to {options[self.selector]}")
                self.space_status = self.status_options[self.selector]
                print(f"STATUS CHANGED to {self.status_options[self.selector]}")
                # poke the last space status change
                self.last_space_status_change = time.time()
                # awake, but no longer in menu
                self.panel_status = "awake"
                # redraw panel
                self.full_draw()
        if (self.panel_status == "in_menu" and self.menus[self.menu_index] == "DOORHOLD"):
            self.draw_space_update_menu()

    async def screen_update(self):
    async def tick_pulse(self):
        while self.running:
            # sensor/tick draw
            # if it's been two minutes since the last sensor poll, do it again
            if int(time.time()) - self.last_sensor_poll > 120:
                self.poll_sensors()
@@ -139,10 +180,8 @@ class Kronk:
                self.partial_draw_clock()
            else:
                self.full_draw(0)
            await asyncio.sleep(1)

    async def sleep_timeout(self):
        while self.running:
            # sleep timer
            if self.panel_status != "asleep":
                print(
                    "BACKLIGHT TIMEOUT COUNTER:"
@@ -179,8 +218,7 @@ class Kronk:
        self.full_draw()
        self.poll_sensors()

        self.tasks.append(asyncio.create_task(self.sleep_timeout()))
        self.tasks.append(asyncio.create_task(self.screen_update()))
        self.tasks.append(asyncio.create_task(self.tick_pulse()))

        self.panel.add_button_callback(self.on_button_press)