Previously this was an error message to help underscore when a device
was sending unexpected messages, but now that we're receiving
measurement logs which have no place in GSMTAP frames, it's expected to
skip some log messages.
This splits diag.rs, which was growing way too big for my taste, into a
number of submodules. This should help us compartmentalize tests better,
as well as use mod namespaces to shorten our struct/enum names.
A few minor refactors, and a more major one that renames
RecordingStore's update_entry_qmdl_size to
update_current_entry_qmdl_size, since the only time we're ever updating
an entry's QMDL size is when it's the current one.
Major changes:
* QmdlWriter now outputs gzipped QMDL files by default
* QmdlReader renamed to QmdlMessageReader, and reads both compressed and
uncompressed QMDL. It no longer requires bounding to avoid reading
partially written files.
LTE EARFCNs can exceed the 14-bit GSMTAP ARFCN field maximum (16383),
causing Deku to panic with "bit size of input is larger than bit
requested size: 16 exceeds 14". This broke pcap generation for
international captures (e.g. UK, Switzerland).
Mask the value to 14 bits per the GSMTAP spec instead of panicking.
Fixes#1012, fixes#945
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On PinePhone (headless display), the UI update receiver was dropped
immediately, causing sends from diag.rs to fail with SendError and
panic. Spawn a task that drains the channel until shutdown.
Fixes#657
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When merging WebDAV and GPS features, we forgot to update the WebDAV
feature to also upload the GPS files.
WebDAV had hardcoded knowledge of which files exist and its own FileKind
enum. Move the FileKind enum into QMDL store so that webdav can be
agnostic over which files belong to a recording, so this is less likely
to happen again.
(This refactor was AI-assisted)
Currently the installer is recompiled everytime a file is missing, even
if the file has been missing before and after the last compilation.
That is because rerun-if-changed on a nonexistent filepath constantly
busts the cache.
v0.11.0 shipped a daemon binary that built fine but didn't actually serve
a working frontend. CI was green. Nothing in the pipeline asserted that
the built binary comes up and serves something.
Add daemon/tests/smoke.rs as an integration test that spawns the built
binary against a tempdir-backed config with debug_mode = true, picks an
ephemeral port, and asserts:
- GET /index.html is 2xx and the decompressed body contains "Rayhunter"
- GET /api/qmdl-manifest is 2xx
- the daemon exits cleanly on SIGINT
Captures the daemon's stderr into a buffer so startup/shutdown failures
print actionable context instead of just "did not start listening".
Runs as part of the regular cargo test invocation, no new CI job.
For the smoke test (and #826) to work, the daemon needs to come up on a
PC without /dev/diag, a screen, or wpa_supplicant. The DIAG read thread,
display driver, and key input were already gated on debug_mode. Gate the
two remaining device-dependent workers the same way:
- run_battery_notification_worker (polls battery sysfs paths)
- wifi_station::run_wifi_client (talks to wpa_supplicant)
doc/installing-from-source.md gains a "Running the daemon on your PC"
section. doc/porting.md drops its duplicate debug_mode line and links to
the new section.
Closes#826.