086f36c4a723c4ee87baef79ac7b336de6bea47b
[staging/basesystem.git] / video_in_hal / systemservice / power_service / server / include / ss_power_state_machine.h
1 /*
2  * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 ///////////////////////////////////////////////////////////////////////////////
18 /// \ingroup  tag_PowerService
19 /// \brief    This file supports the power service state machine.
20 ///
21 ///////////////////////////////////////////////////////////////////////////////
22 #ifndef POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_
23 #define POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_
24
25 #include <system_service/ss_power_service.h>
26 #include "ss_power_state_hysteresis.h"
27
28 class PowerSessionHandler;
29
30 class PowerStateMachine {
31   class Base_State {
32    public:
33     virtual void onWakeup(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
34                           PowerSessionHandler & oSession) {  // NOLINT (runtime/references)
35     }
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)
40
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
45     }
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)
51
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
56     }
57     // LCOV_EXCL_STOP 200: virtual function
58
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
63     }
64     // LCOV_EXCL_STOP 200: virtual function
65
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
70     }
71     // LCOV_EXCL_STOP 200: virtual function
72
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
77     }
78     // LCOV_EXCL_STOP 200: virtual function
79
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
84     }
85     // LCOV_EXCL_STOP 200: virtual function
86
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
91     }
92     // LCOV_EXCL_STOP 200: virtual function
93     virtual PCSTR name() = 0;
94
95     /// State Entry and Exit methods
96
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
101     }
102     // LCOV_EXCL_STOP 200: virtual function
103
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
108     }
109     // LCOV_EXCL_STOP 200: virtual function
110   };
111
112   friend class Base_State;
113
114   class Wakeup : public Base_State {
115    public:
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();
129
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
134     }
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)
138     }
139   };
140
141   friend class Wakeup;
142
143   class WakeupActive : public Wakeup {
144    public:
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)
151     PCSTR name();
152
153     void onEntry(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
154                  PowerSessionHandler & oSession) {  // NOLINT (runtime/references)
155     }
156     void onExit(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
157                 PowerSessionHandler & oSession) {  // NOLINT (runtime/references)
158     }
159   };
160
161   friend class WakeupActive;
162
163   class WakeupPending : public Wakeup {
164    public:
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)
171
172     void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
173                                     PowerSessionHandler & oSession);  // NOLINT (runtime/references)
174     PCSTR name();
175
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)
180     }
181   };
182
183   friend class WakeupPending;
184
185   class Shutdown : public Base_State {
186    public:
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)
191     }
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)
200     PCSTR name();
201
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)
206   };
207
208   friend class Shutdown;
209
210   class ShutdownActive : public Base_State {
211    public:
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)
218     PCSTR name();
219
220     void onEntry(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
221                  PowerSessionHandler & oSession);  // NOLINT (runtime/references)
222   };
223
224   friend class ShutdownActive;
225
226   class LowVoltage1 : public Base_State {
227    public:
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)
238     PCSTR name();
239
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)
244   };
245
246   friend class LowVoltage1;
247
248   class LowVoltage1Active : public Base_State {
249    public:
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)
254     PCSTR name();
255
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)
260   };
261
262   friend class LowVoltage1Active;
263
264   class LowVoltage2 : public Base_State {
265    public:
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)
276     PCSTR name();
277
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)
282   };
283
284   friend class LowVoltage2;
285
286   class LowVoltage2Active : public Base_State {
287    public:
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)
292     PCSTR name();
293
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)
298   };
299
300   friend class LowVoltage2Active;
301
302   class NormalVoltage : public Base_State {
303    public:
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)
312     PCSTR name();
313
314     void onEntry(PowerStateMachine &u, HANDLE h_app,  // NOLINT (runtime/references)
315                  PowerSessionHandler & oSession);  // NOLINT (runtime/references)
316   };
317
318   friend class NormalVoltage;
319
320   class SoftwareUpdate : public Base_State {
321    public:
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)
328     PCSTR name();
329
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)
334   };
335
336   friend class SoftwareUpdate;
337
338  public:
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;
355
356   PowerStateMachine();
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)
361   PCSTR name();
362
363  private:
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;
375
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;
386
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;
393   } Pwr_StateInfo;
394
395   Pwr_StateInfo m_tStateInfo;
396
397   PowerStateMachine(PowerStateMachine&);
398   PowerStateMachine & operator=(PowerStateMachine &);
399
400   /// Helper methods
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);
409
410   void OnVoltage(Base_State * pState, HANDLE h_app,
411                  PowerSessionHandler & oSession);  // NOLINT (runtime/references)
412 };
413
414 #endif  // POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_