Skip to content

Releases: pasqo/beebo-meshcore-fw

Beebo 1.18.0.beebo.1.0

Choose a tag to compare

@pasqo pasqo released this 21 Oct 21:56

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...
Read more

Beebo 1.16.0.beebo.1.0

Choose a tag to compare

@pasqo pasqo released this 17 Sep 03:00

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...
Read more