feat: better power management#78
Draft
drupol wants to merge 2 commits into
Draft
Conversation
Author
|
I'll continue the testing tomorrow, time to go to bed. Feel free to take over if you want. |
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.
This PR introduces power management and sleep states to extend battery runtime. By tracking device activity and gracefully yielding CPU resources when idle, nodes can drastically reduce their power footprint while maintaining mesh routing responsiveness.
The architecture and logic for these improvements draw heavy inspiration from the power management implementations found in the Meshtastic firmware, props to their developers.
volatile unsigned long last_activity_timeinConfig.h.receive_callback()buffer_serial()button_event()loop()inRNode_Firmware.ino.power_management_enabled(it istrueby defualt) is true and the node has been completely idle beyondidle_timeout_ms(defaults to 15 seconds), the loop executes a shortdelay(50).delay()yields execution back to the RTOS idle task. The idle task naturally executesWFI/WFE(Wait For Interrupt / Wait For Event) instructions, gracefully putting the CPU into a low-power "System ON" state while the LoRa radio remains in RX mode. The system wakes up instantly the moment an interrupt fires.Power.hto monitorbattery_voltage.BAT_V_MINthreshold (typically 3.15V), the node intercepts the loop to automatically callsleep_now().SYSTEMOFFon nRF52), shutting down the transceiver and protecting LiPo batteries from irreversible deep-discharge damage.power_management_enabled = trueandidle_timeout_ms = 15000toConfig.hto allow users to opt-out or adjust the idle tolerances based on their use cases.Ongoing...
Let me know what you think about this.