1413470f0Sopenharmony_ci/*
2413470f0Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3413470f0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4413470f0Sopenharmony_ci * you may not use this file except in compliance with the License.
5413470f0Sopenharmony_ci * You may obtain a copy of the License at
6413470f0Sopenharmony_ci *
7413470f0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8413470f0Sopenharmony_ci *
9413470f0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10413470f0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11413470f0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12413470f0Sopenharmony_ci * See the License for the specific language governing permissions and
13413470f0Sopenharmony_ci * limitations under the License.
14413470f0Sopenharmony_ci */
15413470f0Sopenharmony_ci
16413470f0Sopenharmony_ci#include <securec.h>
17413470f0Sopenharmony_ci#include "battery_device.h"
18413470f0Sopenharmony_ci
19413470f0Sopenharmony_cistatic BatInfo battInfo = {
20413470f0Sopenharmony_ci    80,
21413470f0Sopenharmony_ci    10,
22413470f0Sopenharmony_ci    20,
23413470f0Sopenharmony_ci    60,
24413470f0Sopenharmony_ci    CHARGE_STATE_ENABLE,
25413470f0Sopenharmony_ci    PLUGGED_TYPE_WIRELESS,
26413470f0Sopenharmony_ci    "Ternary_Lithium",
27413470f0Sopenharmony_ci    HEALTH_STATE_GOOD,
28413470f0Sopenharmony_ci};
29413470f0Sopenharmony_ci
30413470f0Sopenharmony_cistatic BatteeryDeviceFeatureApi *g_batteryFeatureHandle = NULL;
31413470f0Sopenharmony_cistatic IBattery g_device;
32413470f0Sopenharmony_cistatic IBattery *g_ibattery = NULL;
33413470f0Sopenharmony_ci
34413470f0Sopenharmony_cistatic const char *BATTERY_GetName(Service *service)
35413470f0Sopenharmony_ci{
36413470f0Sopenharmony_ci    (void)service;
37413470f0Sopenharmony_ci    return BATTERY_DEVICE;
38413470f0Sopenharmony_ci}
39413470f0Sopenharmony_ci
40413470f0Sopenharmony_cistatic BOOL Initialize(Service *service, Identity identity)
41413470f0Sopenharmony_ci{
42413470f0Sopenharmony_ci    (void)service;
43413470f0Sopenharmony_ci    (void)identity;
44413470f0Sopenharmony_ci    return TRUE;
45413470f0Sopenharmony_ci}
46413470f0Sopenharmony_ci
47413470f0Sopenharmony_cistatic BOOL MessageHandle(Service *service, Request *msg)
48413470f0Sopenharmony_ci{
49413470f0Sopenharmony_ci    (void)service;
50413470f0Sopenharmony_ci    (void)msg;
51413470f0Sopenharmony_ci    return TRUE;
52413470f0Sopenharmony_ci}
53413470f0Sopenharmony_ci
54413470f0Sopenharmony_cistatic TaskConfig GetTaskConfig(Service *service)
55413470f0Sopenharmony_ci{
56413470f0Sopenharmony_ci    (void)service;
57413470f0Sopenharmony_ci    TaskConfig config = {LEVEL_HIGH, PRI_BELOW_NORMAL, TASK_CONFIG_STACK_SIZE, TASK_CONFIG_QUEUE_SIZE, SHARED_TASK};
58413470f0Sopenharmony_ci    return config;
59413470f0Sopenharmony_ci}
60413470f0Sopenharmony_ci
61413470f0Sopenharmony_cistatic int32_t Invoke(IServerProxy *iProxy, int funcId, void *origin, IpcIo *req, IpcIo *reply)
62413470f0Sopenharmony_ci{
63413470f0Sopenharmony_ci    (void)iProxy;
64413470f0Sopenharmony_ci    (void)funcId;
65413470f0Sopenharmony_ci    (void)origin;
66413470f0Sopenharmony_ci    (void)req;
67413470f0Sopenharmony_ci    (void)reply;
68413470f0Sopenharmony_ci    return BATTERY_OK;
69413470f0Sopenharmony_ci}
70413470f0Sopenharmony_ci
71413470f0Sopenharmony_ciint32_t GetSocImpl(void)
72413470f0Sopenharmony_ci{
73413470f0Sopenharmony_ci    return battInfo.batSoc;
74413470f0Sopenharmony_ci}
75413470f0Sopenharmony_ciBatteryChargeState GetChargingStatusImpl(void)
76413470f0Sopenharmony_ci{
77413470f0Sopenharmony_ci    return battInfo.chargingStatus;
78413470f0Sopenharmony_ci}
79413470f0Sopenharmony_ciBatteryHealthState GetHealthStatusImpl(void)
80413470f0Sopenharmony_ci{
81413470f0Sopenharmony_ci    return battInfo.healthStatus;
82413470f0Sopenharmony_ci}
83413470f0Sopenharmony_ciBatteryPluggedType GetPluggedTypeImpl(void)
84413470f0Sopenharmony_ci{
85413470f0Sopenharmony_ci    return battInfo.pluggedType;
86413470f0Sopenharmony_ci}
87413470f0Sopenharmony_ciint32_t GetVoltageImpl(void)
88413470f0Sopenharmony_ci{
89413470f0Sopenharmony_ci    return battInfo.batVoltage;
90413470f0Sopenharmony_ci}
91413470f0Sopenharmony_cichar *GetTechnologyImpl(void)
92413470f0Sopenharmony_ci{
93413470f0Sopenharmony_ci    return battInfo.BatTechnology;
94413470f0Sopenharmony_ci}
95413470f0Sopenharmony_ciint32_t GetTemperatureImpl(void)
96413470f0Sopenharmony_ci{
97413470f0Sopenharmony_ci    return battInfo.BatTemp;
98413470f0Sopenharmony_ci}
99413470f0Sopenharmony_ciint TurnOnLedImpl(int red, int green, int blue)
100413470f0Sopenharmony_ci{
101413470f0Sopenharmony_ci    (void)red;
102413470f0Sopenharmony_ci    (void)green;
103413470f0Sopenharmony_ci    (void)blue;
104413470f0Sopenharmony_ci    return BATTERY_OK;
105413470f0Sopenharmony_ci}
106413470f0Sopenharmony_ciint TurnOffLedImpl(void)
107413470f0Sopenharmony_ci{
108413470f0Sopenharmony_ci    return BATTERY_OK;
109413470f0Sopenharmony_ci}
110413470f0Sopenharmony_ciint SetLedColorImpl(int red, int green, int blue)
111413470f0Sopenharmony_ci{
112413470f0Sopenharmony_ci    (void)red;
113413470f0Sopenharmony_ci    (void)green;
114413470f0Sopenharmony_ci    (void)blue;
115413470f0Sopenharmony_ci    return BATTERY_OK;
116413470f0Sopenharmony_ci}
117413470f0Sopenharmony_ciint GetLedColorImpl(int *red, int *green, int *blue)
118413470f0Sopenharmony_ci{
119413470f0Sopenharmony_ci    (void)red;
120413470f0Sopenharmony_ci    (void)green;
121413470f0Sopenharmony_ci    (void)blue;
122413470f0Sopenharmony_ci    return BATTERY_OK;
123413470f0Sopenharmony_ci}
124413470f0Sopenharmony_civoid ShutDownImpl(void)
125413470f0Sopenharmony_ci{
126413470f0Sopenharmony_ci}
127413470f0Sopenharmony_civoid UpdateBatInfoImpl(BatInfo *battery)
128413470f0Sopenharmony_ci{
129413470f0Sopenharmony_ci    if (battery == NULL) {
130413470f0Sopenharmony_ci        return;
131413470f0Sopenharmony_ci    }
132413470f0Sopenharmony_ci    if (strcpy_s(battery->BatTechnology, BATTECHNOLOGY_LEN, battInfo.BatTechnology) != EOK) {
133413470f0Sopenharmony_ci        return;
134413470f0Sopenharmony_ci    }
135413470f0Sopenharmony_ci    battery->batSoc = battInfo.batSoc;
136413470f0Sopenharmony_ci    battery->batVoltage = battInfo.batVoltage;
137413470f0Sopenharmony_ci    battery->BatTemp = battInfo.BatTemp;
138413470f0Sopenharmony_ci    battery->batCapacity = battInfo.batCapacity;
139413470f0Sopenharmony_ci    battery->chargingStatus = battInfo.chargingStatus;
140413470f0Sopenharmony_ci    battery->pluggedType = battInfo.pluggedType;
141413470f0Sopenharmony_ci    battery->healthStatus = battInfo.healthStatus;
142413470f0Sopenharmony_ci}
143413470f0Sopenharmony_ci
144413470f0Sopenharmony_cistatic BatteryDevice g_batteryDevice = {
145413470f0Sopenharmony_ci    .GetName = BATTERY_GetName,
146413470f0Sopenharmony_ci    .Initialize = Initialize,
147413470f0Sopenharmony_ci    .MessageHandle = MessageHandle,
148413470f0Sopenharmony_ci    .GetTaskConfig = GetTaskConfig,
149413470f0Sopenharmony_ci    SERVER_IPROXY_IMPL_BEGIN,
150413470f0Sopenharmony_ci    .Invoke = Invoke,
151413470f0Sopenharmony_ci    .GetSoc = GetSocImpl,
152413470f0Sopenharmony_ci    .GetChargingStatus = GetChargingStatusImpl,
153413470f0Sopenharmony_ci    .GetHealthStatus = GetHealthStatusImpl,
154413470f0Sopenharmony_ci    .GetPluggedType =  GetPluggedTypeImpl,
155413470f0Sopenharmony_ci    .GetVoltage = GetVoltageImpl,
156413470f0Sopenharmony_ci    .GetTechnology = GetTechnologyImpl,
157413470f0Sopenharmony_ci    .GetTemperature = GetTemperatureImpl,
158413470f0Sopenharmony_ci    .TurnOnLed = TurnOnLedImpl,
159413470f0Sopenharmony_ci    .TurnOffLed = TurnOffLedImpl,
160413470f0Sopenharmony_ci    .SetLedColor = SetLedColorImpl,
161413470f0Sopenharmony_ci    .GetLedColor = GetLedColorImpl,
162413470f0Sopenharmony_ci    .ShutDown = ShutDownImpl,
163413470f0Sopenharmony_ci    .UpdateBatInfo = UpdateBatInfoImpl,
164413470f0Sopenharmony_ci    IPROXY_END,
165413470f0Sopenharmony_ci};
166413470f0Sopenharmony_ci
167413470f0Sopenharmony_cistatic void ChargingApiGet(void)
168413470f0Sopenharmony_ci{
169413470f0Sopenharmony_ci    if (g_batteryFeatureHandle != NULL) {
170413470f0Sopenharmony_ci        return;
171413470f0Sopenharmony_ci    }
172413470f0Sopenharmony_ci    IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(BATTERY_DEVICE);
173413470f0Sopenharmony_ci    if (iUnknown == NULL) {
174413470f0Sopenharmony_ci        return;
175413470f0Sopenharmony_ci    }
176413470f0Sopenharmony_ci    int ret = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)(&g_batteryFeatureHandle));
177413470f0Sopenharmony_ci    if (ret != BATTERY_OK) {
178413470f0Sopenharmony_ci        return;
179413470f0Sopenharmony_ci    }
180413470f0Sopenharmony_ci}
181413470f0Sopenharmony_ci
182413470f0Sopenharmony_cistatic void Init(void)
183413470f0Sopenharmony_ci{
184413470f0Sopenharmony_ci    BOOL result = SAMGR_GetInstance()->RegisterService((Service *)&g_batteryDevice);
185413470f0Sopenharmony_ci    if (result == FALSE) {
186413470f0Sopenharmony_ci        return;
187413470f0Sopenharmony_ci    }
188413470f0Sopenharmony_ci    BOOL apiResult = SAMGR_GetInstance()->RegisterDefaultFeatureApi(BATTERY_DEVICE, GET_IUNKNOWN(g_batteryDevice));
189413470f0Sopenharmony_ci    if (apiResult == FALSE) {
190413470f0Sopenharmony_ci        return;
191413470f0Sopenharmony_ci    }
192413470f0Sopenharmony_ci}
193413470f0Sopenharmony_ciSYSEX_SERVICE_INIT(Init);
194413470f0Sopenharmony_ci
195413470f0Sopenharmony_ci
196413470f0Sopenharmony_cistatic IBattery *GetBatteryDeviceMethods(void)
197413470f0Sopenharmony_ci{
198413470f0Sopenharmony_ci    if (g_batteryFeatureHandle == NULL) {
199413470f0Sopenharmony_ci        return NULL;
200413470f0Sopenharmony_ci    }
201413470f0Sopenharmony_ci    g_device.GetSoc = g_batteryFeatureHandle->GetSoc;
202413470f0Sopenharmony_ci    g_device.GetChargingStatus = g_batteryFeatureHandle->GetChargingStatus;
203413470f0Sopenharmony_ci    g_device.GetHealthStatus = g_batteryFeatureHandle->GetHealthStatus;
204413470f0Sopenharmony_ci    g_device.GetPluggedType = g_batteryFeatureHandle->GetPluggedType;
205413470f0Sopenharmony_ci    g_device.GetVoltage = g_batteryFeatureHandle->GetVoltage;
206413470f0Sopenharmony_ci    g_device.GetTechnology = g_batteryFeatureHandle->GetTechnology;
207413470f0Sopenharmony_ci    g_device.GetTemperature = g_batteryFeatureHandle->GetTemperature;
208413470f0Sopenharmony_ci    g_device.TurnOnLed = g_batteryFeatureHandle->TurnOnLed;
209413470f0Sopenharmony_ci    g_device.TurnOffLed = g_batteryFeatureHandle->TurnOffLed;
210413470f0Sopenharmony_ci    g_device.SetLedColor = g_batteryFeatureHandle->SetLedColor;
211413470f0Sopenharmony_ci    g_device.GetLedColor = g_batteryFeatureHandle->GetLedColor;
212413470f0Sopenharmony_ci    g_device.ShutDown = g_batteryFeatureHandle->ShutDown;
213413470f0Sopenharmony_ci    g_device.UpdateBatInfo = g_batteryFeatureHandle->UpdateBatInfo;
214413470f0Sopenharmony_ci    return &g_device;
215413470f0Sopenharmony_ci}
216413470f0Sopenharmony_ci
217413470f0Sopenharmony_ciIBattery *NewBatterInterfaceInstance(void)
218413470f0Sopenharmony_ci{
219413470f0Sopenharmony_ci    if (g_batteryFeatureHandle == NULL) {
220413470f0Sopenharmony_ci        ChargingApiGet();
221413470f0Sopenharmony_ci    }
222413470f0Sopenharmony_ci
223413470f0Sopenharmony_ci    g_ibattery = GetBatteryDeviceMethods();
224413470f0Sopenharmony_ci    if (g_ibattery == NULL) {
225413470f0Sopenharmony_ci        return NULL;
226413470f0Sopenharmony_ci    }
227413470f0Sopenharmony_ci    return g_ibattery;
228413470f0Sopenharmony_ci}
229413470f0Sopenharmony_ci
230413470f0Sopenharmony_ciint32_t FreeBatterInterfaceInstance(void)
231413470f0Sopenharmony_ci{
232413470f0Sopenharmony_ci    return 0;
233413470f0Sopenharmony_ci}
234