1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "lnn_event_monitor_impl.h"
17 
18 #include <securec.h>
19 
20 #include "bus_center_event.h"
21 #include "lnn_async_callback_utils.h"
22 #include "lnn_log.h"
23 #include "softbus_adapter_bt_common.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_def.h"
26 #include "softbus_errcode.h"
27 #include "softbus_utils.h"
28 
29 static int32_t g_btStateListenerId = -1;
30 static void LnnOnBtStateChanged(int32_t listenerId, int32_t state);
31 static void LnnOnBtAclStateChanged(int32_t listenerId, const SoftBusBtAddr *addr, int32_t aclState, int32_t hciReason);
32 
33 static SoftBusBtStateListener g_btStateListener = {
34     .OnBtStateChanged = LnnOnBtStateChanged,
35     .OnBtAclStateChanged = LnnOnBtAclStateChanged,
36 };
37 
LnnOnBtStateChanged(int32_t listenerId,int32_t state)38 static void LnnOnBtStateChanged(int32_t listenerId, int32_t state)
39 {
40     if (listenerId < 0 || state < 0) {
41         LNN_LOGE(LNN_STATE, "bt monitor get invalid param");
42         return;
43     }
44 
45     SoftBusBtStackState btState = (SoftBusBtStackState)state;
46     SoftBusBtState *notifyState = (SoftBusBtState *)SoftBusMalloc(sizeof(SoftBusBtState));
47     if (notifyState == NULL) {
48         LNN_LOGE(LNN_STATE, "bt monitor malloc err");
49         return;
50     }
51     *notifyState = SOFTBUS_BT_UNKNOWN;
52     switch (btState) {
53         case SOFTBUS_BLE_STATE_TURN_ON:
54             *notifyState = SOFTBUS_BLE_TURN_ON;
55             break;
56         case SOFTBUS_BLE_STATE_TURN_OFF:
57             *notifyState = SOFTBUS_BLE_TURN_OFF;
58             break;
59         case SOFTBUS_BR_STATE_TURN_ON:
60             *notifyState = SOFTBUS_BR_TURN_ON;
61             break;
62         case SOFTBUS_BR_STATE_TURN_OFF:
63             *notifyState = SOFTBUS_BR_TURN_OFF;
64             break;
65         default:
66             break;
67     }
68 
69     if (*notifyState == SOFTBUS_BT_UNKNOWN) {
70         LNN_LOGD(LNN_STATE, "bt state changed but no need notify, btState=%{public}d", btState);
71         SoftBusFree(notifyState);
72         return;
73     }
74     LNN_LOGI(LNN_STATE, "async notify bt state changed, listenerId=%{public}d, notifyState=%{public}d",
75         listenerId, *notifyState);
76     int32_t ret = LnnAsyncCallbackHelper(GetLooper(LOOP_TYPE_DEFAULT), LnnNotifyBtStateChangeEvent,
77         (void *)notifyState);
78     if (ret != SOFTBUS_OK) {
79         LNN_LOGE(LNN_STATE, "async notify bt state err, ret=%{public}d", ret);
80         SoftBusFree(notifyState);
81         return;
82     }
83 }
84 
LnnOnBtAclStateChanged(int32_t listenerId,const SoftBusBtAddr * addr,int32_t aclState,int32_t hciReason)85 static void LnnOnBtAclStateChanged(int32_t listenerId, const SoftBusBtAddr *addr, int32_t aclState, int32_t hciReason)
86 {
87     (void)hciReason;
88     if (listenerId < 0 || addr == NULL) {
89         LNN_LOGE(LNN_STATE, "bt monitor get invalid param");
90         return;
91     }
92     char btMac[BT_MAC_LEN] = {0};
93     if (ConvertBtMacToStr(btMac, sizeof(btMac), addr->addr, sizeof(addr->addr)) != SOFTBUS_OK) {
94         LNN_LOGE(LNN_STATE, "convert bt mac to str fail");
95         return;
96     }
97     switch (aclState) {
98         case SOFTBUS_ACL_STATE_CONNECTED:
99             LnnNotifyBtAclStateChangeEvent(btMac, SOFTBUS_BR_ACL_CONNECTED);
100             break;
101         case SOFTBUS_ACL_STATE_DISCONNECTED:
102             LnnNotifyBtAclStateChangeEvent(btMac, SOFTBUS_BR_ACL_DISCONNECTED);
103             break;
104         default:
105             LNN_LOGD(LNN_STATE, "not support acl state=%{public}d", aclState);
106             break;
107     }
108 }
109 
LnnInitBtStateMonitorImpl(void)110 int32_t LnnInitBtStateMonitorImpl(void)
111 {
112     g_btStateListenerId = SoftBusAddBtStateListener(&g_btStateListener);
113     if (g_btStateListenerId < 0) {
114         LNN_LOGE(LNN_INIT, "monitor add bt state listener fail");
115         return SOFTBUS_ERR;
116     }
117     LNN_LOGI(LNN_INIT, "lnn bt state monitor impl start success");
118     return SOFTBUS_OK;
119 }
120 
LnnDeinitBtStateMonitorImpl(void)121 void LnnDeinitBtStateMonitorImpl(void)
122 {
123     (void)SoftBusRemoveBtStateListener(g_btStateListenerId);
124 }