mirror of
https://github.com/ruvnet/RuView
synced 2026-06-09 10:13:17 +00:00
d40411e6d7
Adds first-class support for the Raspberry Pi 5's WiFi chip (CYW43455 /
BCM43455c0 — the same 802.11ac wireless as the Pi 4 / Pi 3B+ / Pi 400, and the
chip with the most mature nexmon_csi support), plus a registry of the other
Nexmon-supported Broadcom/Cypress chips.
rvcsi-adapter-nexmon — new `chips.rs`:
- `NexmonChip` (Bcm43455c0, Bcm43436b0, Bcm4366c0, Bcm4375b1, Bcm4358, Bcm4339,
Unknown{chip_ver}) + `RaspberryPiModel` (Pi5/Pi4/Pi400/Pi3BPlus/PiZero2W/
PiZeroW) — Pi5/Pi4/Pi400/Pi3B+ → Bcm43455c0; PiZero2W → Bcm43436b0.
- `nexmon_adapter_profile(chip)` / `raspberry_pi_profile(model)` build the
per-device `AdapterProfile` (channels: 2.4 GHz 1-13 + 5 GHz UNII for dual-band;
bandwidths 20/40/80[/160]; expected subcarrier counts 64/128/256[/512]) that
`validate_frame` bounds CSI frames against.
- `NexmonChip::from_chip_ver` (0x4345 → Bcm43455c0, 0x4339, 0x4358, 0x4366,
0x4375 — best-effort; the raw `chip_ver` is always preserved) and `from_slug`
/ `RaspberryPiModel::from_slug` ("pi5", "raspberry pi 4", "bcm43455c0", ...).
- `NexmonCsiHeader::chip()`; `NexmonPcapAdapter` auto-detects the chip from the
packets' `chip_ver` and uses the matching profile, overridable via
`.with_chip(NexmonChip)` / `.with_pi_model(RaspberryPiModel)`; `.detected_chip()`.
rvcsi-runtime: `decode_nexmon_pcap_for(.., chip_spec)` (validate against a chip /
Pi model, drop non-conforming) + `nexmon_profile_for(spec)`; `NexmonPcapSummary`
gains `chip_names` + `detected_chip`; `CaptureSummary` gains `chip`.
rvcsi-cli: `record --source nexmon-pcap --chip pi5`; new `nexmon-chips`
subcommand (lists chips + Pi models, human or `--json`); `inspect-nexmon` and
`inspect` now print the resolved chip.
rvcsi-node (napi-rs): `nexmonDecodePcap` gains an optional `chip` arg;
`nexmonChipName(chipVer)`, `nexmonProfile(spec)`, `nexmonChips()`. @ruv/rvcsi
SDK + `.d.ts` updated (AdapterProfile / NexmonChipsListing interfaces, the new
fns, `chip` on CaptureSummary, `chip_names`/`detected_chip` on NexmonPcapSummary).
168 rvcsi tests pass (adapter-nexmon 22→28, cli 9→10), 0 failures, clippy-clean.
The synthetic test captures now stamp chip_ver = 0x4345 (the BCM4345 family chip
ID), so the chip-detection happy path is exercised end to end.
ADR-096, CHANGELOG, README, CLAUDE.md updated.
https://claude.ai/code/session_01CdYAPvRTjcch6YrYf42n1z
49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
// Structural smoke test for the @ruv/rvcsi JS surface.
|
|
//
|
|
// Importing the package never throws (the native addon loads lazily). This test
|
|
// asserts the public API shape; if the .node addon HAS been built (e.g. CI ran
|
|
// `npm run build` first), it also checks `rvcsiVersion()` returns a string —
|
|
// otherwise it asserts the error message is the helpful "not built" one.
|
|
//
|
|
// Run with: node --test (Node >= 18)
|
|
|
|
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const rvcsi = require('../index.js');
|
|
|
|
test('exports the expected functions and class', () => {
|
|
for (const fn of [
|
|
'rvcsiVersion',
|
|
'nexmonShimAbiVersion',
|
|
'nexmonDecodeRecords',
|
|
'nexmonDecodePcap',
|
|
'inspectNexmonPcap',
|
|
'decodeChanspec',
|
|
'nexmonChipName',
|
|
'nexmonProfile',
|
|
'nexmonChips',
|
|
'inspectCaptureFile',
|
|
'eventsFromCaptureFile',
|
|
'exportCaptureToRfMemory',
|
|
]) {
|
|
assert.equal(typeof rvcsi[fn], 'function', `${fn} should be a function`);
|
|
}
|
|
assert.equal(typeof rvcsi.RvCsi, 'function', 'RvCsi should be a class');
|
|
assert.equal(typeof rvcsi.RvCsi.openCaptureFile, 'function');
|
|
assert.equal(typeof rvcsi.RvCsi.openNexmonFile, 'function');
|
|
assert.equal(typeof rvcsi.RvCsi.openNexmonPcap, 'function');
|
|
});
|
|
|
|
test('native calls either work (addon built) or fail with a helpful message', () => {
|
|
try {
|
|
const v = rvcsi.rvcsiVersion();
|
|
assert.equal(typeof v, 'string');
|
|
assert.match(v, /^\d+\.\d+\.\d+/);
|
|
assert.equal(typeof rvcsi.nexmonShimAbiVersion(), 'number');
|
|
} catch (e) {
|
|
assert.match(e.message, /native addon is not built/i);
|
|
}
|
|
});
|