~aleteoryx/muditaos

8d79f27d517ca46612168d31d8134e52974faee8 — Maciej Gibowicz 5 years ago 312d4a0
[EGD-5324] Add Low Power documentation

Documentation describing the Low Power control algorithm and
synchronization with the system using dedicated sentinels and drivers.
A module-sys/SystemManager/doc/PowerManagement.md => module-sys/SystemManager/doc/PowerManagement.md +65 -0
@@ 0,0 1,65 @@
# Power Management

Power management is based on the frequency control of the CPU. 

## CPU frequency switching

The CPU frequency control is dependent on the CPU load measured from the time spent in the task Idle. This control is also influenced by requests from interested services via sentinels (`minFrequencyRequested`). By increasing the CPU frequency, we always jump to the maximum possible frequency value. On the other hand, the reduction of the CPU frequency occurs gradually one level down.

![](./data/CpuFreqChangeAlgorithm.svg)

## Low Power synchronization

Synchronization in Low Power mode covers 3 issues:

* immediate informing services about changing the CPU frequency so that they can update their resources (e.g. PWM filling)

* immediate switching on of peripherals that have been turned off by Low Power control (e.g. PLL2)

* request from the service of the minimum CPU frequency in order to perform a task (e.g. screen redraw, telephone conversation)

### Implementation 

To cover these issues, several classes have been implemented.

* Sentinel class

Each sentinel manages the requests, i.e. when it is needed it sends messages to `CpuGovernor` with the required minimum CPU frequency to perform the task (e.g. screen redraw). Furthermore, every sentinel is informed immediately after changing the frequency. This allows it to invoke a callback to the service to update its resources (e.g. PWM filling). Every sentinel must register itself on startup to `CpuGovernor` by sending `SentinelRegistrationMessage`.

* CpuGovernor class

`CpuGovernor` manages all sentinels in the system and has CPU frequency requests from them (e.g. `eInkSentinel`).

* Driver class

Dedicated drivers control the clocks. For example, `driverLPSPI` enables/disables the clock from LPSPI.

* PLL2 class

DriverPLL2 controls the PLL2 bus clock and if all dependent clocks are turned off, it turns off the PLL2 bus clock.

* Device class

Each driver (eg LPSPI) inherits from the Device class. Therefore, we can manage all drivers. Every device must register itself on startup to `DeviceManager` by sending `DeviceRegistrationMessage`.

* DeviceManager class

`DeviceManager` manages all devices on the system. It can turn off all devices and thus dedicated clocks.

### CPU frequency update

`PowerManager` periodically checks the CPU load and queries `CpuGovernor` to determine the conditions for changing the CPU frequency.
After changing CPU frequency, all sentinels must be synchronously updated (e.g. `eInkSentinel`, `cellularSentinel`) so that they can update their resources (e.g. PWM fill)

![](./data/CpuFrequencyUpdate.svg)

### Resource request

Below is an example of requesting resources from `service_eInk` to redraw the screen:

![](./data/eInkResourceRequest.svg)

and requesting resources from `service_cellular` to make a phone call:

![](./data/cellularResourceRequest.svg)


A module-sys/SystemManager/doc/data/CpuFreqChangeAlgorithm.puml => module-sys/SystemManager/doc/data/CpuFreqChangeAlgorithm.puml +40 -0
@@ 0,0 1,40 @@
@startuml
start

if (cpuLoad > frequencyShiftUpperThreshold) then (yes) 
  : aboveThresholdCounter++
  belowThresholdCounter = 0;
else (no)
  if (cpuLoad < frequencyShiftLowerThreshold) then (yes)
    : belowThresholdCounter++
    aboveThresholdCounter = 0;
  else (no)
  	: belowThresholdCounter = 0
    aboveThresholdCounter = 0;  
  endif
endif

if (
   aboveThresholdCounter >= maxAboveThresholdCount
   or
   minFrequencyRequested > currentCpuFrequency
   ) then (yes)
  : IncreaseCpuFrequency()
  
  belowThresholdCounter = 0
  aboveThresholdCounter = 0;
else (no) 
   if (
   belowThresholdCounter >= maxBelowThresholdCount
   and
   currentCpuFreq > minFrequencyRequested
   ) then (yes)
  : DecreaseCpuFrequency()
  
  belowThresholdCounter = 0
  aboveThresholdCounter = 0;
  endif
endif

stop
@enduml
\ No newline at end of file

A module-sys/SystemManager/doc/data/CpuFreqChangeAlgorithm.svg => module-sys/SystemManager/doc/data/CpuFreqChangeAlgorithm.svg +52 -0
@@ 0,0 1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="611px" preserveAspectRatio="none" style="width:723px;height:611px;" version="1.1" viewBox="0 0 723 611" width="723px" zoomAndPan="magnify"><defs><filter height="300%" id="f4w1gyh31egl9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><ellipse cx="289.75" cy="20" fill="#000000" filter="url(#f4w1gyh31egl9)" rx="10" ry="10" style="stroke: none; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="171.25,50,408.25,50,420.25,62,408.25,74,171.25,74,159.25,62,171.25,50" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="237" x="171.25" y="65.8081">cpuLoad &gt; frequencyShiftUpperThreshold</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="20" x="139.25" y="59.4058">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="420.25" y="59.4058">no</text><rect fill="#FEFECE" filter="url(#f4w1gyh31egl9)" height="47.9375" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="194" x="10" y="84"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="170" x="24" y="105.1387">aboveThresholdCounter++</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="174" x="20" y="119.1074">belowThresholdCounter = 0</text><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="354,84,591,84,603,96,591,108,354,108,342,96,354,84" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="237" x="354" y="99.8081">cpuLoad &lt; frequencyShiftLowerThreshold</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="20" x="322" y="93.4058">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="603" y="93.4058">no</text><rect fill="#FEFECE" filter="url(#f4w1gyh31egl9)" height="47.9375" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="234" y="118"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="168" x="248" y="139.1387">belowThresholdCounter++</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="176" x="244" y="153.1074">aboveThresholdCounter = 0</text><rect fill="#FEFECE" filter="url(#f4w1gyh31egl9)" height="47.9375" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="198" x="514" y="118"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="174" x="528" y="139.1387">belowThresholdCounter = 0</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="176" x="524" y="153.1074">aboveThresholdCounter = 0</text><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="472.5,171.9375,484.5,183.9375,472.5,195.9375,460.5,183.9375,472.5,171.9375" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="289.75,201.9375,301.75,213.9375,289.75,225.9375,277.75,213.9375,289.75,201.9375" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="134.75,245.9375,444.75,245.9375,456.75,277.9492,444.75,309.9609,134.75,309.9609,122.75,277.9492,134.75,245.9375" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="138.75" y="256.1479"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="134.75" y="268.9526">aboveThresholdCounter &gt;= maxAboveThresholdCount</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="12" x="134.75" y="281.7573">or</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="277" x="134.75" y="294.562">minFrequencyRequested &gt; currentCpuFrequency</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="138.75" y="307.3667"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="20" x="102.75" y="275.355">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="456.75" y="275.355">no</text><rect fill="#FEFECE" filter="url(#f4w1gyh31egl9)" height="75.875" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="14.75" y="319.9609"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="153" x="28.75" y="341.0996">IncreaseCpuFrequency()</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="0" x="28.75" y="355.0684"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="174" x="24.75" y="369.0371">belowThresholdCounter = 0</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="176" x="24.75" y="383.0059">aboveThresholdCounter = 0</text><rect fill="#FEFECE" filter="url(#f4w1gyh31egl9)" height="75.875" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="368.75" y="408.3867"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="159" x="382.75" y="429.5254">DecreaseCpuFrequency()</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="0" x="382.75" y="443.4941"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="174" x="378.75" y="457.4629">belowThresholdCounter = 0</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="176" x="378.75" y="471.4316">aboveThresholdCounter = 0</text><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="312.25,319.9609,621.25,319.9609,633.25,351.9727,621.25,383.9844,312.25,383.9844,300.25,351.9727,312.25,319.9609" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="20" x="470.75" y="394.1948">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="316.25" y="330.1714"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="309" x="312.25" y="342.9761">belowThresholdCounter &gt;= maxBelowThresholdCount</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="312.25" y="355.7808">and</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="244" x="312.25" y="368.5854">currentCpuFreq &gt; minFrequencyRequested</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="316.25" y="381.3901"/><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="466.75,504.2617,478.75,516.2617,466.75,528.2617,454.75,516.2617,466.75,504.2617" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f4w1gyh31egl9)" points="289.75,534.2617,301.75,546.2617,289.75,558.2617,277.75,546.2617,289.75,534.2617" style="stroke: #A80036; stroke-width: 1.5;"/><ellipse cx="289.75" cy="589.2617" fill="#FFFFFF" filter="url(#f4w1gyh31egl9)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="289.75" cy="589.2617" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342" x2="332" y1="96" y2="96"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="332" x2="332" y1="96" y2="118"/><polygon fill="#A80036" points="328,108,332,118,336,108,332,112" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="603" x2="613" y1="96" y2="96"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="613" x2="613" y1="96" y2="118"/><polygon fill="#A80036" points="609,108,613,118,617,108,613,112" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="332" x2="332" y1="165.9375" y2="183.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="332" x2="460.5" y1="183.9375" y2="183.9375"/><polygon fill="#A80036" points="450.5,179.9375,460.5,183.9375,450.5,187.9375,454.5,183.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="613" x2="613" y1="165.9375" y2="183.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="613" x2="484.5" y1="183.9375" y2="183.9375"/><polygon fill="#A80036" points="494.5,179.9375,484.5,183.9375,494.5,187.9375,490.5,183.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="159.25" x2="107" y1="62" y2="62"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="107" x2="107" y1="62" y2="84"/><polygon fill="#A80036" points="103,74,107,84,111,74,107,78" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="420.25" x2="472.5" y1="62" y2="62"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="472.5" x2="472.5" y1="62" y2="84"/><polygon fill="#A80036" points="468.5,74,472.5,84,476.5,74,472.5,78" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="107" x2="107" y1="131.9375" y2="213.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="107" x2="277.75" y1="213.9375" y2="213.9375"/><polygon fill="#A80036" points="267.75,209.9375,277.75,213.9375,267.75,217.9375,271.75,213.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="472.5" x2="472.5" y1="195.9375" y2="213.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="472.5" x2="301.75" y1="213.9375" y2="213.9375"/><polygon fill="#A80036" points="311.75,209.9375,301.75,213.9375,311.75,217.9375,307.75,213.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="289.75" x2="289.75" y1="30" y2="50"/><polygon fill="#A80036" points="285.75,40,289.75,50,293.75,40,289.75,44" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="466.75" x2="466.75" y1="383.9844" y2="408.3867"/><polygon fill="#A80036" points="462.75,398.3867,466.75,408.3867,470.75,398.3867,466.75,402.3867" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="633.25" x2="645.25" y1="351.9727" y2="351.9727"/><polygon fill="#A80036" points="641.25,426.3184,645.25,436.3184,649.25,426.3184,645.25,430.3184" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="645.25" x2="645.25" y1="351.9727" y2="516.2617"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="645.25" x2="478.75" y1="516.2617" y2="516.2617"/><polygon fill="#A80036" points="488.75,512.2617,478.75,516.2617,488.75,520.2617,484.75,516.2617" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="466.75" x2="466.75" y1="484.2617" y2="504.2617"/><polygon fill="#A80036" points="462.75,494.2617,466.75,504.2617,470.75,494.2617,466.75,498.2617" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="122.75" x2="112.75" y1="277.9492" y2="277.9492"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="112.75" x2="112.75" y1="277.9492" y2="319.9609"/><polygon fill="#A80036" points="108.75,309.9609,112.75,319.9609,116.75,309.9609,112.75,313.9609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="456.75" x2="466.75" y1="277.9492" y2="277.9492"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="466.75" x2="466.75" y1="277.9492" y2="319.9609"/><polygon fill="#A80036" points="462.75,309.9609,466.75,319.9609,470.75,309.9609,466.75,313.9609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="112.75" x2="112.75" y1="395.8359" y2="546.2617"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="112.75" x2="277.75" y1="546.2617" y2="546.2617"/><polygon fill="#A80036" points="267.75,542.2617,277.75,546.2617,267.75,550.2617,271.75,546.2617" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="466.75" x2="466.75" y1="528.2617" y2="546.2617"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="466.75" x2="301.75" y1="546.2617" y2="546.2617"/><polygon fill="#A80036" points="311.75,542.2617,301.75,546.2617,311.75,550.2617,307.75,546.2617" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="289.75" x2="289.75" y1="225.9375" y2="245.9375"/><polygon fill="#A80036" points="285.75,235.9375,289.75,245.9375,293.75,235.9375,289.75,239.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="289.75" x2="289.75" y1="558.2617" y2="578.2617"/><polygon fill="#A80036" points="285.75,568.2617,289.75,578.2617,293.75,568.2617,289.75,572.2617" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ee2983799085d65f96fa6af7dcfc3842]
@startuml
start

if (cpuLoad > frequencyShiftUpperThreshold) then (yes)
: aboveThresholdCounter++
belowThresholdCounter = 0;
else (no)
if (cpuLoad < frequencyShiftLowerThreshold) then (yes)
: belowThresholdCounter++
aboveThresholdCounter = 0;
else (no)
: belowThresholdCounter = 0
aboveThresholdCounter = 0;
endif
endif

if (
aboveThresholdCounter >= maxAboveThresholdCount
or
minFrequencyRequested > currentCpuFrequency
) then (yes)
: IncreaseCpuFrequency()

belowThresholdCounter = 0
aboveThresholdCounter = 0;
else (no)
if (
belowThresholdCounter >= maxBelowThresholdCount
and
currentCpuFreq > minFrequencyRequested
) then (yes)
: DecreaseCpuFrequency()

belowThresholdCounter = 0
aboveThresholdCounter = 0;
endif
endif

stop
@enduml

PlantUML version 1.2019.11(Sun Sep 22 12:02:15 CEST 2019)
(EPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 14.0.2+12-46
Operating System: Linux
Default Encoding: UTF-8
Language: pl
Country: PL
--></g></svg>
\ No newline at end of file

A module-sys/SystemManager/doc/data/CpuFrequencyUpdate.puml => module-sys/SystemManager/doc/data/CpuFrequencyUpdate.puml +19 -0
@@ 0,0 1,19 @@
@startuml

PowerManager -> CpuGovernor : GetMinimumFrequencyRequested
CpuGovernor --> PowerManager : minimumFrequency

...CPU frequency change...

PowerManager -> CpuGovernor : CpuFrequencyHasChanged

CpuGovernor -> cellularSentinel : CpuFrequencyHasChanged

CpuGovernor -> eInkSentinel : CpuFrequencyHasChanged
eInkSentinel -> DriverPWM : updatePWM
note right
Critical section!
mutex necessary
end note

@enduml

A module-sys/SystemManager/doc/data/CpuFrequencyUpdate.svg => module-sys/SystemManager/doc/data/CpuFrequencyUpdate.svg +31 -0
@@ 0,0 1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="339px" preserveAspectRatio="none" style="width:883px;height:339px;" version="1.1" viewBox="0 0 883 339" width="883px" zoomAndPan="magnify"><defs><filter height="300%" id="f4w29l22zrjdz" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0;" x1="68" x2="68" y1="38.2969" y2="106.5625"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="68" x2="68" y1="106.5625" y2="147.3672"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="68" x2="68" y1="147.3672" y2="299.0313"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="308.5" x2="308.5" y1="38.2969" y2="106.5625"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="308.5" x2="308.5" y1="106.5625" y2="147.3672"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="308.5" x2="308.5" y1="147.3672" y2="299.0313"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="505.5" x2="505.5" y1="38.2969" y2="106.5625"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="505.5" x2="505.5" y1="106.5625" y2="147.3672"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="505.5" x2="505.5" y1="147.3672" y2="299.0313"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="627.5" x2="627.5" y1="38.2969" y2="106.5625"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="627.5" x2="627.5" y1="106.5625" y2="147.3672"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="627.5" x2="627.5" y1="147.3672" y2="299.0313"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="735.5" x2="735.5" y1="38.2969" y2="106.5625"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="735.5" x2="735.5" y1="106.5625" y2="147.3672"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="735.5" x2="735.5" y1="147.3672" y2="299.0313"/><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="8" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="15" y="22.9951">PowerManager</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="8" y="298.0313"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="15" y="318.0264">PowerManager</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="253.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="260.5" y="22.9951">CpuGovernor</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="253.5" y="298.0313"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="260.5" y="318.0264">CpuGovernor</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="444.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="451.5" y="22.9951">cellularSentinel</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="444.5" y="298.0313"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="451.5" y="318.0264">cellularSentinel</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="576.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="583.5" y="22.9951">eInkSentinel</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="576.5" y="298.0313"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="583.5" y="318.0264">eInkSentinel</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="88" x="689.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="74" x="696.5" y="22.9951">DriverPWM</text><rect fill="#FEFECE" filter="url(#f4w29l22zrjdz)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="88" x="689.5" y="298.0313"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="74" x="696.5" y="318.0264">DriverPWM</text><polygon fill="#A80036" points="296.5,65.4297,306.5,69.4297,296.5,73.4297,300.5,69.4297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="68.5" x2="302.5" y1="69.4297" y2="69.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="216" x="75.5" y="64.3638">GetMinimumFrequencyRequested</text><polygon fill="#A80036" points="79.5,94.5625,69.5,98.5625,79.5,102.5625,75.5,98.5625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="73.5" x2="307.5" y1="98.5625" y2="98.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="127" x="85.5" y="93.4966">minimumFrequency</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="338" y="130.7729">CPU frequency change</text><polygon fill="#A80036" points="296.5,164.5,306.5,168.5,296.5,172.5,300.5,168.5" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="68.5" x2="302.5" y1="168.5" y2="168.5"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="75.5" y="163.4341">CpuFrequencyHasChanged</text><polygon fill="#A80036" points="493.5,193.6328,503.5,197.6328,493.5,201.6328,497.5,197.6328" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="308.5" x2="499.5" y1="197.6328" y2="197.6328"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="315.5" y="192.5669">CpuFrequencyHasChanged</text><polygon fill="#A80036" points="616,222.7656,626,226.7656,616,230.7656,620,226.7656" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="308.5" x2="622" y1="226.7656" y2="226.7656"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="315.5" y="221.6997">CpuFrequencyHasChanged</text><polygon fill="#A80036" points="723.5,264.4648,733.5,268.4648,723.5,272.4648,727.5,268.4648" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="628" x2="729.5" y1="268.4648" y2="268.4648"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="75" x="635" y="263.3989">updatePWM</text><path d="M740,239.7656 L740,279.7656 L871,279.7656 L871,249.7656 L861,239.7656 L740,239.7656 " fill="#FBFB77" filter="url(#f4w29l22zrjdz)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M861,239.7656 L861,249.7656 L871,249.7656 L861,239.7656 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="98" x="746" y="256.8325">Critical section!</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="110" x="746" y="271.9653">mutex necessary</text><!--MD5=[6c4788b841e800cf870b69c0ce829c52]
@startuml

PowerManager -> CpuGovernor : GetMinimumFrequencyRequested
CpuGovernor - -> PowerManager : minimumFrequency

...CPU frequency change...

PowerManager -> CpuGovernor : CpuFrequencyHasChanged

CpuGovernor -> cellularSentinel : CpuFrequencyHasChanged

CpuGovernor -> eInkSentinel : CpuFrequencyHasChanged
eInkSentinel -> DriverPWM : updatePWM
note right
Critical section!
mutex necessary
end note

@enduml

PlantUML version 1.2019.11(Sun Sep 22 12:02:15 CEST 2019)
(EPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 14.0.2+12-46
Operating System: Linux
Default Encoding: UTF-8
Language: pl
Country: PL
--></g></svg>
\ No newline at end of file

A module-sys/SystemManager/doc/data/ResourceRequest.puml => module-sys/SystemManager/doc/data/ResourceRequest.puml +70 -0
@@ 0,0 1,70 @@
@startuml

service_eInk -> eInkSentinel : SetFrequencyValueRequest
eInkSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : SetCpuFrequencyRequest

service_eInk -> EinkDisplay : powerOn
EinkDisplay -> driverLPSPI : Enable

driverLPSPI -> driverPLL2 : Pll2ClockEnable
note right
Critical section!
mutex necessary
end note

driverLPSPI -> clock_config : LPSPIClockEnable

...screen redraw...
 
EinkDisplay -> driverLPSPI : Disable
 
driverLPSPI -> clock_config : LPSPIClockDisable

driverLPSPI -> driverPLL2 : Pll2ClockDisable
note right
Critical section!
mutex necessary
end note

service_eInk -> eInkSentinel : ResetCpuFrequencyRequest
eInkSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : ResetCpuFrequencyRequest

@enduml
 



@startuml

service_cellular -> cellularSentinel : SetFrequencyValueRequest
cellularSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : SetCpuFrequencyRequest

service_cellular -> bsp_cellular : wakeUp
bsp_cellular -> driverUART : Enable

driverUART -> clock_config : ExternalOscillatorEnable
note right
Critical section!
mutex necessary
end note

driverUART -> clock_config : UARTClockEnable

...call ended...
 
bsp_cellular -> driverUART : Disable
 
driverUART -> clock_config : UARTClockDisable

service_cellular -> cellularSentinel : ResetCpuFrequencyRequest
cellularSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : ResetCpuFrequencyRequest

@enduml

A module-sys/SystemManager/doc/data/cellularResourceRequest.svg => module-sys/SystemManager/doc/data/cellularResourceRequest.svg +42 -0
@@ 0,0 1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="514px" preserveAspectRatio="none" style="width:1246px;height:514px;" version="1.1" viewBox="0 0 1246 514" width="1246px" zoomAndPan="magnify"><defs><filter height="300%" id="f1tv0e0kd571ez" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0;" x1="69" x2="69" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="69" x2="69" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="69" x2="69" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="272" x2="272" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="272" x2="272" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="272" x2="272" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="495.5" x2="495.5" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="495.5" x2="495.5" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="495.5" x2="495.5" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="699" x2="699" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="699" x2="699" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="699" x2="699" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="813" x2="813" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="813" x2="813" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="813" x2="813" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="920" x2="920" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="920" x2="920" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="920" x2="920" y1="318.1641" y2="473.8281"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1097.5" x2="1097.5" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1097.5" x2="1097.5" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1097.5" x2="1097.5" y1="318.1641" y2="473.8281"/><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="8" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="15" y="22.9951">service_cellular</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="8" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="15" y="492.8232">service_cellular</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="211" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="218" y="22.9951">cellularSentinel</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="118" x="211" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="104" x="218" y="492.8232">cellularSentinel</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="435.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="442.5" y="22.9951">PowerManager</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="435.5" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="442.5" y="492.8232">PowerManager</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="644" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="651" y="22.9951">CpuGovernor</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="644" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="651" y="492.8232">CpuGovernor</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="764" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="81" x="771" y="22.9951">bsp_cellular</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="764" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="81" x="771" y="492.8232">bsp_cellular</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="90" x="873" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="76" x="880" y="22.9951">driverUART</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="90" x="873" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="76" x="880" y="492.8232">driverUART</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="1046.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="1053.5" y="22.9951">clock_config</text><rect fill="#FEFECE" filter="url(#f1tv0e0kd571ez)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="1046.5" y="472.8281"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="1053.5" y="492.8232">clock_config</text><polygon fill="#A80036" points="260,65.4297,270,69.4297,260,73.4297,264,69.4297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="69" x2="266" y1="69.4297" y2="69.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="176" x="76" y="64.3638">SetFrequencyValueRequest</text><polygon fill="#A80036" points="484,94.5625,494,98.5625,484,102.5625,488,98.5625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="272" x2="490" y1="98.5625" y2="98.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="200" x="279" y="93.4966">RequestCpuFrequencyMessage</text><polygon fill="#A80036" points="687,123.6953,697,127.6953,687,131.6953,691,127.6953" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="496" x2="693" y1="127.6953" y2="127.6953"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="165" x="503" y="122.6294">SetCpuFrequencyRequest</text><polygon fill="#A80036" points="801.5,152.8281,811.5,156.8281,801.5,160.8281,805.5,156.8281" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="69" x2="807.5" y1="156.8281" y2="156.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="50" x="76" y="151.7622">wakeUp</text><polygon fill="#A80036" points="908,181.9609,918,185.9609,908,189.9609,912,185.9609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="813.5" x2="914" y1="185.9609" y2="185.9609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="43" x="820.5" y="180.895">Enable</text><polygon fill="#A80036" points="1086,223.6602,1096,227.6602,1086,231.6602,1090,227.6602" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="920" x2="1092" y1="227.6602" y2="227.6602"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="154" x="927" y="222.5942">ExternalOscillatorEnable</text><path d="M1103,198.9609 L1103,238.9609 L1234,238.9609 L1234,208.9609 L1224,198.9609 L1103,198.9609 " fill="#FBFB77" filter="url(#f1tv0e0kd571ez)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1224,198.9609 L1224,208.9609 L1234,208.9609 L1224,198.9609 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="98" x="1109" y="216.0278">Critical section!</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="110" x="1109" y="231.1606">mutex necessary</text><polygon fill="#A80036" points="1086,265.3594,1096,269.3594,1086,273.3594,1090,269.3594" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="920" x2="1092" y1="269.3594" y2="269.3594"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="111" x="927" y="264.2935">UARTClockEnable</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="554.5" y="301.5698">call ended</text><polygon fill="#A80036" points="908,335.2969,918,339.2969,908,343.2969,912,339.2969" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="813.5" x2="914" y1="339.2969" y2="339.2969"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="47" x="820.5" y="334.231">Disable</text><polygon fill="#A80036" points="1086,364.4297,1096,368.4297,1086,372.4297,1090,368.4297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="920" x2="1092" y1="368.4297" y2="368.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="115" x="927" y="363.3638">UARTClockDisable</text><polygon fill="#A80036" points="260,393.5625,270,397.5625,260,401.5625,264,397.5625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="69" x2="266" y1="397.5625" y2="397.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="179" x="76" y="392.4966">ResetCpuFrequencyRequest</text><polygon fill="#A80036" points="484,422.6953,494,426.6953,484,430.6953,488,426.6953" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="272" x2="490" y1="426.6953" y2="426.6953"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="200" x="279" y="421.6294">RequestCpuFrequencyMessage</text><polygon fill="#A80036" points="687,451.8281,697,455.8281,687,459.8281,691,455.8281" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="496" x2="693" y1="455.8281" y2="455.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="179" x="503" y="450.7622">ResetCpuFrequencyRequest</text><!--MD5=[6fcf4d81c1fbb048db22def46a2b620c]
@startuml

service_cellular -> cellularSentinel : SetFrequencyValueRequest
cellularSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : SetCpuFrequencyRequest

service_cellular -> bsp_cellular : wakeUp
bsp_cellular -> driverUART : Enable

driverUART -> clock_config : ExternalOscillatorEnable
note right
Critical section!
mutex necessary
end note

driverUART -> clock_config : UARTClockEnable

...call ended...

bsp_cellular -> driverUART : Disable

driverUART -> clock_config : UARTClockDisable

service_cellular -> cellularSentinel : ResetCpuFrequencyRequest
cellularSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : ResetCpuFrequencyRequest

@enduml

PlantUML version 1.2019.11(Sun Sep 22 12:02:15 CEST 2019)
(EPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 14.0.2+12-46
Operating System: Linux
Default Encoding: UTF-8
Language: pl
Country: PL
--></g></svg>
\ No newline at end of file

A module-sys/SystemManager/doc/data/eInkResourceRequest.svg => module-sys/SystemManager/doc/data/eInkResourceRequest.svg +48 -0
@@ 0,0 1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="568px" preserveAspectRatio="none" style="width:1198px;height:568px;" version="1.1" viewBox="0 0 1198 568" width="1198px" zoomAndPan="magnify"><defs><filter height="300%" id="fcbnkjoqvuo08" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><line style="stroke: #A80036; stroke-width: 1.0;" x1="59" x2="59" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="59" x2="59" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="59" x2="59" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="262" x2="262" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="262" x2="262" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="262" x2="262" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="486" x2="486" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="486" x2="486" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="486" x2="486" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="689.5" x2="689.5" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="689.5" x2="689.5" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="689.5" x2="689.5" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="802.5" x2="802.5" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="802.5" x2="802.5" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="802.5" x2="802.5" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="906.5" x2="906.5" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="906.5" x2="906.5" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="906.5" x2="906.5" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1034" x2="1034" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1034" x2="1034" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1034" x2="1034" y1="318.1641" y2="528.0938"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1139" x2="1139" y1="38.2969" y2="277.3594"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1139" x2="1139" y1="277.3594" y2="318.1641"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1139" x2="1139" y1="318.1641" y2="528.0938"/><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="8" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="15" y="22.9951">service_eInk</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="8" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="15" y="547.0889">service_eInk</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="211" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="218" y="22.9951">eInkSentinel</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="211" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="218" y="547.0889">eInkSentinel</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="426" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="433" y="22.9951">PowerManager</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="117" x="426" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="103" x="433" y="547.0889">PowerManager</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="634.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="641.5" y="22.9951">CpuGovernor</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="106" x="634.5" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="92" x="641.5" y="547.0889">CpuGovernor</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="92" x="754.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="78" x="761.5" y="22.9951">EinkDisplay</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="92" x="754.5" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="78" x="761.5" y="547.0889">EinkDisplay</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="89" x="860.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="75" x="867.5" y="22.9951">driverLPSPI</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="89" x="860.5" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="75" x="867.5" y="547.0889">driverLPSPI</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="84" x="990" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="70" x="997" y="22.9951">driverPLL2</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="84" x="990" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="70" x="997" y="547.0889">driverPLL2</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="1088" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="1095" y="22.9951">clock_config</text><rect fill="#FEFECE" filter="url(#fcbnkjoqvuo08)" height="30.2969" style="stroke: #A80036; stroke-width: 1.5;" width="99" x="1088" y="527.0938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="85" x="1095" y="547.0889">clock_config</text><polygon fill="#A80036" points="250.5,65.4297,260.5,69.4297,250.5,73.4297,254.5,69.4297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="59.5" x2="256.5" y1="69.4297" y2="69.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="176" x="66.5" y="64.3638">SetFrequencyValueRequest</text><polygon fill="#A80036" points="474.5,94.5625,484.5,98.5625,474.5,102.5625,478.5,98.5625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="262.5" x2="480.5" y1="98.5625" y2="98.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="200" x="269.5" y="93.4966">RequestCpuFrequencyMessage</text><polygon fill="#A80036" points="677.5,123.6953,687.5,127.6953,677.5,131.6953,681.5,127.6953" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="486.5" x2="683.5" y1="127.6953" y2="127.6953"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="165" x="493.5" y="122.6294">SetCpuFrequencyRequest</text><polygon fill="#A80036" points="790.5,152.8281,800.5,156.8281,790.5,160.8281,794.5,156.8281" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="59.5" x2="796.5" y1="156.8281" y2="156.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="56" x="66.5" y="151.7622">powerOn</text><polygon fill="#A80036" points="895,181.9609,905,185.9609,895,189.9609,899,185.9609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="802.5" x2="901" y1="185.9609" y2="185.9609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="43" x="809.5" y="180.895">Enable</text><polygon fill="#A80036" points="1022,223.6602,1032,227.6602,1022,231.6602,1026,227.6602" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="907" x2="1028" y1="227.6602" y2="227.6602"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="99" x="914" y="222.5942">Pll2ClockEnable</text><path d="M1039,198.9609 L1039,238.9609 L1170,238.9609 L1170,208.9609 L1160,198.9609 L1039,198.9609 " fill="#FBFB77" filter="url(#fcbnkjoqvuo08)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1160,198.9609 L1160,208.9609 L1170,208.9609 L1160,198.9609 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="98" x="1045" y="216.0278">Critical section!</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="110" x="1045" y="231.1606">mutex necessary</text><polygon fill="#A80036" points="1127.5,265.3594,1137.5,269.3594,1127.5,273.3594,1131.5,269.3594" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="907" x2="1133.5" y1="269.3594" y2="269.3594"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="914" y="264.2935">LPSPIClockEnable</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="558" y="301.5698">screen redraw</text><polygon fill="#A80036" points="895,335.2969,905,339.2969,895,343.2969,899,339.2969" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="802.5" x2="901" y1="339.2969" y2="339.2969"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="47" x="809.5" y="334.231">Disable</text><polygon fill="#A80036" points="1127.5,364.4297,1137.5,368.4297,1127.5,372.4297,1131.5,368.4297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="907" x2="1133.5" y1="368.4297" y2="368.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="116" x="914" y="363.3638">LPSPIClockDisable</text><polygon fill="#A80036" points="1022,406.1289,1032,410.1289,1022,414.1289,1026,410.1289" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="907" x2="1028" y1="410.1289" y2="410.1289"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="103" x="914" y="405.063">Pll2ClockDisable</text><path d="M1039,381.4297 L1039,421.4297 L1170,421.4297 L1170,391.4297 L1160,381.4297 L1039,381.4297 " fill="#FBFB77" filter="url(#fcbnkjoqvuo08)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1160,381.4297 L1160,391.4297 L1170,391.4297 L1160,381.4297 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="98" x="1045" y="398.4966">Critical section!</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="110" x="1045" y="413.6294">mutex necessary</text><polygon fill="#A80036" points="250.5,447.8281,260.5,451.8281,250.5,455.8281,254.5,451.8281" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="59.5" x2="256.5" y1="451.8281" y2="451.8281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="179" x="66.5" y="446.7622">ResetCpuFrequencyRequest</text><polygon fill="#A80036" points="474.5,476.9609,484.5,480.9609,474.5,484.9609,478.5,480.9609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="262.5" x2="480.5" y1="480.9609" y2="480.9609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="200" x="269.5" y="475.895">RequestCpuFrequencyMessage</text><polygon fill="#A80036" points="677.5,506.0938,687.5,510.0938,677.5,514.0938,681.5,510.0938" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="486.5" x2="683.5" y1="510.0938" y2="510.0938"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="179" x="493.5" y="505.0278">ResetCpuFrequencyRequest</text><!--MD5=[b2ae224b2d638e53bd7e0f72551ef878]
@startuml

service_eInk -> eInkSentinel : SetFrequencyValueRequest
eInkSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : SetCpuFrequencyRequest

service_eInk -> EinkDisplay : powerOn
EinkDisplay -> driverLPSPI : Enable

driverLPSPI -> driverPLL2 : Pll2ClockEnable
note right
Critical section!
mutex necessary
end note

driverLPSPI -> clock_config : LPSPIClockEnable

...screen redraw...

EinkDisplay -> driverLPSPI : Disable

driverLPSPI -> clock_config : LPSPIClockDisable

driverLPSPI -> driverPLL2 : Pll2ClockDisable
note right
Critical section!
mutex necessary
end note

service_eInk -> eInkSentinel : ResetCpuFrequencyRequest
eInkSentinel -> PowerManager : RequestCpuFrequencyMessage

PowerManager -> CpuGovernor : ResetCpuFrequencyRequest

@enduml

PlantUML version 1.2019.11(Sun Sep 22 12:02:15 CEST 2019)
(EPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 14.0.2+12-46
Operating System: Linux
Default Encoding: UTF-8
Language: pl
Country: PL
--></g></svg>
\ No newline at end of file