Пример #1
0
class Main:
    def __init__(self):
        self.settings = Settings()
        self.credentials = Credentials()
        self.display = Display()
        self.networkManager = NetworkManager()

        self.previous_hour1 = self.previous_hour2 = -1
        self.previous_minute1 = self.previous_minute2 = -1
        self.previous_second2 = self.previous_count = -1

        self.loop = get_event_loop()

        rst_cause = reset_cause()

        if rst_cause in [PWRON_RESET, SOFT_RESET]:
            self.power_on_reset_wkfl()
        elif rst_cause in [HARD_RESET]:
            self.hard_reset_wkfl()
        elif rst_cause == DEEPSLEEP_RESET:
            self.deepsleep_reset_wkfl()
        else:
            self.other_reset_wkfl()

        self.loop.run_forever()
        self.loop.close()

    # Power on
    def power_on_reset_wkfl(self):
        print("> SOFT reset or POWER ON reset")
        self.display_logo()

        sleep(1)

        self.check_credentials()
        self.loop.create_task(self.update_time_animated())

    # Reset button pressed when NOT in deep sleep
    def hard_reset_wkfl(self):
        print("> HARD reset")
        self.display_access_point_icon()
        self.networkManager.start_access_point()
        self.start_http_server()

    # Reset from deep sleep after time-out or reset button pressed when IN deep sleep
    def deepsleep_reset_wkfl(self):
        print("> DEEPSLEEP reset")
        self.check_credentials()

        from NtpTime import NtpTime
        ntp = NtpTime()

        hour1, hour2, minute1, minute2, second1, second2 = ntp.get_time()

    def other_reset_wkfl(self):
        from machine import reset
        reset()

    def display_logo(self):
        from images import pepper_clock_icon, pepper_clock_icon_size

        self.display.display_image(
            pepper_clock_icon, pepper_clock_icon_size[0], pepper_clock_icon_size[1]
        )

    def display_no_wifi_icon(self):
        from images import no_wifi_icon, no_wifi_icon_size

        self.display.display_image(
            no_wifi_icon, no_wifi_icon_size[0], no_wifi_icon_size[1], True
        )

    def display_access_point_icon(self):
        from images import access_point_icon, access_point_icon_size

        self.display.display_image(
            access_point_icon, access_point_icon_size[0], access_point_icon_size[1]
        )

    def check_credentials(self):
        if self.credentials.load().is_valid():
            return

        self.display_no_wifi_icon()
        print("> Going to deep sleep...")
        deepsleep()

    def start_http_server(self):
        from HttpServer import HttpServer

        routes = {
            b"/": b"./index.html",
            b"/index.html": b"./index.html",
            b"/scripts.js": b"./scripts.js",
            b"/style.css": b"./style.css",
            b"/favicon.ico": self.favicon,
            b"/connect": self.connect,
            b"/settings/set-eco-mode": self.set_eco_mode,
            b"/settings/values": self.settings_values,
            b"/settings/shutdown-ap": self.shutdown_ap,
            b"/settings/connected": self.connected,
        }

        self.http = HttpServer(routes)
        print("> HTTP server up and running")

    def settings_values(self, _):
        essid = self.credentials.essid

        if not essid:
            essid = b""

        result = b'{"ecoMode": "%s", "essid": "%s"}' % (
            self.settings.load().eco_mode,
            essid,
        )

        return result

    def favicon(self, _):
        print("> NOT sending the favico :-)")

    def connect(self, params):
        self.credentials.essid = params.get(b"essid", None)
        self.credentials.password = params.get(b"password", None)
        self.credentials.write()

        self.networkManager.connect(self.credentials.essid, self.credentials.password)

    def shutdown_ap(self, params):
        deepsleep(1)

    def set_eco_mode(self, params):
        eco_mode = params.get(b"val", b"1")

        self.settings.eco_mode = eco_mode
        self.settings.write()

    def connected(self, params):
        if self.networkManager.isconnected():
            isconnected = b"1"
        else:
            isconnected = b"0"

        return b'{"connected": "%s"}' % (isconnected)

    def update_time_eco(self):
        self.display.set_eco_mode(True)

        hour1, hour2, minute1, minute2, second1, second2 = self.ntp.get_time()

        updated = self.display.draw_digit(COL_DIGITS[0], hour1, self.previous_hour1)
        updated = (
            self.display.draw_digit(COL_DIGITS[1], hour2, self.previous_hour2)
            or updated
        )
        updated = (
            self.display.draw_digit(COL_DIGITS[2], minute1, self.previous_minute1)
            or updated
        )
        updated = (
            self.display.draw_digit(COL_DIGITS[3], minute2, self.previous_minute2)
            or updated
        )
        updated = self.display.draw_dots(second2, self.previous_second2) or updated

        if updated:
            self.display.update()

        self.previous_hour1 = hour1
        self.previous_hour2 = hour2
        self.previous_minute1 = minute1
        self.previous_minute2 = minute2
        self.previous_second2 = second2

    async def get_offset(self):
        if not self.networkManager.isconnected():
            self.networkManager.connect(self.credentials.essid, self.credentials.password)
            
        while not self.ntp.get_offset():
            await sleep_ms(10000)

    async def update_time(self):
        if not self.networkManager.isconnected():
            self.networkManager.connect(self.credentials.essid, self.credentials.password)
            
        while not self.ntp.update_time():
            await sleep_ms(10000)

    async def update_time_animated(self):
        from NtpTime import NtpTime
        self.ntp = NtpTime()

        self.loop.create_task(self.get_offset())
        self.loop.create_task(self.update_time())

        self.display.fill_white()

        while True:
            hour1, hour2, minute1, minute2, second1, second2 = self.ntp.get_time()
            seconds = second1 * 10 + second2
            count = int(seconds / (60 / 9))  # 9 states = 8 lights + no light
            updated = False

            updated = self.display.draw_digit(COL_DIGITS[0], hour1, self.previous_hour1)
            updated = (
                self.display.draw_digit(COL_DIGITS[1], hour2, self.previous_hour2)
                or updated
            )
            updated = (
                self.display.draw_digit(COL_DIGITS[2], minute1, self.previous_minute1)
                or updated
            )
            updated = (
                self.display.draw_digit(COL_DIGITS[3], minute2, self.previous_minute2)
                or updated
            )
            updated = self.display.draw_dots(second2, self.previous_second2) or updated
            updated = self.display.draw_bar(count, self.previous_count) or updated

            if updated:
                self.display.update()

            self.previous_hour1 = hour1
            self.previous_hour2 = hour2
            self.previous_minute1 = minute1
            self.previous_minute2 = minute2
            self.previous_second2 = second2
            self.previous_count = count

            await sleep_ms(100)