Libm17 is a C implementation of the M17 protocol's RF stack, as described by its specification document.
The library includes:
- soft symbol slicer and a symbol mapper,
- convolutional encoder with soft Viterbi decoder (utilizing fixed point arithmetic),
- Golay encoder with soft decoder (fixed point),
- bit interleaver and randomizer,
- cyclic redundancy check (CRC) calculation (for both LSF/LSD and arbitrary input),
- callsign encoder and decoder,
- LSF/LSD META field extended callsign data, cryptographic nonce, and GNSS position data encoders/decoders,
- two sets of Root Raised Cosine (RRC) filter taps (for 24kHz and 48kHz sample rates).
There's no support for any encryption within the library - it has to be handled by the developer, using own code.
As per the specification document, the address space is divided into parts. Encodable callsign space is accessed by using the base40 alphabet. If the first character is set to #
, the address belongs to the extended hash-address space. The broadcast address is represented by @ALL
. Zero-address is invalid and decodes into a null-string. The reserved chunk for application use cannot be accessed using any string.
- Build the shared object
libm17.so
by runningmake
. - You can install the library object with
make install
.
Unit tests are available and can be run with make test && make testrun
.
- Configre the build - run
cmake -B build
to get default options. - Build the library by running
cmake --build build
. - At this point tests can be run by doing any of:
cmake --build build --target test
ctest --test-dir build
./build/unti_tests/unit_tests
- Finally, installation is just
cmake --install build
Unit tests use the Unity unit testing framework.