summaryrefslogtreecommitdiffstats
path: root/systemservice/interface_unified/library/src/ss_power_client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'systemservice/interface_unified/library/src/ss_power_client.cpp')
-rw-r--r--systemservice/interface_unified/library/src/ss_power_client.cpp254
1 files changed, 254 insertions, 0 deletions
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 <inttypes.h>
+#include <string.h>
+#include <native_service/frameworkunified_application.h>
+#include <native_service/frameworkunified_framework_if.h>
+#include <native_service/frameworkunified_types.h>
+#include <native_service/frameworkunified_framework_types.h>
+#include <string>
+#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;
+}