-
Notifications
You must be signed in to change notification settings - Fork 5
Hibernation Mode #148
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
yudataguy
wants to merge
23
commits into
main
Choose a base branch
from
hibernation-mode
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Hibernation Mode #148
Changes from 14 commits
Commits
Show all changes
23 commits
Select commit
Hold shift + click to select a range
93bac53
add payload mode
yudataguy e027055
update sdd
yudataguy f8336e0
Update FprimeZephyrReference/Components/ModeManager/docs/sdd.md
yudataguy 2809b15
Update FprimeZephyrReference/Components/ModeManager/docs/sdd.md
yudataguy 1e8d449
fix restore payload - face issues, update sdd
yudataguy b4ce7d4
resolve conflict sdd
yudataguy 62a100c
consistency
yudataguy 05ff516
remove component calling safe mode
yudataguy fddb10f
change mode enum values
yudataguy a7d5508
fix the safe mode emit spam
yudataguy 5b0cc7e
update ci run group to sam (temp)
yudataguy 286cd57
rever runner group
yudataguy 4886c64
Merge branch 'main' of github.com:Open-Source-Space-Foundation/proves…
ineskhou 3981691
update hibernation mode
yudataguy cba9372
fix test force exit issue
yudataguy ae69c62
fix test force exit issue
yudataguy 569e0ea
fix some issue
yudataguy b931205
Update FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
yudataguy 941a068
Update FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
yudataguy 4faabc9
Update FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
yudataguy 1122b30
Update FprimeZephyrReference/Components/ModeManager/docs/sdd.md
yudataguy d9d3d4c
Update FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
yudataguy 57f963a
Update FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
yudataguy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
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
403 changes: 389 additions & 14 deletions
403
FprimeZephyrReference/Components/ModeManager/ModeManager.cpp
Large diffs are not rendered by default.
Oops, something went wrong.
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
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
55 changes: 55 additions & 0 deletions
55
FprimeZephyrReference/Components/ModeManager/PicoSleep.cpp
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| // ====================================================================== | ||
| // \title PicoSleep.cpp | ||
| // \brief Implementation of RP2350 dormant mode wrapper | ||
| // ====================================================================== | ||
|
|
||
| #include "FprimeZephyrReference/Components/ModeManager/PicoSleep.hpp" | ||
|
|
||
| #include <zephyr/kernel.h> | ||
| #include <zephyr/sys/reboot.h> | ||
|
|
||
| namespace Components { | ||
|
|
||
| bool PicoSleep::sleepForSeconds(U32 seconds) { | ||
| // Note: The actual RP2350 dormant mode implementation requires: | ||
| // 1. Configure RTC alarm for the specified duration | ||
| // 2. Configure POWMAN wake source to use RTC alarm | ||
| // 3. Enter dormant mode via POWMAN peripheral | ||
| // | ||
| // For now, we use sys_reboot() to simulate the sleep/wake cycle. | ||
| // The state file indicates we're in hibernation mode, so on reboot | ||
| // the system will enter the wake window and listen for EXIT_HIBERNATION. | ||
| // | ||
| // TODO: Implement actual RP2350 dormant mode using POWMAN peripheral | ||
| // when hardware testing is available. | ||
yudataguy marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| // The seconds parameter is stored in the persistent state and would be | ||
| // used to configure the RTC alarm in a full implementation. | ||
| (void)seconds; | ||
|
|
||
| #if defined(CONFIG_BOARD_NATIVE_POSIX) || defined(CONFIG_BOARD_NATIVE_SIM) || defined(CONFIG_ARCH_POSIX) | ||
| // Native/simulation builds: Return false to exercise the failure handling path | ||
| // This allows CI to test HibernationEntryFailed event emission, counter rollback, | ||
| // and mode reversion to SAFE_MODE without actually rebooting. | ||
| return false; | ||
| #else | ||
| // Real hardware: Perform system reboot - the state file will indicate we're | ||
| // in hibernation and on next boot, the system will enter the wake window | ||
yudataguy marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| sys_reboot(SYS_REBOOT_COLD); | ||
|
|
||
| // Should never reach here on real hardware | ||
| return false; | ||
| #endif | ||
| } | ||
|
|
||
| bool PicoSleep::isSupported() { | ||
| #if defined(CONFIG_BOARD_NATIVE_POSIX) || defined(CONFIG_BOARD_NATIVE_SIM) || defined(CONFIG_ARCH_POSIX) | ||
| // Native/simulation: dormant mode is not supported (returns false to exercise failure path) | ||
| return false; | ||
| #else | ||
| // RP2350 supports dormant mode, but our implementation uses reboot as placeholder | ||
| return true; | ||
| #endif | ||
| } | ||
|
|
||
| } // namespace Components | ||
52 changes: 52 additions & 0 deletions
52
FprimeZephyrReference/Components/ModeManager/PicoSleep.hpp
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| // ====================================================================== | ||
| // \title PicoSleep.hpp | ||
| // \brief Wrapper for RP2350 dormant mode using RTC alarm wake | ||
| // ====================================================================== | ||
|
|
||
| #ifndef Components_PicoSleep_HPP | ||
| #define Components_PicoSleep_HPP | ||
|
|
||
| #include "Fw/Types/BasicTypes.hpp" | ||
|
|
||
| namespace Components { | ||
|
|
||
| /** | ||
| * @brief Wrapper class for RP2350 Pico SDK dormant mode functionality | ||
| * | ||
| * The RP2350's dormant mode puts the chip into an ultra-low-power state | ||
| * where only the RTC continues running. When the RTC alarm fires, the | ||
| * system reboots (not resumes). | ||
| * | ||
| * IMPORTANT: sleepForSeconds() does NOT return. The system will reboot | ||
| * when the RTC alarm fires. State must be persisted before calling. | ||
| */ | ||
| class PicoSleep { | ||
| public: | ||
| /** | ||
| * @brief Enter dormant mode for specified duration | ||
| * | ||
| * Configures the RTC alarm and enters RP2350 dormant mode. | ||
| * This function does NOT return - the system will reboot when | ||
| * the RTC alarm fires. | ||
| * | ||
| * @param seconds Duration to sleep in seconds | ||
| * @return false if dormant mode entry failed (function returns), | ||
| * true is never returned (system reboots on success) | ||
| */ | ||
| static bool sleepForSeconds(U32 seconds); | ||
|
|
||
| /** | ||
| * @brief Check if dormant mode is supported on this platform | ||
| * | ||
| * @return true if dormant mode is available | ||
| */ | ||
| static bool isSupported(); | ||
|
|
||
| private: | ||
| // Prevent instantiation | ||
| PicoSleep() = delete; | ||
| }; | ||
|
|
||
| } // namespace Components | ||
|
|
||
| #endif |
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment states "Persistent state structure (version 2 with hibernation support)" but there's no version field in the struct itself, and the code doesn't handle migration from version 1 gracefully. When loading state from an old version 1 file (without the new hibernation fields),
bytesReadwill be less thansizeof(PersistentState), causing the code to fall through to the default initialization branch (line 277-287). While this works, it loses the old safeModeEntryCount. Consider documenting this migration behavior or adding an explicit version field to enable proper migration logic.