X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=service%2Fsystem%2Fpower_service%2Fserver%2Finclude%2Fss_power_state_machine.h;fp=service%2Fsystem%2Fpower_service%2Fserver%2Finclude%2Fss_power_state_machine.h;h=086f36c4a723c4ee87baef79ac7b336de6bea47b;hb=17cf21bcf8a2e29d2cbcf0a313474d2a4ee44f5d;hp=0000000000000000000000000000000000000000;hpb=9e86046cdb356913ae026f616e5bf17f6f238aa5;p=staging%2Fbasesystem.git diff --git a/service/system/power_service/server/include/ss_power_state_machine.h b/service/system/power_service/server/include/ss_power_state_machine.h new file mode 100755 index 0000000..086f36c --- /dev/null +++ b/service/system/power_service/server/include/ss_power_state_machine.h @@ -0,0 +1,414 @@ +/* + * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/////////////////////////////////////////////////////////////////////////////// +/// \ingroup tag_PowerService +/// \brief This file supports the power service state machine. +/// +/////////////////////////////////////////////////////////////////////////////// +#ifndef POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_ +#define POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_ + +#include +#include "ss_power_state_hysteresis.h" + +class PowerSessionHandler; + +class PowerStateMachine { + class Base_State { + public: + virtual void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + virtual void onStartComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + virtual void onLaunchComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + + // LCOV_EXCL_START 200: virtual function + virtual void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + virtual void onStopComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + virtual void onShutdownComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + + // LCOV_EXCL_START 200: virtual function + virtual void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + virtual PCSTR name() = 0; + + /// State Entry and Exit methods + + // LCOV_EXCL_START 200: virtual function + virtual void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + + // LCOV_EXCL_START 200: virtual function + virtual void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 200: virtual function + }; + + friend class Base_State; + + class Wakeup : public Base_State { + public: + void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + virtual PCSTR name(); + + // LCOV_EXCL_START 8: fist status, no entry + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + } + // LCOV_EXCL_STOP 8: fist status, no entry + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + }; + + friend class Wakeup; + + class WakeupActive : public Wakeup { + public: + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + }; + + friend class WakeupActive; + + class WakeupPending : public Wakeup { + public: + void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onStartComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLaunchComplete(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + }; + + friend class WakeupPending; + + class Shutdown : public Base_State { + public: + void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession) { // NOLINT (runtime/references) + } + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class Shutdown; + + class ShutdownActive : public Base_State { + public: + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class ShutdownActive; + + class LowVoltage1 : public Base_State { + public: + void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class LowVoltage1; + + class LowVoltage1Active : public Base_State { + public: + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class LowVoltage1Active; + + class LowVoltage2 : public Base_State { + public: + void onWakeup(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisAborted(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onHysteresisTimeout(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class LowVoltage2; + + class LowVoltage2Active : public Base_State { + public: + void onNormalVoltageEncountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class LowVoltage2Active; + + class NormalVoltage : public Base_State { + public: + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onSoftwareUpdate(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class NormalVoltage; + + class SoftwareUpdate : public Base_State { + public: + void onShutdown(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage1Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onLowVoltage2Encountered(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + PCSTR name(); + + void onEntry(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void onExit(PowerStateMachine &u, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + }; + + friend class SoftwareUpdate; + + public: + typedef enum _Power_State_Machine_Events { + epsmeWAKEUP = epswsPWRON, + epsmeSHUTDOWN = epscnCANSLEEP, + epsmeLVI1_ENCOUNTERED = epsvsLVI1, + epsmeLVI2_ENCOUNTERED = epsvsLVI2, + epsmeNORMAL_VOLTAGE_ENCOUNTERED = epsvsNORMAL, + epsmeSTART_COMPLETE = 0xD1, + epsmeSTOP_COMPLETE = 0xD2, + epsmeSOFTWARE_UPDATE = 0xE1, + epsmeSHUTDOWN_HYSTERESIS_ABORTED = 0xF1, + epsmeLVI1_HYSTERESIS_ABORTED = 0xF2, + epsmeLVI2_HYSTERESIS_ABORTED = 0xF3, + epsmeSHUTDOWN_HYSTERESIS_TM_OUT = 0xFA, + epsmeLVI1_HYSTERESIS_TM_OUT = 0xFB, + epsmeLVI2_HYSTERESIS_TM_OUT = 0xFC, + } ePowerStateMachineEvents; + + PowerStateMachine(); + virtual ~PowerStateMachine(); + void onEvent(HANDLE h_app, PowerSessionHandler & oSession, // NOLINT (runtime/references) + ePowerStateMachineEvents evt); + EFrameworkunifiedStatus initialize(HANDLE h_app, PowerConfigParams & refConfigParms); // NOLINT (runtime/references) + PCSTR name(); + + private: + static Wakeup WakeupState; + static WakeupActive WakeupActiveState; + static WakeupPending WakeupPendingState; + static LowVoltage1 LowVoltage1State; + static LowVoltage1Active LowVoltage1ActiveState; + static LowVoltage2 LowVoltage2State; + static LowVoltage2Active LowVoltage2ActiveState; + static Shutdown ShutdownState; + static ShutdownActive ShutdownActiveState; + static NormalVoltage NormalVoltageState; + static SoftwareUpdate SoftwareUpdateState; + + Base_State *m_pCurrentState; + Base_State *m_pPreviousState; + Base_State *m_pOnHysteresisTimeoutState; + PowerStateHysteresis m_oShutdownHysteresis; + PowerStateHysteresis m_oLowVoltage1Hysteresis; + PowerStateHysteresis m_oLowVoltage2Hysteresis; + RequiredModuleList m_lstWakeupModules; + RequiredModuleList m_lstShutdownModules; + RequiredModuleList m_lstLvi2Modules; + HANDLE m_hHysteresisTimer; + + typedef struct _state_info { + EPWR_POWER_STATE_TYPE wake; + EPWR_VOLTAGE_STATE_TYPE voltage; + EPWR_WAKEUP_LEVEL_TYPE level; + EPWR_WAKEUP_FACTOR_TYPE factor; + EPWR_CRANK_STATE_TYPE crank; + } Pwr_StateInfo; + + Pwr_StateInfo m_tStateInfo; + + PowerStateMachine(PowerStateMachine&); + PowerStateMachine & operator=(PowerStateMachine &); + + /// Helper methods + void NextState(Base_State & refState, HANDLE h_app, // NOLINT (runtime/references) + PowerSessionHandler & oSession); // NOLINT (runtime/references) + void GotoStateOnHysteresisTimeout(Base_State & refState); // NOLINT (runtime/references) + void startHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references) + void reStartHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references) + void stopHysteresisTimer(PowerStateHysteresis & hys_info); // NOLINT (runtime/references) + void publishPowerLVIStatus(HANDLE h_app, PCSTR nNotifNm, UI_32 value); + void publishPowerLevelType(HANDLE h_app, UI_32 value); + + void OnVoltage(Base_State * pState, HANDLE h_app, + PowerSessionHandler & oSession); // NOLINT (runtime/references) +}; + +#endif // POWER_SERVICE_SERVER_INCLUDE_SS_POWER_STATE_MACHINE_H_