1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "caleadapter.h"
23 #include <arpa/inet.h>
24 #include <sys/socket.h>
29 #endif //#ifdef __TIZEN__
34 #include "cableserver.h"
35 #include "cableclient.h"
38 #include "caadapterutils.h"
40 #include "BLEAdapterArduino.h"
41 #include "caadapterutils.h"
42 #endif //#ifdef __TIZEN__
43 #define CALEADAPTER_TAG "CA_BLE_ADAPTER"
45 static CANetworkChangeCallback gNetworkCallback = NULL;
47 static char gLocalBLEAddress[16] = { 0, };
49 static CABool_t gIsServer = CA_FALSE;
51 static u_mutex gBleIsServerMutex = NULL;
53 static u_mutex gBleNetworkCbMutex = NULL;
55 static u_mutex gBleLocalAddressMutex = NULL;
57 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback);
60 int32_t CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state,
62 CAResult_t CAInitBleAdapterMutex();
63 CAResult_t CATermiateBleAdapterMutex();
65 #endif //#ifdef __TIZEN__
67 CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
68 CANetworkPacketReceivedCallback reqRespCallback,
69 CANetworkChangeCallback netCallback,
70 u_thread_pool_t handle)
72 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
75 VERIFY_NON_NULL(registerCallback, NULL, "RegisterConnectivity callback is null");
76 VERIFY_NON_NULL(reqRespCallback, NULL, "PacketReceived Callback is null");
77 VERIFY_NON_NULL(netCallback, NULL, "NetworkChange Callback is null");
79 CAResult_t result = CAInitBleAdapterMutex();
81 if (CA_STATUS_OK != result)
83 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleAdapterMutex failed!");
84 return CA_STATUS_FAILED;
91 #endif //#ifdef __TIZEN__
93 CASetBleServerThreadPoolHandle(handle);
94 CASetBleClientThreadPoolHandle(handle);
95 CASetBLEReqRespServerCallback(reqRespCallback);
96 CASetBLEReqRespClientCallback(reqRespCallback);
97 CALERegisterNetworkNotifications(netCallback);
99 CAConnectivityHandler_t connHandler;
100 connHandler.startAdapter = NULL;
101 connHandler.stopAdapter = NULL;
102 connHandler.startListenServer = CAStartLEListeningServer;
103 connHandler.startDiscoverServer = CAStartLEDiscoveryServer;
104 connHandler.sendData = CASendLEUnicastData;
105 connHandler.sendDataToAll = CASendLEMulticastData;
106 connHandler.startNotifyServer = CAStartLENotifyServer;
107 connHandler.sendNotification = CASendLENotification;
108 connHandler.GetnetInfo = CAGetLEInterfaceInformation;
109 connHandler.readData = CAReadLEData;
110 connHandler.terminate = CATerminateLE;
111 registerCallback(connHandler, CA_LE);
113 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
120 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
122 CASetBLEReqRespServerCallback(NULL);
123 CASetBLEReqRespClientCallback(NULL);
124 CALERegisterNetworkNotifications(NULL);
126 u_mutex_lock(gBleIsServerMutex);
127 if (CA_TRUE == gIsServer)
129 CAStopBleGattServer();
133 CAStopBLEGattClient();
135 u_mutex_unlock(gBleIsServerMutex);
137 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
141 CAResult_t CAStartLEListeningServer()
143 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
145 CAStartBleGattServer();
147 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
148 u_mutex_lock(gBleIsServerMutex);
150 u_mutex_unlock(gBleIsServerMutex);
154 CAResult_t CAStartLEDiscoveryServer()
156 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
158 CAStartBLEGattClient();
160 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
161 u_mutex_lock(gBleIsServerMutex);
162 gIsServer = CA_FALSE;
163 u_mutex_unlock(gBleIsServerMutex);
167 CAResult_t CAStartLENotifyServer()
169 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
171 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
176 uint32_t CASendLENotification(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
178 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
180 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
185 CAResult_t CAReadLEData()
187 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
189 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
194 uint32_t CASendLEUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
196 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
199 VERIFY_NON_NULL(endpoint, NULL, "Remote endpoint is null");
200 VERIFY_NON_NULL(data, NULL, "Data is null");
202 CAResult_t result = CA_STATUS_FAILED;
205 u_mutex_lock(gBleIsServerMutex);
206 if (CA_TRUE == gIsServer)
208 result = CABleServerSenderQueueEnqueueMessage(endpoint, data, dataLen);
209 if (CA_STATUS_OK != result)
211 OIC_LOG(ERROR, CALEADAPTER_TAG,
212 "[SendLEUnicastData] CABleServerSenderQueueEnqueueMessage failed \n");
213 u_mutex_unlock(gBleIsServerMutex);
220 result = CABleClientSenderQueueEnqueueMessage(endpoint, data, dataLen);
221 if (CA_STATUS_OK != result)
223 OIC_LOG(ERROR, CALEADAPTER_TAG,
224 "[SendLEUnicastData] CABleClientSenderQueueEnqueueMessage failed \n");
225 u_mutex_unlock(gBleIsServerMutex);
229 u_mutex_unlock(gBleIsServerMutex);
231 char *tempPath = "temp_path";
232 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
233 #endif //#ifdef __TIZEN__
234 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
239 uint32_t CASendLEMulticastData(void *data, uint32_t dataLen)
241 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
244 VERIFY_NON_NULL(data, NULL, "Data is null");
248 OIC_LOG(ERROR, CALEADAPTER_TAG, "Invalid Parameter");
252 CAResult_t result = CA_STATUS_FAILED;
254 u_mutex_lock(gBleIsServerMutex);
255 if (CA_TRUE == gIsServer)
257 result = CABleServerSenderQueueEnqueueMessage(NULL, data, dataLen);
258 if (CA_STATUS_OK != result)
260 OIC_LOG(ERROR, CALEADAPTER_TAG,
261 "[SendLEMulticastDataToAll] CABleServerSenderQueueEnqueueMessage failed" );
262 u_mutex_unlock(gBleIsServerMutex);
268 result = CABleClientSenderQueueEnqueueMessage(NULL, data, dataLen);
269 if (CA_STATUS_OK != result)
271 OIC_LOG(ERROR, CALEADAPTER_TAG,
272 "[SendLEMulticastDataToAll] CABleClientSenderQueueEnqueueMessage failed" );
273 u_mutex_unlock(gBleIsServerMutex);
277 u_mutex_unlock(gBleIsServerMutex);
279 char *tempPath = "temp_path";
280 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
281 #endif //#ifdef __TIZEN__
282 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
286 CAResult_t CAGetLEInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
288 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
290 VERIFY_NON_NULL(info, NULL, "CALocalConnectivity info is null");
294 char *local_address = NULL;
296 bt_adapter_get_address(&local_address);
297 if (NULL == local_address)
299 OIC_LOG(ERROR, CALEADAPTER_TAG, "Get local bt adapter address failed");
300 return CA_STATUS_FAILED;
303 #endif //#if ARDUINODUE
305 (*info) = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t));
308 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failure!");
309 return CA_STATUS_FAILED;
311 memset((*info), 0x0, sizeof(CALocalConnectivity_t));
313 strncpy((*info)->addressInfo.BT.btMacAddress, local_address, strlen(local_address));
314 u_mutex_lock(gBleLocalAddressMutex);
315 strncpy(gLocalBLEAddress, local_address, sizeof(gLocalBLEAddress));
316 u_mutex_unlock(gBleLocalAddressMutex);
318 (*info)->type = CA_LE;
320 OICFree(local_address);
322 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
326 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback)
328 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
330 u_mutex_lock(gBleNetworkCbMutex);
331 gNetworkCallback = netCallback;
332 u_mutex_unlock(gBleNetworkCbMutex);
337 ret = bt_adapter_set_state_changed_cb(CALEDeviceStateChangedCb, NULL);
340 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
345 ret = bt_adapter_unset_state_changed_cb();
348 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
351 #endif //#ifdef __TIZEN__
352 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
358 int32_t CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state, void *user_data)
360 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
362 bt_adapter_state_e btAdaptorState = BT_ADAPTER_DISABLED;
363 if (BT_ADAPTER_ENABLED == adapter_state)
365 btAdaptorState = BT_ADAPTER_ENABLED;
368 CALocalConnectivity_t localEndpoint;
370 u_mutex_lock(gBleLocalAddressMutex);
371 strncpy(localEndpoint.addressInfo.BT.btMacAddress, gLocalBLEAddress, strlen(gLocalBLEAddress));
372 u_mutex_unlock(gBleLocalAddressMutex);
374 u_mutex_lock(gBleNetworkCbMutex);
375 if (NULL != gNetworkCallback)
377 gNetworkCallback(&localEndpoint, adapter_state);
381 OIC_LOG(ERROR, CALEADAPTER_TAG, "gNetworkCallback is NULL");
383 u_mutex_unlock(gBleNetworkCbMutex);
384 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
388 CAResult_t CAInitBleAdapterMutex()
390 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
393 if (NULL == gBleIsServerMutex)
395 gBleIsServerMutex = u_mutex_new();
396 if (NULL == gBleIsServerMutex)
398 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
399 return CA_STATUS_FAILED;
403 if (NULL == gBleNetworkCbMutex)
405 gBleNetworkCbMutex = u_mutex_new();
406 if (NULL == gBleNetworkCbMutex)
408 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
409 return CA_STATUS_FAILED;
413 if (NULL == gBleLocalAddressMutex)
415 gBleLocalAddressMutex = u_mutex_new();
416 if (NULL == gBleLocalAddressMutex)
418 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
419 return CA_STATUS_FAILED;
422 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
425 CAResult_t CATermiateBleAdapterMutex()
427 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
428 u_mutex_free(gBleIsServerMutex);
429 gBleIsServerMutex = NULL;
430 u_mutex_free(gBleNetworkCbMutex);
431 gBleNetworkCbMutex = NULL;
432 u_mutex_free(gBleLocalAddressMutex);
433 gBleLocalAddressMutex = NULL;
434 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
437 #endif //#ifdef OIC_TIZEN