From 947c78887e791596d4a5ec2d1079f8b1a049628b Mon Sep 17 00:00:00 2001 From: takeshi_hoshina Date: Tue, 27 Oct 2020 11:16:21 +0900 Subject: basesystem 0.1 --- .../library/src/ss_power_client.cpp | 254 +++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 systemservice/interface_unified/library/src/ss_power_client.cpp (limited to 'systemservice/interface_unified/library/src/ss_power_client.cpp') diff --git a/systemservice/interface_unified/library/src/ss_power_client.cpp b/systemservice/interface_unified/library/src/ss_power_client.cpp new file mode 100644 index 00000000..30bdbaac --- /dev/null +++ b/systemservice/interface_unified/library/src/ss_power_client.cpp @@ -0,0 +1,254 @@ +/* + * @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_PowerServiceIf +/// \brief This file supports Power Service client management. +/// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include "system_service/ss_power_service.h" +#include "system_service/ss_power_service_protocol.h" +#include "system_service/ss_power_service_notifications.h" +#include "system_service/ss_services.h" +#include "system_service/ss_system_if.h" +#include "system_service/ss_templates.h" +#include "ss_power_if_interfaceunifiedlog.h" + +typedef struct { + BOOL fAvailable; + HANDLE hSession; + HANDLE hService; + std::string szServiceName; +} TPowerSession; + +static EFrameworkunifiedStatus OnPowerCloseSesionAck(HANDLE hApp); +static EFrameworkunifiedStatus OnPowerOpenSessionAck(HANDLE hApp); +static EFrameworkunifiedStatus OnPowerAvailability(HANDLE hApp); +static EFrameworkunifiedStatus OnPowerAvailable(HANDLE hApp); +static EFrameworkunifiedStatus OnPowerUnavailable(HANDLE hApp); +static TPowerSession g_tPowerSession = { }; + +/// Base on the a user group affiliation we will call there start and stop methods +/// Note: there group and subgroup strings are empty we will call start on the every +/// first case of +EFrameworkunifiedStatus InterfaceunifiedSystemConnectToPowerSerivce(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + + // Subscriptions + FrameworkunifiedNotificationCallbackHandler g_aryPower_Notif_Cbs[] = { + // Notifications name, Call back function + { szNTFY_PowerAvailability, OnPowerAvailability }, }; + + /// Avoid opening a session to the Power + /// service Since it uses the framework as well + if (0 != strcmp(SERVICE_POWER, FrameworkunifiedGetAppName(hApp))) { + // Subscribe and attach call backs to notifications, to Notification Service! + if (eFrameworkunifiedStatusOK + != (eStatus = FrameworkunifiedSubscribeNotificationsWithCallback( + hApp, g_aryPower_Notif_Cbs, _countof(g_aryPower_Notif_Cbs)))) { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "FrameworkunifiedAttachNotificationCallbacksToDispatcher Failed Status:0x%x ", + eStatus); + } else { + /// Need to save the Group and Subgroup values + g_tPowerSession.szServiceName = FrameworkunifiedGetAppName(hApp); + + /// Cleanup any other data members + g_tPowerSession.fAvailable = FALSE; + g_tPowerSession.hService = NULL; + g_tPowerSession.hSession = NULL; + } + } + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "-"); + + return eStatus; +} + +EFrameworkunifiedStatus OnPowerAvailability(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail; + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + + FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, + "Power Service Availability notification received ****"); + + if (sizeof(BOOL) == FrameworkunifiedGetMsgLength(hApp)) { + BOOL avalibility = FALSE; + if (eFrameworkunifiedStatusOK + == (eStatus = FrameworkunifiedGetMsgDataOfSize(hApp, &avalibility, sizeof(BOOL)))) { + if (TRUE == avalibility) { + eStatus = OnPowerAvailable(hApp); + } else { + eStatus = OnPowerUnavailable(hApp); + } + } else { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "FrameworkunifiedAttachNotificationCallbacksToDispatcher Failed Status:0x%x ", + eStatus); + } + } + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "-"); + return eStatus; +} + +EFrameworkunifiedStatus OnPowerAvailable(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail; + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + + // if the service is available before the close happens then close the session and service first. + if (NULL != g_tPowerSession.hService && NULL != g_tPowerSession.hSession) { + EFrameworkunifiedStatus interfaceunifiedRet = FrameworkunifiedCloseSession(g_tPowerSession.hService, + g_tPowerSession.hSession); + SS_ASERT(interfaceunifiedRet == eFrameworkunifiedStatusOK); + g_tPowerSession.hSession = NULL; + g_tPowerSession.hService = NULL; + } + + PCSTR power_name = FrameworkunifiedGetMsgSrc(hApp); + + // opening the service + if (NULL == (g_tPowerSession.hService = FrameworkunifiedOpenService(hApp, power_name))) { + FRAMEWORKUNIFIEDLOG0(ZONE_ERR, __FUNCTION__, "Power: Failed to open service"); + } else { + FrameworkunifiedProtocolCallbackHandler g_aryPower_Protocol_Cbs[] = { + // Command ID, Call back functions + { PROTOCOL_OPEN_SESSION_ACK, OnPowerOpenSessionAck }, + { PROTOCOL_CLOSE_SESSION_ACK, OnPowerCloseSesionAck }, }; + + /// Attach the valid callback for this service + if (eFrameworkunifiedStatusOK + == (eStatus = FrameworkunifiedAttachCallbacksToDispatcher( + hApp, power_name, g_aryPower_Protocol_Cbs, + _countof(g_aryPower_Protocol_Cbs)))) { + EPWR_SESSION_TYPE tOpenSessionReq = epsstBASIC; + /// opening the session with service + if (eFrameworkunifiedStatusOK + != (eStatus = FrameworkunifiedOpenSessionWithData(g_tPowerSession.hService, + &tOpenSessionReq, + sizeof(tOpenSessionReq)))) { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "FrameworkunifiedOpenSession Failed Status:0x%x ", + eStatus); + } + + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "%s has received PowerService Available.", + FrameworkunifiedGetAppName(hApp)); + } else { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, + "FrameworkunifiedAttachCallbacksToDispatcher Failed Status:0x%x ", eStatus); + } + } + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); + return eStatus; +} + +EFrameworkunifiedStatus OnPowerUnavailable(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK; + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + if (0 == strcmp(SERVICE_POWER, FrameworkunifiedGetAppName(hApp))) { + if ((g_tPowerSession.hSession != NULL) + && (g_tPowerSession.hService != NULL)) { + if (eFrameworkunifiedStatusOK + != (eStatus = FrameworkunifiedCloseSession(g_tPowerSession.hService, + g_tPowerSession.hSession))) { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "FrameworkunifiedCloseSession Failed Status:0x%x", + eStatus); + } + g_tPowerSession.hSession = NULL; + g_tPowerSession.hService = NULL; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, + "%s has received PowerService Unavailable.", FrameworkunifiedGetAppName(hApp)); + } else { + FRAMEWORKUNIFIEDLOG( + ZONE_ERR, + __FUNCTION__, + "Error INVALID HANDLE [g_tPowerSession.hSession :0x%" PRIxPTR "]; [g_tPowerSession.hService :0x%" PRIxPTR "] ", // NOLINT (whitespace/line_length) + (uintptr_t) g_tPowerSession.hSession, (uintptr_t) g_tPowerSession.hService); + } + } else { + eStatus = eFrameworkunifiedStatusOK; + } + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "-"); + + return eStatus; +} + +/////////////////////////////////////////////////////////// +/// Function: OnHeartBeatClientOpenSessionAck +/// HeartBeat Service OpenSession callback +/////////////////////////////////////////////////////////// +EFrameworkunifiedStatus OnPowerOpenSessionAck(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusFail; + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + + g_tPowerSession.hSession = FrameworkunifiedGetOpenSessionHandle(hApp); + if (NULL != g_tPowerSession.hSession) { + g_tPowerSession.fAvailable = TRUE; + eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, + "%s Session to PowerService has been successfully opened.", + FrameworkunifiedGetAppName(hApp)); + } else { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "FrameworkunifiedGetOpenSessionHandle returned : %" PRIxPTR "", + (uintptr_t) g_tPowerSession.hSession); + g_tPowerSession.hSession = NULL; + } + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "-"); + + return eStatus; +} + +/////////////////////////////////////////////////////////// +/// Function: OnHeartBeatClientCloseSessionAck +/// HeartBeat Service CloseSession callback +/////////////////////////////////////////////////////////// +EFrameworkunifiedStatus OnPowerCloseSesionAck(HANDLE hApp) { + EFrameworkunifiedStatus eStatus = eFrameworkunifiedStatusOK; + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "+"); + + // Close Service + if (NULL != g_tPowerSession.hService) { + eStatus = FrameworkunifiedCloseService(hApp, g_tPowerSession.hService); + if (eFrameworkunifiedStatusOK != eStatus) { + FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error: FrameworkunifiedCloseService() errored %d/'%s", + eStatus, GetStr(eStatus).c_str()); + } + g_tPowerSession.hService = NULL; + g_tPowerSession.hSession = NULL; + } + g_tPowerSession.fAvailable = FALSE; + eStatus = eFrameworkunifiedStatusOK; + FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, + "%s Session to PowerService has been successfully closed.", + FrameworkunifiedGetAppName(hApp)); + + FRAMEWORKUNIFIEDLOG0(ZONE_FUNC, __FUNCTION__, "-"); + + return eStatus; +} -- cgit 1.2.3-korg