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 }