X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=service%2Fsystem%2Fpower_service%2Fserver%2Fsrc%2Fss_power.cpp;fp=service%2Fsystem%2Fpower_service%2Fserver%2Fsrc%2Fss_power.cpp;h=26e88813d136f10878083034d1c26de2fb6f5c05;hb=17cf21bcf8a2e29d2cbcf0a313474d2a4ee44f5d;hp=0000000000000000000000000000000000000000;hpb=9e86046cdb356913ae026f616e5bf17f6f238aa5;p=staging%2Fbasesystem.git diff --git a/service/system/power_service/server/src/ss_power.cpp b/service/system/power_service/server/src/ss_power.cpp new file mode 100755 index 0000000..26e8881 --- /dev/null +++ b/service/system/power_service/server/src/ss_power.cpp @@ -0,0 +1,1672 @@ +/* + * @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 Handles Power Service Business logic +/// +/////////////////////////////////////////////////////////////////////////////// + +#include "ss_power.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ss_power_powerservicelog.h" + +using namespace std; // NOLINT (build/namespaces) + +static Power g_PowerSubsystem; + +/** + * @brief + * + * @param + * @param + * + * @return + */ +template EFrameworkunifiedStatus PowerCallback( + HANDLE h_app) { + + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusFail; + + C * pObj = static_cast(&g_PowerSubsystem); + + if (pObj) { + l_eStatus = (pObj->*M)(h_app); + } + + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// GetInstance +/// Return global instance of Power object. Power is singleton class +/// +////////////////////////////////////////////////////////////////////// +Power & Power::GetInstance() { + return g_PowerSubsystem; +} + +/////////////////////////////////////////////////////////////////////// +/// Power +/// Constructor of Power class +/// +////////////////////////////////////////////////////////////////////// +Power::Power() + : m__CWORD56_RepHist(SS_PWR__CWORD56__REP_HIST_SIZE), + m_PubCmdHist(SS_PWR_PUB_CMD_HIST_SIZE), + m_ErrHist(SS_PWR_ERR_HIST_SIZE), + m_VCmdHist(SS_PWR_V_HIST_SIZE), + m_PowerState(SS_PS_READY_TO_WAKEUP), + m_VoltageState(epsvsINVALID), + m_CrankState(epscsINVALID), + m_MaxShutdownTimeout(0) { + m_PPStateStrMap[SS_PS_READY_TO_WAKEUP] = "SS_PS_READY_TO_WAKEUP"; + m_PPStateStrMap[SS_PS_WAKEUP_INITIATED] = "SS_PS_WAKEUP_INITIATED"; + m_PPStateStrMap[SS_PS_WAKEUP_COMPLETE] = "SS_PS_WAKEUP_COMPLETE"; + m_PPStateStrMap[SS_PS_POWER_ON_COMPLETE] = "SS_PS_POWER_ON_COMPLETE"; + m_PPStateStrMap[SS_PS_POWER_OFF_INITIATED] = "SS_PS_POWER_OFF_INITIATED"; + m_PPStateStrMap[SS_PS_POWER_OFF_COMPLETE] = "SS_PS_POWER_OFF_COMPLETE"; + m_PPStateStrMap[SS_PS_SHUTDOWN_INITIATED] = "SS_PS_SHUTDOWN_INITIATED"; + m_PPStateStrMap[SS_PS_SHUTDOWN_COMPLETE] = "SS_PS_SHUTDOWN_COMPLETE"; + m_PPStateStrMap[SS_PS_STATE_MAX] = "SS_PS_STATE_MAX"; + + m__CWORD56_RepIter = m__CWORD56_RepHist.begin(); + m_PubHistIter = m_PubCmdHist.begin(); + m_ErrHistIter = m_ErrHist.begin(); + m_VHistIter = m_VCmdHist.begin(); + bzero(&m_WakeUpData, sizeof(m_WakeUpData)); +} + +/////////////////////////////////////////////////////////////////////// +/// ~Power +/// Destructor of Power class +/// +////////////////////////////////////////////////////////////////////// +Power::~Power() { // LCOV_EXCL_START 14 Resident process, not called by NSFW + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert +} +// LCOV_EXCL_STOP 14 Resident process, not called by NSFW + +/////////////////////////////////////////////////////////////////////// +/// Initialize +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::Initialize(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus; + BOOL l_SpecifiedCfgLoaded; + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + SetPowerServiceState(SS_PS_READY_TO_WAKEUP); + + pthread_mutex_init(&pwr_hist_mutex, NULL); + + /// Open and parse the configuration data for Power + const CHAR configFileName[] = "/usr/agl/conf/BS/ss/power_service/rodata/gpf_ss_ps_config.cfg"; + + PowerConfiguration config(configFileName); + l_SpecifiedCfgLoaded = config.LoadParameters(m_tConfigData); + if (FALSE == l_SpecifiedCfgLoaded) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + FRAMEWORKUNIFIEDLOG( + ZONE_ERR, __FUNCTION__, + "Reading configuration from file: %s failed. Using default parameters.", + configFileName); + config.LoadDefaultParameters(m_tConfigData); + } + + config.PrintConfigInfo(m_tConfigData); + + /// init PowerStateMachine + m_oStateMachine.initialize(h_app, m_tConfigData); + + // Register all callbacks to dispatcher and notifications + l_eStatus = RegisterAllCallbacksAndNofitications(h_app); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, "RegisterAllCallbacksAndNofitications()"); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// RegisterAllCallbacksAndNofitications +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::RegisterAllCallbacksAndNofitications(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedRegisterServiceAvailabilityNotification(h_app, szNTFY_PowerAvailability))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR( + "FrameworkunifiedRegisterServiceAvailabilityNotification( "szNTFY_PowerAvailability" )"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + l_eStatus = FrameworkunifiedPublishServiceAvailability(h_app, FALSE); + if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("FrameworkunifiedPublishServiceAvailability()"); + } + // LCOV_EXCL_STOP 4: NSFW error case. + + SS_PWR_LOG_HIST("FrameworkunifiedPublishServiceAvailability()", m_PubCmdHist, + m_PubHistIter, "", l_eStatus); + } + + // Attach Notification callbacks to dispatcher + FrameworkunifiedNotificationsList + ss_power_notifications[] = { + { szNTFY_PowerLVI1, sizeof(PowerSrvLVIStatus), eFrameworkunifiedStateVar} + , {szNTFY_PowerLVI2, sizeof(PowerSrvLVIStatus), eFrameworkunifiedStateVar} + , {szNTFY_PowerLevel, sizeof(PowerSrvLevelType), eFrameworkunifiedStateVar} + , {szNTFY_ShutdownPopup, sizeof(EPWR_SHUTDOWN_POPUP_TYPE), eFrameworkunifiedStateVar} + , {szNTFY_PowerPopup, sizeof(EPWR_POWER_POPUP_TYPE), eFrameworkunifiedStateVar} + }; + // Register Notifications + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedNPRegisterNotifications(h_app, ss_power_notifications, _countof(ss_power_notifications)))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("FrameworkunifiedNPRegisterNotifications(ss_power_notifications)"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + // Subscribe and attach call back for notification + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedSubscribeNotificationWithCallback(h_app, NTFY_SSSystemMgrPowerOnOff, PowerCallback))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("FrameworkunifiedSubscribeNotificationWithCallback()"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + +//************************* + +/// < Attach to the following session handles. + FrameworkunifiedProtocolCallbackHandler ss_power_session_req_handlers[] = { + /// session handles. + { PROTOCOL_OPEN_SESSION_REQ, PowerCallback }, { PROTOCOL_CLOSE_SESSION_REQ, + PowerCallback }, { + SS_POWER_STATE_CHANGE_REQ, PowerCallback }, { SS_POWER_POWER_REQUEST_MSG, + PowerCallback }, { + SS_POWER_COMM_WAKEUP, + PowerCallback }, { + SS_POWER_SHUTDOWN_REQ, + PowerCallback }, { + SS_POWER_SHUTDOWN_REQUEST_MSG, PowerCallback } + + /// Wake-up / Shutdown Protocol commands for System Manager. + , { SS_SM_WAKEUP_MODULES_CMPL_RSPN, PowerCallback }, { SS_SM_SHUTDOWN_MODULES_CMPL_RSPN, + PowerCallback } + // + , { SS_POWER_PRINT_CONNECTIONS, PowerCallback }, { SS_POWER_PRINT_STACK, + PowerCallback } + /// Set Voltage & Crank states from shadow? + , { SS_POWER_VOLTAGE_STATE, PowerCallback }, { SS_POWER_CRANK_STATE, + PowerCallback } + /// Current Power Service State inquiry from Test Client + , { SS_POWER_CRNT_STATE_QUERY, PowerCallback }, { + SS_POWER_SYSTEM_MODE_INFO_REQ, PowerCallback }, { + SS_SM_SYSTEM_MODE_INFO_RSPN, PowerCallback } + /// InitComp report to SystemManager + , { SS_POWER_INITCOMP_REP, PowerCallback } + // + // Startup Confirmation Request ( from Power Shadow ) and + // Startup Confirmation Response ( from System Manager ) + , { SS_POWER_FWD_START_CONFIRMATION_MSG_REQ, PowerCallback }, { + SS_POWER_FWD_START_CONFIRMATION_MSG_RESP, PowerCallback } + // + // User Mode Request ( from Power Shadow ) and + // User Mode Response ( from System Manager ) + , { SS_SM_USER_MODE_SET_RESP, PowerCallback } + + // + // Heartbeat Request ( from Power Shadow ) + , { SS_POWER_HEARTBEAT_REQ, PowerCallback }, { SS_SM__CWORD56__HEARTBEAT_RSPN, + PowerCallback } + + // System Manager to Power Services + , { SS_SM_CPU_RESET_REQ, PowerCallback }, { SS_SM_REMOTE_DATA_RESET_REQ, + PowerCallback } }; + + // Attach callback + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedAttachCallbacksToDispatcher(h_app, FRAMEWORKUNIFIED_ANY_SOURCE, ss_power_session_req_handlers, _countof(ss_power_session_req_handlers)))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("FrameworkunifiedAttachCallbacksToDispatcher( ss_power_session_req_handlers )"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + + //************************* + + // Publish szNTFY_PowerAvailable so that other services can start connecting via sessions. + + l_eStatus = RegisterSMSessionAckCallback( + PowerCallback); + LOG_STATUS(l_eStatus, "RegisterSMSessionAckCallback()"); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnSetCommWakeUp +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSetCommWakeUp(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + Pwr_ServiceSetInterface l_CanStatesData; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_CanStatesData))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else if (l_CanStatesData.data.commwake.state == epscnCANWAKEUP) { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Received WakeUp from %s, Processing Ignored !!", + FrameworkunifiedGetMsgSrc(h_app)); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnSetCommSleep +/// +/// +////////////////////////////////////////////////////////////////////// +// LCOV_EXCL_START 200: can not be called from power class +EFrameworkunifiedStatus Power::OnSetCommSleep(HANDLE h_app) { + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + EFrameworkunifiedStatus l_eStatus; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + Pwr_ServiceSetInterface l_CanStatesData; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_CanStatesData))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); // LCOV_EXCL_LINE 4: NSFW error case. + } else if (l_CanStatesData.data.commwake.state != epscnCANSLEEP) { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Error: %s: l_CanStatesData.data.commwake.state != epscnCANSLEEP", + FrameworkunifiedGetMsgSrc(h_app)); + l_eStatus = eFrameworkunifiedStatusInvldParam; + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Received Sleep from %s", + FrameworkunifiedGetMsgSrc(h_app)); + + // Send to System Manager to WakeUp Modules + l_eStatus = SendShutdownToSystemManager(&l_CanStatesData); + if (l_eStatus != eFrameworkunifiedStatusOK) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("SendShutdownToSystemManager()"); // LCOV_EXCL_LINE 4: NSFW error case. + } else { + SetPowerServiceState(SS_PS_SHUTDOWN_INITIATED); + LOG_SUCCESS("SendShutdownToSystemManager()"); + } + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +// LCOV_EXCL_STOP 200: can not be called from power class + +/////////////////////////////////////////////////////////////////////// +/// SetPowerServiceState +/// +/// +////////////////////////////////////////////////////////////////////// +VOID Power::SetPowerServiceState(SS_PSState f_NewState) { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Changing State from '%s' to '%s'", + m_PPStateStrMap[m_PowerState].c_str(), + m_PPStateStrMap[f_NewState].c_str()); + + m_PowerState = f_NewState; +} + +/////////////////////////////////////////////////////////////////////// +/// OnPowerOnOffNotification +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnPowerOnOffNotification(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + T_SS_SM_UserModeOnOffNotification_StructType l_userModeOnOffStruct; + INTERFACEUNIFIEDLOG_RECEIVED_FROM(h_app); + + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_userModeOnOffStruct))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + " User Mode is '%s', User Mode Change Reason is '%s'", + GetStr(l_userModeOnOffStruct.isUserModeOn).c_str(), + GetStr(l_userModeOnOffStruct.userModeChangeReason).c_str()); + SetPowerServiceState( + l_userModeOnOffStruct.isUserModeOn ? + SS_PS_POWER_ON_COMPLETE : SS_PS_POWER_OFF_COMPLETE); + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// ProcessSystemWakeUp +/// On receipt of this notification send wake up notification to +/// System Manager to wake up (START) all modules +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSetPowerState(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + Pwr_ServiceSetInterface l_serviceSetIf; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_serviceSetIf))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + switch (l_serviceSetIf.data.wake.powerupType) { + case epswsPWRON: + case epswsPWROFF: + m_WakeUpData = l_serviceSetIf.data.wake; + + FRAMEWORKUNIFIEDLOG( + ZONE_INFO, __FUNCTION__, " Received Power %s from %s, level 0x%X", + l_serviceSetIf.data.wake.powerupType == epswsPWRON ? "On" : "Off", + FrameworkunifiedGetMsgSrc(h_app), m_WakeUpData.up.level); + // Send to System Manager to WakeUp Modules + l_eStatus = SendWakeUpToSystemManager(&m_WakeUpData); + if (l_eStatus == eFrameworkunifiedStatusOK) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + SetPowerServiceState(SS_PS_WAKEUP_INITIATED); + LOG_SUCCESS("SendWakeUpToSystemManager()"); + } else { + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("SendWakeUpToSystemManager()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } + break; + default: + l_eStatus = eFrameworkunifiedStatusInvldParam; + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + " Error: Invalid PowerOnOff State received: 0x%X", + l_serviceSetIf.data.wake.powerupType); + break; + } + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// Session Request Handlers +/// +////////////////////////////////////////////////////////////////////// + +EFrameworkunifiedStatus Power::OnOpenSession(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + INTERFACEUNIFIEDLOG_RECEIVED_FROM(h_app); + l_eStatus = m_oSessionHandler.OpenSesion(h_app); + + /// < Test Code TODO: Remove ME!!! + // m_oSessionHandler.Print(); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnCloseSession(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + INTERFACEUNIFIEDLOG_RECEIVED_FROM(h_app); + l_eStatus = m_oSessionHandler.CloseSession(h_app); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnWakeUpComplete(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + wakeInfo l_Wake; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_Wake))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else if (l_Wake.up.level == m_WakeUpData.up.level) { + SetPowerServiceState(SS_PS_WAKEUP_COMPLETE); + + /// < send the state machine a wakeup event. + m_oStateMachine.onEvent(h_app, m_oSessionHandler, + PowerStateMachine::epsmeWAKEUP); + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + " Sending SS_POWER_STATE_CHANGE_RESP(%s) to PSM", + l_Wake.powerupType == epswsPWRON ? "User_On" : "User_Off"); + + // send Wake-up complete response to Supervisor + m_oSessionHandler.SendToSupervisor(SS_POWER_STATE_CHANGE_RESP, + sizeof(l_Wake), (PVOID) &l_Wake); + SS_PWR_LOG_HIST("SS_POWER_STATE_CHANGE_RESP", m__CWORD56_RepHist, m__CWORD56_RepIter, + "SS_PS_WAKEUP_COMPLETE", l_eStatus); + + /// < Test Code TODO: Remove ME!!! + // m_oSessionHandler.Print(); + } else { + l_eStatus = eFrameworkunifiedStatusInvldParam; + FRAMEWORKUNIFIEDLOG( + ZONE_ERR, + __FUNCTION__, + "Error: Power WakeUp Threshold (%d) and SM WakeUp Threshold (%d) Mismatch", + m_WakeUpData.up.level, l_Wake.up.level); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnShutdownComplete(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + SetPowerServiceState(SS_PS_SHUTDOWN_COMPLETE); + + m_oStateMachine.onEvent(h_app, m_oSessionHandler, + PowerStateMachine::epsmeSHUTDOWN); + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Sending SS_POWER_SHUTDOWN_RESP to PSM"); + // send Shutdown complete response to Power Shadow / Supervisor + m_oSessionHandler.SendToSupervisor(SS_POWER_SHUTDOWN_RESP, 0, (PVOID) NULL); + + SS_PWR_LOG_HIST("SS_POWER_SHUTDOWN_RESP", m__CWORD56_RepHist, m__CWORD56_RepIter, + "SS_PS_SHUTDOWN_COMPLETE", l_eStatus); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} // End of EFrameworkunifiedStatus Power::OnShutdownComplete(HANDLE h_app) + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnPrintConnections(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + m_oSessionHandler.Print(); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnPrintStack(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + m_oSessionHandler.Print(); + // m_oStateMachine.Print(); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnHysteresisTimeout(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + m_oStateMachine.onEvent(h_app, m_oSessionHandler, + PowerStateMachine::epsmeLVI1_HYSTERESIS_TM_OUT); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// + +EFrameworkunifiedStatus PowerStateMachine::initialize(HANDLE h_app, + PowerConfigParams & refConfigParms) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + /// Set all hysteresis objects with the configuration data obtained from PowerService.xml + m_oShutdownHysteresis.set(refConfigParms.shutdown); + m_oLowVoltage1Hysteresis.set(refConfigParms.lvi1); + m_oLowVoltage2Hysteresis.set(refConfigParms.lvi2); + + /// Copy the list of required modules. + m_lstWakeupModules = refConfigParms.wakeup_modules; + m_lstShutdownModules = refConfigParms.shutdown_modules; + m_lstLvi2Modules = refConfigParms.lvi2_modules; + + m_hHysteresisTimer = FrameworkunifiedAttachTimerCallback( + h_app, 0, 0, PowerCallback); + if (NULL == m_hHysteresisTimer) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Error: FrameworkunifiedAttachTimerCallback() returned NULL"); + l_eStatus = eFrameworkunifiedStatusInvldHandle; + } + // LCOV_EXCL_STOP 4: NSFW error case. + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus PowerSessionHandler::OpenSesion(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + // check if the subscriber is already in map + PwSessionIter iter = m_mapSessions.find(FrameworkunifiedGetMsgSrc(h_app)); + + // the iter is set to the end then the subscriber is not in the map + if (m_mapSessions.end() == iter) { + string subscriber(FrameworkunifiedGetMsgSrc(h_app)); + PwSessionInfo newEntry; + newEntry.frunning = FALSE; + newEntry.hsession = FrameworkunifiedMcOpenSender(h_app, subscriber.c_str()); + newEntry.sz_name = subscriber; + newEntry.sz_servicename = ""; // we will get this on the start complete. + newEntry.esessiontype = epsstBASIC; + newEntry.ui_groupid = 0; + + if (NULL != newEntry.hsession) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // + // Set the Session Handle for Framework so FrameworkunifiedSendResponse won't error due to a null + // session handle. + // + // LCOV_EXCL_BR_START 4: NSFW error case. + if (eFrameworkunifiedStatusOK + // [in] PCSTR - Name of the associated service name + // [in] HANDLE - Session handle + != (l_eStatus = FrameworkunifiedSetSessionHandle(h_app, subscriber.c_str(), newEntry.hsession))) { // NOLINT[whitespace/line_length] + // LCOV_EXCL_BR_STOP + // LCOV_EXCL_START 4: NSFW error case. + LOG_ERROR("FrameworkunifiedSetSessionHandle()"); + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + // LCOV_EXCL_STOP 4: NSFW error case. + } + + OpenSessionAck openSessionAck; + memset(&openSessionAck, 0, sizeof(openSessionAck)); + strcpy(openSessionAck.cSessionName, SERVICE_POWER); // NOLINT (runtime/printf) + openSessionAck.eStatus = eFrameworkunifiedStatusOK; + openSessionAck.sessionId = 0; /// Only one session handles all the heartbeat clients + + // Send Ack to subscriber + l_eStatus = FrameworkunifiedSendMsg(newEntry.hsession, PROTOCOL_OPEN_SESSION_ACK, + sizeof(OpenSessionAck), (PVOID) &openSessionAck); + char l_cBuf[100]; + snprintf(l_cBuf, sizeof(l_cBuf), + "FrameworkunifiedSendMsg(%s, PROTOCOL_OPEN_SESSION_ACK)", subscriber.c_str()); + LOG_STATUS(l_eStatus, l_cBuf); + } + + // If this is not a basic module then we will need to register some other protocols + if (0 != FrameworkunifiedGetMsgLength(h_app)) { + EPWR_SESSION_TYPE tOpenSessionReq; + if (sizeof(EPWR_SESSION_TYPE) == FrameworkunifiedGetMsgLength(h_app)) { + if (eFrameworkunifiedStatusOK + == (l_eStatus = FrameworkunifiedGetMsgDataOfSize(h_app, (PVOID) &tOpenSessionReq, + sizeof(EPWR_SESSION_TYPE)))) { + switch (tOpenSessionReq) { + case epsstBASIC: { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Subscriber : %s , open a session using type: BASIC", + subscriber.c_str()); + FrameworkunifiedProtocolCallbackHandler ss_power_session_basic_handlers[] = { { + PROTOCOL_OPEN_SESSION_REQ, PowerCallback }, { PROTOCOL_CLOSE_SESSION_REQ, + PowerCallback } }; + + // Attach callback : Power Session Requests + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedAttachCallbacksToDispatcher(h_app, subscriber.c_str(), ss_power_session_basic_handlers, _countof(ss_power_session_basic_handlers)))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR( + "FrameworkunifiedAttachCallbacksToDispatcher(ss_power_session_basic_handlers)"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Subscriber '%s' opened a type 'BASIC' session", + subscriber.c_str()); + } + break; + case epsstSUPERVISOR: { + FrameworkunifiedProtocolCallbackHandler ss_power_sprv_session_handlers[] = { { + PROTOCOL_OPEN_SESSION_REQ, PowerCallback }, { PROTOCOL_CLOSE_SESSION_REQ, + PowerCallback }, { + SS_POWER_FWD_START_CONFIRMATION_MSG_REQ, PowerCallback }, { + SS_POWER_STATE_CHANGE_REQ, PowerCallback }, { SS_POWER_SHUTDOWN_REQ, + PowerCallback } + , { SS_POWER_SYSTEM_MODE_INFO_REQ, PowerCallback }, { + SS_POWER_PUBLISH_SHUTDOWN_CONDITION_REQ, PowerCallback< + Power, &Power::OnPublishShutdownPopupRequest> }, { + SS_POWER_PUBLISH_POWER_POPUP_REQ, PowerCallback }, { + SS_POWER_POWER_REQUEST_MSG, PowerCallback } }; + + // Attach callback : Power Supervisor Session Requests + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedAttachCallbacksToDispatcher(h_app, subscriber.c_str(), ss_power_sprv_session_handlers, _countof(ss_power_sprv_session_handlers)))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR( + "FrameworkunifiedAttachCallbacksToDispatcher(ss_power_sprv_session_handlers)"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Subscriber '%s' opened a 'SUPERVISOR' session", + subscriber.c_str()); + newEntry.esessiontype = tOpenSessionReq; + + static BOOL first_supervisor = TRUE; + if (first_supervisor) { + AttachCallbackToSystemManager( // LCOV_EXCL_BR_LINE 4: NSFW error case. + h_app, SS_SM_SYSTEM_MODE_INFO_RSPN, + PowerCallback); + first_supervisor = FALSE; + } + } + break; + case epsstSYSTEM: { + FrameworkunifiedProtocolCallbackHandler ss_power_system_session_handlers[] = { + { PROTOCOL_OPEN_SESSION_REQ, PowerCallback }, { PROTOCOL_CLOSE_SESSION_REQ, + PowerCallback }, { + SS_POWER_SYSTEM_LAUNCH_COMPLETE, PowerCallback }, { + SS_POWER_SHUTDOWN_RESP, PowerCallback } }; + + // Attach callback : Power System Session Requests + if (eFrameworkunifiedStatusOK != (l_eStatus = FrameworkunifiedAttachCallbacksToDispatcher(h_app, subscriber.c_str(), ss_power_system_session_handlers, _countof(ss_power_system_session_handlers)))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR( + "FrameworkunifiedAttachCallbacksToDispatcher(ss_power_session_handlers)"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; + } + // LCOV_EXCL_STOP 4: NSFW error case. + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Subscriber '%s' opened a 'SYSTEM' session", + subscriber.c_str()); + newEntry.esessiontype = tOpenSessionReq; + } + break; + case epsstUNKNOWN: { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Subscriber '%s' tried to open a type 'UNKNOWN' session", + subscriber.c_str()); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return eFrameworkunifiedStatusInvldParam; + } + break; + } + } + } + } + + // insert this newEntry into the map + m_mapSessions.insert(make_pair(subscriber, newEntry)); + } else { + // This Subscriber is already in our map, just send and ack to keep them quote. + FRAMEWORKUNIFIEDLOG( + ZONE_INFO, __FUNCTION__, + "Subscriber : %s , is already in the map, will Just send back an ACK", + iter->second.sz_name.c_str()); + if (NULL != iter->second.hsession) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + OpenSessionAck openSessionAck; + memset(&openSessionAck, 0, sizeof(openSessionAck)); + strcpy(openSessionAck.cSessionName, SERVICE_POWER); // NOLINT (runtime/printf) + openSessionAck.eStatus = eFrameworkunifiedStatusOK; + // I can't think of a reason why we would need more that one session per subscriber. + openSessionAck.sessionId = 0; + + // Send Ack to subscriber + l_eStatus = FrameworkunifiedSendMsg(iter->second.hsession, PROTOCOL_OPEN_SESSION_ACK, + sizeof(OpenSessionAck), (PVOID) &openSessionAck); + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "FrameworkunifiedSendMsg Success to : %s , status: 0x%x", + iter->second.sz_name.c_str(), l_eStatus); + } else { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, + "What! NULL == iter->second.hsession TODO: Need to handle this!"); + } + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus PowerSessionHandler::StopComplete(HANDLE h_app) { // LCOV_EXCL_START 8: can not be called + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + // ToDo Jay 2012 November 02 Can this be deleted ? + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + " No-op function - It's here, but it doesn't do anything"); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +// LCOV_EXCL_STOP 8: can not be called + +/////////////////////////////////////////////////////////////////////// +/// ProcessVoltageNotifyRequest +/// +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::PublishVoltageStateChange(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + PowerSrvLVIStatus l_LVIStatus; + PowerSrvLevelType l_PowerLevel; + + switch (m_VoltageState) { // LCOV_EXCL_BR_LINE 6: double check + case epsvsNORMAL: + l_PowerLevel = epspltNORMAL; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLevel, &l_PowerLevel, sizeof(PowerSrvLevelType)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLevel ", epspltNORMAL)"); + + l_LVIStatus = ePwSrvLVI_Status_InActive; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI1, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI1 ", ePwSrvLVI_Status_InActive)"); + +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI2, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI2 ", ePwSrvLVI_Status_InActive)"); + break; + + case epsvsLVI1: + l_PowerLevel = epspltEMERGENCY; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLevel, &l_PowerLevel, sizeof(PowerSrvLevelType)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLevel ", epspltEMERGENCY)"); + + l_LVIStatus = ePwSrvLVI_Status_Active; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI1, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI1 ", ePwSrvLVI_Status_Active)"); + + l_LVIStatus = ePwSrvLVI_Status_InActive; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI2, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI2 ", ePwSrvLVI_Status_InActive)"); + break; + + case epsvsLVI2: + l_PowerLevel = epspltEMERGENCY; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLevel, &l_PowerLevel, sizeof(PowerSrvLevelType)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLevel ", epspltEMERGENCY)"); + + l_LVIStatus = ePwSrvLVI_Status_InActive; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI1, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI1 ", ePwSrvLVI_Status_InActive)"); + + l_LVIStatus = ePwSrvLVI_Status_Active; +l_eStatus = FrameworkunifiedNPPublishNotification(h_app, szNTFY_PowerLVI2, &l_LVIStatus, sizeof(PowerSrvLVIStatus)); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, + "FrameworkunifiedNPPublishNotification(" szNTFY_PowerLVI2 ", ePwSrvLVI_Status_Active)"); + break; + + case epsvsINVALID: + // LCOV_EXCL_START 6: double check + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + l_eStatus = eFrameworkunifiedStatusInvldParam; + LOG_ERROR(" epsvsINVALID == m_VoltageState"); + break; + // LCOV_EXCL_STOP 6: double check + + default: + // LCOV_EXCL_START 6: double check + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + l_eStatus = eFrameworkunifiedStatusInvldParam; + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Error: Invalid 'm_VoltageState' value detected: 0x%X/%d", + m_VoltageState, m_VoltageState); + break; + // LCOV_EXCL_STOP 6: double check + } + + SS_PWR_LOG_HIST("PublishVoltageStateChange()", m_PubCmdHist, m_PubHistIter, + "", l_eStatus); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +/////////////////////////////////////////////////////////////////////// +/// OnSystemModeInfoResponse +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSystemModeInfoResponse(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + SystemModeInfo l_SystemModeInfo; + + std::memset(&l_SystemModeInfo, 0, sizeof(SystemModeInfo)); + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_SystemModeInfo))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); // LCOV_EXCL_LINE 4: NSFW error case. + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Sending SS_POWER_SYSTEM_MODE_INFO_RESP to PSM"); + // send Wake-up complete response to System Power Manager + l_eStatus = m_oSessionHandler.SendToSupervisor( + SS_POWER_SYSTEM_MODE_INFO_RESP, sizeof(SystemModeInfo), + (PVOID) &l_SystemModeInfo); + + SS_PWR_LOG_HIST("SS_POWER_SYSTEM_MODE_INFO_RESP", m__CWORD56_RepHist, + m__CWORD56_RepIter, "", l_eStatus); + + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, "m_oSessionHandler.SendToSupervisor( " + "SS_POWER_SYSTEM_MODE_INFO_RESP)"); + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnSystemModeInfoRequest +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSystemModeInfoRequest(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + if (eFrameworkunifiedStatusOK != (l_eStatus = SendSystemModeRequestToSystemManager())) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("SendSystemModeRequestToSystemManager()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnInitCompReport +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnInitCompReport(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + if (eFrameworkunifiedStatusOK != (l_eStatus = SendInitCompReportToSystemManager())) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("SendInitCompReportToSystemManager()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnCurrentPowerStateQuery +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnCurrentPowerStateQuery(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + SS_PSCurrentState l_CurrentState; + std::memset(&l_CurrentState, 0, sizeof(SS_PSCurrentState)); + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_CurrentState))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else if (eFrameworkunifiedStatusOK != (l_eStatus = ConstructPwrStateResponse(l_CurrentState.printRespmsg))) { // LCOV_EXCL_BR_LINE 8: dead code // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 8: dead code. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ConstructPwrStateResponse(l_CurrentState.printRespmsg)"); + // LCOV_EXCL_STOP + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Response is %s", + l_CurrentState.printRespmsg); + // Send Power State to client + + HANDLE l_handle = FrameworkunifiedOpenService(h_app, FrameworkunifiedGetMsgSrc(h_app)); + if (NULL != l_handle) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + l_eStatus = FrameworkunifiedSendMsg(l_handle, SS_POWER_CRNT_STATE_QUERY_RSPN, + sizeof(SS_PSCurrentState), + (PVOID) &l_CurrentState); + + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, "FrameworkunifiedSendMsg(SS_POWER_CRNT_STATE_QUERY_RSPN)"); + + l_eStatus = FrameworkunifiedCloseService(h_app, l_handle); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING(l_eStatus, + "FrameworkunifiedCloseService()"); + } else { + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + l_eStatus = eFrameworkunifiedStatusNullPointer; + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Error. FrameworkunifiedOpenService(%s) returned NULL", + FrameworkunifiedGetMsgSrc(h_app)); + // LCOV_EXCL_STOP 4: NSFW error case. + } + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnSetVoltageState +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSetVoltageState(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + std::string stLvl = "INVALID"; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + Pwr_ServiceSetInterface l_VoltageState; + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_VoltageState))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + m_VoltageState = static_cast(l_VoltageState.data + .voltage.state); + if (eFrameworkunifiedStatusOK != (l_eStatus = PublishVoltageStateChange(h_app))) { // LCOV_EXCL_BR_LINE 4:NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("PublishVoltageStateChange()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } + + SS_PWR_LOG_HIST("OnSetVoltageState", m_PubCmdHist, m_PubHistIter, + "PublishVoltageStateChange()", l_eStatus); + + switch (l_VoltageState.data.voltage.state) { + case epsvsINVALID: { + stLvl = "INVALID"; + } + break; + + case epsvsNORMAL: { + stLvl = "NORMAL"; + } + break; + + case epsvsLVI1: { + stLvl = "LVI1"; + } + break; + + case epsvsLVI2: { + stLvl = "LVI2"; + } + break; + + default: + break; + } + + SS_PWR_LOG_HIST("OnSetVoltageState()", m_VCmdHist, m_VHistIter, stLvl, + l_eStatus); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +/////////////////////////////////////////////////////////////////////// +/// OnSetCrankState +/// +////////////////////////////////////////////////////////////////////// +EFrameworkunifiedStatus Power::OnSetCrankState(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + Pwr_ServiceSetInterface l_CrankState; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_CrankState))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + m_CrankState = static_cast(l_CrankState.data.crank + .state); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +EFrameworkunifiedStatus Power::OnSystemMgrConnectionEstablished(HANDLE h_app) { + EFrameworkunifiedStatus l_eStatus; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + + l_eStatus = FrameworkunifiedPublishServiceAvailability(h_app, TRUE); + + SS_PWR_LOG_HIST("FrameworkunifiedPublishServiceAvailability()", m_PubCmdHist, + m_PubHistIter, "", l_eStatus); + + LOG_STATUS(l_eStatus, + "FrameworkunifiedPublishServiceAvailability(" szNTFY_PowerAvailability ",TRUE)"); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +EFrameworkunifiedStatus Power::OnUserModeResponse(HANDLE h_app) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus; + EPWR_USER_MODE_TYPE l_eUserModeState = epsumINVALID; + Pwr_ServiceSetInterface tServiceSetIf; + + l_eStatus = ValidateUserModeMessage(h_app, l_eUserModeState); + if (eFrameworkunifiedStatusOK != l_eStatus) { + LOG_ERROR("ValidateUserModeMessage(&l_eUserModeState)"); + } else { + PCSTR p_sStateName = l_eUserModeState == epsumON ? "epsumON" : "epsumOFF"; + tServiceSetIf.data.user_mode.mode = l_eUserModeState; + + l_eStatus = m_oSessionHandler.SendToSupervisor( + SS_POWER_USER_MODE_SET_RESP, sizeof(Pwr_ServiceSetInterface), + (PVOID) &tServiceSetIf); + + if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + FRAMEWORKUNIFIEDLOG( + ZONE_ERR, + __FUNCTION__, + "Error: m_oSessionHandler.SendToSupervisor(" " SS_POWER_USER_MODE_SET_RESP, %s) errored: %d/'%s'", + p_sStateName, l_eStatus, GetStr(l_eStatus).c_str()); + // LCOV_EXCL_STOP + } else { + SS_PWR_LOG_HIST("SS_POWER_USER_MODE_SET_RESP", m__CWORD56_RepHist, + m__CWORD56_RepIter, p_sStateName, l_eStatus); + FRAMEWORKUNIFIEDLOG( + ZONE_INFO, + __FUNCTION__, + " m_oSessionHandler.SendToSupervisor(" " SS_POWER_USER_MODE_SET_RESP, %s) successful ", + p_sStateName); + } + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} // End of EFrameworkunifiedStatus Power::OnUserModeResponse( HANDLE h_app ) + +EFrameworkunifiedStatus Power::ValidateUserModeMessage( + HANDLE h_app, EPWR_USER_MODE_TYPE &l_eUserModeState) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus; + Pwr_ServiceSetInterface tServiceSetIf; + EPWR_USER_MODE_TYPE l_my_eUserModeState; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, tServiceSetIf))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + l_my_eUserModeState = tServiceSetIf.data.user_mode.mode; + switch (l_my_eUserModeState) { + case epsumINVALID: + l_eStatus = eFrameworkunifiedStatusInvldParam; + LOG_ERROR("l_eUserModeState == epsumINVALID"); + break; + + case epsumOFF: + case epsumON: + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Validated '%s'", + l_my_eUserModeState == epsumON ? "epsumON" : "epsumOFF"); + l_eUserModeState = l_my_eUserModeState; + l_eStatus = eFrameworkunifiedStatusOK; + break; + + default: + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Error: Unknown 'l_my_eUserModeState' value: 0x%x", + l_my_eUserModeState); + l_eStatus = eFrameworkunifiedStatusInvldParam; + break; + } // End switch + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} // End of EFrameworkunifiedStatus Power::ValidateUserModeMessage( HANDLE h_app, EPWR_USER_MODE_TYPE &l_eUserModeState ) + +//***************************************************************************** +// Start Confirmation Protocol callback functions +// +EFrameworkunifiedStatus Power::OnSendStartupConfirmationRequest(HANDLE h_app) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus; + EFrameworkunifiedStatus l_responseStatus = eFrameworkunifiedStatusOK; + Pwr_ServiceSetInterface tServiceSetIf; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, tServiceSetIf))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + StartupConfirmationMsgStrut l_startupConfirmationMsg = tServiceSetIf.data + .startupConfirmationMsg; + l_eStatus = SendStartupConfirmationToSystemManager( + l_startupConfirmationMsg); + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, "SendStartupConfirmationToSystemManager()"); + } + + if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 200:interface_unified if can not be error. + // LCOV_EXCL_START 200:interface_unified if can not be error. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + l_responseStatus = l_eStatus; // Save the current status as-is to + // send in the message response to the + // requester. + l_eStatus = m_oSessionHandler.SendToSupervisor( + SS_POWER_FWD_START_CONFIRMATION_MSG_RESP, sizeof(EFrameworkunifiedStatus), + (PVOID) &l_responseStatus); + + SS_PWR_LOG_HIST("SS_POWER_FWD_START_CONFIRMATION_MSG_RESP", m__CWORD56_RepHist, + m__CWORD56_RepIter, "", l_eStatus); + + LOG_STATUS( + l_eStatus, + "m_oSessionHandler.SendToSupervisor( " "SS_POWER_FWD_START_CONFIRMATION_MSG_RESP)"); + // LCOV_EXCL_STOP 200:interface_unified if can not be error. + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + " SendStartupConfirmationToSystemManager() successful"); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} // End of EFrameworkunifiedStatus Power::OnSendStartupConfirmationRequest( HANDLE h_app ) + +EFrameworkunifiedStatus Power::OnSendStartupConfirmationResponse(HANDLE h_app) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus; + EFrameworkunifiedStatus l_responseStatus; + + // ReadMsg(): * + // Check h_app ptr, msg size, msg reception, read msg if all ok. * + // Report any errors found. * + // * + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_responseStatus))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + l_eStatus = m_oSessionHandler.SendToSupervisor( + SS_POWER_FWD_START_CONFIRMATION_MSG_RESP, sizeof(EFrameworkunifiedStatus), + (PVOID) &l_responseStatus); + + SS_PWR_LOG_HIST("SS_POWER_FWD_START_CONFIRMATION_MSG_RESP", m__CWORD56_RepHist, + m__CWORD56_RepIter, "", l_eStatus); + + LOG_STATUS( + l_eStatus, + "m_oSessionHandler.SendToSupervisor(" " SS_POWER_FWD_START_CONFIRMATION_MSG_RESP)"); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} // End of EFrameworkunifiedStatus Power::OnSendStartupConfirmationResponse( HANDLE h_app ) +// +// End of Start Confirmation Protocol callback functions +//***************************************************************************** + +//***************************************************************************** +// Start HeartBeat Protocol callback functions +// Theory of operation: Forward HB request to SM. If SM crashes, then the HB +// will cease between SM and the _CWORD56_. Consequently, the _CWORD56_ will reset the +// system. +EFrameworkunifiedStatus Power::On_CWORD56_HeartBeatRequest(HANDLE h_app) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + EPWR_HB_REQ_MSG_STRUCT l_HbReq; + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "_CWORD56_ HeartBeat Request received."); + + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_HbReq))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else if (eFrameworkunifiedStatusOK != (l_eStatus = Send_CWORD56_HeartBeatRequestToSystemManager(l_HbReq))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("Send_CWORD56_HeartBeatRequestToSystemManager()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +EFrameworkunifiedStatus Power::OnSM_CWORD56_HeartBeatResponse(HANDLE h_app) { + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus; + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " Received from SM."); + + l_eStatus = m_oSessionHandler.SendToSupervisor(SS_POWER_HEARTBEAT_RESP, 0, + NULL); + + SS_PWR_LOG_HIST("SS_POWER_HEARTBEAT_RESP", m__CWORD56_RepHist, m__CWORD56_RepIter, "", + l_eStatus); + + LOG_STATUS(l_eStatus, + "m_oSessionHandler.SendToSupervisor( SS_POWER_HEARTBEAT_RESP)"); + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} + +// +// End of Heartbeat Protocol callback functions +//***************************************************************************** + +//***************************************************************************** +// Start CPU Reset Request Protocol callback functions +// +EFrameworkunifiedStatus Power::OnCpuResetRequest(HANDLE h_app) { // SS_SM_CPU_RESET_REQ + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + TSystemManagerCpuResetInfo l_SmCpuResetInfo; // SS Type + SS_Pwr_CpuResetMsgStruct l_PsCpuResetInfo; // SS Type translated to PSM type. + + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_SmCpuResetInfo))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "CPU Reset Type: %d", + l_SmCpuResetInfo.resetReason); + + switch (l_SmCpuResetInfo.resetReason) { + case e_SS_SM_CPU_RESET_REASON_GENERIC_ERR: + case e_SS_SM_CPU_RESET_REASON_CRITICAL_ERR: + l_PsCpuResetInfo.resetReason = epsCpuResetReasonGeneric; + break; + + case e_SS_SM_CPU_RESET_REASON_DSP_ERR: + l_PsCpuResetInfo.resetReason = epsCpuResetReasonFatalError; + break; + + case e_SS_SM_CPU_RESET_REASON_USER_FORCE_RESET: + l_PsCpuResetInfo.resetReason = epsCpuResetReasonUserForceReset; + break; + + case e_SS_SM_CPU_RESET_REASON_NORMAL: + l_PsCpuResetInfo.resetReason = epsCpuResetReasonNormalReset; + break; + default: + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Error: Reset reason '%d' not defined", + l_SmCpuResetInfo.resetReason); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return (eFrameworkunifiedStatusInvldParam); + } + + snprintf(l_PsCpuResetInfo.messageStr, PWR_RESET_MSG_STR_SIZE, "%s", + l_SmCpuResetInfo.messageStr); + + l_eStatus = m_oSessionHandler.SendToSupervisor(SS_POWER_HARD_RESET_REQ, + sizeof(l_PsCpuResetInfo), + (PVOID) &l_PsCpuResetInfo); + + SS_PWR_LOG_HIST("SS_POWER_HARD_RESET_REQ", m__CWORD56_RepHist, m__CWORD56_RepIter, "", + l_eStatus); + + LOG_STATUS_IF_ERRORED_PWR_SM_WITH_HIST_LOGGING( + l_eStatus, "m_oSessionHandler.SendToSupervisor( " + "SS_POWER_HARD_RESET_REQ)"); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +// +// End of CPU Reset Request Protocol callback functions +//***************************************************************************** + +/////////////////////////////////////////////////////////////////////// +/// SetCmdHist +/// +/// +////////////////////////////////////////////////////////////////////// +void Power::SetCmdHist(std::string cmd, cmdHist &hist, cmdHistIter &it, + std::string sender) { + pthread_mutex_lock(&pwr_hist_mutex); + + UI_64 l_clkcycles = ClockCycle(); + /* find out how many cycles per millisecond */ + UI_64 l_totalmsec = l_clkcycles / 1000; + + it->m_time = l_totalmsec; + it->m_cmd = cmd; + it->m_sender = sender; + it++; + + if (it == hist.end()) { + it = hist.begin(); + } + + pthread_mutex_unlock(&pwr_hist_mutex); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \ingroup SSPowerDebugDump +/// implement post mortem function +/// +/// \param +/// +/// \return void +/////////////////////////////////////////////////////////////////////////////// +VOID Power::SSPowerDebugDump(HANDLE h_app) { // LCOV_EXCL_START 7:debug code + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + char l_debugDumpData[SS_PWR_DEBUG_DUMP_MAX_SIZE]; + UI_16 l_byteCount = 0; + cmdHistIter i; + memset((void*) l_debugDumpData, 0x00, sizeof(l_debugDumpData)); // NOLINT (readability/casting) + + l_byteCount = snprintf(l_debugDumpData, SS_PWR_DEBUG_DUMP_MAX_SIZE, + ("\n \n")); + + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n ***Error history***\n"); + + for (i = m_ErrHist.begin(); i != m_ErrHist.end(); ++i) { + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n %s @ %llums EC:%s \n", i->m_cmd.c_str(), + i->m_time, i->m_sender.c_str()); + } + + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n ***_CWORD56_ Reply history***\n"); + + for (i = m__CWORD56_RepHist.begin(); i != m__CWORD56_RepHist.end(); ++i) { + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n %s @ %llums\n", i->m_cmd.c_str(), i->m_time); + } + + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n ***Voltage history***\n"); + + for (i = m_VCmdHist.begin(); i != m_VCmdHist.end(); ++i) { + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n %s @ %llums %s \n", i->m_cmd.c_str(), i->m_time, + i->m_sender.c_str()); + } + + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n ***Publishshing history***\n"); + + for (i = m_PubCmdHist.begin(); i != m_PubCmdHist.end(); ++i) { + l_byteCount += snprintf(l_debugDumpData + l_byteCount, + SS_PWR_DEBUG_DUMP_MAX_SIZE - l_byteCount, + "\n %s @ %llums \n", i->m_cmd.c_str(), i->m_time); + } + + SSDEBUGDUMP("%s", (const char *) &l_debugDumpData); +} +// LCOV_EXCL_STOP 7:debug code + +//***************************************************************************** +// Start Remote Data Reset Protocol callback functions +// From SM to PS +EFrameworkunifiedStatus Power::OnRemoteDataResetRequest(HANDLE h_app) { // SS_SM_REMOTE_DATA_RESET_REQ + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); + EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; + ESMDataResetType l_eSmDataResetType; // SS Type + epsCpuResetReason l_ePsCpuResetReason; // SS Type translated to PSM CPU reset reason. + BOOL l_bResetRequired; + + if (eFrameworkunifiedStatusOK != (l_eStatus = ReadMsg(h_app, l_eSmDataResetType))) { // LCOV_EXCL_BR_LINE 4: NSFW error case. // NOLINT[whitespace/line_length] + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + LOG_ERROR("ReadMsg()"); + // LCOV_EXCL_STOP 4: NSFW error case. + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "Remote Data Reset Type: %d", + l_eSmDataResetType); + l_bResetRequired = FALSE; + switch (l_eSmDataResetType) { + case e_SS_SM_DATA_RESET_TYPE_USER: + l_ePsCpuResetReason = epsCpuResetReasonUserDataReset; + l_bResetRequired = TRUE; + break; + + case e_SS_SM_DATA_RESET_TYPE_FACTORY: + l_ePsCpuResetReason = epsCpuResetReasonFactoryDataReset; + l_bResetRequired = TRUE; + break; + + case e_SS_SM_DATA_RESET_TYPE_CONFIGURATION: // No reset action required. + l_bResetRequired = FALSE; + break; + + default: + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "Error: Remote Reset Data type : %d not defined", + l_eSmDataResetType); + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return (eFrameworkunifiedStatusInvldParam); + } + + if (TRUE == l_bResetRequired) { + SS_Pwr_CpuResetMsgStruct l_PsCpuResetInfo = { }; + l_PsCpuResetInfo.resetReason = l_ePsCpuResetReason; + l_eStatus = m_oSessionHandler.SendToSupervisor(SS_POWER_HARD_RESET_REQ, + sizeof(l_PsCpuResetInfo), + (PVOID) &l_PsCpuResetInfo); + + if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 4: NSFW error case. + // LCOV_EXCL_START 4: NSFW error case. + AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert + FRAMEWORKUNIFIEDLOG( + ZONE_ERR, + __FUNCTION__, + "Error: m_oSessionHandler.SendToSupervisor( " "SS_POWER_HARD_RESET_REQ, Reason '%d') errored:%d/'%s'", + l_ePsCpuResetReason, l_eStatus, GetStr(l_eStatus).c_str()); + // LCOV_EXCL_STOP + } else { + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "SS_POWER_HARD_RESET_REQ Reason '%d' sent to PSMShadow", + l_ePsCpuResetReason); + } + SS_PWR_LOG_HIST("SS_POWER_HARD_RESET_REQ", m__CWORD56_RepHist, m__CWORD56_RepIter, + "", l_eStatus); + } + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return l_eStatus; +} +// +// End of Remote Data Reset Protocol callback functions +//***************************************************************************** + +// EOF of /SS_PowerService/src/ss_power.cpp +