test: make firmware logic bugs catchable without hardware (Workstream F)
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>
This commit is contained in:
40
firmware/esp32p4-sensor-node/test/Makefile
Normal file
40
firmware/esp32p4-sensor-node/test/Makefile
Normal file
@@ -0,0 +1,40 @@
|
||||
# Host build for the ESP-IDF-free firmware logic units.
|
||||
#
|
||||
# Requires nothing but gcc and make. No ESP-IDF, no test framework, no
|
||||
# package manager. `make check` builds and runs; `run_tests.sh` wraps this
|
||||
# and is the entry point CI (and you) should call.
|
||||
|
||||
CC ?= gcc
|
||||
CFLAGS ?= -std=c11 -O1 -g -Wall -Wextra -Werror
|
||||
LDLIBS ?= -lm
|
||||
|
||||
MAIN_DIR := ../main
|
||||
BUILD := build
|
||||
|
||||
# The pure units under test, moved out of their drivers precisely so they
|
||||
# can be compiled here without a cross-toolchain.
|
||||
UNITS := \
|
||||
$(MAIN_DIR)/rd03e_parse.c \
|
||||
$(MAIN_DIR)/bmp280_compensate.c \
|
||||
$(MAIN_DIR)/mems_level.c
|
||||
|
||||
TESTS := \
|
||||
test_main.c \
|
||||
test_rd03e_parse.c \
|
||||
test_bmp280_compensate.c \
|
||||
test_mems_level.c
|
||||
|
||||
BIN := $(BUILD)/firmware_tests
|
||||
|
||||
.PHONY: all check clean
|
||||
all: $(BIN)
|
||||
|
||||
$(BIN): $(UNITS) $(TESTS) test_util.h $(MAIN_DIR)/rd03e_parse.h $(MAIN_DIR)/bmp280_compensate.h $(MAIN_DIR)/mems_level.h
|
||||
@mkdir -p $(BUILD)
|
||||
$(CC) $(CFLAGS) -o $@ $(UNITS) $(TESTS) $(LDLIBS)
|
||||
|
||||
check: $(BIN)
|
||||
./$(BIN)
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD)
|
||||
Reference in New Issue
Block a user