The firmware has never been flashed, and a real bug already reached the repo because of it: RD03E_FRAME_LEN was 5 for a 6-byte frame, so the footer check collided with the distance high byte and EVERY distance reading was garbage — always `lo | 0x5500`, about 218 metres, regardless of what the sensor saw. That was pure logic with no hardware dependency. It should have been catchable on a laptop, and there was simply no way to run the code. Extracted the hardware-free logic out of the three drivers — rd03e_parse, bmp280_compensate, mems_level — as moves rather than rewrites, carrying the explanatory comments along with the code they explain. The drivers now own only their bus I/O and call into the pure units, so nothing changes for the real device. `./run_tests.sh` builds them with gcc -Wall -Wextra -Werror plus a dependency-free assert harness: 175 checks, 0 failed, from a clean tree. Proven to catch the actual bug rather than assumed to: reintroducing FRAME_LEN 5 fails four checks, including one that reads "a simple-report frame is 6 bytes, not 5", plus the truncated-frame and 5-byte-window cases. Restored, green again. This does NOT make the firmware verified, and the README says so plainly — it is called a narrow exception and scoped to pure logic. Wiring, timing, real register behaviour and the reconstructed RD-03E frame format all still need the physical board. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
1.1 KiB
Bash
Executable File
40 lines
1.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Build and run the firmware's host tests. Exits non-zero on any failure.
|
|
#
|
|
# Dependencies: gcc (and libm, which ships with it). Nothing else — no
|
|
# ESP-IDF, no make required (there is a Makefile, but this script does not
|
|
# depend on it), no test framework, no package install.
|
|
#
|
|
# These tests cover PURE LOGIC ONLY: frame parsing, byte order, compensation
|
|
# maths, level maths. They do not and cannot verify wiring, timing, or how
|
|
# the real silicon behaves. See ../README.md "What's verified vs. not".
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")"
|
|
|
|
CC="${CC:-gcc}"
|
|
CFLAGS=(-std=c11 -O1 -g -Wall -Wextra -Werror)
|
|
BUILD="build"
|
|
BIN="$BUILD/firmware_tests"
|
|
|
|
if ! command -v "$CC" >/dev/null 2>&1; then
|
|
echo "run_tests.sh: '$CC' not found; install gcc (or set CC=clang)" >&2
|
|
exit 127
|
|
fi
|
|
|
|
mkdir -p "$BUILD"
|
|
|
|
echo "== building host tests with $CC ${CFLAGS[*]}"
|
|
"$CC" "${CFLAGS[@]}" -o "$BIN" \
|
|
../main/rd03e_parse.c \
|
|
../main/bmp280_compensate.c \
|
|
../main/mems_level.c \
|
|
test_main.c \
|
|
test_rd03e_parse.c \
|
|
test_bmp280_compensate.c \
|
|
test_mems_level.c \
|
|
-lm
|
|
|
|
echo "== running"
|
|
"./$BIN"
|