3537a2f1bb
fix: Reduce file upload chunk size to 4k
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m42s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
After seeing occasional memory allocation failures on file upload,
reduce chunk size to 4k again.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2026-01-13 22:38:37 +01:00
6dee7fff7e
feat: Allow configuring WiFi security
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m44s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 9s
Run pytests / Check-Pytest (push) Successful in 11s
Allow choosing between the three security modes exposed by the
micropython cyw43 wifi driver. Also allow setting up security in AP
mode.
Improve the WiFi section of the configuration UI.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2026-01-06 14:59:12 +01:00
6976aa6963
fix[player]: Don't latch tag if no playlist exists
...
When the device is in 'tagstartstop' tag mode, and the user presents a
new tag to get the serial number and create a playlist using the web UI,
the playerapp still remembered the tag as the currently playing tag even
though no playlist was found and no playback is running. After the user
saves the playlist in the UI and puts the tag on the device again, they
expect the playback to start with the new playlist. Instead, nothing
happens, because this is counted as the 'stop' event of the tagstartstop
mode. The user would have to remove the tag and present it again (after
waiting for the tagtimeout) to play the new playlist.
Fix this unexpected behaviour by not storing the current tag into the
playing_tag field if no playlist existed for the tag.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2026-01-06 14:59:12 +01:00
763305c659
fix[frontend]: Reset upload UI elements, don't expand tree view
...
- Make sure the upload progess bar and file choser are reset when
loading the file browser screen.
- Don't expand the directories in the tree view by default.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2026-01-06 14:59:12 +01:00
6d18437863
fix: Remove directory based db creation
...
Previously, if no tonberry.db existed on the SD card, the database was
initialized with a playlist for each directory containing mp3 files,
with the tag serial number matching the directory name. This was used
during development before the web UI to edit the playlist db existed.
It is no longer necessary, and confusing to the user when unusable
playlists are created when albums are preloaded onto the SD card before
putting it in the tonberry device.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2026-01-06 14:59:12 +01:00
2cf88b26ee
fix: button 0 to shutdown device when in error state
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m42s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
73da134a12
fix: webserver: file uploading
...
- Fix upload of files <= Request.max_body_length
File uploads smaller than the limit were not given to the handler as a
stream by microdot, instead the content is directly stored in the
request.body.
- Refactor stream to file copy into a helper method
- Increase the copy buffer size to 16k
- Call app.reset_idle_timeout() periodically during file uploads to
avoid the device turning off when uploading large files while on
battery.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
5c8a61eb27
feat: Allow configuring volume set at startup
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
4c85683fcb
feat: Allow limiting LED brightness
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
355a8bd345
fix: allow 'reboot' to application when on on battery
...
Having to press the power button again to wake up the device is less
annoying to the user than not being able to apply settings when the
device is on battery.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
f46c045589
feat: Allow limiting max. volume
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
fe1c1eadf7
feat: Add names to playlists
...
Fixes #63 .
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
743188e1a4
fix: frontend: Replace generic 'Device admin' title
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
cd5939f4ee
feat: Enable dualstack IPv4/IPv6 for microdot
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
02954cd87c
feat: Visual feedback on LEDs during startup
...
Set the LEDs to a fixed color during bootup to show the different modes:
- Orange when the device is booting
- Red when button 0 is held and the device goes to a shell
- Blue when button 1 is held and the device goes to AP mode instead of
joining the configured WiFi network
- Red blinking when the run() method throws an exception for any reason
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
58f8526d7e
feat: Join an existing WiFi network
...
Add ssid and passphrase to config to configure the network to join. If
empty SSID is configured, it will create the "TonberryPicoAP..." network
in AP mode as before.
Holding the button 1 during startup will revert to AP mode regardless of
the current configuration.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-27 15:23:48 +01:00
d3aef1be32
fix: frontend: don't convert text that looks like an integer to integers
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-23 12:00:05 +01:00
b9baa1c7d5
microdot: Update to v2.5.1
...
The important fix is an urldecode bug causing umlauts to be decoded
incorrectly from url arguments. This was fixed in v2.2.0, but let's just
update to the latest version.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-23 12:00:05 +01:00
67d7650923
fix: webserver: Catch and report IO errors on upload
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-23 12:00:05 +01:00
43fd68779c
feat: store git version in fw and show in web ui
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-23 12:00:05 +01:00
704951074b
feat: Long press VOL_DOWN button to shutdown/reset device
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 18:31:13 +01:00
9320a3cff2
fix: Show reboot request response in UI
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m40s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
Also make response from api more understandable for non-technical users.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 18:30:45 +01:00
65efebc5c2
feat: allow reboot commands only if usb cable is inserted
2025-12-21 18:30:45 +01:00
040ae4a731
fix: fix flake8 complaint
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 18:30:45 +01:00
9cf044bc80
feat: frontend: Add reboot to bootloader button (for updates)
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m47s
Check code formatting / Check-C-Format (push) Successful in 6s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 17:07:09 +01:00
da9843adb9
feat: /api/v1/reboot/[bootloader|application], confirm with pink LED pattern
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m43s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Failing after 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
2025-12-21 16:57:37 +01:00
02150aec42
fix: frontend: Improve navigation on playlist edit screen
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m43s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 7s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 15:36:53 +01:00
7be038d0d1
feat: Allow deleting files and directories
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m40s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 15:12:31 +01:00
d96350c1a7
feat: frontend: Allow creating directories
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m38s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 14:23:34 +01:00
eec3703b7e
feat: Extend audiofiles API
...
Extend the audiofiles GET API to return both directories and audio
files. Also change the JSON format to include the name and type of all
entries.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 14:22:38 +01:00
25ac3f0687
feat: Add API and frontend to upload files
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m40s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-21 13:29:47 +01:00
3367bba0c5
Merge branch 'misc-fixes' into mbl-next
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m38s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
2025-12-21 12:23:23 +01:00
c555ad94f0
fix: Increase watchdog timeout
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m42s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 11s
Run unit tests on host / Run-Unit-Tests (push) Successful in 19s
Run pytests / Check-Pytest (push) Successful in 31s
Workaround for #60 until it is fixed.
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 22:31:51 +01:00
10ec080e5f
fix: app: Go to idle mode when playlist end is reached
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 22:31:51 +01:00
fb01a8aebb
micropython: Fix filename unicode issues, enable compile-commands.json
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 22:31:51 +01:00
2aa2249238
Merge branch 'more-frontend' into mbl-next
2025-12-20 20:28:56 +01:00
3e275a0aee
Merge branch 'mbl/backend-for-frontend' into mbl-next
2025-12-20 20:27:58 +01:00
71949bdd1a
Merge branch '30-frontend'
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m39s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
2025-12-20 20:26:33 +01:00
8070c0e113
feat: frontend: list of playlists screen, playlist screen, add tracks screen
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m38s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 20:17:06 +01:00
e31aabbefc
Merge branch '30-frontend'
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m40s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
2025-12-20 20:15:42 +01:00
94aa84879f
Merge pull request 'webapi-last-tag-uid' ( #58 ) from webapi-last-tag-uid into main
...
Check code formatting / Check-C-Format (push) Has been cancelled
Check code formatting / Check-Python-Flake8 (push) Has been cancelled
Check code formatting / Check-Bash-Shellcheck (push) Has been cancelled
Build RPi Pico firmware image / Build-Firmware (push) Has been cancelled
Run unit tests on host / Run-Unit-Tests (push) Has been cancelled
Run pytests / Check-Pytest (push) Has been cancelled
Reviewed-on: #58
Reviewed-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 19:14:20 +00:00
059b705a38
fix: webserver: Use streaming response for filesystem listing
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m37s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 19:26:18 +01:00
3213ec8f66
feat: webserver: set and delete playlists
...
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-20 19:26:16 +01:00
e2ca9e5139
feat: api endpoint to get playlist properties
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m36s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 7s
Run pytests / Check-Pytest (push) Successful in 10s
2025-12-20 16:52:37 +01:00
070cf887ab
feat(wip): api endpoint to get playlist properties
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m47s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 7s
Run pytests / Check-Pytest (push) Successful in 10s
2025-12-20 15:40:52 +01:00
28846c9274
wip: api endpoint to list all available audio files
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m37s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Failing after 9s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
Iterative approach. Currently only lists mp3 files.
2025-12-20 14:40:07 +01:00
51cb2c3a68
feat: api endpoint for reading all available playlists
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m36s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Failing after 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
2025-12-19 18:33:42 +01:00
32e996e446
build: add requirements.txt for host python deps
...
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m40s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org >
2025-12-17 18:37:34 +01:00
32bf6a8d68
always return content type application/json
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m36s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 10s
2025-12-16 23:13:04 +01:00
e2f9287ebd
feat: last connected tag uid available at /api/v1/last_tag_uid
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m39s
Check code formatting / Check-C-Format (push) Successful in 8s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 9s
Run pytests / Check-Pytest (push) Successful in 11s
2025-12-16 22:41:55 +01:00