When I created the weather app I didn't have GadgetBridge installed, so I tried to follow the protocol on the [espurino website](https://www.espruino.com/Gadgetbridge), but it wasn't very helpful and I made some mistakes. This commit should fix these mistakes to stop the weather app from crashing, and so it displays the correct values. I have also added a new settings option called "Units", where apps can see what units the user would prefer (metric/imperial).
Signed-off-by: Tait Berlette <54515877+taitberlette@users.noreply.github.com>
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>
Features:
* Multiple alarms (up to 4)
* Day of the week support
* One time alarms
* Snooze
Changes to wasp-os for app support:
* Added + and - to the 28pt and 36pt fonts
* Checkboxes now require a click on the body of the checkbox if there is no label
* Added a Toggle Button class that extends Button and stores a state like checkbox
Signed-off-by: Adam Blair <adampblair@protonmail.com>
Currently the final word of wrapped text will always appear as a single
word on its own line. Fix this by rearranging the break cases to avoid
searching for the most recent space when we get to the end of the text.
Fixes: #230
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Reduce the number of applications imported by the manager and alter
the way applications are initially registered to allow main.py
complete control over the initial applications (but only if it wants
it).
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
This app is functional... although it lacking in almost every
costmetic way, from the icon to the main screen.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Many widgets adopted the _im(mutable) idiom to allow us to reduce the
RAM overhead of each widget. Where the immutable data considers entirely
of integers smaller than 256 then we can push this just a little further
by switching from a tuple to a bytes.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
This is purely a refactoring for the purposes of code reuse. No change
of behaviour is expected.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the ChronoApp example code is both broken (missing apps. prefix)
and doesn't use the latest API for registering watch faces. Fix this.
Whilst here let's also provide an example for the DemoApp since that
is not included in the Software chooser.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The demo app is of somewhat niche interest and is disabled by default
but arguable that makes it more important to document it fully since
this app is harder to find the many others.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
This app is enabled by default and allows users to select a watch face
based on a fullscreen preview of how the app will draw the screen.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
One benefit from wasp-os' dirt simple drawing model is that it is very
easy for apps to provide full screen previews of themselves. Add this
for all clocks ready for us to add a watch face chooser application.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
So... waking up once per second turns out to be a dumb idea because it
regresses the stop watch and HRS tools (which now also only wake up once
per second).
Undo this change but sprinkle a few more micropython.native decorations
on methods used on the wakeup path to minimise power.
Fixes: fb18705b9b ("manager/rtc: Experimental power saving technique")
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the time is calculated 8 times per second from (relatively) slow
python code. Optimize the power consumed by reducing the number of times
we check for wall time updates to only once-per-second and use native
code generation to reduce VM overhead when executing this critical code.
At the time of writing the difference is battery life has not yet been
measured (but we know the current master branch is worse than v0.4 and,
in theory at least, this should close the gap).
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
wasp-os uses an drawing optimization technique to automatically place
a single pixel line on the right of glyphs when rendering them. This
results in a change to the bounding box for a rendered string (by adding
a single pixel on the right of the final character). Fix the bounding box
calculations accordingly. Among other things this eliminates graphical
artifacts when rendering labels in 2048.
Fixes: #203
Fixes: 58b5c0378e ("draw565: Optimize the string drawing")
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
When an application is registered using a string that gives the class
name (e.g. "apps.chrono.ChronoApp") when we automatically delete
the module from a couple of namespaces. This ensures the garbage
collector can do a deeper clean when the application is unregistered.
We also provide a means to directly register watch faces (e.g. to
replace the default clock).
Fixes: #214
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently there is a redundant fill operation issued for every character
drawn. This was added to draw the background colours correctly but the
change did not account for the optimized character rendering in
_draw_glyph().
This results in ~15% performance improvement for character rendering
Fixes: cc34c5d46d ("draw565: Fix wrong background color of strings")
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Signed-off-by: thefenriswolf <stefan.rohrbacher97@gmail.com>
[daniel@redfelineninja.org.uk: fixed up the manifest]
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Signed-off-by: Benoît HERVIER <b@rvier.fr>
[daniel@redfelineninja.org.uk: Removed unused dual clock fonts from
clock_dual.py, fixed up the manifest]
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The music player volume control uses up and down events, but in the
foreground function the app requests left and right events.
Signed-off-by: Tait Berlette <54515877+taitberlette@users.noreply.github.com>
Currently, if the line wrapper attempts to break a line on a space and
that space character is outside the bounding box, then we generate an
over-long line.
Fix this by handling line break generation *after* we have checked the
length of the current line.
Fixes: #193
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Signed-off-by: Brendan M. Sleight <bms.git@barwap.com>
[daniel@redfelineninja.org.uk: Squashed down into a single commit and
updated subject]
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk
Currently then even fast walking will run off the top of the graph. Change
the scale to that fast walking shows in full. I think at this level fast
running will probably run off the top but I need to gather a few more
details before settling on the final scale.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The steplogger records steps but currently there is no way to see the data
recorded on the device itself. Make a first attempt at graphing the
step data.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently we dump the step data every 30 minutes. This was a good
interval for testing but we can extend it a little without any
problems.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently steps from the last six minutes do not appear in the data. We
can fix this by updating the data before creating the iterator.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently, if we ask the simulator to draw out-of-bounds then it will
do exactly that, it will draw outside of the "screen" and corrupt the
pixels of the watch frame that surrounds it. This is an obviously poor
simulation of the real watch and when the out-of-bounds error is only
an out-by-one error can be easily overlooked until we load the code on
the device.
Let's just throw an exception if we draw out-of-bounds. That can easily
be picked up during testing.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The code is not yet enabled by default but it can be tested by adding
custom code to an interested user's main.py .
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently a couple of down presses on the year results in the time being
set to some time in 2099. The micropython date logic does not support
dates this far in the future and throws an exception. Adopt a simple
fix that should be OK for the next 39 years ;-) .
Reported-by: Christopher Peters <me@christopherp.de>
Fixes: #167
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
For small graphical items (line drawing, font glyphs) the performance
of the set_window() method is critical.
Emit native code for this function and optimize the SPI write_cmd()
method to avoid memory allocation. This give a performance boost of
a little over 15% for (24pt) font rendering and 30% for line drawing.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Avoid needless bouncing the chip select when drawing glyphs. This
improved performance by around 15% for 24pt fonts.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Add tests to make sure every app has a screenshot... and fix the
problems picked up by the new tests!
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently many first-time users excitedly install wasp-os and then
struggle to set the time using the various BLE based methods
(REPL, wasptool, GadgetBridge, etc). This results in "is there
another way to set the time" being *the* frequently asked
question.
Whilst getting the BLE tools is highly recommened to get the best
from wasp-os we can delivery a better out-of-the-box experience
for first time users is we provide on board date/time setting.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the spinner uses exclusive max when wrapping from low to high
and inclusive max when wrapping from high to low. Fix this by adopting
*inclusive* max everywhere. The call sites are similarly confused.
Fix this!
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the number of pages is (acidentally) hardcoded where it need
not be and the scroll directions aren't right as soon as we go beyond
two pages (where scroll up and down are equivalent actions).
Fix both.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
wasp-os uses a rather eccentric "2-bit" RLE encoding which works best
when there are only three colors (and black) in a single line. Modify
the screenshot slightly to allow it to be encoded with fewer palette
updated.
2048 is a popular sliding block puzzle game in which tiles are combined
to make the number 2048.
It's one of the few games that are enjoyable to play on such a small
form factor.
This started as a port of a TkInter implementation of the 2048 game. I
implemented all of the TkInter APIs used by the game and it worked on
wasp-os without any code change in the game. However, the performance
was very poor and it consumed too much RAM. I have since reimplemented
the whole game from scratch and managed to achieve acceptable
performance, although more improvements could still be made.
Because names in Python can't start with numbers, I had some trouble
naming things. The module is called "ttfe" (two-thousand-forty-eight),
the class name is Play2048App, and the software.py entry is "Play 2048".
Signed-off-by: Miguel Rochefort <miguelrochefort@gmail.com>
[daniel@redfelineninja.org.uk: Renamed the python filename, normalized
the screenshot and included the app in the docs]
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The title will render with the last font used, and this isn't always
right for the ConfirmationView. Setting the font explicitly solves that
issue.
Signed-off-by: Miguel Rochefort <miguelrochefort@gmail.com>
Signed-off-by: Wolfgang Ginolas <wolfgang.ginolas@gwif.eu>
[daniel@redfelineninja.org.uk: squashed into a single commit, rebase to
latest master, integrate with the Software application and rename the
screenshots to match the application name]
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Switch from a headphone to music notation metaphor and take the (lazy?)
approach of using the watch chassis to frame the icon.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the simulator shows redraw artifacts that are concealed
on the real device by using display on/off. We can improve this by
avoiding the refresh when the display is off. This does not match
the behaviour of the real hardware (which goes dark during transitions)
but does make the simulator feel much more comfortable to use.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Relaunching the simulator to run tests quickly gets frustrating if
the Self Test is disabled by default. Change this.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Replace the pixelated Yes/No buttons with text based alternatives.
This also required changes to the pager to change the way the
redraw after changing view is implemented (improved muting and a reset
of the colours).
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Enabling software by default allows us disable several other applications
by default because there is now a GUI based route to enable them.
This does require a few tweaks to the test suite and allows allows us to
remove a lot of boilerplate text from the application library document
since it is no longer relavent.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently wasp-os enables a narrow set of applications because we don't
want to consume RAM by importing the module and constructing the
application. We can improve on this situation by providing a small
(stateless) application that can be used to enable or diable applications.
This allows all the ROMed applications to be enabled using the GUI
without compromising on the ability to develop applications.
In fact this application significantlly reduces the RAM consumed in the
default case becasue the Self Test app does not need to maintain its
state.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The checkbox uses the _im(mutable) idiom to minimize the RAM overhead
of its immutable properties (position and label). However it can be useful
to retrieve the label to provide a property accessor.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
By default bright and mid are white/grey tones, the ui widgets are
blue and the spot colours are different variants of orange.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the theme is explicitly little endian. This does match the
underlying hardware but makes it needlessly difficult to hand edit
themes. Switch the default theme and theming tools over to big endian
form and add comments to the default theme to support hand editing.
We also expand the ASCII characters in the default them with hex codes.
This is the final step needed to make hand edited themes trivial to work
with.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
Currently the bma421 driver simple re-initializes the sensor when asked
to set the step counter to zero. Switch over to the proper function
for this.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The ConfirmationView became broken when we converted it's images over to
2-bit RLE. That happened because the confirmation view relied on the
the 1-bit RLE to dynamically generate hit boxes.
Currently the code pre-calculates the hit box which is a waste of RAM.
Let's rip out the existing hit box logic and replace it with much larger
("fat finger") hit targets.
We make the touch() method more closely adopt the idioms of other UI
components (e.g. don't return the dialog status... just whether or
not we handled the touch).
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
The alarm is off by default so there's no reason to set an alarm that
is disabled. Let's stop doing that.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
We are able to add this to the self tests without having to create a
special page. Instead we can modify the existing notifications test
to utilize the spinner.
Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>