wasp-os/wasp/apps/faces.py
Daniel Thompson 2858826921 apps: Replace del self.x with self.x = None in all apps
Testing has demonstrated that del self.x does not make the memory used to
store x available for garbage collection.

There is clearly an additional reference from another place. In fact
*after* del self.x then the memory can be made available for GC by
assignment (e.g. self.x = None). However I haven't found how to release
this reference and there is nothing in self.__dict__ that can help.

For now we'll use a twp-step process where we set the variable to None
before deleting it.

This has a big impact on memory usage. For Software it is almost 1k
(a.k.a. about 10% impact on free RAM).

Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
2021-07-28 22:01:04 +01:00

73 lines
2.2 KiB
Python

# SPDX-License-Identifier: LGPL-3.0-or-later
# Copyright (C) 2020 Daniel Thompson
"""Watch Face Chooser
~~~~~~~~~~~~~~~~~~~~~
A tool to select a suitable watch face.
.. figure:: res/FacesApp.png
:width: 179
The app is intended to be enabled by default and has, therefore, been carefully
structured to minimize memory usage when the app is not active.
"""
import wasp
import icons
class FacesApp():
"""Choose a default watch face."""
NAME = 'Faces'
ICON = icons.clock
def foreground(self):
"""Activate the application."""
choices = []
choices.append(('clock', 'Clock'))
choices.append(('chrono', 'Chrono'))
choices.append(('dual_clock', 'DualClock'))
choices.append(('fibonacci_clock', 'FibonacciClock'))
choices.append(('word_clock', 'WordClock'))
self.choices = choices
self.choice = 0
self.si = wasp.widgets.ScrollIndicator()
self._update()
wasp.system.request_event(wasp.EventMask.SWIPE_UPDOWN)
def background(self):
self.choices = None
del self.choices
self.choice = None
del self.choice
self.si = None
del self.si
# When the watch face redraws then the change to the scrolling indicator
# is a little subtle. Let's provide some haptic feedback too so the user
# knows something has happened.
wasp.watch.vibrator.pulse()
def swipe(self, event):
"""Notify the application of a touchscreen swipe event."""
choice = self.choice
if event[0] == wasp.EventType.DOWN:
choice = choice - 1 if choice > 0 else len(self.choices)-1
if event[0] == wasp.EventType.UP:
choice = choice + 1 if choice < len(self.choices)-1 else 0
self.choice = choice
mute = wasp.watch.display.mute
mute(True)
self._update()
mute(False)
def _update(self):
"""Draw the display from scratch."""
wasp.watch.drawable.fill()
(module, label) = self.choices[self.choice]
wasp.system.register('apps.{}.{}App'.format(module, label), watch_face=True)
wasp.system.quick_ring[0].preview()
self.si.draw()