Files
celrs/README.md
T
portersky df3d399610 feat: adopt ELRS USB CRSF frame format, add skeleton modules
Switch CRC from CCITT (0x07) to DVB-S2 (0xD5) to match ELRS.
Adopt ELRS USB frame format: [addr][length][type][payload][crc].
Update frame type constants to match current ELRS protocol values.

New skeleton modules (stub implementations with TODO comments):
  - crsf_telemetry.h/.c: telemetry decoders (GPS, battery, link..)
  - crsf_stream.h/.c: incremental streaming frame reader
  - crsf_param.h/.c: parameter protocol (read/write/set_power)

Retained old frame format as *_legacy functions for backward
compatibility with existing telemetry tool and tests.

Add cel_serial_find_elrs_port() and cel_serial_open_probe()
stubs to serial module for port auto-detection and baud probing.
2026-06-14 20:47:56 +02:00

142 lines
4.3 KiB
Markdown

# celrs
A C23 project for interfacing with ELRS TX modules (e.g., BAYCK Nano Dual
Band) via serial USB using the CRSF (Crossfire Serial) protocol.
Built on the same TDD foundation as [ctdd](https://github.com/PorterSky/ctdd)
using [Unity](https://github.com/ThrowTheSwitch/Unity) and
[CMock](https://github.com/ThrowTheSwitch/CMock).
All dependencies are fetched automatically via CMake `FetchContent` — no
manual installation required beyond the tools listed below.
## Requirements
| Tool | Purpose |
| ------------ | ----------------------------------------------------- |
| CMake ≥ 3.21 | Build system |
| Ninja | Build backend |
| C23 compiler | GCC 14+, Clang 18+ |
| Ruby ≥ 3.0 | CMock mock generation |
| gcovr ≥ 6.0 | Coverage reports — optional (`uv tool install gcovr`) |
## Build
Configure:
```sh
cmake -S . -B build -G Ninja
```
Build:
```sh
ninja -C build
```
## Test
Full Unity output with colors:
```sh
ninja -C build check
```
CTest summary only:
```sh
ninja -C build test
```
`check` builds all suites and runs CTest with `--output-on-failure`,
so assertion-level detail appears on any failure without running
binaries by hand.
## Coverage
Configure with coverage instrumentation:
```sh
cmake -S . -B build-cov -G Ninja -DENABLE_COVERAGE=ON
```
Generate the HTML report:
```sh
ninja -C build-cov coverage
```
Open `build-cov/coverage/index.html` in a browser to view results.
Only `celrs/` source files are measured. Unity, CMock, and generated
mock files are excluded. Requires GCC or Clang with gcov support, and
`gcovr` on `PATH`.
> **Windows note:** requires GCC (e.g. `scoop install gcc`) or a Clang
> build that includes compiler-rt. A custom Clang without compiler-rt
> will fail at link time.
## Architecture
```
celrs/
crsf.h / crsf.c CRSF protocol: CRC8/DVB-S2, frame build/parse
crsf_telemetry.h/.c Telemetry frame decoders (GPS, battery, link..)
crsf_stream.h/.c Incremental streaming frame reader
crsf_param.h/.c Parameter protocol (read/write/set_power)
serial.h / serial.c Serial port abstraction (Win/POSIX)
logger.h / logger.c Level-filtering logger
log_write.h/.c stdout log sink
tools/
telemetry.c Telemetry read tool
tests/
test_crsf.c CRSF CRC, parse, build tests
test_serial.c Serial open/close/stub tests
test_logger.c Logger level-filtering tests
deps/
FindUnity.cmake Fetches Unity v2.6.1 via ZIP
FindCMock.cmake Fetches CMock v2.6.0 via ZIP
```
## CRSF Protocol
CRSF (Crossfire Serial Protocol) is the serial protocol used by ELRS for
communication between ground station and TX/RX modules.
### Frame format (ELRS USB CRSF)
```
+--------+----------+--------+----------+-----+
| addr | length | type | payload | CRC |
+--------+----------+--------+----------+-----+
1 byte 1 byte 1 byte N bytes 1B
```
- **Address:** Frame sync byte (`0xC8` for host, `0xEE` for module, etc.)
- **Length:** Total bytes after this field (type + payload + CRC)
- **Type:** Frame type (RC channels, telemetry, parameter, etc.)
- **Payload:** Frame-specific data
- **CRC:** CRC8/DVB-S2 (poly `0xD5`) over type + payload
### Common device addresses
| Address | Device |
| ------- | ----------------------------- |
| 0x00 | FC Broadcast |
| 0x10 | Flight Controller |
| 0x80 | TBS Ground Station |
| 0xEA | Custom Module (Radio) |
| 0xEE | ELRS TX Module |
| 0xEF | ELRS Lua (host script) |
### Common frame types
| Type | Name |
| ------ | --------------------------- |
| 0x01 | RC Channels Packed |
| 0x02 | GPS |
| 0x08 | Battery |
| 0x0B | Heartbeat |
| 0x14 | Link Stats |
| 0x16 | RC Channels |
| 0x28 | Device Ping |
| 0x29 | Device Info |
| 0x2B | Parameter Entry |
| 0x2C | Parameter Read |
| 0x2D | Parameter Write |
| 0x2E | ELRS Status |