2 * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 ///////////////////////////////////////////////////////////////////////////////
18 /// \ingroup tag_PowerService
19 /// \brief This file supports the power service state machine.
21 ///////////////////////////////////////////////////////////////////////////////
22 #ifndef POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_
23 #define POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_
25 #include <system_service/ss_power_service.h>
26 #include "ss_power_state_hysteresis.h"
28 class PowerSessionHandler;
30 class PowerStateMachine {
33 virtual void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
34 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
36 virtual void onStartComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
37 PowerSessionHandler & oSession); // NOLINT (runtime/references)
38 virtual void onLaunchComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
39 PowerSessionHandler & oSession); // NOLINT (runtime/references)
41 // LCOV_EXCL_START 200: virtual function
42 virtual void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
43 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
44 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
46 // LCOV_EXCL_STOP 200: virtual function
47 virtual void onStopComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
48 PowerSessionHandler & oSession); // NOLINT (runtime/references)
49 virtual void onShutdownComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
50 PowerSessionHandler & oSession); // NOLINT (runtime/references)
52 // LCOV_EXCL_START 200: virtual function
53 virtual void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
54 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
55 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
57 // LCOV_EXCL_STOP 200: virtual function
59 // LCOV_EXCL_START 200: virtual function
60 virtual void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
61 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
62 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
64 // LCOV_EXCL_STOP 200: virtual function
66 // LCOV_EXCL_START 200: virtual function
67 virtual void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
68 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
69 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
71 // LCOV_EXCL_STOP 200: virtual function
73 // LCOV_EXCL_START 200: virtual function
74 virtual void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
75 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
76 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
78 // LCOV_EXCL_STOP 200: virtual function
80 // LCOV_EXCL_START 200: virtual function
81 virtual void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
82 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
83 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
85 // LCOV_EXCL_STOP 200: virtual function
87 // LCOV_EXCL_START 200: virtual function
88 virtual void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
89 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
90 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
92 // LCOV_EXCL_STOP 200: virtual function
93 virtual PCSTR name() = 0;
95 /// State Entry and Exit methods
97 // LCOV_EXCL_START 200: virtual function
98 virtual void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
99 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
100 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
102 // LCOV_EXCL_STOP 200: virtual function
104 // LCOV_EXCL_START 200: virtual function
105 virtual void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
106 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
107 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
109 // LCOV_EXCL_STOP 200: virtual function
112 friend class Base_State;
114 class Wakeup : public Base_State {
116 void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
117 PowerSessionHandler & oSession); // NOLINT (runtime/references)
118 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
119 PowerSessionHandler & oSession); // NOLINT (runtime/references)
120 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
121 PowerSessionHandler & oSession); // NOLINT (runtime/references)
122 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
123 PowerSessionHandler & oSession); // NOLINT (runtime/references)
124 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
125 PowerSessionHandler & oSession); // NOLINT (runtime/references)
126 void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
127 PowerSessionHandler & oSession); // NOLINT (runtime/references)
128 virtual PCSTR name();
130 // LCOV_EXCL_START 8: fist status, no entry
131 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
132 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
133 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
135 // LCOV_EXCL_STOP 8: fist status, no entry
136 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
137 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
143 class WakeupActive : public Wakeup {
145 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
146 PowerSessionHandler & oSession); // NOLINT (runtime/references)
147 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
148 PowerSessionHandler & oSession); // NOLINT (runtime/references)
149 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
150 PowerSessionHandler & oSession); // NOLINT (runtime/references)
153 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
154 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
156 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
157 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
161 friend class WakeupActive;
163 class WakeupPending : public Wakeup {
165 void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
166 PowerSessionHandler & oSession); // NOLINT (runtime/references)
167 void onStartComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
168 PowerSessionHandler & oSession); // NOLINT (runtime/references)
169 void onLaunchComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
170 PowerSessionHandler & oSession); // NOLINT (runtime/references)
172 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
173 PowerSessionHandler & oSession); // NOLINT (runtime/references)
176 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
177 PowerSessionHandler & oSession); // NOLINT (runtime/references)
178 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
179 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
183 friend class WakeupPending;
185 class Shutdown : public Base_State {
187 void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
188 PowerSessionHandler & oSession); // NOLINT (runtime/references)
189 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
190 PowerSessionHandler & oSession) { // NOLINT (runtime/references)
192 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
193 PowerSessionHandler & oSession); // NOLINT (runtime/references)
194 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
195 PowerSessionHandler & oSession); // NOLINT (runtime/references)
196 void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
197 PowerSessionHandler & oSession); // NOLINT (runtime/references)
198 void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
199 PowerSessionHandler & oSession); // NOLINT (runtime/references)
202 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
203 PowerSessionHandler & oSession); // NOLINT (runtime/references)
204 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
205 PowerSessionHandler & oSession); // NOLINT (runtime/references)
208 friend class Shutdown;
210 class ShutdownActive : public Base_State {
212 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
213 PowerSessionHandler & oSession); // NOLINT (runtime/references)
214 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
215 PowerSessionHandler & oSession); // NOLINT (runtime/references)
216 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
217 PowerSessionHandler & oSession); // NOLINT (runtime/references)
220 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
221 PowerSessionHandler & oSession); // NOLINT (runtime/references)
224 friend class ShutdownActive;
226 class LowVoltage1 : public Base_State {
228 void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
229 PowerSessionHandler & oSession); // NOLINT (runtime/references)
230 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
231 PowerSessionHandler & oSession); // NOLINT (runtime/references)
232 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
233 PowerSessionHandler & oSession); // NOLINT (runtime/references)
234 void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
235 PowerSessionHandler & oSession); // NOLINT (runtime/references)
236 void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
237 PowerSessionHandler & oSession); // NOLINT (runtime/references)
240 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
241 PowerSessionHandler & oSession); // NOLINT (runtime/references)
242 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
243 PowerSessionHandler & oSession); // NOLINT (runtime/references)
246 friend class LowVoltage1;
248 class LowVoltage1Active : public Base_State {
250 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
251 PowerSessionHandler & oSession); // NOLINT (runtime/references)
252 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
253 PowerSessionHandler & oSession); // NOLINT (runtime/references)
256 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
257 PowerSessionHandler & oSession); // NOLINT (runtime/references)
258 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
259 PowerSessionHandler & oSession); // NOLINT (runtime/references)
262 friend class LowVoltage1Active;
264 class LowVoltage2 : public Base_State {
266 void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
267 PowerSessionHandler & oSession); // NOLINT (runtime/references)
268 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
269 PowerSessionHandler & oSession); // NOLINT (runtime/references)
270 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
271 PowerSessionHandler & oSession); // NOLINT (runtime/references)
272 void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
273 PowerSessionHandler & oSession); // NOLINT (runtime/references)
274 void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
275 PowerSessionHandler & oSession); // NOLINT (runtime/references)
278 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
279 PowerSessionHandler & oSession); // NOLINT (runtime/references)
280 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
281 PowerSessionHandler & oSession); // NOLINT (runtime/references)
284 friend class LowVoltage2;
286 class LowVoltage2Active : public Base_State {
288 void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
289 PowerSessionHandler & oSession); // NOLINT (runtime/references)
290 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
291 PowerSessionHandler & oSession); // NOLINT (runtime/references)
294 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
295 PowerSessionHandler & oSession); // NOLINT (runtime/references)
296 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
297 PowerSessionHandler & oSession); // NOLINT (runtime/references)
300 friend class LowVoltage2Active;
302 class NormalVoltage : public Base_State {
304 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
305 PowerSessionHandler & oSession); // NOLINT (runtime/references)
306 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
307 PowerSessionHandler & oSession); // NOLINT (runtime/references)
308 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
309 PowerSessionHandler & oSession); // NOLINT (runtime/references)
310 void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
311 PowerSessionHandler & oSession); // NOLINT (runtime/references)
314 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
315 PowerSessionHandler & oSession); // NOLINT (runtime/references)
318 friend class NormalVoltage;
320 class SoftwareUpdate : public Base_State {
322 void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
323 PowerSessionHandler & oSession); // NOLINT (runtime/references)
324 void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
325 PowerSessionHandler & oSession); // NOLINT (runtime/references)
326 void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
327 PowerSessionHandler & oSession); // NOLINT (runtime/references)
330 void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
331 PowerSessionHandler & oSession); // NOLINT (runtime/references)
332 void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references)
333 PowerSessionHandler & oSession); // NOLINT (runtime/references)
336 friend class SoftwareUpdate;
339 typedef enum _Power_State_Machine_Events {
340 epsmeWAKEUP = epswsPWRON,
341 epsmeSHUTDOWN = epscnCANSLEEP,
342 epsmeLVI1_ENCOUNTERED = epsvsLVI1,
343 epsmeLVI2_ENCOUNTERED = epsvsLVI2,
344 epsmeNORMAL_VOLTAGE_ENCOUNTERED = epsvsNORMAL,
345 epsmeSTART_COMPLETE = 0xD1,
346 epsmeSTOP_COMPLETE = 0xD2,
347 epsmeSOFTWARE_UPDATE = 0xE1,
348 epsmeSHUTDOWN_HYSTERESIS_ABORTED = 0xF1,
349 epsmeLVI1_HYSTERESIS_ABORTED = 0xF2,
350 epsmeLVI2_HYSTERESIS_ABORTED = 0xF3,
351 epsmeSHUTDOWN_HYSTERESIS_TM_OUT = 0xFA,
352 epsmeLVI1_HYSTERESIS_TM_OUT = 0xFB,
353 epsmeLVI2_HYSTERESIS_TM_OUT = 0xFC,
354 } ePowerStateMachineEvents;
357 virtual ~PowerStateMachine();
358 void onEvent(HANDLE h_app, PowerSessionHandler & oSession, // NOLINT (runtime/references)
359 ePowerStateMachineEvents evt);
360 EFrameworkunifiedStatus initialize(HANDLE h_app, PowerConfigParams & refConfigParms); // NOLINT (runtime/references)
364 static Wakeup WakeupState;
365 static WakeupActive WakeupActiveState;
366 static WakeupPending WakeupPendingState;
367 static LowVoltage1 LowVoltage1State;
368 static LowVoltage1Active LowVoltage1ActiveState;
369 static LowVoltage2 LowVoltage2State;
370 static LowVoltage2Active LowVoltage2ActiveState;
371 static Shutdown ShutdownState;
372 static ShutdownActive ShutdownActiveState;
373 static NormalVoltage NormalVoltageState;
374 static SoftwareUpdate SoftwareUpdateState;
376 Base_State *m_pCurrentState;
377 Base_State *m_pPreviousState;
378 Base_State *m_pOnHysteresisTimeoutState;
379 PowerStateHysteresis m_oShutdownHysteresis;
380 PowerStateHysteresis m_oLowVoltage1Hysteresis;
381 PowerStateHysteresis m_oLowVoltage2Hysteresis;
382 RequiredModuleList m_lstWakeupModules;
383 RequiredModuleList m_lstShutdownModules;
384 RequiredModuleList m_lstLvi2Modules;
385 HANDLE m_hHysteresisTimer;
387 typedef struct _state_info {
388 EPWR_POWER_STATE_TYPE wake;
389 EPWR_VOLTAGE_STATE_TYPE voltage;
390 EPWR_WAKEUP_LEVEL_TYPE level;
391 EPWR_WAKEUP_FACTOR_TYPE factor;
392 EPWR_CRANK_STATE_TYPE crank;
395 Pwr_StateInfo m_tStateInfo;
397 PowerStateMachine(PowerStateMachine&);
398 PowerStateMachine & operator=(PowerStateMachine &);
401 void NextState(Base_State & refState, HANDLE h_app, // NOLINT (runtime/references)
402 PowerSessionHandler & oSession); // NOLINT (runtime/references)
403 void GotoStateOnHysteresisTimeout(Base_State & refState); // NOLINT (runtime/references)
404 void startHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references)
405 void reStartHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references)
406 void stopHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references)
407 void publishPowerLVIStatus(HANDLE h_app, PCSTR nNotifNm, UI_32 value);
408 void publishPowerLevelType(HANDLE h_app, UI_32 value);
410 void OnVoltage(Base_State * pState, HANDLE h_app,
411 PowerSessionHandler & oSession); // NOLINT (runtime/references)
414 #endif // POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_