From 2d9abe2ff283385571ba1ea93500b50e4de163d3 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 10:31:59 -0800 Subject: [PATCH 1/7] Added deep and light sleep functions --- adafruit_magtag/magtag.py | 51 ++++++++++++++++++++++++++++++++++ adafruit_magtag/peripherals.py | 11 ++++++++ 2 files changed, 62 insertions(+) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index 5722bed..ae73f9a 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -92,6 +92,13 @@ def __init__( self._json_path = None self.json_path = json_path + try: + import alarm # pylint: disable=import-outside-toplevel + + self._alarm = alarm + except ImportError: + self._alarm = None + self._regexp_path = regexp_path self.splash = self.graphics.splash @@ -293,6 +300,50 @@ def set_text(self, val, index=0, auto_refresh=True): if auto_refresh: self.refresh() + def enter_deep_sleep(self, sleep_time): + """ + Enter deep sleep and restart the program after a certain amount of time + + :param float sleep_time: The amount of time to sleep in seconds + + """ + if self._alarm: + self.peripherals.neopixel_disable = True + self.peripherals.speaker_disable = True + pause = self._alarm.time.TimeAlarm( + monotonic_time=time.monotonic() + sleep_time + ) + self._alarm.exit_and_deep_sleep_until_alarms(pause) + else: + raise NotImplementedError( + "Deep sleep not supported. Make sure you have the latest CircuitPython." + ) + + def enter_light_sleep(self, sleep_time): + """ + Enter light sleep and resume the program after a certain amount of time + + :param float sleep_time: The amount of time to sleep in seconds + + """ + if self._alarm: + neopixel_state = self.peripherals.neopixel_disable + self.peripherals.neopixel_disable = True + speaker_state = self.peripherals.speaker_disable + self.peripherals.speaker_disable = True + pause = self._alarm.time.TimeAlarm( + monotonic_time=time.monotonic() + sleep_time + ) + self._alarm.light_sleep_until_alarms(pause) + + self.peripherals.neopixel_disable = neopixel_state + self.peripherals.speaker_disable = speaker_state + gc.collect() + else: + raise NotImplementedError( + "Hardware light sleep not supported. Make sure you have the latest CircuitPython." + ) + def get_local_time(self, location=None): """Accessor function for get_local_time()""" return self.network.get_local_time(location=location) diff --git a/adafruit_magtag/peripherals.py b/adafruit_magtag/peripherals.py index 3abd531..856976b 100755 --- a/adafruit_magtag/peripherals.py +++ b/adafruit_magtag/peripherals.py @@ -96,6 +96,17 @@ def neopixel_disable(self): def neopixel_disable(self, value): self._neopixel_disable.value = value + @property + def speaker_disable(self): + """ + Enable or disable the speaker for power savings + """ + return not self._speaker_enable.value + + @speaker_disable.setter + def speaker_disable(self, value): + self._speaker_enable.value = not value + @property def button_a_pressed(self): """ From 50157d32cd7cf56374a895037689e5fb13730515 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 11:59:43 -0800 Subject: [PATCH 2/7] Rename deepsleep and reinit neopixel values for light sleep --- adafruit_magtag/magtag.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index ae73f9a..9e313fa 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -300,9 +300,10 @@ def set_text(self, val, index=0, auto_refresh=True): if auto_refresh: self.refresh() - def enter_deep_sleep(self, sleep_time): + def enter_deep_sleep_and_restart(self, sleep_time): """ - Enter deep sleep and restart the program after a certain amount of time + Stops the current program and enters deep sleep. The program is restarted from the beginning + after a certain period of time. :param float sleep_time: The amount of time to sleep in seconds @@ -321,12 +322,13 @@ def enter_deep_sleep(self, sleep_time): def enter_light_sleep(self, sleep_time): """ - Enter light sleep and resume the program after a certain amount of time + Enter light sleep and resume the program after a certain period of time. :param float sleep_time: The amount of time to sleep in seconds """ if self._alarm: + neopixel_values = self.peripherals.neopixels neopixel_state = self.peripherals.neopixel_disable self.peripherals.neopixel_disable = True speaker_state = self.peripherals.speaker_disable @@ -335,9 +337,10 @@ def enter_light_sleep(self, sleep_time): monotonic_time=time.monotonic() + sleep_time ) self._alarm.light_sleep_until_alarms(pause) - self.peripherals.neopixel_disable = neopixel_state self.peripherals.speaker_disable = speaker_state + for i in range(4): + self.peripherals.neopixels[i] = neopixel_values[i] gc.collect() else: raise NotImplementedError( From 09eb4a84c4fde0a49ead8afbe5382eb2d625e018 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 12:07:14 -0800 Subject: [PATCH 3/7] Updated changes requested by Dan --- adafruit_magtag/magtag.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index 9e313fa..fa31d10 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -300,10 +300,10 @@ def set_text(self, val, index=0, auto_refresh=True): if auto_refresh: self.refresh() - def enter_deep_sleep_and_restart(self, sleep_time): + def exit_and_enter_deep_sleep(self, sleep_time): """ Stops the current program and enters deep sleep. The program is restarted from the beginning - after a certain period of time. + after a certain period of time. If USB is plugged in, it won't enter a true deep sleep. :param float sleep_time: The amount of time to sleep in seconds @@ -322,7 +322,8 @@ def enter_deep_sleep_and_restart(self, sleep_time): def enter_light_sleep(self, sleep_time): """ - Enter light sleep and resume the program after a certain period of time. + Enter light sleep and resume the program after a certain period of time. If USB + is plugged in, it won't enter a true light sleep. :param float sleep_time: The amount of time to sleep in seconds From 9d7b904e2dd1d634fbbcc4c19def811c2cc7a6e7 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 12:19:41 -0800 Subject: [PATCH 4/7] Update comment to be more specific about usb --- adafruit_magtag/magtag.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index fa31d10..ab01897 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -303,7 +303,8 @@ def set_text(self, val, index=0, auto_refresh=True): def exit_and_enter_deep_sleep(self, sleep_time): """ Stops the current program and enters deep sleep. The program is restarted from the beginning - after a certain period of time. If USB is plugged in, it won't enter a true deep sleep. + after a certain period of time. If USB is plugged into a computer, it won't enter a true + deep sleep. :param float sleep_time: The amount of time to sleep in seconds @@ -323,7 +324,7 @@ def exit_and_enter_deep_sleep(self, sleep_time): def enter_light_sleep(self, sleep_time): """ Enter light sleep and resume the program after a certain period of time. If USB - is plugged in, it won't enter a true light sleep. + is plugged into a computer, it won't enter a true light sleep. :param float sleep_time: The amount of time to sleep in seconds From 60df25f7c4c47b84f9ba87f632ede749217c6f92 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 15:37:41 -0800 Subject: [PATCH 5/7] Disable wifi when entering deep or light sleep --- adafruit_magtag/magtag.py | 4 ++++ adafruit_magtag/network.py | 12 ++++++++++++ adafruit_magtag/wifi_module.py | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index ab01897..dda9fc9 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -312,6 +312,7 @@ def exit_and_enter_deep_sleep(self, sleep_time): if self._alarm: self.peripherals.neopixel_disable = True self.peripherals.speaker_disable = True + self.network.enabled = False pause = self._alarm.time.TimeAlarm( monotonic_time=time.monotonic() + sleep_time ) @@ -335,10 +336,13 @@ def enter_light_sleep(self, sleep_time): self.peripherals.neopixel_disable = True speaker_state = self.peripherals.speaker_disable self.peripherals.speaker_disable = True + network_state = self.network.enabled + self.network.enabled = False pause = self._alarm.time.TimeAlarm( monotonic_time=time.monotonic() + sleep_time ) self._alarm.light_sleep_until_alarms(pause) + self.network.enabled = network_state self.peripherals.neopixel_disable = neopixel_state self.peripherals.speaker_disable = speaker_state for i in range(4): diff --git a/adafruit_magtag/network.py b/adafruit_magtag/network.py index b6663fa..411925a 100755 --- a/adafruit_magtag/network.py +++ b/adafruit_magtag/network.py @@ -544,3 +544,15 @@ def fetch_data( return values[0] return values + + @property + def enabled(self): + """ + Return or set whether the WiFi is enabled + + """ + return self._wifi.enabled + + @enabled.setter + def enabled(self, value): + self._wifi.enabled = value diff --git a/adafruit_magtag/wifi_module.py b/adafruit_magtag/wifi_module.py index 96281a7..8c304d4 100755 --- a/adafruit_magtag/wifi_module.py +++ b/adafruit_magtag/wifi_module.py @@ -93,3 +93,17 @@ def ip_address(self): """ return wifi.radio.ipv4_address + + @property + def enabled(self): + """ + Return or set whether the WiFi Radio is enabled + + """ + return wifi.radio.enabled + + @enabled.setter + def enabled(self, value): + if not value: + self._connected = False + wifi.radio.enabled = bool(value) From 680d344a203146d02fb59253dc15fa29b2107372 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 15:52:48 -0800 Subject: [PATCH 6/7] Make scott's requested changes --- adafruit_magtag/magtag.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index dda9fc9..2a85a22 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -300,11 +300,13 @@ def set_text(self, val, index=0, auto_refresh=True): if auto_refresh: self.refresh() - def exit_and_enter_deep_sleep(self, sleep_time): + def exit_and_deep_sleep(self, sleep_time): """ Stops the current program and enters deep sleep. The program is restarted from the beginning - after a certain period of time. If USB is plugged into a computer, it won't enter a true - deep sleep. + after a certain period of time. + + See https://circuitpython.readthedocs.io/en/latest/shared-bindings/alarm/index.html for more + details. :param float sleep_time: The amount of time to sleep in seconds @@ -324,8 +326,10 @@ def exit_and_enter_deep_sleep(self, sleep_time): def enter_light_sleep(self, sleep_time): """ - Enter light sleep and resume the program after a certain period of time. If USB - is plugged into a computer, it won't enter a true light sleep. + Enter light sleep and resume the program after a certain period of time. + + See https://circuitpython.readthedocs.io/en/latest/shared-bindings/alarm/index.html for more + details. :param float sleep_time: The amount of time to sleep in seconds From e00c43dc35e0c2e5fc95e76e4ccbbdfa8a9a0fa5 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Thu, 3 Dec 2020 16:30:46 -0800 Subject: [PATCH 7/7] Remove wifi disabling code for now --- adafruit_magtag/magtag.py | 4 ---- adafruit_magtag/network.py | 6 +----- adafruit_magtag/wifi_module.py | 8 +------- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/adafruit_magtag/magtag.py b/adafruit_magtag/magtag.py index 2a85a22..dcef126 100755 --- a/adafruit_magtag/magtag.py +++ b/adafruit_magtag/magtag.py @@ -314,7 +314,6 @@ def exit_and_deep_sleep(self, sleep_time): if self._alarm: self.peripherals.neopixel_disable = True self.peripherals.speaker_disable = True - self.network.enabled = False pause = self._alarm.time.TimeAlarm( monotonic_time=time.monotonic() + sleep_time ) @@ -340,13 +339,10 @@ def enter_light_sleep(self, sleep_time): self.peripherals.neopixel_disable = True speaker_state = self.peripherals.speaker_disable self.peripherals.speaker_disable = True - network_state = self.network.enabled - self.network.enabled = False pause = self._alarm.time.TimeAlarm( monotonic_time=time.monotonic() + sleep_time ) self._alarm.light_sleep_until_alarms(pause) - self.network.enabled = network_state self.peripherals.neopixel_disable = neopixel_state self.peripherals.speaker_disable = speaker_state for i in range(4): diff --git a/adafruit_magtag/network.py b/adafruit_magtag/network.py index 411925a..26d9d22 100755 --- a/adafruit_magtag/network.py +++ b/adafruit_magtag/network.py @@ -548,11 +548,7 @@ def fetch_data( @property def enabled(self): """ - Return or set whether the WiFi is enabled + Return whether the WiFi is enabled """ return self._wifi.enabled - - @enabled.setter - def enabled(self, value): - self._wifi.enabled = value diff --git a/adafruit_magtag/wifi_module.py b/adafruit_magtag/wifi_module.py index 8c304d4..7879afb 100755 --- a/adafruit_magtag/wifi_module.py +++ b/adafruit_magtag/wifi_module.py @@ -97,13 +97,7 @@ def ip_address(self): @property def enabled(self): """ - Return or set whether the WiFi Radio is enabled + Return whether the WiFi Radio is enabled """ return wifi.radio.enabled - - @enabled.setter - def enabled(self, value): - if not value: - self._connected = False - wifi.radio.enabled = bool(value)