v4.2.0
This is F Prime v4.2.0!
Highlighted New Features
These are the key features released in v4.2.0.
Advanced Telemetry Management
Svc::TlmPacketizer has been significantly enhanced to give projects fine-grained control over how telemetry is managed and downlinked.
Configurable output streams: Telemetry can now be routed to multiple configurable named sections (e.g. REALTIME for live downlink, RECORDED for store-and-forward). Each section is independently configurable and can be enabled or disabled at runtime.
Per-group rate control: Each section/group pair now has its own rate logic. Telemetry packets can be sent on-change with a configurable minimum tick interval (rate limiting), at a guaranteed maximum tick interval (heartbeat), or both. This replaces the previous all-or-nothing output on changemodel.
Configurable output port mapping: A 2D configuration table maps each section/group pair to a specific output port index, enabling flexible routing of telemetry streams to different downstream consumers.
All rate and stream settings are backed by a parameter, so defaults can be set at build time and overridden at runtime without a reboot.
To pair with this, Svc::ComQueuehas been extended with richer per-queue configuration:
Drop policy: Each queue can be configured to drop the newest (incoming) or oldest (head-of-queue) message on overflow, allowing projects to tune for freshness vs. in-order delivery. Queues can operate in FIFO or LIFO mode per-port. Per-queue priority controls which data is serviced first; queues sharing a priority are balanced via round-robin.
Topology Ports (Modeling)
FPP now supports topology ports — named I/O ports declared directly on a topology (subtopology). This allows a subtopology to be treated as a black-box module with well-defined connection points.
Outer topologies connect to a subtopology through its named ports without needing to reference internal component instances, improving encapsulation and reusability. All F Prime core subtopologies (Svc.CdhCore, Svc.ComCcsds, Svc.ComFprime, Svc.DataProducts, Svc.FileHandling) have been updated to expose topology ports.
New Component: Svc::FileWorker
Svc::FileWorker is a new active component that offloads slow file I/O operations from time-critical components. It provides asynchronous interfaces for reading, writing, and CRC-verifying files, with cancel support and state-based flow control (IDLE → READING/WRITING). Components that previously had to block on filesystem operations can now delegate to FileWorker and receive a completion signal when the operation is done.
Changes Affecting Users
These two changes affect users of F Prime.
1. Configuration Updates For Svc::TlmPacketizer
Svc::TlmPacketizer has been changed to allow for greater control over packet output rates. It now allows users to configure output groups, and sections to produce telemetry at specified rates. These changes are documented in the Svc::TlmPacketizer SDD.
Users with custom configuration for Svc::TlmPacketizer must update their configuration.
Build Configuration
Users including the TlmPacketizer autocoding (e.g. by including an FPP Packet Set in their topology) without using the TlmPacketizer itself now need to explicitly depend on the Config module in their Deployment/Top/CMakeLists.txt like such:
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/instances.fpp"
"${CMAKE_CURRENT_LIST_DIR}/topology.fpp"
SOURCES
"${CMAKE_CURRENT_LIST_DIR}/RefTopology.cpp"
DEPENDS
+ Svc_TlmPacketizer_config_TlmPacketizerConfig # Supports packet autocoding w/o TlmPacketizer
)Svc::TlmPacketizer Users With Custom Configuration
Users with custom configuration must make the following changes:
TLMPACKETIZER_HASH_BUCKETSmust be renamed toMAX_PACKETIZER_CHANNELS.TLMPACKETIZER_NUM_TLM_HASH_SLOTS,TLMPACKETIZER_HASH_MOD_VALUE,PacketUpdateModemust be deleted.- (Optional) Tune
TlmPacketizerCfg.fppto size output ports, sections, max groups, etc.
Caution
The maximum group for a telemetry packet is now limited to NUM_CONFIGURABLE_TLMPACKETIZER_GROUPS found in TlmPacketizerCfg.fpp
Note
The stock TlmPacketizerCfg.fpp is designed to work with an output port for each of two sections. If left unconnected, the behavior will mimic Svc::TlmPacketizer of v4.2.0.
See TlmPacketizerCfg.hpp
2. Update Utils::Hash::final() to Utils::Hash::finalize()
In order to deconflict with the C++ final keyword, Utils::Hash::final() was renamed to Utils::Hash::finalize().
Utils::Hash Users
Users must rename their uses of the .final method.
- hash.final(crc_output);
+ hash.finalize(crc_output);Changes Affecting Platform Developers
These changes affect developers providing platform packages in the F Prime environment.
Add teardown to Os::Queue
Since Os::Queue is allowed to allocate resources on a call to create, a mirror teardown method is needed to allow teardown.
For Platform Developers
At minimum, developers of Os::Queue implementations must define a teardown function.
+ void MyQueue ::teardown() {
+ ...
+ }Use const Fw::TimeInterval& interval as Argument to Os::TaskInterface::_delay()
Os::TaskInterface uses a const Reference for the interval to prevent a copy when passing by value.
For Platform Developers
Implementers of Os::Task must switch to taking const TimeInterval& interval as input on their implementation of _delay.
- Os::Task::Status PosixTask::_delay(Fw::TimeInterval interval) {
+ Os::Task::Status PosixTask::_delay(const Fw::TimeInterval& interval) {sscanf Implementation
F Prime now provides an sscanf implementation selection (like was previously available for printf). This was done to allow users to entirely bypass the format-function in the C library by providing their own implementations.
For Platform Developers
Platform developers, at minimum, should add a new implementation selection to their platform CMake.
CHOOSES_IMPLEMENTATIONS
...
+ Fw_StringScan_sscanfWhat's Changed
- Uplink file announce by @timcanham in #4529
- Remove virtual methods from final classes by @Kronos3 in #4544
- Specify aggregator's priority by @kevin-f-ortega in #4545
- Prevent divide-by-zero in PosixFileSystem::_getFreeSpace by @heathdutton in #4548
- Add missing status for invalid priority by @kevin-f-ortega in #4541
- Remove Timeout from
Svc::FileDownlinkby @LeStarch in #4555 - Fix minor typos found during familiarization by @djbyrne17 in #4556
- Remove
fprime-system-referencefrom CI by @thomas-bc in #4558 - Update
ground-interface.mdand purge oldFramingProtocolby @thomas-bc in #4547 - Add queue flush commands to com queue by @LeStarch in #4559
- Enclose macros iss4375 by @djbyrne17 in #4568
- Fix/missing priority by @LeStarch in #4570
- Fix object slicing and modernize types in Version.cpp by @JuanPS999 in #4563
- Fix formatting of
data-products.mdfor website by @thomas-bc in #4571 - Prevent infinite loop in FileTest unique filename generation by @heathdutton in #4566
- Make timevalue and timeintervalvalue dict types by @zimri-leisher in #4575
- Switch to FPP enum for time comparisons by @zimri-leisher in #4561
- Add Drv.AsyncByteStreamBufferAdapter (async) by @mshahabn in #4557
- FpySequencer add function calling directives by @zimri-leisher in #4534
- Add Drv.ByteStreamBufferAdapter (sync) by @mshahabn in #4546
- Document Memory Management patterns by @thomas-bc in #4507
- Fix/weak strong by @LeStarch in #4579
- DataProduct Catalog Runtime Insertion by @Willmac16 in #4083
- Fix DpCatalog UT Memory Leak by @LeStarch in #4589
- Enclose macros by @djbyrne17 in #4582
- Correct TmFramer size assertion math by @Willmac16 in #4592
- Telemeter params on startup for FpySeq by @Willmac16 in #4603
- Clear invalid context in ComAggregator doClear action by @heathdutton in #4597
- Use FPP constant for FileDownlink filename length by @heathdutton in #4594
- Enhance TDD guide with detailed explanations and tips by @LeStarch in #4583
- Add new Svc::ComRetry component by @valdaarhun in #4367
- Add Svc.FileDispatcher component by @timcanham in #4552
- Add File Dispatcher port to CmdSequencer by @timcanham in #4553
- Fix student review feedback for #4101 by @LeStarch in #4584
- Update GDS App Plugin documentation by @LeStarch in #4585
- Bump werkzeug from 3.1.4 to 3.1.5 by @dependabot[bot] in #4608
- Bump urllib3 from 2.6.0 to 2.6.3 by @dependabot[bot] in #4607
- Calculate Data Product checksum in the DpWriter component by @kubiak-jpl in #4622
- Fix invalid start parameter in gds-test-api-guide examples by @heathdutton in #4639
- Add dict specifier to FpySequencer consts by @zimri-leisher in #4638
- Suppress duplicate library warning on macos by @Willmac16 in #4628
- Update dictionary spec to require FW_FIXED_LENGTH_STRING_SIZE by @jwest115 in #4667
- Add data product how-to by @LeStarch in #4664
- Update Data Products integration tests and bump fprime-gds by @thomas-bc in #4671
- Expose default file create permissions through a new OsCfg.fpp config file by @kubiak-jpl in #4613
- Address workshop feedback for data products How-To by @thomas-bc in #4682
- Add CRC checks to Svc.PrmDb by @odacindy-fprime in #4586
- Update requirements.txt to work with Python 3.14 by @thomas-bc in #4616
- Fix static analysis issues in Serializable.cpp by @Sarah5567 in #4634
- Correct isConnected check in FpySequencer for seqStartOut by @Willmac16 in #4647
- Fix PolyType Static Analysis Issues by @youio in #4649
- Initialize variables to fix static analysis warnings by @Jashan66 in #4672
- Add methods to convert from Fw::Time* to Fw::Time*Value by @LeStarch in #4658
- Updated default file creation mode to a+rw equivalent by @kubiak-jpl in #4679
- Update hello-world namespaces in CI by @thomas-bc in #4692
- Revise FppTest by @bocchino in #4659
- Revise modeling and code gen for default string sizes by @bocchino in #4673
- Add Fw.DataProduct FPP interface by @thomas-bc in #4669
- Add baremetal and multi-core documentation by @thomas-bc in #4680
- Update README with team roles and maintainers by @LeStarch in #4722
- FpySequencer push FW_SERIALIZE_TRUE/FALSE for boolean ops by @zimri-leisher in #4712
- Update governance roles and privileges by @LeStarch in #4718
- Add verification steps for system requirements by @djbyrne17 in #4710
- Add kevin-f-ortega as Community Manager by @LeStarch in #4725
- Fix markdown formatting across documentation by @thomas-bc in #4709
- Update vulnerability reporting instructions by @LeStarch in #4736
- Implement Os::Queue::setRegistry by @jsmith212 in #4648
- Os static analysis findings by @Sarah5567 in #4665
- Replace global assert hook with static class member by @Gregox273 in #4701
- Clean up DpCatalog test artifacts in destructor by @heathdutton in #4714
- ComQueue queue ordering, drop mode, & command to reprioritize by @Willmac16 in #4674
- Fix: Clean up generated files in ComLoggerTester by @Sarah5567 in #4735
- Fixed broken CCSDS links by @Brian-Campuzano in #4743
- Fix FILE_NAME_ARG definition by @thomas-bc in #4754
- Increase FpySequencer UT coverage to 87% by @zimri-leisher in #4747
- TlmPacketizer Group Level Control Improvements by @Lex-ari in #4668
- Add checks to TC deframing stack to prevent underflows by @thomas-bc in #4763
- Add How-To Implement a Radio Manager by @thomas-bc in #4738
- S_ISVTX is part of XSI, which is an optional set of interfaces and ex… by @kevin-f-ortega in #4768
- Add configure section/group port to TlmPacketizer by @LeStarch in #4766
- Modify Os::Task::delay to pass in interval by const reference by @Gregox273 in #4751
- Use GH Actions inputs through environment variables by @thomas-bc in #4764
- Bump werkzeug from 3.1.5 to 3.1.6 by @dependabot[bot] in #4778
- Bump flask from 3.0.3 to 3.1.3 by @dependabot[bot] in #4777
- Add CCSDS AOS Framer by @Willmac16 in #4630
- Topology connection unit tests by @Kronos3 in #4765
- Modify circular buffer overflow test to handle zero-length random input by @Gregox273 in #4752
- Use FPP enum for state machine state by @bocchino in #4803
- Add required fixes for F Prime to have deinit triggered by autocode by @LeStarch in #4800
- Warn on zero-size downlink. Fixes: #2756 by @LeStarch in #4802
- Remove doOtherChecks from health. Fixes: #4404 by @LeStarch in #4801
- Add README explaining tutorial directory structure by @ryanhasmanners in #4812
- Resolve Utils/Hash static analysis findings by @vsoulgard in #4799
- Topology Ports in FPP by @Kronos3 in #4805
- Fixed corner case in shadow write when writing 0 bytes in append mode by @kevin-f-ortega in #4821
- FpySequencer use FwTimeBaseStoreType instead of U16 by @zimri-leisher in #4820
- Allow bypassing ignore list by @LeStarch in #4771
- Add System Functional Documentation - Dictionary by @swanchr in #4780
- Fix static analysis warning in Posix ConditionVariable.cpp by @thomas-bc in #4814
- Fix RawTime serializability concerns by @thomas-bc in #4811
- Fix String type in FileDownlink by @vsoulgard in #4823
- Update dictionary spec value description by @jwest115 in #4827
- Update License by @Lex-ari in #4828
- Remove priority from ActiveTextLogger by @timcanham in #4798
- Use Java FPP for fpp-to-json by @Kronos3 in #4829
- Bump markdown from 3.7 to 3.8.1 by @dependabot[bot] in #4832
- Data product async interface by @Sarah5567 in #4727
- Add deinit function for passive components by @LeStarch in #4831
- Refactor Ccsds.ApidManager to use
Fw::ArrayMapby @vsoulgard in #4833 - Make
Os::QueueInterface::teardown()pure virtual by @vsoulgard in #4824 - Fix CI from discarding errors in UTs by @LeStarch in #4853
- Fix CI scripts FPUTIL_TARGETS by @thomas-bc in #4856
- Fix to
operator=forExternalSerializeBufferWithMemberCopyby @bocchino in #4855 - Clarify instructions that caused problems for new users by @djbyrne17 in #4849
- Issue 4790 generic hub command ports by @mshahabn in #4793
- Add System Functional Documentation - Sequencing by @swanchr in #4781
- Add OS Abstraction Layer SDD and How-To guide by @thomas-bc in #4840
- Add PassThroughRouter component by @DJKessler in #4825
- TlmPacketizer: Remove Double-Buffering by @Sarah5567 in #4822
- Add floating point operations for
Fw::Timeby @vsoulgard in #4842 - Add PR auto-reply when Formatting CI fails by @Copilot in #4870
- Switching inline hash map and slots with r/b tree by @LeStarch in #4871
- FileWorker by @rjtsao in #4810
- Refactor PrmDb to use Fw::ArrayMap by @Kronos3 in #4881
- Replace cmd dispatch table with map by @LeStarch in #4883
- Update fprime-fpl-layout and fprime-fpl-write-pic versions to 1.0.4 by @LeStarch in #4886
- Fix TlmPacketizer large entry copy by @LeStarch in #4878
- Remove test output files for FileWorker by @bocchino in #4895
- Remove erroneous include in PassThroughRouterTester by @thomas-bc in #4901
- Update FpConstants to use sizeof, add sizeof tests to FppTest by @jwest115 in #4859
- Fix PosixFile UT random failures by @LeStarch in #4905
- Add FppTest tests for empty structs by @bocchino in #4908
- Adding sscanf replacement implementation, and tests by @LeStarch in #4872
- Replace command sequence table with map by @LeStarch in #4888
- FPP Framework Testing by @Kronos3 in #4890
- Add in function to dispatch all available messages by @LeStarch in #4911
- FPP v3.2.0 by @bocchino in #4912
- Add option to force assertions to always abort by @celskeggs in #4677
- Bump pygments from 2.18.0 to 2.20.0 by @dependabot[bot] in #4916
- Add topology ports to subtopologies by @Sarah5567 in #4907
- Improve data copying efficiency in TlmPacketizer by @Sarah5567 in #4868
- Update MmapAllocator by @kubiak-jpl in #4892
- refactor: replace FW_MIN/FW_MAX macros with std::min/std::max by @dcpagotto in #4865
- docs: fix double word and formatting in introduction by @aliden1z in #4924
- Omega by @LeStarch in #4919
- Making TlmPacketizer configuration tables driven from parameter by @LeStarch in #4830
- Remove legacy Cheetah3 dependency by @thomas-bc in #4927
- Update fprime-gds and fprime-tools versions for v4.2.0 by @LeStarch in #4930
- Fix hard-asserts in GenericHub deserialization by @LeStarch in #4929
- Add an agent that reviews standard norms for F Prime by @LeStarch in #4935
- Update PR review instructions for agent availability by @LeStarch in #4937
- Remove non-functional PR comment workflow by @thomas-bc in #4933
New Contributors
- @heathdutton made their first contribution in #4548
- @JuanPS999 made their first contribution in #4563
- @odacindy-fprime made their first contribution in #4586
- @Sarah5567 made their first contribution in #4634
- @youio made their first contribution in #4649
- @Jashan66 made their first contribution in #4672
- @jsmith212 made their first contribution in #4648
- @Gregox273 made their first contribution in #4701
- @ryanhasmanners made their first contribution in #4812
- @vsoulgard made their first contribution in #4799
- @swanchr made their first contribution in #4780
- @rjtsao made their first contribution in #4810
- @dcpagotto made their first contribution in #4865
- @aliden1z made their first contribution in #4924
Full Changelog: v4.1.1...v4.2.0