diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index 286738e..e1e0cf6 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -138,14 +138,14 @@ jobs: -DCMAKE_CXX_COMPILER=g++ - name: Build (library + stream demos + self-tests) - # WiFiDriverDemo / WiFiDriverTxDemo / PrecoderDemo use POSIX-only APIs - # (e.g. fork() in txdemo/main.cpp for the DEVOURER_TX_WITH_RX path) and + # rxdemo / txdemo / precoder use POSIX-only APIs + # (e.g. fork() in examples/tx/main.cpp for the DEVOURER_TX_WITH_RX path) and # are not mingw targets. This job guards the stdin-driven stream demos # and the headless self-tests ctest runs — every registered test's # binary must be listed here, or the Test step fails it as Not Run. run: > cmake --build build --target - WiFiDriver StreamTxDemo StreamDuplexDemo StreamStdinSelftest + devourer streamtx duplex StreamStdinSelftest ToneMaskSelftest BfReportDecodeSelftest SweepSpecSelftest TxPowerQuantSelftest LinkHealthSelftest TxCapsSelftest TxPktPwrSelftest RxQualitySelftest diff --git a/CLAUDE.md b/CLAUDE.md index 7b8e495..1fbaa75 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,9 +5,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## What this is Userspace re-implementation of Realtek's RTL88xxAU Wi-Fi driver — speaks to the chip -directly via libusb instead of a kernel module. Static library `WiFiDriver` + two -demo binaries (`WiFiDriverDemo` for RX, `WiFiDriverTxDemo` for TX). Used by the -OpenIPC project for long-range video links. +directly via libusb instead of a kernel module. Static library `devourer` (CMake +target) + example executables under `examples/` — the two canonical demos are +`rxdemo` (RX) and `txdemo` (TX). Used by the OpenIPC project for long-range +video links. Three chip generations are supported, dispatched at construction (see **Architecture**): @@ -78,7 +79,7 @@ rewrites TXAGC). `GetTxPowerCaps` reports the family step (0.5 dB Jaguar1/2, uses a second chip's per-frame RSSI as the sensor: at bench range the B210 front-end limits on the frames at any gain and cannot see TXAGC slopes). `GetThermalStatus` reads the RF 0x42 meter with the family baseline on every -generation. `TxPowerStepDemo` (examples/txpower/, CLI-only) is the reference +generation. `txpower` (examples/txpower/, CLI-only) is the reference consumer; register-level validation lives in `tests/txpwr_offset_regcheck.sh` (canary parity vs master, exact-step moves, rails, stickiness, the 8822E TX+RX 0x41e8 quirk cell). The 8822B's VHT TXAGC sections are programmed from @@ -118,7 +119,7 @@ cmake --build build -j Per-chip build options select which drivers are compiled in — all default ON, so the command above builds every chip. Turn off the ones you don't need to -drop their firmware blobs + PHY tables (an 8812AU-only `WiFiDriverDemo` is +drop their firmware blobs + PHY tables (an 8812AU-only `rxdemo` is ~1.0 MB vs ~2.6 MB): `DEVOURER_JAGUAR1` (8812/8811/8821), `DEVOURER_8814` (requires JAGUAR1), `DEVOURER_JAGUAR2_8822B` (8822BU/8812BU), `DEVOURER_JAGUAR2_8821C` (8811CU/8821CU), `DEVOURER_JAGUAR3_8822C`, @@ -136,7 +137,7 @@ toolchain the MSVC matrix cell doesn't; the `build-configs` matrix builds each per-chip subset and `reject-bad-configs` asserts the invalid option combos fail (`.github/workflows/cmake-multi-platform.yml`). `ctest` runs in every CI job; the one registered test (`stream_stdin_binary`) round-trips the stream demos' -binary-stdin framing (`txdemo/stream_stdin.h`) headlessly, so a Windows +binary-stdin framing (`examples/common/stream_stdin.h`) headlessly, so a Windows text-mode regression fails CI instead of only surfacing on a radio. Hardware regression testing happens out-of-band via `tests/regress.py`. @@ -209,7 +210,7 @@ when `--sniffer-iface` is active) at `/tmp/devourer-regress-last/`. See ## Demo env vars -Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: +Both `rxdemo` and `txdemo` honour: - `DEVOURER_PID=0xNNNN` — restrict the open loop to a single PID (e.g. `0x8813` for RTL8814AU); without it, the demo iterates every Realtek PID. @@ -230,7 +231,7 @@ Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: - `DEVOURER_RX_KEEP_CORRUPTED=1` — pass frames that fail the 802.11 FCS (CRC32) or decryption-ICV check up to the host instead of dropping them at the WMAC filter (sets RCR `ACRC32|AICV`). They arrive with `crc_err`/`icv_err` set on - the RX descriptor; `WiFiDriverDemo` surfaces them in its `` + the RX descriptor; `rxdemo` surfaces them in its `` output. This is the entry point for the fused-FEC sub-block-salvage layer (see `docs/fused-fec.md`); opt-in, since a body with a corrupt tail is the worst-case input for an IP-stack consumer that didn't ask for it. @@ -276,7 +277,7 @@ Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: - `DEVOURER_RX_NBI=` — (all generations, RX) arm the narrowband- interference notch filter at one in-channel frequency (vendor-parity, LUT-quantized — a single narrow notch, not a slice mask). -- `DEVOURER_TX_WITH_RX=thread` — (`WiFiDriverTxDemo`) run the RX worker loop on +- `DEVOURER_TX_WITH_RX=thread` — (`txdemo`) run the RX worker loop on a `std::thread` alongside the TX loop, on the **same claimed adapter**: one bring-up (`InitWrite`), then `StartRxLoop(packetProcessor)` — the programmatic API for concurrent TX+RX on one handle (all three generations). On Jaguar3 the @@ -306,8 +307,8 @@ Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: `delta = raw − baseline`, and a coarse `status` bucket (cool/warm/hot/critical, keyed off delta — the meter has no calibrated °C, so this is deliberately bucketed rather than a fake temperature). Works on every Jaguar chip; read-only (does not - alter TX-power tracking). 0/unset = disabled. In `WiFiDriverDemo` (RX) this - spawns a background poller at the given cadence; in `WiFiDriverTxDemo` it is + alter TX-power tracking). 0/unset = disabled. In `rxdemo` (RX) this + spawns a background poller at the given cadence; in `txdemo` it is read inline on the TX thread (no extra USB contention) every `N/2` frames. Jaguar-1 has no hard thermal TX shutdown — a rising `delta` is the early warning that the PA is heating and TX power is being backed off. NB: on the @@ -316,7 +317,7 @@ Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: - `DEVOURER_THERMAL_WARN_DELTA=N` — thermal-units-above-baseline threshold at which a one-shot `warn` fires (default `15`); re-arms once the chip cools back below it. -- `DEVOURER_LINKHEALTH=1` — (`WiFiDriverDemo` RX, needs `DEVOURER_RX_ENERGY_MS`) +- `DEVOURER_LINKHEALTH=1` — (`rxdemo` RX, needs `DEVOURER_RX_ENERGY_MS`) emit a `` verdict line per energy window: the RX sensor tuple classified into a plain-language cause + fix (`src/LinkHealth.h`). The point is to tell a **near-field saturation** problem (strong RSSI + poor EVM — @@ -330,7 +331,7 @@ Both `WiFiDriverDemo` and `WiFiDriverTxDemo` honour: guarded (`tests/link_health_selftest.cpp`), SAT-vs-HEALTHY verified on-air (`tests/link_health_onair.sh`). See **`docs/bench-testing-near-field.md`**. -`WiFiDriverTxDemo` selects the on-air TX mode with a single env var that it +`txdemo` selects the on-air TX mode with a single env var that it parses into a `devourer::TxMode` and hands to `RtlJaguarDevice::SetTxMode` (the canonical runtime API; the demo sends a rate-less beacon so this mode applies). The library itself is radiotap-driven — a frame that carries its own @@ -349,9 +350,9 @@ gate any more (an HT-MCS radiotap is honoured unconditionally): (Programmatic equivalent: `dev->SetTxMode(devourer::TxMode{...})`; `dev->ClearTxMode()` reverts to the built-in default.) -`SvcTxDemo` is a per-packet-rate showcase: it reads length-prefixed HEVC NALs +`svctx` is a per-packet-rate showcase: it reads length-prefixed HEVC NALs from stdin, classifies each by `temporal_id` / IRAP-or-parameter-set criticality -(`txdemo/svc_tx_demo/svc_tx.h`), and injects each at the PHY rate its SVC-T layer +(`examples/svctx/svc_tx.h`), and injects each at the PHY rate its SVC-T layer deserves — a per-layer unequal-error-protection ladder (robust MCS for base/IDR, fast MCS for enhancement), since the radiotap is honoured per-packet. The ladder is `DEVOURER_SVC_LADDER="CRIT=;T0=;T1=;..."` where each `` @@ -362,7 +363,7 @@ The SVC ladder is the PHY-MCS half of cross-layer unequal error protection. The application-FEC half — a sub-block-integrity layer that salvages FCS-failed frames (`DEVOURER_RX_KEEP_CORRUPTED`) plus a Reed-Solomon outer code with per-layer redundancy — lives in `tools/precoder/` and is documented in -**`docs/fused-fec.md`**. `StreamTxDemo` adds `DEVOURER_TX_PWR_OVERRIDE=N` +**`docs/fused-fec.md`**. `streamtx` adds `DEVOURER_TX_PWR_OVERRIDE=N` (absolute per-rate TXAGC index 0..63, held) for the marginal-SNR bench setups that exercise the salvage path. @@ -402,7 +403,7 @@ filters the frame stats to the canonical probe SA), and sounding that recovers a coarse per-bin H(f) of the link — down to 5 MHz bins on Jaguar3 (`docs/rx-spectrum-sensing.md`). -`WiFiDriverTxDemo` also honours a TX-gain ramp + duty knob for thermal / +`txdemo` also honours a TX-gain ramp + duty knob for thermal / TX-power characterisation (drives `RtlJaguarDevice::SetTxPowerOverride` + `ApplyTxPower`): @@ -429,7 +430,7 @@ and `tests/run_thermal_gain_sweep.sh` (build + uv venv + sudo run). **The caller owns libusb.** `WiFiDriver::CreateRtlDevice` is intentionally thin — `libusb_init`, device open, kernel driver detach, and `libusb_claim_interface(handle, 0)` must happen **before** handing the handle -to the factory. `demo/main.cpp` is the canonical boilerplate. +to the factory. `examples/rx/main.cpp` is the canonical boilerplate. **Chip identity is resolved at construction** from SYS_CFG bits + USB PID. `CreateRtlDevice` returns an `IRtlDevice` (`Init` / `InitWrite` / `send_packet` / @@ -553,7 +554,7 @@ dev->InitWrite(SelectedChannel{ .Channel = 36, .ChannelOffset = 0, dev->send_packet(buffer, len); // buffer[0..] = radiotap header, then 802.11 ``` -The canonical test beacon (`txdemo/main.cpp`) uses SA `57:42:75:05:d6:00` — -the same constant is hardcoded into `demo/main.cpp` as the `` +The canonical test beacon (`examples/tx/main.cpp`) uses SA `57:42:75:05:d6:00` — +the same constant is hardcoded into `examples/rx/main.cpp` as the `` matcher and into `tests/regress.py` (`CANONICAL_SA`). Change all three together if it ever moves. diff --git a/CMakeLists.txt b/CMakeLists.txt index 63e52bc..bcb8315 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ if(WIN32 AND NOT "$ENV{VCPKG_ROOT}" STREQUAL "") set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") endif() -project(Rtl8812auNet) +project(devourer) enable_testing() @@ -54,7 +54,7 @@ endif() find_package(PkgConfig REQUIRED) pkg_check_modules(libusb REQUIRED IMPORTED_TARGET libusb-1.0) -add_library(WiFiDriver +add_library(devourer # --- generation-agnostic core (always compiled) --- src/logger.h hal/basic_types.h @@ -97,22 +97,22 @@ add_library(WiFiDriver src/PhyTableLoader.h ) -target_compile_features(WiFiDriver PUBLIC cxx_std_20) +target_compile_features(devourer PUBLIC cxx_std_20) -# Link WiFiDriver with libusb as found via pkg-config. -target_link_libraries(WiFiDriver PUBLIC PkgConfig::libusb) +# Link devourer with libusb as found via pkg-config. +target_link_libraries(devourer PUBLIC PkgConfig::libusb) -target_include_directories(WiFiDriver PUBLIC hal) -target_include_directories(WiFiDriver PUBLIC hal/phydm/rtl8814a) -target_include_directories(WiFiDriver PUBLIC hal/phydm/rtl8822c) -target_include_directories(WiFiDriver PUBLIC hal/phydm/rtl8822e) -target_include_directories(WiFiDriver PUBLIC hal/phydm/rtl8822b) -target_include_directories(WiFiDriver PUBLIC hal/phydm/rtl8821c) -target_include_directories(WiFiDriver PUBLIC src) +target_include_directories(devourer PUBLIC hal) +target_include_directories(devourer PUBLIC hal/phydm/rtl8814a) +target_include_directories(devourer PUBLIC hal/phydm/rtl8822c) +target_include_directories(devourer PUBLIC hal/phydm/rtl8822e) +target_include_directories(devourer PUBLIC hal/phydm/rtl8822b) +target_include_directories(devourer PUBLIC hal/phydm/rtl8821c) +target_include_directories(devourer PUBLIC src) # --- per-chip source groups (see options above) --- if(DEVOURER_JAGUAR1) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE hal/hal8812a_fw.c hal/hal8812a_fw.h hal/hal8821a_fw.c hal/hal8821a_fw.h hal/Hal8812PwrSeq.c hal/Hal8812PwrSeq.h @@ -132,18 +132,18 @@ if(DEVOURER_JAGUAR1) src/jaguar1/FrameParser.cpp src/jaguar1/FrameParser.h # NB: PhyTableLoader was promoted to src/ (shared with Jaguar2). src/jaguar1/BbDbgportReader.cpp src/jaguar1/BbDbgportReader.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR1=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR1=1) endif() if(DEVOURER_8814) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE hal/hal8814a_fw.c hal/hal8814a_fw.h hal/Hal8814PwrSeq.c hal/Hal8814PwrSeq.h hal/Hal8814PhyReg.h hal/phydm/rtl8814a/Hal8814_PhyTables.c hal/phydm/rtl8814a/Hal8814_PhyTables.h src/jaguar1/Iqk8814a.cpp src/jaguar1/Iqk8814a.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_8814=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_8814=1) endif() # --- Jaguar2 (RTL8822BU / RTL8811CU-8821CU) --- @@ -155,7 +155,7 @@ endif() # .cpp files (self-guarded on DEVOURER_HAVE_JAGUAR2_8822B/_8821C); each chip's # firmware blob + generated tables live in its own variant block. if(DEVOURER_JAGUAR2) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE src/jaguar2/RtlJaguar2Device.cpp src/jaguar2/RtlJaguar2Device.h src/jaguar2/HalJaguar2.cpp src/jaguar2/HalJaguar2.h src/jaguar2/HalmacJaguar2Fw.cpp src/jaguar2/HalmacJaguar2Fw.h @@ -167,33 +167,33 @@ if(DEVOURER_JAGUAR2) src/jaguar2/Jaguar2Calibration.h src/jaguar2/Phy8822bTables.cpp src/jaguar2/Halrf8822b.cpp src/jaguar2/Halrf8822b.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR2=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR2=1) endif() # 8822B variant data (2T2R): firmware blob + generated phydm tables + txpwr_lmt. if(DEVOURER_JAGUAR2_8822B) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE hal/hal8822b_fw.c hal/hal8822b_fw.h hal/phydm/rtl8822b/Hal8822b_PhyTables.c hal/phydm/rtl8822b/Hal8822b_PhyTables.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR2_8822B=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR2_8822B=1) endif() # 8821C variant (1T1R): per-variant dispatcher impls (Phy8821cTables / Halrf8821c) # + firmware blob + generated phydm tables. Mirrors the Jaguar3 8822E block. if(DEVOURER_JAGUAR2_8821C) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE src/jaguar2/Phy8821cTables.cpp src/jaguar2/Halrf8821c.cpp src/jaguar2/Halrf8821c.h hal/hal8821c_fw.c hal/hal8821c_fw.h hal/phydm/rtl8821c/Hal8821c_PhyTables.c hal/phydm/rtl8821c/Hal8821c_PhyTables.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR2_8821C=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR2_8821C=1) endif() if(DEVOURER_JAGUAR3) # Shared Jaguar3 port (compiled when either variant is on). Phy8822cTables.cpp # and Halrf8822c.cpp also carry the make_jaguar3_*() dispatchers, so they are # always built when Jaguar3 is on; their per-variant bodies are #if-guarded. - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE src/jaguar3/Jaguar3PhyTables.h src/jaguar3/Jaguar3Calibration.h src/jaguar3/ChipVariant.h @@ -207,103 +207,103 @@ if(DEVOURER_JAGUAR3) src/jaguar3/PhyTableLoaderJaguar3.cpp src/jaguar3/PhyTableLoaderJaguar3.h src/jaguar3/Phy8822cTables.cpp src/jaguar3/Halrf8822c.cpp src/jaguar3/Halrf8822c.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR3=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR3=1) endif() if(DEVOURER_JAGUAR3_8822C) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE hal/hal8822c_fw.c hal/hal8822c_fw.h hal/phydm/rtl8822c/Hal8822c_PhyTables.c hal/phydm/rtl8822c/Hal8822c_PhyTables.h hal/phydm/rtl8822c/Hal8822c_IqkNctl.c hal/phydm/rtl8822c/Hal8822c_IqkNctl.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR3_8822C=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR3_8822C=1) endif() if(DEVOURER_JAGUAR3_8822E) - target_sources(WiFiDriver PRIVATE + target_sources(devourer PRIVATE hal/hal8822e_fw.c hal/hal8822e_fw.h hal/phydm/rtl8822e/Hal8822e_PhyTables.c hal/phydm/rtl8822e/Hal8822e_PhyTables.h src/jaguar3/Phy8822eTables.cpp src/jaguar3/Halrf8822e.cpp src/jaguar3/Halrf8822e.h) - target_compile_definitions(WiFiDriver PUBLIC DEVOURER_HAVE_JAGUAR3_8822E=1) + target_compile_definitions(devourer PUBLIC DEVOURER_HAVE_JAGUAR3_8822E=1) endif() -add_executable(WiFiDriverDemo - demo/main.cpp +add_executable(rxdemo + examples/rx/main.cpp ) -target_link_libraries(WiFiDriverDemo PUBLIC WiFiDriver) +target_link_libraries(rxdemo PUBLIC devourer) -add_executable(WiFiDriverTxDemo - txdemo/main.cpp +add_executable(txdemo + examples/tx/main.cpp ) -target_link_libraries(WiFiDriverTxDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) +target_link_libraries(txdemo PUBLIC devourer PRIVATE PkgConfig::libusb) # Pre-modulator subcarrier PoC: transmits PSDU bytes shaped by # tools/precoder/encode_subcarriers.py so chosen OFDM data subcarriers carry # chosen bits. Single-stream BPSK / HT MCS0 / BCC on 8812/8821/8811. -add_executable(PrecoderDemo - txdemo/precoder_demo/main.cpp +add_executable(precoder + examples/precoder/main.cpp ) -target_link_libraries(PrecoderDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) +target_link_libraries(precoder PUBLIC devourer PRIVATE PkgConfig::libusb) # Stream-link TX: reads length-prefixed PSDU bodies from stdin and transmits # one probe-request per body. Driven by tools/precoder/stream_tx.py — the # C++/Python split keeps libusb out of the framing math. -add_executable(StreamTxDemo - txdemo/stream_tx_demo/main.cpp +add_executable(streamtx + examples/streamtx/main.cpp ) -target_link_libraries(StreamTxDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) -# stream_stdin.h (shared binary-stdin framing) lives in txdemo/. -target_include_directories(StreamTxDemo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/txdemo) +target_link_libraries(streamtx PUBLIC devourer PRIVATE PkgConfig::libusb) +# stream_stdin.h (shared binary-stdin framing) lives in examples/common/. +target_include_directories(streamtx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/examples/common) # SVC-T UEP injector: maps each HEVC NAL's temporal_id -> a robust/fast TxMode # (svc_tx.h), so base/IDR layers fly robust and enhancement layers ride fast. -add_executable(SvcTxDemo - txdemo/svc_tx_demo/main.cpp +add_executable(svctx + examples/svctx/main.cpp ) -target_link_libraries(SvcTxDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) -target_include_directories(SvcTxDemo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/txdemo) +target_link_libraries(svctx PUBLIC devourer PRIVATE PkgConfig::libusb) +target_include_directories(svctx PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/examples/common) # Stream-link DUPLEX: one binary, one chip, both directions. Combines the RX -# loop from WiFiDriverDemo and the stdin-driven TX from StreamTxDemo — +# loop from rxdemo and the stdin-driven TX from streamtx — # stdin = length-prefixed PSDU bodies, stdout = lines. # tools/precoder/tun_p2p.py spawns this for --mode=duplex. -add_executable(StreamDuplexDemo - txdemo/stream_duplex_demo/main.cpp +add_executable(duplex + examples/duplex/main.cpp ) -target_link_libraries(StreamDuplexDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) -target_include_directories(StreamDuplexDemo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/txdemo) +target_link_libraries(duplex PUBLIC devourer PRIVATE PkgConfig::libusb) +target_include_directories(duplex PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/examples/common) -# TxPowerStepDemo — reference consumer of the runtime TX-power API +# txpower — reference consumer of the runtime TX-power API # (IRtlDevice::SetTxPowerOffsetQdb / SetTxPowerIndexOverride / GetTxPowerState / # GetThermalStatus): opens one adapter, steps the knobs from CLI args (no env # vars), and prints machine-readable state markers. The register-level # validation driver for tests/txpwr_offset_regcheck.sh and the shape of an # adaptive-link controller's power leg. -add_executable(TxPowerStepDemo +add_executable(txpower examples/txpower/main.cpp ) -target_link_libraries(TxPowerStepDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) +target_link_libraries(txpower PUBLIC devourer PRIVATE PkgConfig::libusb) -# WiFiSenseDemo — Wi-Fi motion/presence sensor from beamforming reports. Drives +# sense — Wi-Fi motion/presence sensor from beamforming reports. Drives # two adapters (a sounder + a beamformee) on one host, self-captures the reports, # decodes the per-tone Givens angles (src/BfReportDecode.h), and shows a live # motion readout. See examples/sense/README.md and docs/beamforming-victim-sensing.md. -add_executable(WiFiSenseDemo +add_executable(sense examples/sense/main.cpp ) -target_link_libraries(WiFiSenseDemo PUBLIC WiFiDriver PRIVATE PkgConfig::libusb) +target_link_libraries(sense PUBLIC devourer PRIVATE PkgConfig::libusb) # Headless regression guard for the binary-stdin framing shared by the two -# stream demos above (txdemo/stream_stdin.h). No libusb, no radio — just the +# stream demos above (examples/common/stream_stdin.h). No libusb, no radio — just the # set_stdin_binary() + read_exact() path, so a text-mode regression (e.g. the # _setmode gate slipping back to _MSC_VER, which is invisible to a build-only # check) fails `ctest` on the Windows/mingw jobs. See tests/stream_stdin_test.cmake. add_executable(StreamStdinSelftest - txdemo/stream_stdin_selftest.cpp + examples/common/stream_stdin_selftest.cpp ) target_compile_features(StreamStdinSelftest PRIVATE cxx_std_20) -target_include_directories(StreamStdinSelftest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/txdemo) +target_include_directories(StreamStdinSelftest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/examples/common) add_test( NAME stream_stdin_binary @@ -319,7 +319,7 @@ add_test( add_executable(ToneMaskSelftest tests/tone_mask_selftest.cpp ) -target_link_libraries(ToneMaskSelftest PRIVATE WiFiDriver) +target_link_libraries(ToneMaskSelftest PRIVATE devourer) add_test(NAME tone_mask_math COMMAND ToneMaskSelftest) @@ -330,7 +330,7 @@ add_test(NAME tone_mask_math COMMAND ToneMaskSelftest) add_executable(SweepSpecSelftest tests/sweep_spec_selftest.cpp ) -target_link_libraries(SweepSpecSelftest PRIVATE WiFiDriver) +target_link_libraries(SweepSpecSelftest PRIVATE devourer) add_test(NAME sweep_spec_math COMMAND SweepSpecSelftest) @@ -340,7 +340,7 @@ add_test(NAME sweep_spec_math COMMAND SweepSpecSelftest) add_executable(TxPowerQuantSelftest tests/txpower_quant_selftest.cpp ) -target_link_libraries(TxPowerQuantSelftest PRIVATE WiFiDriver) +target_link_libraries(TxPowerQuantSelftest PRIVATE devourer) add_test(NAME txpower_quant_math COMMAND TxPowerQuantSelftest) @@ -351,7 +351,7 @@ add_test(NAME txpower_quant_math COMMAND TxPowerQuantSelftest) add_executable(LinkHealthSelftest tests/link_health_selftest.cpp ) -target_link_libraries(LinkHealthSelftest PRIVATE WiFiDriver) +target_link_libraries(LinkHealthSelftest PRIVATE devourer) add_test(NAME link_health_classify COMMAND LinkHealthSelftest) @@ -360,7 +360,7 @@ add_test(NAME link_health_classify COMMAND LinkHealthSelftest) add_executable(RxQualitySelftest tests/rx_quality_selftest.cpp ) -target_link_libraries(RxQualitySelftest PRIVATE WiFiDriver) +target_link_libraries(RxQualitySelftest PRIVATE devourer) add_test(NAME rx_quality_derive COMMAND RxQualitySelftest) @@ -369,7 +369,7 @@ add_test(NAME rx_quality_derive COMMAND RxQualitySelftest) add_executable(TxCapsSelftest tests/tx_caps_selftest.cpp ) -target_link_libraries(TxCapsSelftest PRIVATE WiFiDriver) +target_link_libraries(TxCapsSelftest PRIVATE devourer) add_test(NAME tx_caps_derive COMMAND TxCapsSelftest) @@ -380,19 +380,19 @@ if(DEVOURER_JAGUAR2_8822B OR DEVOURER_JAGUAR2_8821C) add_executable(TxPktPwrSelftest tests/txpkt_pwr_selftest.cpp ) - target_link_libraries(TxPktPwrSelftest PRIVATE WiFiDriver) + target_link_libraries(TxPktPwrSelftest PRIVATE devourer) target_include_directories(TxPktPwrSelftest PRIVATE src) add_test(NAME txpkt_pwr_quant COMMAND TxPktPwrSelftest) endif() # Headless guard for the beamforming-report decoder (src/BfReportDecode.h) — the -# LSB-first Givens-angle unpacking + per-tone variance behind WiFiSenseDemo. It +# LSB-first Givens-angle unpacking + per-tone variance behind sense. It # decodes a real captured VHT MU report and checks the angles against an offline # reference, so a port regression fails `ctest` instead of only on a radio. add_executable(BfReportDecodeSelftest examples/sense/bf_report_decode_selftest.cpp ) -target_link_libraries(BfReportDecodeSelftest PRIVATE WiFiDriver) +target_link_libraries(BfReportDecodeSelftest PRIVATE devourer) add_test(NAME bf_report_decode COMMAND BfReportDecodeSelftest) diff --git a/README.md b/README.md index ef19d10..001ea65 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ and the 1T1R + BT **RTL8811CU** (chip **8821C**), the **Jaguar3** parts — `rtl8822c` (RTL8812CU / RTL8822CU) and `rtl8822e` (RTL8812EU / RTL8822EU) — which additionally reach **5/10 MHz narrowband** operation the Jaguar-1 silicon physically can't. No kernel module, no -`rtl8812au` DKMS tree — just a C++20 static library (`WiFiDriver`) plus two -demo executables for RX and TX. It is the OpenIPC project's driver of choice +`rtl8812au` DKMS tree — just a C++20 static library (`devourer`) plus example +executables under `examples/`. It is the OpenIPC project's driver of choice for long-range video links built on top of cheap Realtek 11ac USB radios. ## Hardware landscape @@ -116,21 +116,23 @@ root. ### Build artifacts -- `WiFiDriver` — static library; link this from your application. -- `WiFiDriverDemo` — RX example built from `demo/main.cpp`. Walks every +- `devourer` — static library; link this from your application. +- `rxdemo` — RX example built from `examples/rx/main.cpp`. Walks every Realtek device under VID `0bda` and tries to open it; sets monitor mode on channel 36 / 20 MHz, runs the read loop. -- `WiFiDriverTxDemo` — TX example built from `txdemo/main.cpp`. Opens the +- `txdemo` — TX example built from `examples/tx/main.cpp`. Opens the device via `libusb_open_device_with_vid_pid` by default, or wraps a USB fd passed as `argv[1]` (the Termux-on-Android pattern using `libusb_wrap_sys_device`). Forks RX into a child, TX-loops a hardcoded beacon in the parent. +- `streamtx` / `duplex` / `svctx` / `precoder` / `txpower` / `sense` — + specialised examples, one directory each under `examples/`. ### Selecting which chips to build All chips are compiled in by default. Turn off the ones you don't need to drop their firmware blobs and generated PHY tables and shrink the binary — -an 8812AU-only `WiFiDriverDemo` is ~1.0 MB versus ~2.6 MB with everything on. +an 8812AU-only `rxdemo` is ~1.0 MB versus ~2.6 MB with everything on. | CMake option | default | chips | |---|---|---| @@ -189,7 +191,7 @@ Common to both demos: to DEBUG (produces ~7 MB per 15 s, can fill `/tmp` mid-capture, and slows init measurably). `DEVOURER_USB_QUIET` is accepted as a no-op. -`WiFiDriverDemo` (RX)-only knobs: +`rxdemo` (RX)-only knobs: - `DEVOURER_RX_ENERGY_MS=N` — frame-free RX energy / interferer-detection telemetry (the read side of `DEVOURER_CW_TONE`). Every `N` ms emit a @@ -230,7 +232,7 @@ Common to both demos: coarse per-bin H(f) map of the actual link, rendered by `tests/sounding_map.py` (see `docs/rx-spectrum-sensing.md`). -`WiFiDriverTxDemo`-only knobs: +`txdemo`-only knobs: - `DEVOURER_TX_RATE=[/][/SGI][/LDPC][/STBC]` — the on-air TX mode, parsed into a `devourer::TxMode` and applied via `RtlJaguarDevice::SetTxMode`. @@ -267,7 +269,7 @@ documented in [`docs/wfb-ng-tuning.md`](docs/wfb-ng-tuning.md). The caller owns libusb: you must `libusb_init`, open the device, detach any kernel driver, and `libusb_claim_interface(handle, 0)` **before** handing the handle to `WiFiDriver::CreateRtlDevice`. The factory is intentionally -thin — see `demo/main.cpp` for the full boilerplate. A minimal RX path: +thin — see `examples/rx/main.cpp` for the full boilerplate. A minimal RX path: ```cpp auto logger = std::make_shared(); @@ -363,8 +365,16 @@ src/ Driver implementation jaguar3/ Jaguar3 (rtl8822c / rtl8822e) HAL — RtlJaguar3Device, HalMAC firmware download, halrf calibration, 5/10 MHz narrowband, per-generation PHY/RF tables + TX/RX descriptors -demo/ RX example -txdemo/ TX example (Android / Termux pattern) +examples/ Example executables (one directory per demo) + rx/ RX example (rxdemo) + tx/ TX example (txdemo; Android / Termux pattern) + streamtx/ stdin-driven TX (streamtx) + duplex/ stdin TX + RX duplex (duplex) + svctx/ HEVC SVC-T UEP injector (svctx) + precoder/ OFDM subcarrier precoding PoC (precoder) + txpower/ runtime TX-power API reference (txpower) + sense/ beamforming motion/presence sensor (sense) + common/ stream_stdin.h shared framing + selftest ``` Each chip generation can be compiled out to shrink the binary — see diff --git a/docs/adaptive-link-building-blocks.md b/docs/adaptive-link-building-blocks.md index 73863b9..bd9b2af 100644 --- a/docs/adaptive-link-building-blocks.md +++ b/docs/adaptive-link-building-blocks.md @@ -80,7 +80,7 @@ baseband directly; see [`rx-spectrum-sensing.md`](rx-spectrum-sensing.md)): the fade state the receive-chain lever adapts to — decorrelated, fast-fading antennas are where combining more chains pays, so a motion signal tells the controller when to open chains up and when to collapse to one. (The - `WiFiSenseDemo` example surfaces this as a motion-energy readout; see + `sense` example surfaces this as a motion-energy readout; see [`beamforming-victim-sensing.md`](beamforming-victim-sensing.md).) **Thermal** (a local safety input, not a link sensor): diff --git a/docs/adaptive-link-validation.md b/docs/adaptive-link-validation.md index fafcf73..6efa082 100644 --- a/docs/adaptive-link-validation.md +++ b/docs/adaptive-link-validation.md @@ -64,7 +64,7 @@ the on-air comparison below. ## On-air validation The bench is two RTL88xxAU adapters (an 8812AU transmitter, an 8821AU receiver) -driven by `StreamDuplexDemo` and `tools/precoder/adaptive_link.py`, plus a USRP +driven by `duplex` and `tools/precoder/adaptive_link.py`, plus a USRP B210 raising the receiver's noise floor as a controllable, reproducible interferer. @@ -123,7 +123,7 @@ is real end-to-end loss (on-air + processing), now measured honestly. absolute energy numbers (relative savings hold without it). 3. **On-air adaptive SVC.** The per-temporal-layer ladder flies at fixed MCS today - (`SvcTxDemo`, `tests/svc_uep_onair.sh`); retuning the per-layer ladder and shed + (`svctx`, `tests/svc_uep_onair.sh`); retuning the per-layer ladder and shed set live from the ground controller is validated in simulation (linklab) but not yet on air. @@ -178,7 +178,7 @@ uv run python -m linklab.train.run --history 8 --fading-k 4 --n-envs 512 On-air (needs two RTL88xxAU adapters + a USRP B210): ```sh -cmake -S . -B build && cmake --build build -j # build StreamDuplexDemo +cmake -S . -B build && cmake --build build -j # build duplex # baseline link diagnosis (no interferer): localize any frame loss sudo bash tests/halfduplex_baseline.sh # fade-SLA sweep: static vs mean-matched fading across interferer gains diff --git a/docs/beamforming-self-sounding.md b/docs/beamforming-self-sounding.md index 4f02041..4693e8b 100644 --- a/docs/beamforming-self-sounding.md +++ b/docs/beamforming-self-sounding.md @@ -59,17 +59,17 @@ the rtl88x2bu and rtl88x2cu trees). Entry 0, P_AID 0. ```sh # beamformee: arm to reply to sounding from the beamformer MAC (no association) DEVOURER_VID=0x2357 DEVOURER_PID=0x0120 DEVOURER_CHANNEL=100 \ - DEVOURER_BF_ARM_BFEE= WiFiDriverDemo + DEVOURER_BF_ARM_BFEE= rxdemo # beamformer: inject an NDPA to the beamformee, arm the sounding engine DEVOURER_PID=0x8812 DEVOURER_CHANNEL=100 DEVOURER_TX_RATE=VHT2SS_MCS0 \ DEVOURER_TX_NDPA_RA= DEVOURER_TX_NDPA=1 \ - DEVOURER_BF_ARM_SOUNDER=1 WiFiDriverTxDemo + DEVOURER_BF_ARM_SOUNDER=1 txdemo # capture + decode the reports (any monitor RX; the beamformer is addressed but # monitor mode is promiscuous). Mode 4 dumps full frames for the decoder. DEVOURER_PID=0x8813 DEVOURER_CHANNEL=100 DEVOURER_BF_DETECT_REPORT=4 \ - WiFiDriverDemo | tools/bf_report_decode.py + rxdemo | tools/bf_report_decode.py # single-radio beamformer: the report is addressed TO the sounder, so one # adapter can sound and capture its own reports — DEVOURER_TX_WITH_RX=thread @@ -82,7 +82,7 @@ DEVOURER_PID=0x8813 DEVOURER_CHANNEL=100 DEVOURER_BF_DETECT_REPORT=4 \ DEVOURER_PID=0x8812 DEVOURER_CHANNEL=100 DEVOURER_TX_RATE=VHT2SS_MCS0 \ DEVOURER_TX_NDPA_RA= DEVOURER_TX_NDPA=1 \ DEVOURER_BF_ARM_SOUNDER=1 DEVOURER_TX_WITH_RX=thread \ - DEVOURER_BF_DETECT_REPORT=4 WiFiDriverTxDemo | tools/bf_report_decode.py + DEVOURER_BF_DETECT_REPORT=4 txdemo | tools/bf_report_decode.py ``` Gotchas that cost time during bring-up: diff --git a/docs/beamforming-victim-sensing.md b/docs/beamforming-victim-sensing.md index 720f8a9..93d4d22 100644 --- a/docs/beamforming-victim-sensing.md +++ b/docs/beamforming-victim-sensing.md @@ -200,21 +200,21 @@ DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 DEVOURER_TX_RATE=VHT2SS_MCS0 \ DEVOURER_TX_NDPA_RA= DEVOURER_TX_NDPA=1 \ DEVOURER_BF_ARM_SOUNDER=1 DEVOURER_TX_WITH_RX=thread \ DEVOURER_BF_DETECT_REPORT=4 DEVOURER_TX_GAP_US=4000 \ - ./build/WiFiDriverTxDemo 2>/dev/null | grep '' > cap.raw + ./build/txdemo 2>/dev/null | grep '' > cap.raw ``` Beamformee (the client), on its adapter: ```sh DEVOURER_CHANNEL=6 DEVOURER_BF_ARM_BFEE=57:42:75:05:d6:00 \ - ./build/WiFiDriverDemo + ./build/rxdemo ``` 5 MHz narrowband interferer (for the interference experiment), on a Jaguar3 part: ```sh DEVOURER_PID=0xc812 DEVOURER_CHANNEL=6 DEVOURER_NB_BW=5 \ - DEVOURER_TX_GAP_US=0 DEVOURER_TX_PWR=8 ./build/WiFiDriverTxDemo + DEVOURER_TX_GAP_US=0 DEVOURER_TX_PWR=8 ./build/txdemo ``` Decode + per-tone readouts: @@ -225,9 +225,9 @@ tools/bf_report_decode.py cap.raw --csv cap.csv # interference: per-tone cross-frame variance of psi (Result 2/3) ``` -## Try it — `WiFiSenseDemo` +## Try it — `sense` -`WiFiSenseDemo` turns the above into a runnable motion/presence sensor: one binary +`sense` turns the above into a runnable motion/presence sensor: one binary drives two adapters — a sounder and a beamformee — sounds continuously, self-captures the reports, decodes the per-tone angles in C++ (`src/BfReportDecode.h`), and prints a live readout (the mean per-tone cross-frame @@ -235,7 +235,7 @@ variance of the phase angle) against a **self-calibrating noise floor** — a CFAR-style test shown as `σ`, with `CLEAR` / `MOTION` verdicts. ```sh -WiFiSenseDemo --channel 6 \ +sense --channel 6 \ --sounder 0x0bda:0x8812 --beamformee 0x0bda:0xc812 ``` diff --git a/docs/bench-testing-near-field.md b/docs/bench-testing-near-field.md index 880899c..ce104db 100644 --- a/docs/bench-testing-near-field.md +++ b/docs/bench-testing-near-field.md @@ -62,7 +62,7 @@ multipath-desense regime. and cross-polarised antennas. 3. **Watch EVM, not SNR.** A strong RSSI with poor EVM is the saturation fingerprint. `DEVOURER_RX_ENERGY_MS=500 DEVOURER_LINKHEALTH=1` on - `WiFiDriverDemo` classifies each window and says so in plain language: + `rxdemo` classifies each window and says so in plain language: ``` verdict=SATURATED rssi_dbm=-33 snr_db=19.5 evm_db=-22.5 diff --git a/docs/fused-fec.md b/docs/fused-fec.md index 2554763..6cd89ae 100644 --- a/docs/fused-fec.md +++ b/docs/fused-fec.md @@ -13,13 +13,13 @@ default, never cooperate: every 802.11 MCS. Its code rate is fixed by the MCS choice. devourer already selects it per packet from the radiotap header / `TxMode` (`src/RadiotapBuilder.cpp`, `src/RtlJaguarDevice.cpp`), and the SVC ladder - (`txdemo/svc_tx_demo/svc_tx.h`) already picks a robust MCS for important + (`examples/svctx/svc_tx.h`) already picks a robust MCS for important video layers. 2. **Application-layer FEC** — a packet-erasure code spread across radio frames (Reed-Solomon / RaptorQ / RLC). It recovers whole frames that are *lost*. 3. **Corrupted-frame retention** — `DEVOURER_RX_KEEP_CORRUPTED` keeps frames that fail the 802.11 FCS instead of dropping them - (`src/RadioManagementModule.cpp` sets RCR `ACRC32|AICV`; `demo/main.cpp` + (`src/RadioManagementModule.cpp` sets RCR `ACRC32|AICV`; `examples/rx/main.cpp` surfaces the body with `crc_err`/`icv_err` + per-frame RSSI/EVM/SNR). **The gap:** a frame that fails the FCS is normally dropped wholesale, so the @@ -104,7 +104,7 @@ where RaptorQ's probabilistic overhead is worst. `tools/precoder/svc_uep_fec.py` is the application-FEC half of cross-layer unequal error protection (Abdel-Khalek & Heath, JSAC 2012). The PHY-MCS half -already lives in C++ (`txdemo/svc_tx_demo/svc_tx.h`, `DEVOURER_SVC_LADDER`). +already lives in C++ (`examples/svctx/svc_tx.h`, `DEVOURER_SVC_LADDER`). This module maps each HEVC temporal layer to its own RS redundancy — heavy on base/IDR, light on enhancement — routed by an SBI `stream_id`: @@ -211,7 +211,7 @@ for both receivers. Only the receiver — and thus the inner decode — differs: | `svc_spatial_uep_sim.py` | per-SVC-layer spatial UEP — the 3-axis staircase (MCS + FEC + STBC), quantifying the spatial knob's survival-SNR contribution | | `spatial_sbi_sim.py` | spatial diversity keeps corruption localized — how combining (by fade correlation ρ) moves frames out of the frame-wide-loss bin into the SBI-salvageable one | | `fused_fec_link.py` | chip-path `FusedFecSender` / `FusedFecReceiver` (baseline-vs-SBI) | -| `fused_fec_tx.py` / `fused_fec_rx.py` | chip-path CLIs (bytes ↔ `StreamTxDemo` / ``) | +| `fused_fec_tx.py` / `fused_fec_rx.py` | chip-path CLIs (bytes ↔ `streamtx` / ``) | | `fec_fusion_sim.py` | offline simulation: quantify SBI gain, size sub-blocks, no hardware | | `soft_erasure_fec.py` | errors-and-erasures Reed-Solomon (BCH form) + soft-reliability GMD; the reference that quantifies the inner-vs-outer soft-information question | | `fec_ab_sim.py` | the SBI-vs-plain-block-FEC A/B over measured channels (does SBI beat just adding parity, at equal overhead?) | @@ -297,7 +297,7 @@ To exercise the salvage path reproducibly on a bench without an attenuator AWGN/CW source. A given `--tx-gain` reproduces the same interference (fixed RNG seed), so the FCS-failure rate becomes a function of one number — the reproducible knob when the natural rate is too low. -- **`DEVOURER_TX_PWR_OVERRIDE`** (StreamTxDemo) forces an absolute per-rate +- **`DEVOURER_TX_PWR_OVERRIDE`** (streamtx) forces an absolute per-rate TXAGC index 0–63 for fine control. Note: a `uhubctl` power-cycle of a **root-hub** port (e.g. the 8812 on root hub diff --git a/docs/rx-spectrum-sensing.md b/docs/rx-spectrum-sensing.md index c2b9cf4..f2b63d1 100644 --- a/docs/rx-spectrum-sensing.md +++ b/docs/rx-spectrum-sensing.md @@ -35,7 +35,7 @@ whose per-tone SNR / V-angle variance localises an interferer to ~1 MHz. ## `DEVOURER_RX_ENERGY_MS` — the energy sensor -`WiFiDriverDemo` with `DEVOURER_RX_ENERGY_MS=N` emits one `` +`rxdemo` with `DEVOURER_RX_ENERGY_MS=N` emits one `` line every `N` ms: ``` diff --git a/docs/startup-time.md b/docs/startup-time.md index 87c6ddb..0e4c61a 100644 --- a/docs/startup-time.md +++ b/docs/startup-time.md @@ -8,9 +8,9 @@ RF-quiet rooms) that make naive startup benchmarks lie. "Ready" is measured, not inferred: -- **devourer RX** — `exec → first 802.11 frame delivered` (`WiFiDriverDemo`, +- **devourer RX** — `exec → first 802.11 frame delivered` (`rxdemo`, its `init-timing: demo.first_rx_frame` line). -- **devourer TX** — `exec → first bulk-OUT submitted` (`WiFiDriverTxDemo`, +- **devourer TX** — `exec → first bulk-OUT submitted` (`txdemo`, `init-timing: txdemo.first_tx_submit`; includes the demo's settle sleep — that's the user-visible latency). - **kernel** — `insmod → netdev registered → monitor-mode setup → first diff --git a/docs/wfb-ng-tuning.md b/docs/wfb-ng-tuning.md index 1d6403d..09e13df 100644 --- a/docs/wfb-ng-tuning.md +++ b/docs/wfb-ng-tuning.md @@ -68,7 +68,7 @@ is ~saturated because the low tail becomes signal. git clone https://github.com/svpcom/rtl8812au && cd rtl8812au && make && \ sudo insmod 88XXau_wfb.ko rtw_tx_pwr_idx_override=30 git clone https://github.com/svpcom/wfb-ng && cd wfb-ng && make -# devourer side: build/WiFiDriverTxDemo with DEVOURER_TX_RATE=MCS7/20 + DEVOURER_TX_PAYLOAD_BYTES + DEVOURER_TX_GAP_US=0 +# devourer side: build/txdemo with DEVOURER_TX_RATE=MCS7/20 + DEVOURER_TX_PAYLOAD_BYTES + DEVOURER_TX_GAP_US=0 # measure (ceiling-free) while either side floods a clean 5 GHz channel: sudo python3 tests/sdr_duty.py --freq 5745e6 --secs 4 --mcs 7 --bw 20 --noise-db -62 ``` diff --git a/txdemo/stream_stdin.h b/examples/common/stream_stdin.h similarity index 94% rename from txdemo/stream_stdin.h rename to examples/common/stream_stdin.h index b14b2b4..4d49f37 100644 --- a/txdemo/stream_stdin.h +++ b/examples/common/stream_stdin.h @@ -1,5 +1,5 @@ -// Shared stdin framing for the stdin-driven stream demos (StreamTxDemo, -// StreamDuplexDemo) and their headless regression self-test +// Shared stdin framing for the stdin-driven stream demos (streamtx, +// duplex) and their headless regression self-test // (StreamStdinSelftest). // // Centralises the two things that have to stay correct on every Windows diff --git a/txdemo/stream_stdin_selftest.cpp b/examples/common/stream_stdin_selftest.cpp similarity index 96% rename from txdemo/stream_stdin_selftest.cpp rename to examples/common/stream_stdin_selftest.cpp index 7970f2d..7b5b779 100644 --- a/txdemo/stream_stdin_selftest.cpp +++ b/examples/common/stream_stdin_selftest.cpp @@ -1,6 +1,6 @@ -// StreamStdinSelftest — headless regression test for txdemo/stream_stdin.h. +// StreamStdinSelftest — headless regression test for examples/common/stream_stdin.h. // -// The stdin-driven stream demos (StreamTxDemo, StreamDuplexDemo) read a binary +// The stdin-driven stream demos (streamtx, duplex) read a binary // stream from stdin. On Windows that only works if stdin is // put into binary mode; the gate has to be `_WIN32` (not `_MSC_VER`) so it also // fires under mingw/GCC. A regression there is invisible to a build-only CI job diff --git a/txdemo/stream_duplex_demo/main.cpp b/examples/duplex/main.cpp similarity index 92% rename from txdemo/stream_duplex_demo/main.cpp rename to examples/duplex/main.cpp index be7ae0b..77ea6b1 100644 --- a/txdemo/stream_duplex_demo/main.cpp +++ b/examples/duplex/main.cpp @@ -1,23 +1,23 @@ -// StreamDuplexDemo — single-chip full-duplex for the precoder stream link. +// duplex — single-chip full-duplex for the precoder stream link. // -// Combines WiFiDriverDemo's RX loop (Init → infinite_read → packet callback) -// with StreamTxDemo's stdin-driven TX (read length-prefixed PSDU body → +// Combines rxdemo's RX loop (Init → infinite_read → packet callback) +// with streamtx's stdin-driven TX (read length-prefixed PSDU body → // send_packet) on ONE claimed interface. RX runs in the main thread; TX in a // worker thread reads stdin and calls send_packet concurrently. libusb is // thread-safe; the two bulk endpoints (_bulk_in_ep, _bulk_out_ep) don't share // transfer state. // // Used by tools/precoder/tun_p2p.py in --mode=duplex with a single PID per -// peer. Replaces the StreamTxDemo + WiFiDriverDemo pair (one adapter per +// peer. Replaces the streamtx + rxdemo pair (one adapter per // direction) with a single binary per peer (one adapter per peer, ergo two // adapters total for a P2P link instead of four). // -// On-wire wire format on stdin is identical to StreamTxDemo: +// On-wire wire format on stdin is identical to streamtx: // // EOF on stdin closes the TX side cleanly; RX keeps running until the process // terminates. // -// RX emission on stdout mirrors demo/main.cpp's DEVOURER_STREAM_OUT path — +// RX emission on stdout mirrors examples/rx/main.cpp's DEVOURER_STREAM_OUT path — // `rate=R len=L body=HEX` for every frame matching the // canonical SA. Other stdout output is suppressed; stderr carries logger and // counters. @@ -75,12 +75,12 @@ static constexpr uint16_t kRealtekProductIds[] = { 0x8812, 0x0811, 0xa811, 0xb811, 0x8813, }; -// Same probe-request header as StreamTxDemo / PrecoderDemo; radiotap is now +// Same probe-request header as streamtx / precoder; radiotap is now // built once at startup from DEVOURER_STREAM_RATE — accepts legacy // (6M..54M), HT (MCS0..MCS31), or VHT (VHT1SS_MCS0..VHT4SS_MCS9) carrier // modes. Default is 6M legacy OFDM, bit-identical to the historic // kRadiotapLegacy6M constant. The canonical SA matcher in the packet -// processor below is identical to demo/main.cpp's, so any tooling that +// processor below is identical to examples/rx/main.cpp's, so any tooling that // already grep'd lines keeps working unchanged. // Radiotap is MUTABLE here (the adaptive link rewrites the on-air rate live via // the stdin SET_RATE control op). Guarded by g_rt_mu against the TX thread. @@ -110,7 +110,7 @@ static std::atomic g_rx_hits{0}; /* DEVOURER_TX_STATUS=1: surface chip-side C2H frames (TX-status reports * from the same 8812/8821 chip we're TXing on). Best-effort 8814A TX_RPT - * decode mirrors demo/main.cpp; the C2H sub-type ID isn't enumerated in + * decode mirrors examples/rx/main.cpp; the C2H sub-type ID isn't enumerated in * the vendored headers so the raw hex stays in the line. */ static const bool g_tx_status_enabled = std::getenv("DEVOURER_TX_STATUS") != nullptr; @@ -144,7 +144,7 @@ static void packet_processor(const Packet &packet) { if (std::memcmp(packet.Data.data() + 10, kCanonicalSa, 6) != 0) return; long hits = ++g_rx_hits; std::lock_guard lk(g_print_mu); - // Full field set (mirrors demo/main.cpp) so the adaptive VRX can score RSSI/SNR + // Full field set (mirrors examples/rx/main.cpp) so the adaptive VRX can score RSSI/SNR // and the VTX can read RCF/DISC bodies + ACK_SEQ. std::printf("rate=%u len=%zu crc_err=%u icv_err=%u " "rssi=%d,%d evm=%d,%d snr=%d,%d seq=%u tsfl=%u " @@ -277,7 +277,7 @@ int main(int argc, char **argv) { // Make stdin binary so a 0x1A/CRLF doesn't corrupt the length-prefixed PSDU // stream. Gated on _WIN32 (not _MSC_VER) in the shared helper — see - // txdemo/stream_stdin.h. + // examples/common/stream_stdin.h. stream_stdin::set_stdin_binary(); libusb_context *context = nullptr; @@ -296,7 +296,7 @@ int main(int argc, char **argv) { } else { rc = libusb_init(&context); if (rc < 0) return rc; - /* Match WiFiDriverDemo's libusb log level convention — WARNING by + /* Match rxdemo's libusb log level convention — WARNING by * default, DEVOURER_USB_DEBUG=1 opts into DEBUG. */ libusb_set_option(context, LIBUSB_OPTION_LOG_LEVEL, std::getenv("DEVOURER_USB_DEBUG") @@ -348,7 +348,7 @@ int main(int argc, char **argv) { if (const char *ch_env = std::getenv("DEVOURER_CHANNEL")) { channel = std::atoi(ch_env); } - /* DEVOURER_TX_POWER: flat TXAGC index (see StreamTxDemo). Unset = each + /* DEVOURER_TX_POWER: flat TXAGC index (see streamtx). Unset = each * family's calibrated default — SetTxPower is now a real flat override on * EVERY generation, so the old unconditional SetTxPower(40) (a no-op on * Jaguar1/2) is gone. */ @@ -363,9 +363,9 @@ int main(int argc, char **argv) { TxArgs txa{rtlDevice.get(), interval_ms, max_psdu, &should_stop, logger}; std::thread tx{tx_thread, std::move(txa)}; - logger->info("StreamDuplexDemo entering RX loop on ch {} — TX thread ready", + logger->info("duplex entering RX loop on ch {} — TX thread ready", channel); - // RX loop. Same Init() path as WiFiDriverDemo; SelectedChannel sets up the + // RX loop. Same Init() path as rxdemo; SelectedChannel sets up the // shared monitor-mode bring-up (StartWithMonitorMode + SetMonitorChannel). rtlDevice->Init(packet_processor, SelectedChannel{.Channel = static_cast(channel), diff --git a/txdemo/precoder_demo/main.cpp b/examples/precoder/main.cpp similarity index 95% rename from txdemo/precoder_demo/main.cpp rename to examples/precoder/main.cpp index 220b554..c26806a 100644 --- a/txdemo/precoder_demo/main.cpp +++ b/examples/precoder/main.cpp @@ -1,4 +1,4 @@ -// PrecoderDemo — transmit a pre-shaped PSDU produced by +// precoder — transmit a pre-shaped PSDU produced by // tools/precoder/encode_subcarriers.py. // // This is the on-air vehicle for the pre-modulator subcarrier PoC: the Python @@ -21,7 +21,7 @@ // Encode shaped PSDUs with `--phy legacy` (the encoder default) to match. // // Usage: -// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/PrecoderDemo --psdu shaped.bin +// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/precoder --psdu shaped.bin // [--count N] [--interval-ms MS] (Termux: pass the numeric USB fd as argv[1]) // // Env: DEVOURER_VID / DEVOURER_PID / DEVOURER_CHANNEL / DEVOURER_SKIP_RESET — @@ -77,12 +77,12 @@ static const uint8_t kRadiotapLegacy6M[13] = { 0x00, 0x00, 0x0d, 0x00, 0x04, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00}; -// Canonical TX-validation source MAC — shared with txdemo/main.cpp, -// demo/main.cpp's `` matcher, tests/regress.py (CANONICAL_SA) +// Canonical TX-validation source MAC — shared with examples/tx/main.cpp, +// examples/rx/main.cpp's `` matcher, tests/regress.py (CANONICAL_SA) // and tests/inject_beacon.py. Change all of them together if it ever moves. static const uint8_t kCanonicalSa[6] = {0x57, 0x42, 0x75, 0x05, 0xd6, 0x00}; -// 802.11 probe-request mgmt header (24 bytes), mirroring txdemo/main.cpp's +// 802.11 probe-request mgmt header (24 bytes), mirroring examples/tx/main.cpp's // frame. DATA frames (ToDS) get silently NAKed by the chip in monitor mode — // the plan's "Data frame" wording is superseded by txdemo's hard-won // probe-request, which the SA matcher recognises identically (addr2 at +10). @@ -131,7 +131,7 @@ int main(int argc, char **argv) { } if (psdu_path.empty()) { - logger->error("usage: PrecoderDemo --psdu [--count N] " + logger->error("usage: precoder --psdu [--count N] " "[--interval-ms MS]"); return 2; } diff --git a/demo/main.cpp b/examples/rx/main.cpp similarity index 99% rename from demo/main.cpp rename to examples/rx/main.cpp index fb3e109..082596c 100644 --- a/demo/main.cpp +++ b/examples/rx/main.cpp @@ -198,7 +198,7 @@ struct RxAgg { }; static RxAgg g_rxagg; -/* The canonical txdemo beacon SA (same constant as txdemo/main.cpp and +/* The canonical txdemo beacon SA (same constant as examples/tx/main.cpp and * tests/regress.py CANONICAL_SA — change all three together): the * matcher and the "canon" aggregate filter below. */ static const uint8_t kTxSa[6] = {0x57, 0x42, 0x75, 0x05, 0xd6, 0x00}; @@ -349,12 +349,12 @@ static void packetProcessor(const Packet &packet) { fflush(stdout); } /* BF self-sounding report detector (DEVOURER_BF_DETECT_REPORT modes 1-4) — - * shared with WiFiDriverTxDemo's single-radio capture, see BfReportDetect.h. */ + * shared with txdemo's single-radio capture, see BfReportDetect.h. */ devourer::bf::detect_report(packet); /* TX-validation hook: detect frames whose SA matches the txdemo's hardcoded * injected beacon (57:42:75:05:d6:00). When running this RX demo against - * one adapter while WiFiDriverTxDemo runs against another on the same + * one adapter while txdemo runs against another on the same * channel, each hit confirms an injected frame made it over the air. */ if (packet.Data.size() >= 16) { if (std::memcmp(packet.Data.data() + 10, kTxSa, 6) == 0) { @@ -403,7 +403,7 @@ static void packetProcessor(const Packet &packet) { /* DEVOURER_DUMP_BODY=1: print the RX rate index (DESC_RATE*: 0x04=6M * OFDM, 0x00=1M CCK, 0x0c+=HT/VHT MCS) and the 802.11 frame body * (everything after the 24-byte mgmt header) as hex. Consumed by - * tests/precoder_roundtrip.py to confirm a PrecoderDemo frame flew as + * tests/precoder_roundtrip.py to confirm a precoder frame flew as * 6M OFDM and that its shaped PSDU bytes round-tripped intact — the * two-adapter, no-SDR verification. First few hits only. */ static const bool dump_body = std::getenv("DEVOURER_DUMP_BODY") != nullptr; diff --git a/examples/sense/README.md b/examples/sense/README.md index da37475..18082fd 100644 --- a/examples/sense/README.md +++ b/examples/sense/README.md @@ -1,4 +1,4 @@ -# WiFiSenseDemo — Wi-Fi motion sensing you can run on your own dongles +# sense — Wi-Fi motion sensing you can run on your own dongles A runnable example built on the `devourer` library that turns two cheap Realtek Wi-Fi adapters into a **motion / presence sensor**. No SDR, no special AP — one @@ -60,7 +60,7 @@ From the repo root: ```sh cmake -S . -B build -cmake --build build -j --target WiFiSenseDemo +cmake --build build -j --target sense ``` The decoder has a headless self-test that runs under `ctest` (no radio needed): @@ -74,7 +74,7 @@ ctest --test-dir build -R bf_report_decode ## 4. Run it ```sh -./build/WiFiSenseDemo --channel 6 \ +./build/sense --channel 6 \ --sounder 0x0bda:0xc812 \ --beamformee 0x0bda:0xb82c ``` @@ -259,7 +259,7 @@ them offline: ```sh # capture ~30 s of reports to a file (stderr carries the raw dump) -DEVOURER_SENSE_DUMP=1 ./build/WiFiSenseDemo --channel 6 \ +DEVOURER_SENSE_DUMP=1 ./build/sense --channel 6 \ --sounder 0x0bda:0xc812 --beamformee 0x0bda:0xb82c \ 2> capture.txt @@ -318,7 +318,7 @@ chosen. | File | What | |------|------| -| `examples/sense/main.cpp` | the `WiFiSenseDemo` binary: adapter bring-up, sounding loop, `AdaptiveDetector`, display, watchdog. | +| `examples/sense/main.cpp` | the `sense` binary: adapter bring-up, sounding loop, `AdaptiveDetector`, display, watchdog. | | `src/BfReportDecode.h` | header-only report decoder + `MotionMeter` (reusable; no libusb dependency). | | `examples/sense/bf_report_decode_selftest.cpp` | headless `ctest` that guards the decoder against a real captured report. | | `docs/beamforming-victim-sensing.md` | the theory: why a beamforming report measures the channel and senses motion. | diff --git a/examples/sense/main.cpp b/examples/sense/main.cpp index a9d3636..5f263fe 100644 --- a/examples/sense/main.cpp +++ b/examples/sense/main.cpp @@ -1,4 +1,4 @@ -/* WiFiSenseDemo — a runnable Wi-Fi motion/presence sensor built on devourer. +/* sense — a runnable Wi-Fi motion/presence sensor built on devourer. * * An 802.11ac beamforming report is a measurement taken at the beamformee: its * per-tone Givens angles track the channel, so a moving person perturbs them @@ -508,7 +508,7 @@ int main(int argc, char **argv) { else if (a == "--verbose" || a == "-v") verbose = true; else if (a == "-h" || a == "--help") { std::printf( - "WiFiSenseDemo — Wi-Fi motion sensing from beamforming reports\n" + "sense — Wi-Fi motion sensing from beamforming reports\n" " drives two adapters: a sounder + a beamformee, on one host.\n" " --channel N (default 6)\n" " --sensitivity low|med|high detector threshold (default med)\n" diff --git a/txdemo/stream_tx_demo/main.cpp b/examples/streamtx/main.cpp similarity index 95% rename from txdemo/stream_tx_demo/main.cpp rename to examples/streamtx/main.cpp index a77d9a9..9dd0840 100644 --- a/txdemo/stream_tx_demo/main.cpp +++ b/examples/streamtx/main.cpp @@ -1,6 +1,6 @@ -// StreamTxDemo — stdin-driven TX for the precoder stream link. +// streamtx — stdin-driven TX for the precoder stream link. // -// Mirrors PrecoderDemo's chip-setup boilerplate (legacy 6M OFDM probe-request +// Mirrors precoder's chip-setup boilerplate (legacy 6M OFDM probe-request // carrier, single-stream BPSK/BCC, RTL8812AU/8821AU/8811AU), but instead of // looping on one shaped PSDU it reads a sequence of length-prefixed PSDU // bodies from stdin and sends one probe-request per body. The encoder @@ -19,10 +19,10 @@ // ends. // // Usage: -// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/StreamTxDemo \\ +// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/streamtx \\ // [--interval-ms MS] [--max-psdu BYTES] < bodies.bin // uv run python tools/precoder/stream_tx.py < data.bin | \\ -// ./build/StreamTxDemo +// ./build/streamtx // // Env: same conventions as the other demos (DEVOURER_VID / DEVOURER_PID / // DEVOURER_CHANNEL / DEVOURER_SKIP_RESET). @@ -79,12 +79,12 @@ static constexpr uint16_t kRealtekProductIds[] = { 0x8812, 0x0811, 0xa811, 0xb811, 0x8813, }; -// Identical 802.11 probe-request header to PrecoderDemo; radiotap is now +// Identical 802.11 probe-request header to precoder; radiotap is now // built once at startup from DEVOURER_STREAM_RATE — accepts legacy // (6M..54M), HT (MCS0..MCS31), or VHT (VHT1SS_MCS0..VHT4SS_MCS9) carrier // modes. Default is 6M legacy OFDM, bit-identical to the historic // kRadiotapLegacy6M constant. Same canonical SA, same matcher in -// demo/main.cpp's RX path — keep these three in lockstep, see CLAUDE.md. +// examples/rx/main.cpp's RX path — keep these three in lockstep, see CLAUDE.md. static const std::vector kStreamRadiotap = devourer::build_stream_radiotap(devourer::parse_tx_mode_env()); static const uint8_t kCanonicalSa[6] = {0x57, 0x42, 0x75, 0x05, 0xd6, 0x00}; @@ -124,7 +124,7 @@ int main(int argc, char **argv) { } // Make stdin binary so a 0x1A or CRLF doesn't corrupt PSDU bytes. Gated on - // _WIN32 (not _MSC_VER) inside the shared helper — see txdemo/stream_stdin.h. + // _WIN32 (not _MSC_VER) inside the shared helper — see examples/common/stream_stdin.h. stream_stdin::set_stdin_binary(); libusb_context *context = nullptr; @@ -219,7 +219,7 @@ int main(int argc, char **argv) { * knob for pushing the link into the marginal-SNR regime where the RX's * corrupted-frame salvage path gets exercised (pairs with the B210 interferer * in tests/fused_fec_onair.sh). Applied once and held, unlike - * WiFiDriverTxDemo's DEVOURER_TX_PWR_START ramp. Must follow InitWrite so it + * txdemo's DEVOURER_TX_PWR_START ramp. Must follow InitWrite so it * applies live. Generation-agnostic (IRtlDevice runtime TX-power API). */ if (const char *o = std::getenv("DEVOURER_TX_PWR_OVERRIDE")) { int idx = std::atoi(o); @@ -337,7 +337,7 @@ int main(int argc, char **argv) { tx_buf.insert(tx_buf.end(), psdu.begin(), psdu.end()); bool ok = rtlDevice->send_packet(tx_buf.data(), tx_buf.size()); ++tx_count; - // Tag matches PrecoderDemo's so existing log-watchers keep working; route + // Tag matches precoder's so existing log-watchers keep working; route // to stderr to leave stdout clean for downstream callers that may chain // this binary. if (tx_count <= 5 || tx_count % 500 == 0) { diff --git a/txdemo/svc_tx_demo/main.cpp b/examples/svctx/main.cpp similarity index 97% rename from txdemo/svc_tx_demo/main.cpp rename to examples/svctx/main.cpp index 3ec50b0..3844a62 100644 --- a/txdemo/svc_tx_demo/main.cpp +++ b/examples/svctx/main.cpp @@ -1,4 +1,4 @@ -// SvcTxDemo — TID-aware unequal-error-protection (UEP) injector. +// svctx — TID-aware unequal-error-protection (UEP) injector. // // Reads a sequence of length-prefixed HEVC NAL units from stdin, classifies // each by its temporal_id / criticality (svc_tx.h), and injects it at the PHY @@ -16,7 +16,7 @@ // inject each NAL as it arrives, once. // // Usage: -// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/SvcTxDemo \ +// DEVOURER_PID=0x8812 DEVOURER_CHANNEL=6 ./build/svctx \ // [--mtu N] [--gap-us US] < nals.bin #ifndef NOMINMAX @@ -198,7 +198,7 @@ int main(int argc, char** argv) { nals.push_back(std::move(nal)); } if (nals.empty()) { logger->error("no NALs on stdin"); return 2; } - logger->info("SvcTxDemo: {} NALs, mtu={}, ch{} — looping", nals.size(), mtu, + logger->info("svctx: {} NALs, mtu={}, ch{} — looping", nals.size(), mtu, channel); long sent[9] = {0}; // [0..7] per TID, [8] = critical diff --git a/txdemo/svc_tx_demo/svc_tx.h b/examples/svctx/svc_tx.h similarity index 100% rename from txdemo/svc_tx_demo/svc_tx.h rename to examples/svctx/svc_tx.h diff --git a/txdemo/main.cpp b/examples/tx/main.cpp similarity index 99% rename from txdemo/main.cpp rename to examples/tx/main.cpp index 8e0f701..805aa84 100644 --- a/txdemo/main.cpp +++ b/examples/tx/main.cpp @@ -50,7 +50,7 @@ #define USB_VENDOR_ID 0x0bda /* Known USB product IDs for the Realtek Jaguar family — same set as the RX - * demo (demo/main.cpp). */ + * demo (examples/rx/main.cpp). */ static constexpr uint16_t kRealtekProductIds[] = { 0x8812, 0x0811, 0xa811, 0xb811, 0x8813, 0xb812, 0xb82c, /* RTL8822BU (Jaguar2); OEM VIDs via DEVOURER_VID/PID */ @@ -123,7 +123,7 @@ static void packetProcessor(const Packet &packet) { fflush(stdout); } /* BF self-sounding report detector (DEVOURER_BF_DETECT_REPORT modes 1-4, - * shared with WiFiDriverDemo): with DEVOURER_TX_WITH_RX=thread this is how + * shared with rxdemo): with DEVOURER_TX_WITH_RX=thread this is how * a single-radio sounder surfaces its own captured beamforming reports. */ devourer::bf::detect_report(packet); /* Surface frames whose source MAC matches the txdemo's injected beacon @@ -212,7 +212,7 @@ int main(int argc, char **argv) { * topology when several share one VID:PID and even the serial — e.g. two * identical RTL8814AU dongles. DEVOURER_USB_PORT is the dotted libusb port * path (sysfs `devpath` / `lsusb -t`). Unset = the VID:PID open loop below. - * Mirrors the RX demo (demo/main.cpp). */ + * Mirrors the RX demo (examples/rx/main.cpp). */ if (const char *bus_env = std::getenv("DEVOURER_USB_BUS")) { const auto want_bus = static_cast(std::strtoul(bus_env, nullptr, 0)); diff --git a/examples/txpower/main.cpp b/examples/txpower/main.cpp index 6c41f60..c5e7971 100644 --- a/examples/txpower/main.cpp +++ b/examples/txpower/main.cpp @@ -1,4 +1,4 @@ -/* TxPowerStepDemo — reference consumer of the runtime TX-power API. +/* txpower — reference consumer of the runtime TX-power API. * * Opens one adapter, brings it up for TX, prints the family's TxPowerCaps, * then walks the requested knob sequence — a quarter-dB offset ramp diff --git a/src/BfReportDetect.h b/src/BfReportDetect.h index ba3a182..f954260 100644 --- a/src/BfReportDetect.h +++ b/src/BfReportDetect.h @@ -1,6 +1,6 @@ /* BfReportDetect — console detector for beamforming self-sounding reports, - * shared by WiFiDriverDemo (2-adapter rig: separate capture radio) and - * WiFiDriverTxDemo (single-radio: the sounder captures its own reports via + * shared by rxdemo (2-adapter rig: separate capture radio) and + * txdemo (single-radio: the sounder captures its own reports via * StartRxLoop). Header-only so the demos stay identical consumers. * * A VHT/HT Compressed Beamforming report is a management Action frame — diff --git a/src/RxPacket.h b/src/RxPacket.h index 07057d2..02583c4 100644 --- a/src/RxPacket.h +++ b/src/RxPacket.h @@ -39,7 +39,7 @@ struct rx_pkt_attrib * for the frame. With the seq_num just above it, a downstream layer * can drop duplicates by seq and measure one-way latency by diffing * the chip's TSF against its own wall clock. Populated by - * FrameParser; surfaced through demo/main.cpp's . */ + * FrameParser; surfaced through examples/rx/main.cpp's . */ uint32_t tsfl; uint8_t data_rate; uint8_t bw; @@ -48,7 +48,7 @@ struct rx_pkt_attrib uint8_t sgi; /* Descrambler seed the chip recovered from this frame's SERVICE field. * Trustworthy only on RTL8814AU (see FrameParser.cpp); surfaced for the - * DEVOURER_DUMP_SCRAMBLER hook in demo/main.cpp. */ + * DEVOURER_DUMP_SCRAMBLER hook in examples/rx/main.cpp. */ uint8_t scrambler; /* RSSI / SNR per RF path: A, B (Jaguar 8812/8811) plus C, D (8814AU). On * non-8814 chips the [2..3] slots are zero — the upstream RX phy-status diff --git a/src/RxQuality.h b/src/RxQuality.h index b73a24a..925f72a 100644 --- a/src/RxQuality.h +++ b/src/RxQuality.h @@ -4,7 +4,7 @@ * * devourer already exposes per-frame RSSI/SNR/EVM (the Packet callback) and * frame-free FA/CCA/IGI (GetRxEnergy), but the windowing + the LinkHealth - * verdict lived only in demo/main.cpp. This promotes that into the library: the + * verdict lived only in examples/rx/main.cpp. This promotes that into the library: the * device aggregates per-frame RX quality internally, and GetRxQuality() returns * one struct fusing the frame aggregate, the frame-free energy, a passive * noise-floor estimate, and the plain-language verdict. diff --git a/src/jaguar1/BbDbgportReader.h b/src/jaguar1/BbDbgportReader.h index 18f7c2c..17e3c34 100644 --- a/src/jaguar1/BbDbgportReader.h +++ b/src/jaguar1/BbDbgportReader.h @@ -30,7 +30,7 @@ * destructive until proven otherwise. * * Gating: every helper is no-op unless an explicit env var is set in - * demo/main.cpp. There is no automatic invocation — read+restore happens + * examples/rx/main.cpp. There is no automatic invocation — read+restore happens * only when a researcher asks for it. */ diff --git a/src/jaguar1/FrameParser.cpp b/src/jaguar1/FrameParser.cpp index 512068c..11f7f4c 100644 --- a/src/jaguar1/FrameParser.cpp +++ b/src/jaguar1/FrameParser.cpp @@ -133,7 +133,7 @@ static rx_pkt_attrib rtl8812_query_rx_desc_status(uint8_t *pdesc) { /* Offset 20 — chip-side TSF low (32 bits). Surfaced via RxAtrib.tsfl * for downstream latency measurement and dup-detection (see - * demo/main.cpp's line). The macro reads bits 0..31 + * examples/rx/main.cpp's line). The macro reads bits 0..31 * of pdesc+20 (full 4-byte u32), not a byte — the original commented * `(byte)` cast in master was a copy-paste from another field. */ pattrib.tsfl = GET_RX_STATUS_DESC_TSFL_8812(pdesc); @@ -259,7 +259,7 @@ std::vector FrameParser::recvbuf2recvframe(std::span ptr) { * Layout per upstream Realtek convention: byte 0 = C2H cmd_id * (sub-type), byte 1 = seq, bytes 2..N = payload. Sub-type IDs * vary per chip and aren't enumerated in the vendored headers — - * demo/main.cpp does a best-effort decode of the 8814A TX_RPT + * examples/rx/main.cpp does a best-effort decode of the 8814A TX_RPT * payload via the GET_8814A_C2H_TX_RPT_* macros gated by * DEVOURER_TX_STATUS=1, plus a raw hex dump so observers can * validate the sub-type ID against on-air capture. */ diff --git a/src/jaguar1/RadioManagementModule.h b/src/jaguar1/RadioManagementModule.h index 2745382..8e7923f 100644 --- a/src/jaguar1/RadioManagementModule.h +++ b/src/jaguar1/RadioManagementModule.h @@ -102,7 +102,7 @@ class RadioManagementModule { * value instead of the EFUSE-derived per-rate table (or the `power` * fallback). -1 = disabled (normal behaviour). Set via SetTxPowerOverride * and re-applied on the next channel-set; used by the thermal-vs-gain - * ramp in WiFiDriverTxDemo. Atomic so GetTxPowerState's cached snapshot is + * ramp in txdemo. Atomic so GetTxPowerState's cached snapshot is * readable from any thread (setters remain control-plane-thread calls). */ std::atomic txpwr_override_{-1}; /* Runtime TX-power offset in TXAGC index steps (0.5 dB each), folded onto diff --git a/src/jaguar1/RtlJaguarDevice.cpp b/src/jaguar1/RtlJaguarDevice.cpp index 54e482e..0e43ceb 100644 --- a/src/jaguar1/RtlJaguarDevice.cpp +++ b/src/jaguar1/RtlJaguarDevice.cpp @@ -362,7 +362,7 @@ bool RtlJaguarDevice::send_packet(const uint8_t *packet, size_t length) { /* STBC (radiotap MCS known bit5 / flags bits5-6) and FEC=LDPC (known bit4 / * flags bit4). The HT branch previously read neither, so an HT frame tagged * STBC/LDPC in radiotap silently transmitted as BCC SISO -- only the VHT - * branch honoured them. Reading them here lets WiFiDriverTxDemo emit a real + * branch honoured them. Reading them here lets txdemo emit a real * HT STBC / HT LDPC frame (needed as a chip reference for the gr-ieee802-11 * fork's modern-format TX). */ if (mcs_known & 0x20) { diff --git a/src/logger.h b/src/logger.h index cd1d2bc..4820368 100644 --- a/src/logger.h +++ b/src/logger.h @@ -134,7 +134,7 @@ class Logger { /* Verbosity threshold. A message at level L is emitted only when * _level <= L, so Debug shows everything and Silent shows nothing. Defaults * to Debug, so existing consumers' output is unchanged; a caller that wants - * a clean stdout (e.g. WiFiSenseDemo's live display) can quiet the library + * a clean stdout (e.g. sense's live display) can quiet the library * with set_level(Logger::Level::Warn). */ enum class Level { Debug, Info, Warn, Error, Silent }; void set_level(Level l) { _level = l; } diff --git a/tests/README.md b/tests/README.md index faa2e52..bc5026a 100644 --- a/tests/README.md +++ b/tests/README.md @@ -14,7 +14,7 @@ RX = kernel does dvr emit valid baseline / rig sanity check ``` Each cell injects/receives the canonical beacon (SA `57:42:75:05:d6:00`, -matching `txdemo/main.cpp`) for `--duration` seconds and counts hits. +matching `examples/tx/main.cpp`) for `--duration` seconds and counts hits. The baseline cell runs first — if it fails the rig itself is broken and the remaining cells are skipped (override with `--no-baseline-abort`). @@ -94,7 +94,7 @@ probe on kernels 6.15+ (`failed to download firmware`, `error -22`), but ### On the host (both modes) - 2 supported USB Wi-Fi adapters plugged in -- devourer built (`build/WiFiDriverDemo`, `build/WiFiDriverTxDemo`) +- devourer built (`build/rxdemo`, `build/txdemo`) - Python 3.9+ with `scapy` (`pip install scapy` or `python3-scapy`) - `iw`, `tcpdump`, `ip` on PATH - Passwordless `sudo`, or run directly as root @@ -289,7 +289,7 @@ reportedly fails at RX). Add more in `ENCODING_COMBOS` at the top of The underlying knobs are also usable standalone for one-off targeted TX: - **Devourer TX:** `DEVOURER_TX_RATE=[/][/SGI][/LDPC][/STBC]` read by - `WiFiDriverTxDemo` (parsed into a `devourer::TxMode`, applied via + `txdemo` (parsed into a `devourer::TxMode`, applied via `RtlJaguarDevice::SetTxMode`). `` = `6M`..`54M` (legacy) | `MCS0`..`MCS31` (HT) | `VHT1SS_MCS0`..`VHT4SS_MCS9` (VHT); `` = `20|40|80|160`. Examples: `MCS7/40/SGI`, `VHT2SS_MCS3/80/LDPC`. @@ -319,7 +319,7 @@ sudo python3 tests/sniff_air.py --iface wlan0mon --channel 100 \ ``` The `d/k` and `d/d` rows are not affected by the kernel-TX caveat — -`WiFiDriverTxDemo` writes the radiotap header directly into the +`txdemo` writes the radiotap header directly into the chip's bulk-OUT buffer, so the `DEVOURER_TX_*` env vars are ground truth for what flies on devourer TX. diff --git a/tests/adaptive_onair.sh b/tests/adaptive_onair.sh index 65075c8..9d005f8 100644 --- a/tests/adaptive_onair.sh +++ b/tests/adaptive_onair.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # On-air closed-loop adaptive link: VTX (8812) <-> VRX (8821), both running -# StreamDuplexDemo driven by adaptive_link.py. The VTX streams synthetic video and +# duplex driven by adaptive_link.py. The VTX streams synthetic video and # applies the VRX's RCF feedback (SET_PWR / SET_RATE) live; the VRX scores RSSI/SNR # and commands the energy-min operating point. An optional B210 interferer # (USE_INTERFERER=1) drives the link into the corrupt regime so the controller @@ -27,7 +27,7 @@ RENDEZVOUS=${RENDEZVOUS:-} VTX_LOG=/tmp/adaptive_vtx.log; VRX_LOG=/tmp/adaptive_vrx.log VIDEO=/tmp/adaptive_video.bin -KILL(){ sudo pkill -9 -f adaptive_link 2>/dev/null; sudo pkill -9 StreamDuplexD 2>/dev/null +KILL(){ sudo pkill -9 -f adaptive_link 2>/dev/null; sudo pkill -9 duplex 2>/dev/null sudo pkill -9 -f sdr_interferer 2>/dev/null; } trap KILL EXIT @@ -54,12 +54,12 @@ VTX_CH=$CH; [ -n "$RENDEZVOUS" ] && VTX_CH=$((CH + 5)) echo "=== VRX (8821) adaptive_link on ch$CH ===" sudo env DEVOURER_VID=$VRX_VID DEVOURER_PID=$VRX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vrx --pid $VRX_PID --channel $CH \ - --vtx-id $VTX_ID --duplex "$ROOT/build/StreamDuplexDemo" >"$VRX_LOG" 2>&1 & + --vtx-id $VTX_ID --duplex "$ROOT/build/duplex" >"$VRX_LOG" 2>&1 & sleep 6 echo "=== VTX (8812) adaptive_link on ch$VTX_CH ===" sudo env DEVOURER_VID=$VTX_VID DEVOURER_PID=$VTX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vtx --pid $VTX_PID --channel $VTX_CH \ - --vtx-id $VTX_ID --video "$VIDEO" --duplex "$ROOT/build/StreamDuplexDemo" >"$VTX_LOG" 2>&1 & + --vtx-id $VTX_ID --video "$VIDEO" --duplex "$ROOT/build/duplex" >"$VTX_LOG" 2>&1 & sleep "$SECS"; KILL; sleep 1 diff --git a/tests/antenna_decorrelation.py b/tests/antenna_decorrelation.py index 7fbb4d1..acb4d06 100644 --- a/tests/antenna_decorrelation.py +++ b/tests/antenna_decorrelation.py @@ -9,7 +9,7 @@ measures the decorrelation that a given antenna layout actually delivers, instead of assuming it. -Input is the per-chain PHY link metric emitted by ``WiFiDriverDemo`` under +Input is the per-chain PHY link metric emitted by ``rxdemo`` under ``DEVOURER_RX_ALLPATHS=1`` — one ```` line per received frame: seq=N rssi=a,b,c,d snr=a,b,c,d evm=a,b,c,d @@ -366,7 +366,7 @@ def main() -> int: arr = parse(lines, args.metric) if arr.size == 0: print("no or lines found — did you " - "run WiFiDriverDemo with DEVOURER_RX_ALLPATHS=1 (and receive " + "run rxdemo with DEVOURER_RX_ALLPATHS=1 (and receive " "frames)?", file=sys.stderr) return 2 print(report(summarise(arr, args.metric))) diff --git a/tests/bench_init.py b/tests/bench_init.py index 99642eb..cf2377f 100644 --- a/tests/bench_init.py +++ b/tests/bench_init.py @@ -4,9 +4,9 @@ Measures, per plugged DUT, how long it takes from process start until the driver can actually move frames: - * devourer RX — `WiFiDriverDemo` until `init-timing: demo.first_rx_frame` + * devourer RX — `rxdemo` until `init-timing: demo.first_rx_frame` (exec → first 802.11 frame delivered). - * devourer TX — `WiFiDriverTxDemo` until `init-timing: txdemo.first_tx_submit` + * devourer TX — `txdemo` until `init-timing: txdemo.first_tx_submit` (exec → first bulk-OUT submitted; includes txdemo's settle sleep, deliberately — that's the user-visible latency). * kernel — two flavours, same stage names: @@ -126,7 +126,7 @@ def run_devourer_cell( `txdemo.first_tx_submit` (tx); the process is killed as soon as the marker appears, or at timeout. """ - binary = "WiFiDriverDemo" if mode == "rx" else "WiFiDriverTxDemo" + binary = "rxdemo" if mode == "rx" else "txdemo" end_marker = "demo.first_rx_frame" if mode == "rx" else "txdemo.first_tx_submit" detach_from_host_kernel(dut) @@ -264,7 +264,7 @@ def start_traffic_source( log_path = logdir / f"traffic-{src.pid}.log" fh = open(log_path, "w") proc = regress._register_local_proc(subprocess.Popen( - [str(devourer_root / "build" / "WiFiDriverTxDemo")], + [str(devourer_root / "build" / "txdemo")], env=env, stdout=fh, stderr=subprocess.STDOUT, preexec_fn=regress._child_preexec, )) diff --git a/tests/bench_onair.py b/tests/bench_onair.py index 36d58bd..35b184c 100755 --- a/tests/bench_onair.py +++ b/tests/bench_onair.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """On-air TX throughput per chip per band (devourer), via USRP duty-cycle. -For each plugged Jaguar chip and each band, floods with WiFiDriverTxDemo at a +For each plugged Jaguar chip and each band, floods with txdemo at a fixed HT MCS/BW and measures channel occupancy with sdr_duty.py (ceiling-free). Emits a markdown table for the README. Optionally also measures wfb-ng (svpcom driver + a raw-AF_PACKET blaster) for the parity comparison. @@ -70,7 +70,7 @@ def devourer_flood(vid, pid, ch, mcs, bw, size): DEVOURER_TX_RATE=f"MCS{mcs}/{bw}", DEVOURER_TX_PAYLOAD_BYTES=str(size), DEVOURER_TX_GAP_US="0") return regress._register_local_proc(subprocess.Popen( - [str(ROOT / "build" / "WiFiDriverTxDemo")], env=env, + [str(ROOT / "build" / "txdemo")], env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, preexec_fn=regress._child_preexec)) diff --git a/tests/bf_ndpa_onair.sh b/tests/bf_ndpa_onair.sh index dccf740..6b2be27 100755 --- a/tests/bf_ndpa_onair.sh +++ b/tests/bf_ndpa_onair.sh @@ -15,7 +15,7 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" +TXDEMO="$ROOT/build/txdemo" # UHD python is a system package (the tests/.venv predates python 3.14). PY="/usr/bin/python3" PROBE="$HERE/bf_ndpa_probe.py" @@ -25,12 +25,12 @@ FREQ=5500e6 RATE=10e6 DUR=8 -[ -x "$TXDEMO" ] || { echo "build WiFiDriverTxDemo first ($TXDEMO)"; exit 1; } +[ -x "$TXDEMO" ] || { echo "build txdemo first ($TXDEMO)"; exit 1; } [ -x "$PY" ] || { echo "missing venv python $PY"; exit 1; } mkdir -p "$OUT" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null + pkill -x txdemo 2>/dev/null pkill -f "bf_ndpa_probe.py" 2>/dev/null wait 2>/dev/null } diff --git a/tests/bf_report_sniff.sh b/tests/bf_report_sniff.sh index f5e861a..b824040 100755 --- a/tests/bf_report_sniff.sh +++ b/tests/bf_report_sniff.sh @@ -13,8 +13,8 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" OUT="/tmp/bf-report-sniff" CHANNEL=100 DUR=8 @@ -24,8 +24,8 @@ BFER_MAC="57:42:75:05:d6:00" # canonical SA = NDPA TA (8812AU sounder) mkdir -p "$OUT" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null - pkill -x WiFiDriverDemo 2>/dev/null + pkill -x txdemo 2>/dev/null + pkill -x rxdemo 2>/dev/null wait 2>/dev/null } trap cleanup EXIT INT TERM diff --git a/tests/bf_selfsound_jaguar2.sh b/tests/bf_selfsound_jaguar2.sh index 3479705..dfc4bcd 100755 --- a/tests/bf_selfsound_jaguar2.sh +++ b/tests/bf_selfsound_jaguar2.sh @@ -27,8 +27,8 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" OUT="/tmp/bf-jaguar2" CHANNEL=100 DUR=8 @@ -45,8 +45,8 @@ J1AUX_PID="${J1AUX_PID:-0x0120}" # (8821AU, Archer T2U Plus) mkdir -p "$OUT" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null - pkill -x WiFiDriverDemo 2>/dev/null + pkill -x txdemo 2>/dev/null + pkill -x rxdemo 2>/dev/null wait 2>/dev/null } trap cleanup EXIT INT TERM diff --git a/tests/bf_selfsound_jaguar3.sh b/tests/bf_selfsound_jaguar3.sh index de2d6a1..bc96c46 100755 --- a/tests/bf_selfsound_jaguar3.sh +++ b/tests/bf_selfsound_jaguar3.sh @@ -16,8 +16,8 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" OUT="/tmp/bf-jaguar3" CHANNEL=100 DUR=8 @@ -30,8 +30,8 @@ mkdir -p "$OUT" tag="$(echo "$BFEE_PID" | tr -d 'x')" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null - pkill -x WiFiDriverDemo 2>/dev/null + pkill -x txdemo 2>/dev/null + pkill -x rxdemo 2>/dev/null wait 2>/dev/null } trap cleanup EXIT INT TERM diff --git a/tests/bf_selfsound_onair.sh b/tests/bf_selfsound_onair.sh index caa38bb..c8589f6 100755 --- a/tests/bf_selfsound_onair.sh +++ b/tests/bf_selfsound_onair.sh @@ -14,8 +14,8 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" PY="/usr/bin/python3" PROBE="$HERE/bf_ndpa_probe.py" OUT="/tmp/bf-selfsound" @@ -29,8 +29,8 @@ BFER_MAC="57:42:75:05:d6:00" # canonical SA = NDPA TA mkdir -p "$OUT" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null - pkill -x WiFiDriverDemo 2>/dev/null + pkill -x txdemo 2>/dev/null + pkill -x rxdemo 2>/dev/null pkill -f "bf_ndpa_probe.py" 2>/dev/null wait 2>/dev/null } diff --git a/tests/bf_waterfall.sh b/tests/bf_waterfall.sh index 6847c9b..0d5fcec 100755 --- a/tests/bf_waterfall.sh +++ b/tests/bf_waterfall.sh @@ -14,8 +14,8 @@ set -u HERE="$(cd "$(dirname "$0")" && pwd)" ROOT="$(dirname "$HERE")" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" WF="$ROOT/tools/bf_waterfall.py" CHANNEL=100 BFER_MAC="57:42:75:05:d6:00" @@ -25,8 +25,8 @@ OP_SNR="${1:-}" [ -x "$TXDEMO" ] && [ -x "$RXDEMO" ] || { echo "build demos first"; exit 1; } cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null - pkill -x WiFiDriverDemo 2>/dev/null + pkill -x txdemo 2>/dev/null + pkill -x rxdemo 2>/dev/null wait 2>/dev/null } trap cleanup EXIT INT TERM diff --git a/tests/canary_diff.py b/tests/canary_diff.py index 5941fa8..7dcf1d6 100755 --- a/tests/canary_diff.py +++ b/tests/canary_diff.py @@ -5,7 +5,7 @@ A clean way to compare: - `tools/canary_kernel_dump.sh [chip]` output (kernel side via iwpriv) - - `DEVOURER_DUMP_CANARY=1 ./build/WiFiDriverDemo` block extracted + - `DEVOURER_DUMP_CANARY=1 ./build/rxdemo` block extracted by `awk '/DEVOURER_DUMP_CANARY \\(post channel-set ch=N\\)/, /END DEVOURER_DUMP_CANARY/' | sed 's/^//'` diff --git a/tests/compare_8814_decorrelation.sh b/tests/compare_8814_decorrelation.sh index 9ffb61c..d3c0cb8 100755 --- a/tests/compare_8814_decorrelation.sh +++ b/tests/compare_8814_decorrelation.sh @@ -2,7 +2,7 @@ # Compare inter-chain antenna decorrelation across every plugged RTL8814AU. # # Two RTL8814AU dongles that enumerate identically (same VID:PID:serial) can only -# be told apart by USB topology, so this drives WiFiDriverDemo's +# be told apart by USB topology, so this drives rxdemo's # DEVOURER_USB_BUS/PORT selector once per device. Each is measured as RX against # one controlled beacon TX (the canonical SA), so the only variable between runs # is the adapter's antenna front-end — e.g. 2 external dipoles (CF-938AC) vs 4 @@ -27,7 +27,7 @@ METRIC="${METRIC:-rssi}" OUTDIR="$(mktemp -d -t devourer-8814cmp.XXXXXX)" cleanup() { - for comm in WiFiDriverDemo WiFiDriverTxDem; do + for comm in rxdemo txdemo; do pkill -x "$comm" 2>/dev/null || true done rm -f "${TXLOG:-}" 2>/dev/null || true @@ -37,8 +37,8 @@ trap cleanup EXIT INT TERM echo "== building devourer ==" [ -d "$ROOT/build" ] || cmake -S "$ROOT" -B "$ROOT/build" >/dev/null cmake --build "$ROOT/build" -j >/dev/null -DEMO="$ROOT/build/WiFiDriverDemo" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" +DEMO="$ROOT/build/rxdemo" +TXDEMO="$ROOT/build/txdemo" # uv venv for the analyser (numpy only). command -v uv >/dev/null 2>&1 || { echo "uv not found" >&2; exit 1; } diff --git a/tests/cu_kernel_rx_check.sh b/tests/cu_kernel_rx_check.sh index 23ad497..fbe14a9 100755 --- a/tests/cu_kernel_rx_check.sh +++ b/tests/cu_kernel_rx_check.sh @@ -16,7 +16,7 @@ TXS=$(find_sys 8812) [ -z "$TXS" ] && { echo "no 8812AU"; exit 1; } cleanup() { - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null sudo pkill -9 -f "tcpdump -i ${CUIF}mon" 2>/dev/null sudo iw dev ${CUIF}mon del 2>/dev/null sudo ip link set "$CUIF" up 2>/dev/null @@ -38,7 +38,7 @@ iw dev "$MONIF" info 2>/dev/null | grep -iE "type|channel" | sed 's/^/ /' # 8812AU -> devourer beacon flood echo "$TXS:1.0" | sudo tee /sys/bus/usb/drivers/rtw88_8812au/unbind >/dev/null 2>&1; sleep 1 sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0x8812 DEVOURER_CHANNEL=$CH \ - stdbuf -oL timeout -k 5 "$SECS" build/WiFiDriverTxDemo >/tmp/cuk_tx.log 2>&1 & + stdbuf -oL timeout -k 5 "$SECS" build/txdemo >/tmp/cuk_tx.log 2>&1 & sleep 5 echo "=== tcpdump on $MONIF for $((SECS-7))s ===" diff --git a/tests/cw_tone_sdr.sh b/tests/cw_tone_sdr.sh index 1788781..c6f6ab1 100755 --- a/tests/cw_tone_sdr.sh +++ b/tests/cw_tone_sdr.sh @@ -6,7 +6,7 @@ # (carrier-to-spur), power monotonicity vs the gain index, a clean stop (carrier # vanishes + normal beacon TX resumes), and a 60 s frequency-drift hold. # -# Each measurement launches its OWN WiFiDriverTxDemo session: the tone is armed +# Each measurement launches its OWN txdemo session: the tone is armed # in InitWrite, so a fresh gain index means a fresh bring-up (no live-gain API). # # Requires: two USB Wi-Fi adapters (8812AU + 8821AU) plugged in, a UHD SDR near @@ -23,7 +23,7 @@ set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$HERE/.." && pwd)" -DEMO="$ROOT/build/WiFiDriverTxDemo" +DEMO="$ROOT/build/txdemo" # --- matrix cells: name|VID|PID|channel|sdr_center_mhz ------------------------- # VID/PID are the adapter's USB IDs (`lsusb`); override the whole cell list with @@ -70,7 +70,7 @@ done DEMO_PID="" cleanup() { [ -n "$DEMO_PID" ] && kill "$DEMO_PID" 2>/dev/null || true - pkill -x WiFiDriverTxDem 2>/dev/null || true + pkill -x txdemo 2>/dev/null || true pkill -f "tests/cw_tone_probe.py" 2>/dev/null || true } trap cleanup EXIT INT TERM diff --git a/tests/dis_cca_onair.sh b/tests/dis_cca_onair.sh index bae87d2..0bea6ba 100755 --- a/tests/dis_cca_onair.sh +++ b/tests/dis_cca_onair.sh @@ -41,8 +41,8 @@ TX_PID=0x8812 TX_VID=0x0bda # 8812AU beacon source DUT_PID=0xa81a DUT_VID=0x0bda # 8822EU — Jaguar3, the community chip cleanup() { - sudo -n pkill -x WiFiDriverDemo 2>/dev/null || true - sudo -n pkill -x WiFiDriverTxDem 2>/dev/null || true + sudo -n pkill -x rxdemo 2>/dev/null || true + sudo -n pkill -x txdemo 2>/dev/null || true sudo -n pkill -f sdr_interferer 2>/dev/null || true true } @@ -55,7 +55,7 @@ for d in "$TX_PID $TX_VID beacon-8812AU" "$DUT_PID $DUT_VID DUT-8822EU"; do done echo "== building ==" -cmake --build "$ROOT/build" -j --target WiFiDriverDemo WiFiDriverTxDemo >/dev/null || exit 1 +cmake --build "$ROOT/build" -j --target rxdemo txdemo >/dev/null || exit 1 # One RX cell against a running interferer + beacon. $5 = "1" arms dis_cca. # Echoes "hits igi_med fa_med". @@ -69,14 +69,14 @@ run_cell() { # $1=gain $2=tag $3=discca(0|1) sudo -n env DEVOURER_PID="$TX_PID" DEVOURER_VID="$TX_VID" \ DEVOURER_CHANNEL="$CH" DEVOURER_TX_RATE=MCS3 DEVOURER_TX_PWR="$BEACON_PWR" \ DEVOURER_TX_GAP_US=1500 \ - timeout $((DUR + 8)) "$ROOT/build/WiFiDriverTxDemo" >/dev/null 2>&1 & + timeout $((DUR + 8)) "$ROOT/build/txdemo" >/dev/null 2>&1 & local tx=$! sleep 3 local discca_env="" [ "$discca" = "1" ] && discca_env="DEVOURER_DIS_CCA=1" sudo -n env DEVOURER_PID="$DUT_PID" DEVOURER_VID="$DUT_VID" \ DEVOURER_CHANNEL="$CH" DEVOURER_RX_ENERGY_MS=500 $discca_env \ - timeout "$DUR" "$ROOT/build/WiFiDriverDemo" >"$OUT/$tag.log" 2>&1 || true + timeout "$DUR" "$ROOT/build/rxdemo" >"$OUT/$tag.log" 2>&1 || true kill "$tx" 2>/dev/null; wait "$tx" 2>/dev/null kill "$jam" 2>/dev/null; wait "$jam" 2>/dev/null sudo -n pkill -f sdr_interferer 2>/dev/null @@ -105,7 +105,7 @@ PYEOF # Confirm the knob actually lands its registers once (no interferer) before the sweep. echo "== register-landing check (no interferer) ==" sudo -n env DEVOURER_PID="$DUT_PID" DEVOURER_VID="$DUT_VID" DEVOURER_CHANNEL="$CH" \ - DEVOURER_DIS_CCA=1 timeout 6 "$ROOT/build/WiFiDriverDemo" 2>&1 \ + DEVOURER_DIS_CCA=1 timeout 6 "$ROOT/build/rxdemo" 2>&1 \ | grep -m1 "CCA/EDCCA" || echo " WARN: no CCA/EDCCA log line seen" printf "%-8s | %-22s | %-22s\n" "gain_dB" "dis_cca=0 (hits/igi/fa)" "dis_cca=1 (hits/igi/fa)" diff --git a/tests/eu_5g_cold_repeat.sh b/tests/eu_5g_cold_repeat.sh index 19adf02..1cefd79 100755 --- a/tests/eu_5g_cold_repeat.sh +++ b/tests/eu_5g_cold_repeat.sh @@ -9,11 +9,11 @@ FREQ=5180e6 N=${1:-4} KMOD=rtl88x2eu_ohd -cleanup(){ sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null; } +cleanup(){ sudo pkill -9 -x txdemo 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null; } trap cleanup EXIT cold_cycle(){ # full VBUS off/on of the EU's hub port - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null sudo rmmod $KMOD 2>/dev/null; sleep 1 sudo uhubctl -l $HUB -a off >/dev/null 2>&1; sleep 4 sudo uhubctl -l $HUB -a on >/dev/null 2>&1; sleep 6 @@ -35,10 +35,10 @@ for i in $(seq 1 $N); do if ! lsusb | grep -qi a81a; then echo " run $i: EU did not enumerate"; continue; fi sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xa81a DEVOURER_CHANNEL=36 \ DEVOURER_TX_RATE=MCS7 DEVOURER_TX_GAP_US=0 DEVOURER_TX_PAYLOAD_BYTES=1465 \ - stdbuf -oL timeout -k 5 14 build/WiFiDriverTxDemo >/tmp/cold_dev_$i.log 2>&1 & + stdbuf -oL timeout -k 5 14 build/txdemo >/tmp/cold_dev_$i.log 2>&1 & sleep 6 echo " devourer cold run $i:$(sweep)" - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sleep 1 + sudo pkill -9 -x txdemo 2>/dev/null; sleep 1 done echo "=== $N COLD kernel EU 5G runs (power-cycled each) ===" diff --git a/tests/eu_5g_txpwr_probe.sh b/tests/eu_5g_txpwr_probe.sh index 25f20d3..24a3a7d 100755 --- a/tests/eu_5g_txpwr_probe.sh +++ b/tests/eu_5g_txpwr_probe.sh @@ -15,7 +15,7 @@ PY=${PY:-python3} SECS=5 EU_VID=0x0bda; EU_PID=0xa81a -cleanup(){ sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; } +cleanup(){ sudo pkill -9 -x txdemo 2>/dev/null; } trap cleanup EXIT cell() { # $1=label $2=channel $3=freq $4=extra-env @@ -23,7 +23,7 @@ cell() { # $1=label $2=channel $3=freq $4=extra-env cleanup; sleep 2 sudo env DEVOURER_VID=$EU_VID DEVOURER_PID=$EU_PID DEVOURER_CHANNEL=$ch \ DEVOURER_TX_RATE=MCS7 DEVOURER_TX_GAP_US=0 $extra \ - stdbuf -oL timeout -k 5 $((SECS+5)) build/WiFiDriverTxDemo \ + stdbuf -oL timeout -k 5 $((SECS+5)) build/txdemo \ >/tmp/eu5gp_$label.log 2>&1 & local txpid=$! sleep 5 diff --git a/tests/eu_devourer_run.sh b/tests/eu_devourer_run.sh index 56c829e..49b3274 100755 --- a/tests/eu_devourer_run.sh +++ b/tests/eu_devourer_run.sh @@ -7,7 +7,7 @@ # port power-cycle. # # sudo tests/eu_devourer_run.sh [seconds] [usbmon_out] -# e.g. sudo tests/eu_devourer_run.sh build/WiFiDriverDemo 12 /tmp/eu_dev.txt +# e.g. sudo tests/eu_devourer_run.sh build/rxdemo 12 /tmp/eu_dev.txt set -u PID=${PID:-a81a} @@ -23,7 +23,7 @@ fi HUBLOC=${SYS%.*} # 3-2.3.3 -> 3-2.3 (uhubctl hub location) HUBPORT=${SYS##*.} # 3-2.3.3 -> 3 (uhubctl port number) echo "[harness] a81a at $SYS (uhubctl $HUBLOC port $HUBPORT)" -BIN=${1:-build/WiFiDriverDemo} +BIN=${1:-build/rxdemo} SECS=${2:-12} MONOUT=${3:-} COMM=$(basename "$BIN" | cut -c1-15) # /proc comm is truncated to 15 chars diff --git a/tests/eu_kernel_baseline.sh b/tests/eu_kernel_baseline.sh index 4f58fc0..5cf207a 100755 --- a/tests/eu_kernel_baseline.sh +++ b/tests/eu_kernel_baseline.sh @@ -12,8 +12,8 @@ cleanup(){ trap cleanup EXIT # Ensure no devourer userspace holds the device. -sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null -sudo pkill -9 -x WiFiDriverDe 2>/dev/null +sudo pkill -9 -x txdemo 2>/dev/null +sudo pkill -9 -x rxdemo 2>/dev/null sleep 1 # Bind the kernel module (built out-of-tree in reference/rtl88x2eu). diff --git a/tests/eu_rx_validate.sh b/tests/eu_rx_validate.sh index 52990d4..04322ec 100755 --- a/tests/eu_rx_validate.sh +++ b/tests/eu_rx_validate.sh @@ -28,8 +28,8 @@ echo "[harness] TX $TXPID=$TXS RX $RXPID=$RXS ch=$CH ${SECS}s" TXHUB=${TXS%.*}; TXPORT=${TXS##*.} cleanup() { - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null - sudo pkill -9 -x WiFiDriverDemo 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null + sudo pkill -9 -x rxdemo 2>/dev/null echo "$TXS:1.0" | sudo tee /sys/bus/usb/drivers/$TXDRV/bind >/dev/null 2>&1 [ -n "$RXDRV" ] && echo "$RXS:1.0" | sudo tee /sys/bus/usb/drivers/$RXDRV/bind >/dev/null 2>&1 sleep 2 @@ -41,13 +41,13 @@ trap cleanup EXIT echo "$TXS:1.0" | sudo tee /sys/bus/usb/drivers/$TXDRV/unbind >/dev/null 2>&1; sleep 1 echo "=== starting $TXPID beacon flood on ch$CH ===" sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0x$TXPID DEVOURER_CHANNEL=$CH \ - stdbuf -oL timeout -k 5 "$SECS" "${TXBIN:-build/WiFiDriverTxDemo}" >/tmp/eu_rxval_tx.log 2>&1 & + stdbuf -oL timeout -k 5 "$SECS" "${TXBIN:-build/txdemo}" >/tmp/eu_rxval_tx.log 2>&1 & sleep 6 # let TX come up before RX starts listening # --- run RX DUT --- echo "=== running RX DUT ($RXPID) on ch$CH ===" sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0x$RXPID DEVOURER_CHANNEL=$CH \ - stdbuf -oL -eL timeout -k 5 $((SECS-7)) "${RXBIN:-build/WiFiDriverDemo}" 2>&1 \ + stdbuf -oL -eL timeout -k 5 $((SECS-7)) "${RXBIN:-build/rxdemo}" 2>&1 \ | tee /tmp/eu_rxval_rx.log | grep -iE "IQK done|RX pkt|tx-hit|entering RX" | sed 's/^/[rx] /' echo "==================== RESULT ====================" diff --git a/tests/eu_tx_sdr_check.sh b/tests/eu_tx_sdr_check.sh index 097d104..57f0eeb 100755 --- a/tests/eu_tx_sdr_check.sh +++ b/tests/eu_tx_sdr_check.sh @@ -15,18 +15,18 @@ run_tx() { # $1=pid $2=sysfs $3=driver $4=label local pid=$1 sys=$2 drv=$3 label=$4 [ -n "$drv" ] && { echo "$sys:1.0" | sudo tee /sys/bus/usb/drivers/$drv/unbind >/dev/null 2>&1; sleep 1; } sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0x$pid DEVOURER_CHANNEL=$CH DEVOURER_TX_RATE=MCS7/20 \ - stdbuf -oL timeout -k 5 $((SECS+4)) build/WiFiDriverTxDemo >/tmp/eutx_$label.log 2>&1 & + stdbuf -oL timeout -k 5 $((SECS+4)) build/txdemo >/tmp/eutx_$label.log 2>&1 & local txpid=$! sleep 4 echo "--- $label TX duty @ ${FREQ}Hz ---" sudo $PY tests/sdr_duty.py --freq $FREQ --secs $SECS --mcs 7 --bw 20 2>&1 | grep -iE "duty|mbps|noise|error" | head - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; wait $txpid 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null; wait $txpid 2>/dev/null [ -n "$drv" ] && echo "$sys:1.0" | sudo tee /sys/bus/usb/drivers/$drv/bind >/dev/null 2>&1 sleep 2 echo " ($label sends: $(grep -c 'rc=1\|bulk_send.*OK' /tmp/eutx_$label.log), fails: $(grep -c 'Failed to send' /tmp/eutx_$label.log))" } -trap 'sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null' EXIT +trap 'sudo pkill -9 -x txdemo 2>/dev/null' EXIT [ -n "$CUS" ] && run_tx c812 "$CUS" rtw88_8822cu CU-control [ -n "$EUS" ] && run_tx a81a "$EUS" "" EU echo "Done. duty >> noise = radiates; duty ~ noise = dark front-end." diff --git a/tests/eu_txagc_regdiff.sh b/tests/eu_txagc_regdiff.sh index 2d95d71..91a36ba 100644 --- a/tests/eu_txagc_regdiff.sh +++ b/tests/eu_txagc_regdiff.sh @@ -17,7 +17,7 @@ OUT=/tmp/eu_regdiff mkdir -p $OUT cleanup(){ - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null sudo pkill -9 -f kernel_tx_inject 2>/dev/null sudo pkill -9 -f "cat /sys/kernel/debug/usb/usbmon" 2>/dev/null } @@ -54,7 +54,7 @@ sudo timeout 20 cat /sys/kernel/debug/usb/usbmon/$BUS > $OUT/d_raw.txt & CAP=$! sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xa81a DEVOURER_CHANNEL=36 \ DEVOURER_TX_RATE=MCS7 DEVOURER_TX_GAP_US=2000 \ - stdbuf -oL timeout -k 3 8 build/WiFiDriverTxDemo >/dev/null 2>&1 || true + stdbuf -oL timeout -k 3 8 build/txdemo >/dev/null 2>&1 || true sudo kill $CAP 2>/dev/null; wait $CAP 2>/dev/null echo "" diff --git a/tests/eu_txpwr_ab.sh b/tests/eu_txpwr_ab.sh index 515c582..7930804 100755 --- a/tests/eu_txpwr_ab.sh +++ b/tests/eu_txpwr_ab.sh @@ -7,10 +7,10 @@ set -u KMOD=rtl88x2eu_ohd HUB=3-2.3 FREQ=5180e6 -cleanup(){ sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null; } +cleanup(){ sudo pkill -9 -x txdemo 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null; } trap cleanup EXIT -cycle(){ sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null +cycle(){ sudo pkill -9 -x txdemo 2>/dev/null; sudo pkill -9 -f kernel_tx_inject 2>/dev/null sudo rmmod $KMOD 2>/dev/null; sleep 1; sudo uhubctl -l $HUB -a cycle >/dev/null 2>&1; sleep 4; } sweep(){ # prints "8:xx 10:xx 12:xx 14:xx" @@ -31,10 +31,10 @@ meas_devourer(){ cycle sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xa81a DEVOURER_CHANNEL=36 \ DEVOURER_TX_RATE=MCS7 DEVOURER_TX_GAP_US=0 DEVOURER_TX_PAYLOAD_BYTES=1465 \ - stdbuf -oL timeout -k 5 30 build/WiFiDriverTxDemo >/dev/null 2>&1 & + stdbuf -oL timeout -k 5 30 build/txdemo >/dev/null 2>&1 & sleep 5 echo " devourer:$(sweep)" - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; sleep 1 + sudo pkill -9 -x txdemo 2>/dev/null; sleep 1 } meas_kernel(){ diff --git a/tests/eu_txref_test.sh b/tests/eu_txref_test.sh index 87e87b2..110f062 100755 --- a/tests/eu_txref_test.sh +++ b/tests/eu_txref_test.sh @@ -5,7 +5,7 @@ # sudo tests/eu_txref_test.sh set -u PY=${PY:-python3}; EU_VID=0x0bda; EU_PID=0xa81a; CH=6; FREQ=2437e6; SECS=5 -cleanup(){ sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; } +cleanup(){ sudo pkill -9 -x txdemo 2>/dev/null; } trap cleanup EXIT sudo rmmod rtl88x2eu_ohd 2>/dev/null @@ -13,7 +13,7 @@ cell() { # $1=label $2=extra-env cleanup; sleep 2 sudo env DEVOURER_VID=$EU_VID DEVOURER_PID=$EU_PID DEVOURER_CHANNEL=$CH \ DEVOURER_TX_RATE=MCS7 DEVOURER_TX_GAP_US=0 DEVOURER_RFDUMP=1 $2 \ - stdbuf -oL timeout -k 5 $((SECS+5)) build/WiFiDriverTxDemo \ + stdbuf -oL timeout -k 5 $((SECS+5)) build/txdemo \ >/tmp/txref_$1.log 2>&1 & sleep 5 echo "--- $1 ($2) ---" diff --git a/tests/eu_usbmon_capture.sh b/tests/eu_usbmon_capture.sh index 86455e4..3cc16ef 100755 --- a/tests/eu_usbmon_capture.sh +++ b/tests/eu_usbmon_capture.sh @@ -12,7 +12,7 @@ cleanup(){ sudo pkill -9 -f "cat $MON" 2>/dev/null; } trap cleanup EXIT # Start fresh: unload driver so we capture a clean cold init. -sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null +sudo pkill -9 -x txdemo 2>/dev/null for i in $(ls /sys/class/net | grep -E "^wl"); do sudo ip link set "$i" down 2>/dev/null; done sudo rmmod rtl88x2eu_ohd 2>/dev/null; sleep 2 diff --git a/tests/eu_usbmon_devourer.sh b/tests/eu_usbmon_devourer.sh index aea1cbe..3e0713d 100755 --- a/tests/eu_usbmon_devourer.sh +++ b/tests/eu_usbmon_devourer.sh @@ -4,14 +4,14 @@ # sudo tests/eu_usbmon_devourer.sh set -u BUS=3; MON=/sys/kernel/debug/usb/usbmon/${BUS}u; RAW=/tmp/eu_dev_usbmon.txt -cleanup(){ sudo pkill -9 -f "cat $MON" 2>/dev/null; sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null; } +cleanup(){ sudo pkill -9 -f "cat $MON" 2>/dev/null; sudo pkill -9 -x txdemo 2>/dev/null; } trap cleanup EXIT for i in $(ls /sys/class/net | grep -E "^wl"); do sudo ip link set "$i" down 2>/dev/null; done sudo rmmod rtl88x2eu_ohd 2>/dev/null; sleep 2 sudo cat "$MON" > "$RAW" 2>/dev/null & sleep 1 sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xa81a DEVOURER_CHANNEL=36 \ - DEVOURER_TX_RATE=MCS7 stdbuf -oL timeout -k 5 10 build/WiFiDriverTxDemo \ + DEVOURER_TX_RATE=MCS7 stdbuf -oL timeout -k 5 10 build/txdemo \ >/tmp/eu_dev_tx.log 2>&1 sleep 1 cleanup diff --git a/tests/fade_sla_onair.sh b/tests/fade_sla_onair.sh index c8f3c79..a0186b7 100644 --- a/tests/fade_sla_onair.sh +++ b/tests/fade_sla_onair.sh @@ -2,7 +2,7 @@ # Fade-SLA validation — does devourer's adaptive controller hold the delivery SLA # under time-correlated fading? # -# Runs the closed loop (8812 VTX <-> 8821 VRX, both StreamDuplexDemo driven by +# Runs the closed loop (8812 VTX <-> 8821 VRX, both duplex driven by # adaptive_link.py) TWICE under a B210 interferer at the SAME gain: once STATIC, # once FADING (--fade-coherence). It then compares the VRX's post-seq delivery # (the `deliv=` field of ). The hypothesis, from the linklab sim, is @@ -31,7 +31,7 @@ declare -A VTX_LOG=( [static]=/tmp/fade_sla_vtx_static.log [fading]=/tmp/fade_sl INTF_LOG=/tmp/fade_sla_intf.log KILL(){ sudo pkill -9 -f adaptive_link 2>/dev/null - sudo pkill -9 StreamDuplexD 2>/dev/null + sudo pkill -9 duplex 2>/dev/null sudo pkill -9 -f sdr_interferer 2>/dev/null; } trap KILL EXIT @@ -55,11 +55,11 @@ run_phase(){ # $1=label $2..=extra sdr_interferer args sleep 8 sudo env DEVOURER_VID=$VRX_VID DEVOURER_PID=$VRX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vrx --pid $VRX_PID --channel $CH \ - --vtx-id $VTX_ID --duplex "$ROOT/build/StreamDuplexDemo" >"${VRX_LOG[$label]}" 2>&1 & + --vtx-id $VTX_ID --duplex "$ROOT/build/duplex" >"${VRX_LOG[$label]}" 2>&1 & sleep 4 sudo env DEVOURER_VID=$VTX_VID DEVOURER_PID=$VTX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vtx --pid $VTX_PID --channel $CH \ - --vtx-id $VTX_ID --video "$VIDEO" --duplex "$ROOT/build/StreamDuplexDemo" \ + --vtx-id $VTX_ID --video "$VIDEO" --duplex "$ROOT/build/duplex" \ >"${VTX_LOG[$label]}" 2>&1 & # wait for the session to establish (rendezvous) before the measurement window for _ in $(seq 1 20); do diff --git a/tests/fused_fec_headtohead.sh b/tests/fused_fec_headtohead.sh index 890e39f..18a7c27 100644 --- a/tests/fused_fec_headtohead.sh +++ b/tests/fused_fec_headtohead.sh @@ -43,7 +43,7 @@ RAW=/tmp/h2h_chip_raw.log CAP=/tmp/h2h_sdr.cf32 BODIES=/tmp/h2h_bodies.bin -KILL(){ sudo pkill -9 StreamTxDem 2>/dev/null; sudo pkill -9 WiFiDriverDem 2>/dev/null +KILL(){ sudo pkill -9 streamtx 2>/dev/null; sudo pkill -9 rxdemo 2>/dev/null sudo pkill -9 -f tools_record_iq 2>/dev/null; sudo pkill -9 -f fused_fec 2>/dev/null; } trap KILL EXIT @@ -77,14 +77,14 @@ echo "[h2h] TX bodies: $(wc -c <"$BODIES") bytes rate=$TX_RATE pwr=$TX_PWR_OVER : > "$RAW" sudo env DEVOURER_VID=$RX_VID DEVOURER_PID=$RX_PID DEVOURER_CHANNEL=$CH \ DEVOURER_STREAM_OUT=1 DEVOURER_RX_KEEP_CORRUPTED=1 \ - timeout $((SECS + 25)) "$ROOT/build/WiFiDriverDemo" >"$RAW" 2>/dev/null & + timeout $((SECS + 25)) "$ROOT/build/rxdemo" >"$RAW" 2>/dev/null & sleep 8 # chip init (open + reset + monitor up) # --- TX (8812): marginal MCS7, background, for the window --- echo "[h2h] TX + simultaneous chip-RX & B210-record ..." sudo env DEVOURER_VID=$TX_VID DEVOURER_PID=$TX_PID DEVOURER_CHANNEL=$CH \ DEVOURER_TX_RATE=$TX_RATE DEVOURER_TX_PWR_OVERRIDE=$TX_PWR_OVERRIDE \ - timeout "$SECS" "$ROOT/build/StreamTxDemo" < "$BODIES" >/tmp/h2h_tx.log 2>&1 & + timeout "$SECS" "$ROOT/build/streamtx" < "$BODIES" >/tmp/h2h_tx.log 2>&1 & sleep 2 # let TX ramp # --- SDR RX (B210): record IQ mid-window (foreground; both others are live) --- @@ -97,7 +97,7 @@ else fi # let TX finish, then stop the chip RX -sleep $((SECS)); sudo pkill -9 StreamTxDem 2>/dev/null; sudo pkill -9 WiFiDriverDem 2>/dev/null +sleep $((SECS)); sudo pkill -9 streamtx 2>/dev/null; sudo pkill -9 rxdemo 2>/dev/null sleep 1 # ===================== offline analysis (same FEC params) ===================== diff --git a/tests/fused_fec_onair.sh b/tests/fused_fec_onair.sh index 7229818..522d251 100644 --- a/tests/fused_fec_onair.sh +++ b/tests/fused_fec_onair.sh @@ -14,7 +14,7 @@ # "partially corrupt" — it kills DETECTION (preamble too weak), so the RX gets # ZERO frames. Power controls reception; MCS (and the optional interferer) # control data corruption. -# * Capture-then-offline-analyse (not a live pipe): WiFiDriverDemo → raw log, +# * Capture-then-offline-analyse (not a live pipe): rxdemo → raw log, # then fused_fec_rx reads the log. Robust + re-analysable with different FEC # params. # * Optional USRP B210 interferer (USE_INTERFERER=1, IGAIN dB) raises the noise @@ -47,7 +47,7 @@ IMODE=${IMODE:-noise} # noise | cw RAW=/tmp/fused_fec_rx_raw.log -KILL(){ sudo pkill -9 StreamTxDem 2>/dev/null; sudo pkill -9 WiFiDriverDem 2>/dev/null +KILL(){ sudo pkill -9 streamtx 2>/dev/null; sudo pkill -9 rxdemo 2>/dev/null sudo pkill -9 -f fused_fec 2>/dev/null; sudo pkill -9 -f sdr_interferer 2>/dev/null; } trap KILL EXIT @@ -88,7 +88,7 @@ fi : > "$RAW" sudo env DEVOURER_VID=$RX_VID DEVOURER_PID=$RX_PID DEVOURER_CHANNEL=$CH \ DEVOURER_STREAM_OUT=1 DEVOURER_RX_KEEP_CORRUPTED=1 \ - timeout $((SECS + 30)) "$ROOT/build/WiFiDriverDemo" >"$RAW" 2>/dev/null & + timeout $((SECS + 30)) "$ROOT/build/rxdemo" >"$RAW" 2>/dev/null & RXBG=$! sleep 8 # RX init (open + reset + monitor up) @@ -100,11 +100,11 @@ pwr_env="" $PY "$FEC/fused_fec_tx.py" --input /tmp/fused_fec_src.bin --repeat 4 $FEC_ARGS 2>/dev/null \ | sudo env DEVOURER_VID=$TX_VID DEVOURER_PID=$TX_PID DEVOURER_CHANNEL=$CH \ DEVOURER_TX_RATE=$TX_RATE $pwr_env \ - timeout "$SECS" "$ROOT/build/StreamTxDemo" >/dev/null 2>&1 + timeout "$SECS" "$ROOT/build/streamtx" >/dev/null 2>&1 sleep 3 sudo pkill -9 -f sdr_interferer 2>/dev/null -sudo pkill -9 WiFiDriverDem 2>/dev/null +sudo pkill -9 rxdemo 2>/dev/null wait "$RXBG" 2>/dev/null # Offline analysis: same FEC params, baseline vs SBI. diff --git a/tests/gen_svc_nals.py b/tests/gen_svc_nals.py index c8ba420..3ae2ca3 100644 --- a/tests/gen_svc_nals.py +++ b/tests/gen_svc_nals.py @@ -16,7 +16,7 @@ P-frames medium, enhancement frames small — so the airtime/energy and FEC accounting downstream see a realistic byte mix, not a flat one. - python3 tests/gen_svc_nals.py [GOPS] [PAYLOAD] | DEVOURER_PID=0x8812 ... ./build/SvcTxDemo + python3 tests/gen_svc_nals.py [GOPS] [PAYLOAD] | DEVOURER_PID=0x8812 ... ./build/svctx """ import struct import sys diff --git a/tests/halfduplex_baseline.sh b/tests/halfduplex_baseline.sh index 893c277..a5b26b6 100644 --- a/tests/halfduplex_baseline.sh +++ b/tests/halfduplex_baseline.sh @@ -29,7 +29,7 @@ VIDEO=/tmp/hdx_video.bin VRX_LOG=/tmp/hdx_vrx.log; VTX_LOG=/tmp/hdx_vtx.log KILL(){ sudo pkill -9 -f adaptive_link 2>/dev/null - sudo pkill -9 StreamDuplexD 2>/dev/null; } + sudo pkill -9 duplex 2>/dev/null; } trap KILL EXIT free_adapters(){ @@ -49,12 +49,12 @@ run_once(){ # $1 = feedback period ms sudo env DEVOURER_VID=$VRX_VID DEVOURER_PID=$VRX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vrx --pid $VRX_PID --channel $CH \ --vtx-id $VTX_ID --feedback-ms "$fb" \ - --duplex "$ROOT/build/StreamDuplexDemo" >"$VRX_LOG" 2>&1 & + --duplex "$ROOT/build/duplex" >"$VRX_LOG" 2>&1 & sleep 4 sudo env DEVOURER_VID=$VTX_VID DEVOURER_PID=$VTX_PID PYTHONPATH="$PREC" \ python3 "$PREC/adaptive_link.py" --role vtx --pid $VTX_PID --channel $CH \ --vtx-id $VTX_ID --video "$VIDEO" \ - --duplex "$ROOT/build/StreamDuplexDemo" >"$VTX_LOG" 2>&1 & + --duplex "$ROOT/build/duplex" >"$VTX_LOG" 2>&1 & for _ in $(seq 1 20); do grep -q 'state=SESSION' "$VRX_LOG" && break; sleep 1; done sleep "$SECS"; KILL; sleep 2 } diff --git a/tests/hop_parity_check.sh b/tests/hop_parity_check.sh index ea2f7b8..034936f 100755 --- a/tests/hop_parity_check.sh +++ b/tests/hop_parity_check.sh @@ -44,11 +44,11 @@ if [ -z "${FAMILY:-}" ]; then fi echo "family: $FAMILY (TX_PID=$TX_PID)" -cleanup() { pkill -x WiFiDriverTxDem 2>/dev/null || true; } +cleanup() { pkill -x txdemo 2>/dev/null || true; } trap cleanup EXIT INT TERM -echo "== building WiFiDriverTxDemo ==" -cmake --build "$ROOT/build" -j --target WiFiDriverTxDemo >/dev/null +echo "== building txdemo ==" +cmake --build "$ROOT/build" -j --target txdemo >/dev/null # Run the demo to: InitWrite(INIT@BW) [full], then hop to TARGET@BW via the # selected path. One full round of [INIT,TARGET] reaches TARGET last; the final @@ -62,7 +62,7 @@ run_path() { # $1 = HOP_FAST value, $2 = output file DEVOURER_HOP_OFFSET="$OFFSET" \ DEVOURER_HOP_DWELL_FRAMES=3 DEVOURER_HOP_ROUNDS=1 \ DEVOURER_HOP_FAST="$1" \ - timeout 60 "$ROOT/build/WiFiDriverTxDemo" >"$2" 2>&1 || true + timeout 60 "$ROOT/build/txdemo" >"$2" 2>&1 || true } # Extract the LAST canary block (the TARGET channel) as "REG ADDR = VALUE" lines. diff --git a/tests/hop_rx_probe.py b/tests/hop_rx_probe.py index 09b5a12..0437b39 100755 --- a/tests/hop_rx_probe.py +++ b/tests/hop_rx_probe.py @@ -3,7 +3,7 @@ Tunes a UHD device (B200/B210/LibreSDR) once to a center frequency wide enough to cover several Wi-Fi channels at the same time, then watches all of them -simultaneously while a hopping transmitter (WiFiDriverTxDemo with +simultaneously while a hopping transmitter (txdemo with DEVOURER_HOP_CHANNELS) cycles between them. Because one wideband receiver sees every hop channel at once, it can distinguish "the transmitter retuned away" from "the transmitter dropped frames" — which a narrowband receiver tuned to a diff --git a/tests/in_process_hotplug_wrap.cpp b/tests/in_process_hotplug_wrap.cpp index e5bf935..1d06631 100644 --- a/tests/in_process_hotplug_wrap.cpp +++ b/tests/in_process_hotplug_wrap.cpp @@ -38,11 +38,11 @@ // first time. Use this binary as a regression check against future // changes to HalModule's 8821 init. // -// Build (against an existing master build with libWiFiDriver.a): +// Build (against an existing master build with libdevourer.a): // // g++ -std=c++20 -O2 tests/in_process_hotplug_wrap.cpp \ // -o /tmp/in_process_hotplug_wrap \ -// -I src -I hal build/libWiFiDriver.a \ +// -I src -I hal build/libdevourer.a \ // $(pkg-config --cflags --libs libusb-1.0) -pthread // // Run (needs root for sysfs unbind + /dev/bus/usb open): diff --git a/tests/inject_beacon.py b/tests/inject_beacon.py index c23ca1f..b8d1c56 100755 --- a/tests/inject_beacon.py +++ b/tests/inject_beacon.py @@ -2,8 +2,8 @@ """Inject the canonical devourer TX-validation beacon on a kernel-driver monitor interface. -The frame mirrors txdemo/main.cpp's hardcoded beacon: a probe request with -SA = 57:42:75:05:d6:00. WiFiDriverDemo and WiFiDriverTxDemo both grep for +The frame mirrors examples/tx/main.cpp's hardcoded beacon: a probe request with +SA = 57:42:75:05:d6:00. rxdemo and txdemo both grep for this SA on RX (the `` matcher) so the same beacon works as the TX source whether the RX side is devourer or tcpdump. @@ -21,8 +21,8 @@ from scapy.all import RadioTap, Dot11, Raw, sendp -# Source MAC matches the canonical beacon SA in txdemo/main.cpp and the -# `` matcher in demo/main.cpp. Don't change without +# Source MAC matches the canonical beacon SA in examples/tx/main.cpp and the +# `` matcher in examples/rx/main.cpp. Don't change without # updating both sides. CANONICAL_SA = "57:42:75:05:d6:00" @@ -41,7 +41,7 @@ def _build_radiotap_mcs(*, mcs: int, ldpc: bool, stbc: int, bandwidth: int, its `MCS` post-field plumbing is brittle across versions. Easier to emit the bytes ourselves and prepend them as Raw. Layout: u8 version, u8 pad, u16 it_len (LE), u32 it_present (LE), u16 TX Flags, u8 MCS known, u8 MCS - flags, u8 MCS index. Total 13 bytes — matches txdemo/main.cpp's header. + flags, u8 MCS index. Total 13 bytes — matches examples/tx/main.cpp's header. """ known = 0x37 # bandwidth | mcs_idx | gi | fec_type | stbc known flags = 0 diff --git a/tests/j3_dig_penalty_sweep.sh b/tests/j3_dig_penalty_sweep.sh index 8c309ff..2e41afc 100755 --- a/tests/j3_dig_penalty_sweep.sh +++ b/tests/j3_dig_penalty_sweep.sh @@ -37,8 +37,8 @@ DUT_PID=0xa81a DUT_VID=0x0bda # 8822EU — J3 static-IGI DUT CTL_PID=0x012d CTL_VID=0x2357 # 8822BU (T3U) — J2 adaptive-IGI control cleanup() { - sudo -n pkill -x WiFiDriverDemo 2>/dev/null || true - sudo -n pkill -x WiFiDriverTxDem 2>/dev/null || true + sudo -n pkill -x rxdemo 2>/dev/null || true + sudo -n pkill -x txdemo 2>/dev/null || true sudo -n pkill -f sdr_interferer 2>/dev/null || true true } @@ -52,7 +52,7 @@ for d in "$TX_PID $TX_VID beacon-8812AU" "$DUT_PID $DUT_VID DUT-8822EU" \ done echo "== building ==" -cmake --build "$ROOT/build" -j --target WiFiDriverDemo WiFiDriverTxDemo >/dev/null || exit 1 +cmake --build "$ROOT/build" -j --target rxdemo txdemo >/dev/null || exit 1 # One RX cell against a running interferer + beacon. Echoes "hits igi_med fa_med". run_cell() { # $1=rx_pid $2=rx_vid $3=gain $4=tag @@ -67,13 +67,13 @@ run_cell() { # $1=rx_pid $2=rx_vid $3=gain $4=tag sudo -n env DEVOURER_PID="$TX_PID" DEVOURER_VID="$TX_VID" \ DEVOURER_CHANNEL="$CH" DEVOURER_TX_RATE=MCS3 DEVOURER_TX_PWR="$BEACON_PWR" \ DEVOURER_TX_GAP_US=1500 \ - timeout $((DUR + 8)) "$ROOT/build/WiFiDriverTxDemo" >/dev/null 2>&1 & + timeout $((DUR + 8)) "$ROOT/build/txdemo" >/dev/null 2>&1 & local tx=$! sleep 3 # RX under test. sudo -n env DEVOURER_PID="$rxpid" DEVOURER_VID="$rxvid" \ DEVOURER_CHANNEL="$CH" DEVOURER_RX_ENERGY_MS=500 \ - timeout "$DUR" "$ROOT/build/WiFiDriverDemo" >"$OUT/$tag.log" 2>&1 || true + timeout "$DUR" "$ROOT/build/rxdemo" >"$OUT/$tag.log" 2>&1 || true kill "$tx" 2>/dev/null; wait "$tx" 2>/dev/null kill "$jam" 2>/dev/null; wait "$jam" 2>/dev/null sudo -n pkill -f sdr_interferer 2>/dev/null diff --git a/tests/jaguar2_8821c_bringup_smoke.sh b/tests/jaguar2_8821c_bringup_smoke.sh index d5920cc..e489324 100755 --- a/tests/jaguar2_8821c_bringup_smoke.sh +++ b/tests/jaguar2_8821c_bringup_smoke.sh @@ -7,7 +7,7 @@ # Usage: sudo tests/jaguar2_8821c_bringup_smoke.sh [channel] [seconds] set -u HERE="$(cd "$(dirname "$0")" && pwd)" -DEMO="$HERE/../build/WiFiDriverDemo" +DEMO="$HERE/../build/rxdemo" VID=0x0bda PID=0xc811 CH=${1:-6} SECS=${2:-10} LOG=$(mktemp /tmp/j2-8821c.XXXX.log) restored=0 @@ -15,7 +15,7 @@ restored=0 cleanup() { [ "$restored" = 1 ] && return restored=1 - pkill -f "WiFiDriverDemo" 2>/dev/null + pkill -f "rxdemo" 2>/dev/null echo "=== restore rtw88_8821cu ===" modprobe rtw88_8821cu 2>/dev/null sleep 1 diff --git a/tests/jaguar2_8821c_bw_sdr.sh b/tests/jaguar2_8821c_bw_sdr.sh index 223d232..fe93cf3 100755 --- a/tests/jaguar2_8821c_bw_sdr.sh +++ b/tests/jaguar2_8821c_bw_sdr.sh @@ -18,7 +18,7 @@ PWR=0x2d OUT=/tmp/j2_8821c_bw_sdr rm -rf "$OUT"; mkdir -p "$OUT" -cleanup() { sudo pkill -x WiFiDriverTxDem 2>/dev/null; sudo modprobe rtw88_8821cu 2>/dev/null; } +cleanup() { sudo pkill -x txdemo 2>/dev/null; sudo modprobe rtw88_8821cu 2>/dev/null; } trap cleanup EXIT probe() { # label freq @@ -36,13 +36,13 @@ run_bw() { # bw offset ch freq label timeout 24 sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xc811 DEVOURER_CHANNEL=$CH \ ${BW:+DEVOURER_HOP_BW=$BW} ${OFF:+DEVOURER_HOP_OFFSET=$OFF} \ DEVOURER_TX_RATE=MCS1${BW:+/$BW} DEVOURER_TX_GAP_US=0 DEVOURER_TX_PWR=$PWR \ - ./build/WiFiDriverTxDemo >"$OUT/dev_${LBL}.log" 2>&1 & + ./build/txdemo >"$OUT/dev_${LBL}.log" 2>&1 & sleep 10 # power-on -> DLFW -> init -> TX flooding if grep -q 'ready for TX' "$OUT/dev_${LBL}.log"; then break; fi - echo " (try $try: bring-up failed, retrying)"; sudo pkill -x WiFiDriverTxDem 2>/dev/null; wait 2>/dev/null + echo " (try $try: bring-up failed, retrying)"; sudo pkill -x txdemo 2>/dev/null; wait 2>/dev/null done probe "$LBL" "$FREQ" - sudo pkill -x WiFiDriverTxDem 2>/dev/null; wait 2>/dev/null; sleep 1 + sudo pkill -x txdemo 2>/dev/null; wait 2>/dev/null; sleep 1 } echo "[bw-sdr] baseline (no TX) @ 5755MHz" diff --git a/tests/jaguar2_8821c_bw_txhit.sh b/tests/jaguar2_8821c_bw_txhit.sh index 1d65c6c..83f22d2 100755 --- a/tests/jaguar2_8821c_bw_txhit.sh +++ b/tests/jaguar2_8821c_bw_txhit.sh @@ -12,8 +12,8 @@ # Usage: sudo tests/jaguar2_8821c_bw_txhit.sh <40|80> [channel] [seconds] set -u HERE="$(cd "$(dirname "$0")" && pwd)" -RXDEMO="$HERE/../build/WiFiDriverDemo" -TXDEMO="$HERE/../build/WiFiDriverTxDemo" +RXDEMO="$HERE/../build/rxdemo" +TXDEMO="$HERE/../build/txdemo" DIR=${1:-rx} BW=${2:-40} CH=${3:-1} SECS=${4:-15} C811_VID=0x0bda C811_PID=0xc811 # CF-811AC (8821C) T3U_VID=0x2357 T3U_PID=0x012d # T3U (8822B, known-good wide TX) @@ -27,8 +27,8 @@ restored=0 cleanup() { [ "$restored" = 1 ] && return restored=1 - pkill -f WiFiDriverTxDemo 2>/dev/null - pkill -f WiFiDriverDemo 2>/dev/null + pkill -f txdemo 2>/dev/null + pkill -f rxdemo 2>/dev/null sleep 1 modprobe rtw88_8821cu rtw88_8822bu 2>/dev/null echo "=== kernel drivers restored ===" diff --git a/tests/jaguar2_8821c_rx_txhit.sh b/tests/jaguar2_8821c_rx_txhit.sh index d7a2433..0a078c5 100755 --- a/tests/jaguar2_8821c_rx_txhit.sh +++ b/tests/jaguar2_8821c_rx_txhit.sh @@ -8,8 +8,8 @@ # Usage: sudo tests/jaguar2_8821c_rx_txhit.sh [channel] [seconds] set -u HERE="$(cd "$(dirname "$0")" && pwd)" -RXDEMO="$HERE/../build/WiFiDriverDemo" -TXDEMO="$HERE/../build/WiFiDriverTxDemo" +RXDEMO="$HERE/../build/rxdemo" +TXDEMO="$HERE/../build/txdemo" CH=${1:-1} SECS=${2:-15} TX_VID=0x2357 TX_PID=0x012d # T3U (8822B) transmitter RX_VID=0x0bda RX_PID=0xc811 # CF-811AC (8821C) receiver @@ -19,8 +19,8 @@ restored=0 cleanup() { [ "$restored" = 1 ] && return restored=1 - pkill -f WiFiDriverTxDemo 2>/dev/null - pkill -f WiFiDriverDemo 2>/dev/null + pkill -f txdemo 2>/dev/null + pkill -f rxdemo 2>/dev/null sleep 1 modprobe rtw88_8821cu 2>/dev/null modprobe rtw88_8822bu 2>/dev/null diff --git a/tests/jaguar2_8821c_tx_txhit.sh b/tests/jaguar2_8821c_tx_txhit.sh index 6dcd0da..14d77e7 100755 --- a/tests/jaguar2_8821c_tx_txhit.sh +++ b/tests/jaguar2_8821c_tx_txhit.sh @@ -7,8 +7,8 @@ # Usage: sudo tests/jaguar2_8821c_tx_txhit.sh [channel] [seconds] set -u HERE="$(cd "$(dirname "$0")" && pwd)" -RXDEMO="$HERE/../build/WiFiDriverDemo" -TXDEMO="$HERE/../build/WiFiDriverTxDemo" +RXDEMO="$HERE/../build/rxdemo" +TXDEMO="$HERE/../build/txdemo" CH=${1:-1} SECS=${2:-15} TX_VID=0x0bda TX_PID=0xc811 # CF-811AC (8821C) transmitter RX_VID=0x2357 RX_PID=0x0120 # T2U-Plus 8821AU (Jaguar1) receiver @@ -18,8 +18,8 @@ restored=0 cleanup() { [ "$restored" = 1 ] && return restored=1 - pkill -f WiFiDriverTxDemo 2>/dev/null - pkill -f WiFiDriverDemo 2>/dev/null + pkill -f txdemo 2>/dev/null + pkill -f rxdemo 2>/dev/null sleep 1 modprobe rtw88_8821cu rtw88_8821au 2>/dev/null echo "=== kernel drivers restored ===" diff --git a/tests/jaguar2_8822b_rx_smoke.sh b/tests/jaguar2_8822b_rx_smoke.sh index a94dba3..624c0e6 100755 --- a/tests/jaguar2_8822b_rx_smoke.sh +++ b/tests/jaguar2_8822b_rx_smoke.sh @@ -5,7 +5,7 @@ # RtlJaguar2Device and (b) decodes live 802.11 frames. set -u HERE="$(cd "$(dirname "$0")" && pwd)" -DEMO="$HERE/../build/WiFiDriverDemo" +DEMO="$HERE/../build/rxdemo" VID=0x2357 PID=0x012d CH=${1:-6} SECS=${2:-8} LOG=$(mktemp /tmp/j2-8822b-rx.XXXX.log) restored=0 @@ -13,7 +13,7 @@ restored=0 cleanup() { [ "$restored" = 1 ] && return restored=1 - pkill -f "WiFiDriverDemo" 2>/dev/null + pkill -f "rxdemo" 2>/dev/null # T3U had no kernel driver bound at start; nothing to restore. Re-probe in # case a driver auto-binds after the device resets. sleep 1 diff --git a/tests/jaguar2_bw_sdr.sh b/tests/jaguar2_bw_sdr.sh index c26b1ad..3075735 100644 --- a/tests/jaguar2_bw_sdr.sh +++ b/tests/jaguar2_bw_sdr.sh @@ -14,7 +14,7 @@ NS=4e6 OUT=/tmp/j2_bw_sdr rm -rf "$OUT"; mkdir -p "$OUT" -cleanup() { sudo pkill -x WiFiDriverTxDem 2>/dev/null; } +cleanup() { sudo pkill -x txdemo 2>/dev/null; } trap cleanup EXIT recover() { @@ -39,10 +39,10 @@ run_bw() { # bw offset ch freq label timeout 26 sudo env DEVOURER_VID=0x2357 DEVOURER_PID=0x012d DEVOURER_CHANNEL=$CH \ ${BW:+DEVOURER_HOP_BW=$BW} ${OFF:+DEVOURER_HOP_OFFSET=$OFF} \ DEVOURER_TX_RATE=MCS1${BW:+/$BW} DEVOURER_TX_GAP_US=0 \ - ./build/WiFiDriverTxDemo >"$OUT/dev_${LBL}.log" 2>&1 & + ./build/txdemo >"$OUT/dev_${LBL}.log" 2>&1 & sleep 12 # power-on -> DLFW -> init -> TX flooding probe "$LBL" "$FREQ" - sudo pkill -x WiFiDriverTxDem 2>/dev/null; wait 2>/dev/null; sleep 1 + sudo pkill -x txdemo 2>/dev/null; wait 2>/dev/null; sleep 1 } run_bw "" "" 149 5745e6 bw20 # 20 MHz (no HOP_BW) diff --git a/tests/jaguar2_tx_bw40.sh b/tests/jaguar2_tx_bw40.sh index 9903652..fbbe4ec 100644 --- a/tests/jaguar2_tx_bw40.sh +++ b/tests/jaguar2_tx_bw40.sh @@ -12,7 +12,7 @@ SNIFF_IF=${SNIFF_IF:-wlp4s0u2u4} # 8822cu (supports 5G + HT40) CANON=57:42:75:05:d6:00 DUR=${DUR:-16} -cleanup() { sudo pkill -f "tcpdump -i $SNIFF_IF" 2>/dev/null; sudo pkill -x WiFiDriverTxDem 2>/dev/null; } +cleanup() { sudo pkill -f "tcpdump -i $SNIFF_IF" 2>/dev/null; sudo pkill -x txdemo 2>/dev/null; } trap cleanup EXIT echo "[bw40] recovering T3U first" @@ -43,7 +43,7 @@ HOPBW=${HOPBW:-40} # devourer TX bandwidth (40 or 80) echo "[bw40] TX ch$CH bw$HOPBW offset$OFFSET rate $RATE" timeout "$DUR" sudo env DEVOURER_VID=0x2357 DEVOURER_PID=0x012d DEVOURER_CHANNEL=$CH \ DEVOURER_HOP_BW=$HOPBW DEVOURER_HOP_OFFSET=$OFFSET DEVOURER_TX_RATE=$RATE \ - ./build/WiFiDriverTxDemo >/tmp/j2_bw40_demo.txt 2>&1 || true + ./build/txdemo >/tmp/j2_bw40_demo.txt 2>&1 || true sleep 2 echo "=== rf18/bw: $(grep -oE 'channel set ch=[0-9]+ bw=[0-9]+ .rf18=0x[0-9a-f]+' /tmp/j2_bw40_demo.txt | head -1) ===" echo "=== sent: $(grep -c bulk_send /tmp/j2_bw40_demo.txt) ===" diff --git a/tests/jaguar2_tx_onair.sh b/tests/jaguar2_tx_onair.sh index dd0ffe3..5528699 100755 --- a/tests/jaguar2_tx_onair.sh +++ b/tests/jaguar2_tx_onair.sh @@ -16,7 +16,7 @@ DUR=${DUR:-10} cleanup() { sudo pkill -f "tcpdump -i $SNIFF_IF" 2>/dev/null - sudo pkill -x WiFiDriverTxDem 2>/dev/null + sudo pkill -x txdemo 2>/dev/null } trap cleanup EXIT @@ -45,7 +45,7 @@ sudo timeout $((DUR + 3)) tcpdump -i "$SNIFF_IF" -nn -e -c 20 \ SNIFF_PID=$! sleep 1 -echo "[tx] starting WiFiDriverTxDemo (ch$CH rate $RATE)" +echo "[tx] starting txdemo (ch$CH rate $RATE)" timeout "$DUR" sudo stdbuf -oL env \ DEVOURER_VID=0x2357 DEVOURER_PID=0x012d DEVOURER_CHANNEL=$CH \ DEVOURER_TX_RATE=$RATE ${DEVOURER_TX_PWR:+DEVOURER_TX_PWR=$DEVOURER_TX_PWR} \ @@ -53,7 +53,7 @@ timeout "$DUR" sudo stdbuf -oL env \ ${DEVOURER_TX_COEX_LOOP:+DEVOURER_TX_COEX_LOOP=$DEVOURER_TX_COEX_LOOP} \ ${DEVOURER_RFE:+DEVOURER_RFE=$DEVOURER_RFE} \ ${DEVOURER_TX_PWR_OVERRIDE:+DEVOURER_TX_PWR_OVERRIDE=$DEVOURER_TX_PWR_OVERRIDE} \ - ./build/WiFiDriverTxDemo >/tmp/j2_tx_demo.txt 2>&1 || true + ./build/txdemo >/tmp/j2_tx_demo.txt 2>&1 || true wait $SNIFF_PID 2>/dev/null echo "=== TX demo tail ==="; grep -iE 'bulk|TX|ready for TX|error|send' /tmp/j2_tx_demo.txt | tail -5 diff --git a/tests/jaguar3_cold_capture.sh b/tests/jaguar3_cold_capture.sh index 4fe1362..e346aa7 100755 --- a/tests/jaguar3_cold_capture.sh +++ b/tests/jaguar3_cold_capture.sh @@ -41,7 +41,7 @@ sudo sh -c "cat /sys/kernel/debug/usb/usbmon/${BUS}u > ${OUT}.raw" & sleep 0.4 sudo env $EXTRA DEVOURER_VID=0x0bda DEVOURER_PID=0xc812 \ - DEVOURER_CHANNEL=36 stdbuf -oL -eL timeout 9 build/WiFiDriverDemo \ + DEVOURER_CHANNEL=36 stdbuf -oL -eL timeout 9 build/rxdemo \ > "${OUT}.log" 2>&1 sudo pkill -9 -f "usbmon/${BUS}u" 2>/dev/null diff --git a/tests/jaguar3_devourer_run.sh b/tests/jaguar3_devourer_run.sh index 1dc0dff..229ebdd 100755 --- a/tests/jaguar3_devourer_run.sh +++ b/tests/jaguar3_devourer_run.sh @@ -4,7 +4,7 @@ # binary with the Jaguar-3 family forced, optionally usbmon-capture, then rebind. # # sudo tests/jaguar3_devourer_run.sh [seconds] [usbmon_out] -# e.g. sudo tests/jaguar3_devourer_run.sh build/WiFiDriverDemo 12 /tmp/j3_dev.txt +# e.g. sudo tests/jaguar3_devourer_run.sh build/rxdemo 12 /tmp/j3_dev.txt set -u # Auto-detect the c812's sysfs node by PID (it moves between USB ports across @@ -29,7 +29,7 @@ HUBLOC=${SYS%.*} # 3-2.4 -> 3-2 (uhubctl hub location) HUBPORT=${SYS##*.} # 3-2.4 -> 4 (uhubctl port number) echo "[harness] c812 at $SYS (uhubctl $HUBLOC port $HUBPORT)" DRV=rtw88_8822cu -BIN=${1:-build/WiFiDriverDemo} +BIN=${1:-build/rxdemo} SECS=${2:-12} MONOUT=${3:-} COMM=$(basename "$BIN" | cut -c1-15) # /proc comm is truncated to 15 chars diff --git a/tests/jaguar3_eu_5mhz_mirror_ab.sh b/tests/jaguar3_eu_5mhz_mirror_ab.sh index 1845cb3..5283dad 100755 --- a/tests/jaguar3_eu_5mhz_mirror_ab.sh +++ b/tests/jaguar3_eu_5mhz_mirror_ab.sh @@ -40,7 +40,7 @@ run_case() { # name nb_bw nb_dac('' = default) # PSD at bench distance. sudo PID=a81a DEVOURER_CHANNEL="$CHANNEL" DEVOURER_NB_BW="$bw" \ DEVOURER_NB_DAC="$dacovr" DEVOURER_TX_PWR="${TX_PWR:-0x3f}" SECS=24 \ - tests/jaguar3_devourer_run.sh build/WiFiDriverTxDemo 24 \ + tests/jaguar3_devourer_run.sh build/txdemo 24 \ > "$OUT/dev_${name}.log" 2>&1 & local H=$! sleep 11 # power-on -> DLFW -> init -> narrowband re-clock -> TX diff --git a/tests/jaguar3_eu_nb_dac_sweep.sh b/tests/jaguar3_eu_nb_dac_sweep.sh index 9ce4eb0..500ce02 100755 --- a/tests/jaguar3_eu_nb_dac_sweep.sh +++ b/tests/jaguar3_eu_nb_dac_sweep.sh @@ -33,7 +33,7 @@ for CODE in $CODES; do echo "=== NB_BW=${NB_BW} DAC code ${CODE} ===" sudo PID=a81a DEVOURER_CHANNEL="$CHANNEL" DEVOURER_NB_BW="$NB_BW" \ DEVOURER_NB_DAC="$CODE" DEVOURER_TX_PWR="${TX_PWR:-0x3f}" SECS=24 \ - tests/jaguar3_devourer_run.sh build/WiFiDriverTxDemo 24 \ + tests/jaguar3_devourer_run.sh build/txdemo 24 \ > "$OUT/dev_${CODE}.log" 2>&1 & H=$! sleep 11 diff --git a/tests/jaguar3_narrowband_sdr.sh b/tests/jaguar3_narrowband_sdr.sh index 7b3f33e..0ee9260 100755 --- a/tests/jaguar3_narrowband_sdr.sh +++ b/tests/jaguar3_narrowband_sdr.sh @@ -39,7 +39,7 @@ for BW in 20 10 5; do sudo PID="${PID:-c812}" DEVOURER_CHANNEL="$CHANNEL" DEVOURER_NB_BW="$BW" \ DEVOURER_TX_PWR="${TX_PWR:-}" \ SECS=24 tests/jaguar3_devourer_run.sh \ - build/WiFiDriverTxDemo 24 > "$OUT/dev_${BW}.log" 2>&1 & + build/txdemo 24 > "$OUT/dev_${BW}.log" 2>&1 & H=$! sleep 11 # power-on -> DLFW -> replay -> narrowband re-clock -> TX probe "tx${BW}" "$OUT/tx_${BW}.npy" diff --git a/tests/jaguar3_rx_usbmon.sh b/tests/jaguar3_rx_usbmon.sh index c33c07a..da97609 100755 --- a/tests/jaguar3_rx_usbmon.sh +++ b/tests/jaguar3_rx_usbmon.sh @@ -20,8 +20,8 @@ MON=/sys/kernel/debug/usb/usbmon/${RXBUS}u echo "[harness] TX 8812AU=$TXS RX c812=$RXS (bus $RXBUS dev $RXDEV)" cleanup() { - sudo pkill -9 -x WiFiDriverTxDem 2>/dev/null - sudo pkill -9 -x WiFiDriverDemo 2>/dev/null + sudo pkill -9 -x txdemo 2>/dev/null + sudo pkill -9 -x rxdemo 2>/dev/null sudo pkill -9 -f "cat $MON" 2>/dev/null echo "$TXS:1.0" | sudo tee /sys/bus/usb/drivers/rtw88_8812au/bind >/dev/null 2>&1 echo "$RXS:1.0" | sudo tee /sys/bus/usb/drivers/rtw88_8822cu/bind >/dev/null 2>&1 @@ -35,11 +35,11 @@ echo "$RXS:1.0" | sudo tee /sys/bus/usb/drivers/rtw88_8822cu/unbind >/dev/null 2 sleep 1 sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0x8812 DEVOURER_CHANNEL=$CH \ - stdbuf -oL timeout -k 5 "$SECS" build/WiFiDriverTxDemo >/tmp/j3rx_tx.log 2>&1 & + stdbuf -oL timeout -k 5 "$SECS" build/txdemo >/tmp/j3rx_tx.log 2>&1 & sleep 5 sudo sh -c "cat $MON > /tmp/j3rx_mon.raw" & sleep 0.3 sudo env DEVOURER_VID=0x0bda DEVOURER_PID=0xc812 DEVOURER_CHANNEL=$CH \ - stdbuf -oL -eL timeout -k 5 $((SECS-7)) build/WiFiDriverDemo >/tmp/j3rx_rx.log 2>&1 + stdbuf -oL -eL timeout -k 5 $((SECS-7)) build/rxdemo >/tmp/j3rx_rx.log 2>&1 sudo pkill -9 -f "cat $MON" 2>/dev/null; sleep 0.3 sudo chown "$(id -u):$(id -g)" /tmp/j3rx_mon.raw 2>/dev/null || true diff --git a/tests/jaguar3_tx_onair.sh b/tests/jaguar3_tx_onair.sh index 4a9c70f..10bed23 100755 --- a/tests/jaguar3_tx_onair.sh +++ b/tests/jaguar3_tx_onair.sh @@ -26,7 +26,7 @@ echo "=== [2/3] TX: devourer transmits continuously while SDR captures ===" # Run the TX demo in the background via the standard run harness (it unbinds the # kernel driver, forces the Jaguar-3 family, and handles power-cycle recovery on # exit). Give it time to power-on + DLFW + replay before the chip starts TXing. -sudo SECS=25 tests/jaguar3_devourer_run.sh build/WiFiDriverTxDemo 25 \ +sudo SECS=25 tests/jaguar3_devourer_run.sh build/txdemo 25 \ > /tmp/j3_tx_onair_dev.log 2>&1 & HARNESS=$! sleep 10 # power-on -> DLFW -> kernel replay -> first bulk-OUT diff --git a/tests/jaguar3_tx_sniff.sh b/tests/jaguar3_tx_sniff.sh index 7cb5b54..279763a 100755 --- a/tests/jaguar3_tx_sniff.sh +++ b/tests/jaguar3_tx_sniff.sh @@ -4,7 +4,7 @@ # DUT: RTL8812CU (0bda:c812, 9-1.3) runs devourer's Jaguar-3 TX demo, # injecting the canonical beacon SA 57:42:75:05:d6:00 on ch36. # Witness: RTL8812AU (0bda:8812, 9-2) runs devourer's Jaguar-1 RX demo in -# monitor on ch36 — demo/main.cpp already prints +# monitor on ch36 — examples/rx/main.cpp already prints # when it decodes that SA. Dogfoods devourer on both ends and avoids # the RTL8814AU host-capture path entirely. # Bonus: USRP B210 in-band power at 5180 MHz. @@ -17,7 +17,7 @@ SNIFF_LOG=/tmp/j3_sniff.log DUT_LOG=/tmp/j3_dut_tx.log rm -f "$SNIFF_LOG" "$DUT_LOG" -SNIFF_COMM=$(basename build/WiFiDriverDemo | cut -c1-15) +SNIFF_COMM=$(basename build/rxdemo | cut -c1-15) cleanup() { sudo pkill -9 -x "$SNIFF_COMM" 2>/dev/null } @@ -25,7 +25,7 @@ trap cleanup EXIT echo "=== start RX sniffer: devourer on RTL8812AU (ch36 monitor) ===" sudo env DEVOURER_PID=0x8812 DEVOURER_VID=0x0bda DEVOURER_CHANNEL=36 \ - stdbuf -oL -eL build/WiFiDriverDemo > "$SNIFF_LOG" 2>&1 & + stdbuf -oL -eL build/rxdemo > "$SNIFF_LOG" 2>&1 & SNIFF=$! # Wait until the sniffer is actually in its RX loop before keying the DUT. for i in $(seq 1 20); do @@ -36,7 +36,7 @@ sleep 2 echo " sniffer up ($(wc -l < "$SNIFF_LOG") log lines)" echo "=== key DUT: devourer Jaguar-3 TX on RTL8812CU (ch36) ===" -sudo SECS=22 tests/jaguar3_devourer_run.sh build/WiFiDriverTxDemo 22 \ +sudo SECS=22 tests/jaguar3_devourer_run.sh build/txdemo 22 \ > "$DUT_LOG" 2>&1 & HARNESS=$! diff --git a/tests/link_health_onair.sh b/tests/link_health_onair.sh index 95e98e4..1e1279b 100755 --- a/tests/link_health_onair.sh +++ b/tests/link_health_onair.sh @@ -16,7 +16,7 @@ # cases calibrated from the AWGN sweep (tests/j3_dig_penalty_sweep.sh). A third # regime here injects B210 AWGN as an informational check only (no pass/fail). # -# Ground = a second devourer part running WiFiDriverDemo with +# Ground = a second devourer part running rxdemo with # DEVOURER_RX_ENERGY_MS + DEVOURER_LINKHEALTH. # # Usage: sudo -v && tests/link_health_onair.sh [tx_pid] [ground_pid] @@ -35,8 +35,8 @@ fail() { echo " FAIL: $*"; FAIL=$((FAIL+1)); } skip() { echo " SKIP: $*"; SKIP=$((SKIP+1)); } cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null || true - pkill -x WiFiDriverDemo 2>/dev/null || true + pkill -x txdemo 2>/dev/null || true + pkill -x rxdemo 2>/dev/null || true sudo -n pkill -f sdr_interferer 2>/dev/null || true true } @@ -46,7 +46,7 @@ plugged "$TX_PID" "$TX_VID" || { echo "SKIP: TX $TX_PID not plugged"; exit 0; } plugged "$GROUND_PID" "$GROUND_VID" || { echo "SKIP: ground $GROUND_PID not plugged"; exit 0; } echo "== building ==" -cmake --build "$ROOT/build" -j --target WiFiDriverDemo WiFiDriverTxDemo >/dev/null || exit 1 +cmake --build "$ROOT/build" -j --target rxdemo txdemo >/dev/null || exit 1 # Run a ground-RX window against a beacon at TX index $1 (+ optional interferer # gain in $2); echo the MODAL verdict over the window. @@ -61,15 +61,15 @@ run_regime() { # $1=tx_idx $2=jam_gain("" = none) $3=tag fi sudo -n env DEVOURER_PID="$GROUND_PID" DEVOURER_VID="$GROUND_VID" \ DEVOURER_CHANNEL="$CH" DEVOURER_RX_ENERGY_MS=500 DEVOURER_LINKHEALTH=1 \ - timeout 22 "$ROOT/build/WiFiDriverDemo" >"$OUT/$tag.log" 2>&1 & + timeout 22 "$ROOT/build/rxdemo" >"$OUT/$tag.log" 2>&1 & local gj=$! sleep 6 sudo -n env DEVOURER_PID="$TX_PID" DEVOURER_VID="$TX_VID" DEVOURER_CHANNEL="$CH" \ DEVOURER_TX_RATE=MCS3 DEVOURER_TX_PWR="$idx" DEVOURER_TX_GAP_US=1500 \ - timeout 14 "$ROOT/build/WiFiDriverTxDemo" >/dev/null 2>&1 & + timeout 14 "$ROOT/build/txdemo" >/dev/null 2>&1 & local tx=$! wait "$tx" 2>/dev/null - sudo -n pkill -x WiFiDriverDemo 2>/dev/null; wait "$gj" 2>/dev/null + sudo -n pkill -x rxdemo 2>/dev/null; wait "$gj" 2>/dev/null [ -n "$jampid" ] && { kill "$jampid" 2>/dev/null; sudo -n pkill -f sdr_interferer 2>/dev/null; } sleep 2 # Modal verdict across the window's linkhealth lines (skip the first, it can diff --git a/tests/link_probe.py b/tests/link_probe.py index b7d6356..d07873c 100755 --- a/tests/link_probe.py +++ b/tests/link_probe.py @@ -3,9 +3,9 @@ station's RX telemetry into a margin-vs-lever curve and a recommended operating point. -The emitter (WiFiDriverTxDemo with DEVOURER_CONT_TX + a DEVOURER_TX_PWR ramp) +The emitter (txdemo with DEVOURER_CONT_TX + a DEVOURER_TX_PWR ramp) prints one `index=N` marker per step; the ground station -(WiFiDriverDemo with DEVOURER_RX_ENERGY_MS) prints `` (per-frame +(rxdemo with DEVOURER_RX_ENERGY_MS) prints `` (per-frame SNR aggregate) and `` (frame-free power histogram) lines. Both are captured with a host-side arrival timestamp (prefixed ` `), so this aligns them by wall-clock — no cross-process clock sync — binning each ground sample diff --git a/tests/link_probe.sh b/tests/link_probe.sh index 9f82013..086ee49 100755 --- a/tests/link_probe.sh +++ b/tests/link_probe.sh @@ -25,8 +25,8 @@ set -u HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$HERE/.." && pwd)" -TXDEMO="$ROOT/build/WiFiDriverTxDemo" -RXDEMO="$ROOT/build/WiFiDriverDemo" +TXDEMO="$ROOT/build/txdemo" +RXDEMO="$ROOT/build/rxdemo" EMIT_VID=0x0bda EMIT_PID="" GROUND_VID=0x0bda GROUND_PID="" CHANNEL=36 RATE=MCS4 @@ -63,7 +63,7 @@ TS='import sys,time for l in sys.stdin: sys.stdout.write(f"{time.time():.3f} {l}"); sys.stdout.flush()' -cleanup() { for c in WiFiDriverTxDem WiFiDriverDemo; do pkill -x "$c" 2>/dev/null || true; done; } +cleanup() { for c in txdemo rxdemo; do pkill -x "$c" 2>/dev/null || true; done; } trap cleanup EXIT INT TERM echo "== building ==" diff --git a/tests/mrc_mobility.py b/tests/mrc_mobility.py index 0d7591b..ee7dff0 100644 --- a/tests/mrc_mobility.py +++ b/tests/mrc_mobility.py @@ -7,7 +7,7 @@ chain keeps changing, so a *fixed* single antenna repeatedly falls into nulls it can't escape while MRC fills them. This tool measures that. -It consumes a capture from `WiFiDriverDemo` run with the RX-path *toggle*: +It consumes a capture from `rxdemo` run with the RX-path *toggle*: DEVOURER_RX_PATHS=0x22:0xFF@300 # alternate chain-B-only and all-4 every 300ms DEVOURER_RX_ALLPATHS=1 # emit per-chain lines diff --git a/tests/per_mcs_power_ceiling.sh b/tests/per_mcs_power_ceiling.sh index e778b4b..75a6ffb 100755 --- a/tests/per_mcs_power_ceiling.sh +++ b/tests/per_mcs_power_ceiling.sh @@ -37,8 +37,8 @@ IDXS="${IDXS:-8 16 24 32 40 48 56 63}" mkdir -p "$OUT" cleanup() { - pkill -x WiFiDriverTxDem 2>/dev/null || true - pkill -x WiFiDriverDemo 2>/dev/null || true + pkill -x txdemo 2>/dev/null || true + pkill -x rxdemo 2>/dev/null || true true } trap cleanup EXIT INT TERM @@ -47,13 +47,13 @@ plugged "$TX_PID" "$TX_VID" || { echo "SKIP: TX $TX_PID not plugged"; exit 0; } plugged "$GROUND_PID" "$GROUND_VID" || { echo "SKIP: ground $GROUND_PID not plugged"; exit 0; } echo "== building ==" -cmake --build "$ROOT/build" -j --target WiFiDriverTxDemo WiFiDriverDemo >/dev/null || exit 1 +cmake --build "$ROOT/build" -j --target txdemo rxdemo >/dev/null || exit 1 echo "== ground RX ($GROUND_PID) up on ch$CH ==" : >"$OUT/ground.log" sudo -n env DEVOURER_PID="$GROUND_PID" DEVOURER_VID="$GROUND_VID" \ DEVOURER_CHANNEL="$CH" DEVOURER_STREAM_OUT=1 \ - stdbuf -oL timeout 1200 "$ROOT/build/WiFiDriverDemo" 2>"$OUT/ground.err" \ + stdbuf -oL timeout 1200 "$ROOT/build/rxdemo" 2>"$OUT/ground.err" \ | while IFS= read -r line; do printf '%s %s\n' "$(date +%s.%N)" "$line"; done \ >>"$OUT/ground.log" & GJ=$! @@ -65,13 +65,13 @@ for mcs in $MCSES; do t0="$(date +%s.%N)" sudo -n env DEVOURER_PID="$TX_PID" DEVOURER_VID="$TX_VID" DEVOURER_CHANNEL="$CH" \ DEVOURER_TX_RATE="$mcs" DEVOURER_TX_PWR="$idx" DEVOURER_TX_GAP_US=1500 \ - timeout 10 "$ROOT/build/WiFiDriverTxDemo" >/dev/null 2>&1 || true + timeout 10 "$ROOT/build/txdemo" >/dev/null 2>&1 || true t1="$(date +%s.%N)" echo "$mcs $idx $t0 $t1" >>"$OUT/cells.txt" sleep 1.5 done done -sudo -n pkill -x WiFiDriverDemo 2>/dev/null +sudo -n pkill -x rxdemo 2>/dev/null wait "$GJ" 2>/dev/null python3 - "$OUT/ground.log" "$OUT/cells.txt" <<'PYEOF' diff --git a/tests/precoder_roundtrip.py b/tests/precoder_roundtrip.py index 728a8d7..c0fbb6d 100644 --- a/tests/precoder_roundtrip.py +++ b/tests/precoder_roundtrip.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 """Two-adapter, no-SDR round-trip test for the precoder PoC. -TX one devourer adapter (PrecoderDemo, shaped PSDU) and RX a second devourer -adapter (WiFiDriverDemo, monitor mode) on the same channel, then check: +TX one devourer adapter (precoder, shaped PSDU) and RX a second devourer +adapter (rxdemo, monitor mode) on the same channel, then check: 1. TRANSPORT - the canonical-SA frame is received at all (hits > 0). 2. PHY RATE - it flew as 6 Mbps legacy OFDM (RX rate index == DESC_RATE6M @@ -232,8 +232,8 @@ def main(argv: "list[str] | None" = None) -> int: help="scrambler seed for auto-generation") ap.add_argument("--n-sym", type=int, default=8, help="OFDM symbols of shaped payload (auto-generation)") - ap.add_argument("--tx-bin", default=str(REPO / "build" / "PrecoderDemo")) - ap.add_argument("--rx-bin", default=str(REPO / "build" / "WiFiDriverDemo")) + ap.add_argument("--tx-bin", default=str(REPO / "build" / "precoder")) + ap.add_argument("--rx-bin", default=str(REPO / "build" / "rxdemo")) ap.add_argument("--duration", type=float, default=20.0) ap.add_argument("--rx-warmup", type=float, default=12.0, help="seconds to let the RX radio come up before TX. Some " diff --git a/tests/precoder_stream_roundtrip.py b/tests/precoder_stream_roundtrip.py index 4f45281..ec25fd2 100644 --- a/tests/precoder_stream_roundtrip.py +++ b/tests/precoder_stream_roundtrip.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 """Two-adapter byte-stream round-trip on the precoder stream link. -Streams `--bytes N` random bytes from one devourer adapter (StreamTxDemo, +Streams `--bytes N` random bytes from one devourer adapter (streamtx, fed by tools/precoder/stream_tx.py) to a second devourer adapter -(WiFiDriverDemo with DEVOURER_STREAM_OUT=1), then decodes the received +(rxdemo with DEVOURER_STREAM_OUT=1), then decodes the received lines via stream.decode_body and checks: 1. TRANSPORT — at least `--min-frames` frames decoded. @@ -19,7 +19,7 @@ pinned subcarriers"); proving the chip actually radiates those subcarriers on-air still needs an SDR / BB-dbgport observer — see tools/precoder/README.md. -Defaults match PrecoderDemo's matrix-validated cell: 2.4 GHz channel 6, +Defaults match precoder's matrix-validated cell: 2.4 GHz channel 6, RTL8812AU TX and RTL8821AU / RTL8811AU RX. RTL8814AU is out of scope (TX flakiness, issue #36). @@ -150,7 +150,7 @@ def run_test(args) -> int: rx_reader.start() time.sleep(args.rx_warmup) - # 2. TX side: stream_tx.py | StreamTxDemo, with shape/seed/offset/etc. + # 2. TX side: stream_tx.py | streamtx, with shape/seed/offset/etc. tx_env = dict(os.environ, DEVOURER_PID=args.tx_pid, DEVOURER_VID=args.tx_vid, DEVOURER_CHANNEL=str(args.channel), DEVOURER_USB_QUIET="1") pyenv = dict(os.environ) @@ -306,10 +306,10 @@ def main(argv: "list[str] | None" = None) -> int: ap.add_argument("--offset", type=int, default=None, help="scrambler-phase offset of the body (default 0 — the " "shape pins are honoured by the model but not " - "on-air; pass 208 to match PrecoderDemo placement)") + "on-air; pass 208 to match precoder placement)") ap.add_argument("--entry-state", type=lambda s: int(s, 0), default=None) - ap.add_argument("--tx-bin", default=str(REPO / "build" / "StreamTxDemo")) - ap.add_argument("--rx-bin", default=str(REPO / "build" / "WiFiDriverDemo")) + ap.add_argument("--tx-bin", default=str(REPO / "build" / "streamtx")) + ap.add_argument("--rx-bin", default=str(REPO / "build" / "rxdemo")) ap.add_argument("--interval-ms", type=int, default=2) ap.add_argument("--repeat", type=int, default=4, help="TX-side per-frame replication to combat early-frame " diff --git a/tests/precoder_stream_smoke.py b/tests/precoder_stream_smoke.py index b0ef3b2..a248e96 100644 --- a/tests/precoder_stream_smoke.py +++ b/tests/precoder_stream_smoke.py @@ -7,7 +7,7 @@ It drives the same encode → simulated-on-wire → decode path the two-adapter hardware harness uses, but synthesises the `` line that -WiFiDriverDemo would print, so no USB is involved. +rxdemo would print, so no USB is involved. The smoke covers: * byte-mode round-trip — frame the input, encode, decode, reassemble; @@ -33,7 +33,7 @@ def _frame_psdu_for_wire(body: bytes) -> bytes: - """Round-trip the StreamTxDemo wire format: length-prefixed PSDU body.""" + """Round-trip the streamtx wire format: length-prefixed PSDU body.""" return struct.pack("/dev/null - pkill -INT -x WiFiDriverTxDem 2>/dev/null - pkill -INT -x WiFiDriverDemo 2>/dev/null + pkill -INT -x txdemo 2>/dev/null + pkill -INT -x rxdemo 2>/dev/null pkill -INT -f sdr_interferer 2>/dev/null sleep 1 - pkill -KILL -x WiFiDriverTxDem 2>/dev/null - pkill -KILL -x WiFiDriverDemo 2>/dev/null + pkill -KILL -x txdemo 2>/dev/null + pkill -KILL -x rxdemo 2>/dev/null pkill -KILL -f sdr_interferer 2>/dev/null } trap cleanup EXIT INT TERM @@ -80,19 +80,19 @@ sound_slice() { #