Repository navigation
Releases: pasqo/beebo-meshcore-fw
Releases · pasqo/beebo-meshcore-fw
Release list
Beebo 1.18.0.beebo.1.0
Install
Firmware: download heltec-v4-1.18.0.beebo.1.0.bin below and flash via USB or OTA.
beebo CLI: pip install "beebo-cli==1.18.0.1.0" (add [analysis] for plots and statistics: pip install "beebo-cli[analysis]==1.18.0.1.0").
See the docs for full usage docs.
Changelog
beebo-v1.18.0.1.0 — changes since beebo-v1.16.0.1.0:
- Discord links point to the firmware-development channel
- Console: monitor status service shows tx_direct_untracked and tx_flood_pending
- README: current to 1.18.0.1.0; docs site, PyPI, support; drop the upstream roadmap and the bibliography
- Issue forms for bug reports and feature requests; Discord contact link
- Console: battery state forces the charge classifier; shared with the binary opcode
- Console: trial start with switches, monitor capture leaf names, neighbors discover -t
- Console: advert flood and advert direct
- Console: the CLI's names for older node commands; discover.neighbors no longer reads past its terminator
- Console: check, monitor status sections, monitor clear
- Console: monitor, battery and trial commands; feed warning names the settings command
- Console: status, status node/radio/resources
- Console: the settings command (settings [value]) replaces bare tree names; 75 paths, listing of branches
- multi_role: the clock no longer follows contact timestamps
- Trial start feed line names the profile
- Trial profiles (main, exhaustive), console alias table, trial feed lines, signed get tx
- Offline queue: feed messages have priority when full
- Feeds are ordinary channels of the channel table; repeater loads the table; off-air feed and repeater chat dropped
- Repeater role reuses the companion sync handlers; monitor and trial lines on the status feed; QoS/SoH helpers shared
- Boot line on the status feed; reset reason names shared in ResetReason.h
- App feeds: slots and names in the board prefs, one role-neutral lookup, rename
- Channel code shared across roles: one message/info frame builder, one queue-and-notify, role-neutral feed input
- App feed in repeater role: offline queue for every role, feed channels, cli console, reply splitting
- Repeater role: valid empty contacts, messages and has-connection replies for the app sync
- multi_role: monring.header and monring.clear text keys; clearMonRing() shared with SET_MONRING op 2
- multi_role: remove the unreachable set af branch; the released radio parser answers it on both roles
- Meshadventurer rename: restore the v1.18.0 tag content of MeshadventurerBoard.h and target.h
- Merge upstream MeshCore v1.18.0 into multi_role: remote companion CLI, shared-core fixes, radio prefs refactor, upstream /prefs.json onboarding; bound local CLI replies
- merge-bin.py: esptool 5 command and option names (merge-bin, --flash-mode/--flash-freq/--flash-size) Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- debug env: drop the grafted gdb platform_packages entry; the platform's own gdb 17.1 and OpenOCD 0.12 are used Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- heltec_v4_r8_hybrid_prep: the R8 board's IDF libs (octal PSRAM) get their own library pass Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- offline message queue (256 frames, 44 kB) allocated from PSRAM in begin(), out of internal static RAM Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- sdkconfig: esp_timer 4096, IPC 1024, tcpip 2560 stacks (the IDF 4.4 values); frees 6-8 kB internal heap Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- rx-start-timeout event once per 8 s, with startReceive()'s error code; native Dispatcher test Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- Per-transport connect grace: BLE 3 s, others 300 ms; native FSM tests Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- Session FSM: SESSION_CLOSING waits for the owner's tx to drain before a disconnect drops the link; BLE txDrained; native FSM tests Claude-Session: https://claude.ai/code/session_015sU5mXLg8QWtTT2BwhELbh
- merge-bin.py: bootloader header flash mode from the platform helper (dio), not the board's qio
- Cancel MLOG replay on disable/NO_REPLAY enable; take STA auto-reconnect IP during TCP backoff
- SerialBLEInterface: require encryption for the TX CCCD write so a fresh pair does not race the app's first-command timeout
- custom_sdkconfig: keep BT_CTRL_BLE_MASTER on (controller rejects advertising without it); weak setup/loop in hybrid_prep
- esp32 S3 headless: custom_sdkconfig trims NimBLE/controller (free RAM after BLE init 20 -> 64 KB); hybrid_prep env; untrack generated sdkconfig.defaults
- SerialBLEInterface: port from Bluedroid to the Arduino-ESP32 3.x BLE library (NimBLE); drop BEEBO_BLE_STUB
- Arduino-ESP32 3.x: drop adcAttachPin, ESP-NOW callback signatures, esp_mac.h; BEEBO_BLE_STUB no-op BLE until the NimBLE port
- esp32_base: pioarduino platform-espressif32 55.03.312-1 (Arduino-ESP32 3.3.12, ESP-IDF 5.5.5)
- trial: a combined start from stored values takes each list's first value that differs as B (TrialSequence::skipStored)
- trial: a planned schedule starts at any rate (underpowered runs capped); the traffic tracker and plan follow the score's weighted indicators
- tx_wait_cad split by busy source (frame, rssi, hw) and busy verdict count in RouteRecord; native Dispatcher test
- Echo window 4500 ms + 6 x airtime (the 99% line of a capture is 4404 ms + 5.59 x airtime)
- Static companion build: planTrial() stub (GET_TUNING_TRIAL_PLAN calls it unguarded)
- Text CLI: get/set monring.config, the repeater slot's capture word (hex, rx path mode bit included)
- RX path mode: nbr holds the last three hops of the path, one byte each (RXREC_EXT_PATH1), set by bit 8 of monring_config
- Echo window: 4500 ms + 5 x airtime from the send (rounded from the 99% fit of a capture)
- RX ext: RXREC_EXT_VIA_US (our hash earlier in the path: a non-direct echo)
- RX record ext byte: RXREC_EXT_PREV_US (the hop before the last is our own hash), monitor format 4
- Echo attribution: a repeat of our send is its echo only with our sent path (late credit within seen_window, EVENT_ECHO_OTHER for other routes), success events stamped with the path check
- dedup_window renamed seen_window in the internals, default 30 s
- Planned trials have no rate floor: they run at any rate the schedule fits and end idle only on a silent cycle; the idle test allows counting noise
- Trial min_pkt_rate counts normalized by the largest score weight squared (plain events a minute at any weight scale)
- Trial block spread is internal: starts at c = 0.02, prior weight 3 pairs; block_spread_pct 0 = built-in, an advanced override
- Trial: min_rx_rate becomes min_pkt_rate on the score's own counts a minute (start gate for every schedule, idle stop), GET_TUNING_TRIAL_COUNT_RATE
- Trial re-plan blends the block spread: block_spread_pct is the starting guess, the trial's own c = var(d)/2 - v moves it
- Trial: the block length follows the traffic per A B B A cycle (block_size_s auto), block_count auto is the most pairs; the replan record carries the length
- GET_TUNING_TRIAL_PLAN: the schedule the node would plan now
- Trial planner: decayed-rate tracker replaces the slot ring; re-plan from the A blocks after every cycle, growth up to the cap
- ExposureTracker: plan from the counts since boot after a 10 minute pilot, slots take over later
- Trial run order: RX boost before the FEM LNA
- block_spread_pct setting event id 139 (138 is retired)
- Trial plan and noise records, block_spread_pct setting (opcodes, text command, event), underpowered outcome id
- Trial start path: plan the schedule from tracked traffic, settle guard before a switching block, defaults 0/0 and ranges for block_size_s/block_count
- TrialPlanner and ExposureTracker (host-testable), TrialFSM noise log, futility projection and SKIPPED_UNDERPOWERED outcome; native tests
- Rename the trial block settings block_size_s and block_count; the old names stay accepted by the text commands
- Refuse a changed score weight while a trial runs (ERR_CODE_BAD_STATE)
- Echo slot starts at the send, fixed window (500 + 6 x airtime + 250): echo_at_tx and echo_factor removed (setting, trial switch, TLV, storage)
- Echo slots: take a free or resolved slot before evicting a pending one, oldest first
- Echo factor persisted in /beebo_repeater (the save went to the companion file)
- Echo window factor: setting and trial switch (echo_factor 1-20, half units), upstream 750 ms baseline in both modes, window in the echo verdict events
- Companion traffic injector: Poisson arrivals gated on the node's own RX rate, sustain opcodes 87-91
- Trial default lists: rxboost 0,1; retry 0,5,5|6,5|7; delay factors 0,0.5,1,2; airtime 0.5,1,3,9
- Retry policy: rates separated by |, candidates by ,
- One retry setting: a policy byte listing the coding rate of each retry; retry_no and retry_cr go
- Score: routed, delivered, received indicators; reward weights renamed to score
- Combined trial: participants(), part record, tuning.trial.combined
- Free-running route wait accumulators; no idle gap in checkSend wait slices
- echo: a route retry is not a new confirmable attempt
- Relay the noise floor live while an MLOG stream is on
- node.transmit: per-role tx_disable, Dispatcher::checkSend() gate (BEEBO_TX_GATE), EVENT_TX_SUPPRESSED, CW refusal, text CLI; MLOG no-replay seeds the time anchor on the session path
- echo_at_tx: window is the neighbor turnaround only (no 500 ms base)
- Echo slot at the send (echo_at_tx): optional, per-packet _retryable flag, noteTx creates the slot; trial switch
- Test: stale TX state on received packets uses a direct packet so it reaches onRecvPacket
- Fix: a received packet keeps no stale TX coding rate or attempt from the pool (forward could go out at CR 8)
- Route retry: a queued retry's echo window starts when it is s...
Beebo 1.16.0.beebo.1.0
Install
Firmware: download heltec-v4-1.16.0.beebo.1.0.bin below and flash via USB or OTA.
beebo CLI: pip install -e beebo from a checkout of the private beebo-meshcore-dev repo at this tag's date.
See the docs for full usage docs.
Changelog
Initial release (beebo-v1.16.0.1.0):
- beebo: replace cached _is_repeater/_is_companion bools with live isRepeater()/isCompanion() reads of _board.role
- beebo: fix _board.role/_is_repeater desync in begin() caused by loadBeeboCompanionPrefs()'s legacy tail read
- beebo: paginate GET_PREFS_TLV, fix USB send-frame cap stuck at BLE's 176B floor
- beebo: fold role_name/board_name/owner_password/repeater_password_set/dedup_window/monring_event_mask into PREFS_TLV, renumber sub-ids
- beebo: fix stale BeeboCompanionPrefs references in board_name/owner_password docs
- beebo: fold repeater/guest password into PREFS_TLV_FIELDS, retire their SET opcodes
- beebo: retire SET_MONRING's op=3 (duplicated SET_PREFS_TLV KEY_MONRING_CONFIG)
- beebo: fold owner_info/manual_add_contacts/autoadd_config into PREFS_TLV_FIELDS, retire their opcodes
- beebo: fold board/battery BeeboBasePrefs fields into PREFS_TLV_FIELDS, retire their individual opcodes
- beebo: retire remaining PREFS_TLV_FIELDS-duplicate opcodes, rename REPEATER_ misnomers
- beebo: retire per-field GET/SET opcodes now that GET/SET_PREFS_TLV covers them
- beebo: unify live-role and explicit-role opcodes via NODE_ROLE_LIVE sentinel
- beebo: drop redundant ROLE_ prefix from GET/SET_PUBLIC_KEY (no bare collision, unlike wifi/transport)
- beebo: retire superseded per-role/companion-only opcodes, replace with unified GET/SET_(role)
- beebo: add unified GET/SET_ROLE_ opcodes for role-paired settings
- beebo: strip remaining session-narration comments from Beebo.h declarations
- beebo: add PREFS_TLV_WIFI_PWD (key 27) as an independent password field
- beebo: strip provenance/history narration from Beebo.*/BeeboRepeater.cpp comments
- beebo: strip session/plan-doc narration comments from PrefsTlv refactor
- beebo: fold getRepeaterDefaultScope() into getDefaultScope(), retire it
- beebo: add role-parameterized getDefaultScope(), collapse duplicated if-repeater branch
- beebo: finish API-uniformity rename on Role-prefixed accessors, fold BLE_PIN into PREFS_TLV_FIELDS
- beebo: rename tlv{Get|Set}{Repeater|Companion}() to tlv{Get|Set}()
- beebo: role-parameterize PREFS_TLV_FIELDS and fold Pattern C/companion-write duplicates into it
- beebo: replace getRepeaterName() with role-parameterized getRoleName()
- beebo: add BEEBO_CMD_SET_COMPANION_* opcodes, fix companion.* write gap
- beebo: fix repeater.* ComPrefs setters targeting live role instead of NODE_ROLE_REPEATER
- beebo: add companion/repeater JTAG-enabled PlatformIO envs
- beebo: fix per-role identity migration gating and GET_ROLE_NAME live-slot read
- beebo: BeeboPrefs/BeeboRoleState settings refactor + USB/TCP OTA throughput fixes
- beebo: fix GET_COMPANION_LAT/LON comment to reference BeeboCompanionPrefs, not _prefs
- beebo: fix SHARE vs PREFS advert_loc_policy to match upstream, give companion its own PREFS coordinate
- beebo: add GET/SET_REPEATER_ADV_LOC_POLICY and GET_COMPANION_ADV_LOC_POLICY, fix advert role bleed
- beebo: add GET_COMPANION_MULTI_ACKS/_PATH_HASH_MODE/_LAT/_LON opcodes
- beebo: role-split repeater's independent multi_acks/path_hash_mode/coords and default-scope region
- beebo -i: defer connect, add connect/release REPL commands
- beebo analyze dup-latency: exclude pkt_hash collisions, fix dedup cycle time, add window recommendation
- beebo: batch companion.repeat into PREFS_TLV, warm both roles' caches, harden role_isolation cleanup
- beebo/verif: fix test_transport_log_reports_real_sta_ip_pass's root cause -- off/on coalescing
- beebo/verif: add neighbors resolve hardware test, refine req_owner unreliability finding
- beebo/verif: fix transport-log ring wraparound, add repeat prompt to onboard, skip mma pending sensor device
- beebo/verif: land ping/trace/poke hardware tests, enable bench repeat permanently
- beebo/verif: extend discover.py hardware coverage with bunch/bench
- beebo/verif: add hardware coverage for messages.py send against bunch/bench
- beebo/verif: add hardware coverage for admin.py against bunch/bench
- beebo/verif: migrate test_status_packets_stats.py mesh tests to bench/bunch
- beebo: fix bunch's node.role/_is_repeater desync (fw), bump to rc199, update docs
- beebo: add reusable "Bench Isolated (Test)" RF preset for bench/bunch
- beebo/verif: close common_link.py, closing HARDWARE_TEST_PARITY.md entirely
- beebo: log real STA IP in monitor transport, fix test_monitor.py pull/list gap
- beebo/verif: migrate test_status_packets_stats.py's shape tests off beebo/gatto
- beebo/verif: fix coords probe format mismatch in test_role_isolation.py
- beebo/verif: close neighbors.py full surface, closing config/ batch
- beebo/verif: close debuglog.py, closing connect/ batch except common_link.py
- beebo/verif: close scripts/calibrate_vbat.py, closing scripts/ batch
- beebo/verif: close neighbors.py (forget) in commands/ batch
- beebo/verif: close monitor.py (CLI+core) in commands/ batch
- beebo/verif: close messages.py (download) in commands/ batch
- beebo/verif: close wifi_settings.py, closing common/ infra batch
- beebo/verif: close interactive.py/node_role.py/paths.py/persistence.py in common/ infra batch
- beebo/verif: close fem.py, note discover.py blocker, set bench TX power safety default
- beebo/verif: close cw.py in common/ infra batch
- beebo/verif: close clock.py in common/ infra batch
- beebo/verif: close beebo_reader.py + ble_settings.py in common/ infra batch
- beebo/verif: close region.py in the hardware-parity settings-leaf batch, fix role-conditional check.py test
- beebo/verif: close common/prefs_tlv.py; postpone admin.py/ping.py rather than use beebo/gatto
- beebo/verif: fix merged-image bug in test_ota_throughput.py, run it for real, close ota.py
- beebo/verif: close node.py (status) in the hardware-parity settings-leaf batch
- beebo/verif: close identity.py in the hardware-parity settings-leaf batch
- beebo/verif: close config.py in the hardware-parity settings-leaf batch, add repeater-role goldens
- beebo/verif: close check.py and backup.py in the config settings-leaf batch, confirm admin.py blocked on bunch
- beebo/verif: close repeater_settings.py leaf batch, migrate off gatto
- beebo/verif: close companion_settings.py leaf batch, drop beebo/gatto fixtures
- beebo/verif: close out radio.py leaf batch (adc/idle_margin/battery)
- beebo/verif: add _settings_roundtrip.py shared infra, pilot on radio.py txpower/rxgain
- beebo/verif: add structural hardware coverage for rxlog.py
- beebo/verif: add reduced-scope hardware coverage for measure.py
- beebo/verif: add hardware-verified coverage for common/host_profile.py
- beebo/verif: add hardware-verified coverage for contacts.py
- beebo/verif: add hardware-verified coverage for profile.py, fix CliSession ANSI/tee gaps
- beebo/verif: require hardware-verified coverage for device-touching tests, add log headers
- beebo/verif: add synthetic coverage for analysis.py to 100%
- beebo/verif: add synthetic coverage for rxlog.py to 100%
- beebo/verif: add synthetic coverage for monitor.py to 100%
- beebo/verif: add synthetic coverage for measure.py to 100%
- beebo/verif: add synthetic coverage for contacts.py to 100%
- beebo/verif: add synthetic coverage for ping.py to 100%
- beebo/verif: add synthetic coverage for neighbors.py to 100%
- beebo: 100% synthetic coverage on backup.py (53 modules at 100%, overall 67%)
- beebo: 100% synthetic coverage on admin.py (52 modules at 100%, overall 65%)
- beebo: 100% synthetic coverage on ota.py (51 modules at 100%, overall 62%)
- beebo: 100% synthetic coverage on check.py (50 modules at 100%, overall 61%)
- beebo: 100% synthetic coverage on node.py (49 modules at 100%, overall 61%)
- beebo: 100% synthetic coverage on radio.py (48 modules at 100%, overall 57%)
- beebo: 100% synthetic coverage on repeater_settings.py (47 modules at 100%, overall 53%)
- beebo: 100% synthetic coverage on companion_settings.py (46 modules at 100%, overall 50%)
- beebo: 100% synthetic coverage on config.py (45 modules at 100%, overall 48%)
- beebo: fix pre-existing CommonLink.serial baudrate test bug, 100% synthetic coverage on connect.py (44 modules at 100%, overall 45%, full suite green)
- beebo: 100% synthetic coverage on settings.py (43 modules at 100%, overall 43%)
- beebo: 100% synthetic coverage on common_link.py (42 modules at 100%, overall 42%)
- beebo: 100% synthetic coverage on identity.py (41 modules at 100%, overall 41%)
- beebo: 100% synthetic coverage on tuning.py (40 modules at 100%, overall 40%)
- beebo: 100% synthetic coverage on interactive.py (39 modules at 100%)
- beebo: 100% synthetic coverage on poke.py and node_role.py (38 modules at 100%)
- beebo: 100% synthetic coverage on debuglog.py (36 modules at 100%)
- beebo: 100% synthetic coverage on app.py (35 modules at 100%)
- beebo: fix set_config_value swallowing a top-level key appended after existing sections; 100% synthetic coverage on common/config.py (34 modules at 100%)
- beebo: 100% synthetic coverage on common/prefs_tlv.py (33 modules at 100%)
- beebo: 100% synthetic coverage on messages.py and profile.py, +2 host_profile.py branches (32 modules at 100%, overall 35%)
- beebo/verif: 100% coverage on region.py
- beebo/verif: 100% coverage on scripts_cmd.py and calibrate_vbat.py
- beebo/verif: 100% coverage on trace/local_config/persistence
- beebo/verif: 100% coverage on ble_settings/wifi_settings/transport
- beebo/verif: 100% coverage on logsetup/paths/settings_tree/stats/stats_ring
- beebo/verif: 100% coverage on clock.py and discover.py
- beebo/verif: 100% coverage on fem.py and cw.py
- beebo: fix BeeboMessageReader's dead EventType.OTA_BEGIN reference, 100% coverage on backup_crypto/beebo_reader
- beebo/ve...