Repository navigation
Conversation
FAQ: Fixed instructions on wiping and resetting nrf52 devices
docs: fix frame format tables
Add documentation for radio presets
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add MCOtxt decoding to companion firmware
MCOtxt (MeshCore Open Text codec) is a lightweight text-compression codec designed for MeshCore messages. It was specifically developed to keep code size, language tables, and RAM requirements small enough to fit on nRF microcontrollers, including nRF52840-based nodes, alongside the existing firmware.
It uses small, fixed language-specific prediction tables and variable-length character codes. Tables are available for English, Russian, French, German, Italian, Ukrainian, and Belarusian, including mixed-language messages. Characters absent from the tables are preserved through raw UTF-8 escape sequences, allowing emoji, other scripts, and arbitrary Unicode text to remain representable.
Representative text averages approximately 5.6 bits per character in the codec stream. Compared with plain UTF-8, this corresponds to roughly:
These estimates exclude container headers, reply metadata, and Base91 overhead. Actual savings depend on message content and transport. Smaller payloads allow more text per radio packet and can reduce LoRa airtime.
The format also supports:
GROUP_DATAenvelopes (0x0120, subtype/version0x31) and Base91 text prefixed withmct:.Message encoding is currently available only in the MeshCore Open Advanced (MCOa) companion app, a fork of MeshCore Open. MCOa builds are available from its releases page.
Other applications can add MCOtxt encoding and decoding by porting the reference Dart implementation. The MCOtxt v1 protocol reference documents the wire format and links to the relevant implementation files.
Encoder interoperability: for binary
GROUP_DATAmessages, new encoders should reuse the existing application namespacedata_type = 0x0120and MCOtxt subtype/version byte0x31— subtype0x03, wire version0x01. Using these identifiers with the documented envelope format maintains compatibility with the current MCOa application.This PR adds decoding to the companion firmware so existing companion apps and local displays can read compressed chat messages.
The implementation:
cap=list inCMD_APP_START. Apps declaringmctxtreceive the original frames, preserving structured metadata.@[author]mention at the beginning of the first decoded part for apps receiving plain text.Implementation details and test instructions are included in
docs/mcotxt.md.Validation: 72 native tests and 7 queue lifecycle tests pass under AddressSanitizer. Queue tests are also connected to CI.