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 #include "caqueueingthread.h"
44 #include "camsgparser.h"
47 #define CALEADAPTER_TAG "CA_BLE_ADAPTER"
49 static CANetworkChangeCallback gNetworkCallback = NULL;
51 static char gLocalBLEAddress[16] = { 0, };
53 static CABool_t gIsServer = CA_FALSE;
55 static u_mutex gBleIsServerMutex = NULL;
57 static u_mutex gBleNetworkCbMutex = NULL;
59 static u_mutex gBleLocalAddressMutex = NULL;
62 * @var gBleClientThreadPool
63 * @brief reference to threadpool
65 static u_thread_pool_t gBleAdapterThreadPool = NULL;
68 * @var gBleAdapterThreadPoolMutex
69 * @brief Mutex to synchronize the task to be pushed to thread pool.
71 static u_mutex gBleAdapterThreadPoolMutex = NULL;
74 * @var gBLEClientSendQueueHandle
75 * @brief Queue to process the outgoing packets from GATTClient.
77 static CAQueueingThread_t *gBLEClientSendQueueHandle = NULL;
80 * @var gCABleClientReceiverQueue
81 * @brief Queue to process the incoming packets to GATT Client.
83 static CAQueueingThread_t *gCABleClientReceiverQueue = NULL;
86 * @var gBleClientSendDataMutex
87 * @brief Mutex to synchronize the queing of the data from SenderQueue.
89 static u_mutex gBleClientSendDataMutex = NULL;
93 * @var gBleClientReceiveDataMutex
94 * @brief Mutex to synchronize the queing of the data from ReceiverQueue.
96 static u_mutex gBleClientReceiveDataMutex = NULL;
99 * @var gDataReceiverHandlerState
100 * @brief Stop condition of redvhandler.
102 static bool gDataReceiverHandlerState = false;
105 * @var gSendQueueHandle
106 * @brief Queue to process the outgoing packets from GATTServer.
108 static CAQueueingThread_t *gSendQueueHandle = NULL;
111 * @var gCABleServerReceiverQueue
112 * @brief Queue to process the incoming packets to GATTServer
114 static CAQueueingThread_t *gCABleServerReceiverQueue = NULL;
117 * @var gBleServerSendDataMutex
118 * @brief Mutex to synchronize the queing of the data from SenderQueue.
120 static u_mutex gBleServerSendDataMutex = NULL;
123 * @var gBleServerReceiveDataMutex
124 * @brief Mutex to synchronize the queing of the data from ReceiverQueue.
126 static u_mutex gBleServerReceiveDataMutex = NULL;
128 static u_mutex gBleAdapterReqRespCbMutex = NULL;
130 static CANetworkPacketReceivedCallback gNetworkPacketReceivedCallback = NULL;
132 * @ENUM CALeServerStatus
133 * @brief status of BLE Server Status
135 * This ENUM provides information of LE Adapter Server status
139 CA_SERVER_NOTSTARTED = 0,
144 static CALeServerStatus gLeServerStatus = CA_SERVER_NOTSTARTED;
146 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback);
148 void CASetBleAdapterThreadPoolHandle(u_thread_pool_t handle);
151 void CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state,
153 CAResult_t CAInitBleAdapterMutex();
154 CAResult_t CATermiateBleAdapterMutex();
156 #endif //#ifdef __TIZEN__
158 CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
159 CANetworkPacketReceivedCallback reqRespCallback,
160 CANetworkChangeCallback netCallback,
161 u_thread_pool_t handle)
163 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
166 VERIFY_NON_NULL(registerCallback, NULL, "RegisterConnectivity callback is null");
167 VERIFY_NON_NULL(reqRespCallback, NULL, "PacketReceived Callback is null");
168 VERIFY_NON_NULL(netCallback, NULL, "NetworkChange Callback is null");
170 CAResult_t result = CAInitBleAdapterMutex();
171 if (CA_STATUS_OK != result)
173 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleAdapterMutex failed!");
174 return CA_STATUS_FAILED;
181 #endif //#ifdef __TIZEN__
183 CASetBleServerThreadPoolHandle(handle);
184 CASetBleClientThreadPoolHandle(handle);
185 CASetBleAdapterThreadPoolHandle(handle);
186 CASetBLEReqRespServerCallback(CABLEServerReceivedData);
187 CASetBLEReqRespClientCallback(CABLEClientReceivedData);
188 CASetBLEReqRespAdapterCallback(reqRespCallback);
190 CALERegisterNetworkNotifications(netCallback);
192 CAConnectivityHandler_t connHandler;
193 connHandler.startAdapter = NULL;
194 connHandler.stopAdapter = NULL;
195 connHandler.startListenServer = CAStartLEListeningServer;
196 connHandler.startDiscoverServer = CAStartLEDiscoveryServer;
197 connHandler.sendData = CASendLEUnicastData;
198 connHandler.sendDataToAll = CASendLEMulticastData;
199 connHandler.GetnetInfo = CAGetLEInterfaceInformation;
200 connHandler.readData = CAReadLEData;
201 connHandler.terminate = CATerminateLE;
202 registerCallback(connHandler, CA_LE);
204 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
211 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
213 CASetBLEReqRespServerCallback(NULL);
214 CASetBLEReqRespClientCallback(NULL);
215 CALERegisterNetworkNotifications(NULL);
217 u_mutex_lock(gBleIsServerMutex);
218 if (CA_TRUE == gIsServer)
220 CAStopBleGattServer();
224 CAStopBLEGattClient();
226 u_mutex_unlock(gBleIsServerMutex);
228 CATerminateBleQueues();
230 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
234 CAResult_t CAStartLEListeningServer()
236 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
238 bt_error_e err = BT_ERROR_NONE;
239 bt_adapter_state_e adapterState;
241 CAResult_t result = CAInitBleServerQueues();
242 if (CA_STATUS_OK != result)
244 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
245 return CA_STATUS_FAILED;
248 //Get Bluetooth adapter state
249 if (BT_ERROR_NONE != (err = bt_adapter_get_state(&adapterState)))
251 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
254 return CA_STATUS_FAILED;
257 if (BT_ADAPTER_ENABLED != adapterState)
259 gLeServerStatus = CA_LISTENING_SERVER;
260 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Listen Server will be started once BT Adapter is enabled");
264 CAStartBleGattServer();
266 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
267 u_mutex_lock(gBleIsServerMutex);
269 u_mutex_unlock(gBleIsServerMutex);
273 CAResult_t CAStartLEDiscoveryServer()
275 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
277 bt_error_e err = BT_ERROR_NONE;
278 bt_adapter_state_e adapterState;
280 CAResult_t result = CAInitBleClientQueues();
281 if (CA_STATUS_OK != result)
283 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
284 return CA_STATUS_FAILED;
287 //Get Bluetooth adapter state
288 if (BT_ERROR_NONE != (err = bt_adapter_get_state(&adapterState)))
290 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
293 return CA_STATUS_FAILED;
296 if (BT_ADAPTER_ENABLED != adapterState)
298 gLeServerStatus = CA_DISCOVERY_SERVER;
299 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Disc Server will be started once BT Adapter is enabled");
303 CAStartBLEGattClient();
305 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
306 u_mutex_lock(gBleIsServerMutex);
307 gIsServer = CA_FALSE;
308 u_mutex_unlock(gBleIsServerMutex);
312 CAResult_t CAStartLENotifyServer()
314 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
316 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
321 uint32_t CASendLENotification(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
323 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
325 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
330 CAResult_t CAReadLEData()
332 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
334 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
339 uint32_t CASendLEUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
341 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
344 VERIFY_NON_NULL(endpoint, NULL, "Remote endpoint is null");
345 VERIFY_NON_NULL(data, NULL, "Data is null");
347 CAResult_t result = CA_STATUS_FAILED;
350 u_mutex_lock(gBleIsServerMutex);
351 if (CA_TRUE == gIsServer)
353 result = CABLEServerSendData(endpoint, data, dataLen);
354 if (CA_STATUS_OK != result)
356 OIC_LOG(ERROR, CALEADAPTER_TAG,
357 "[SendLEUnicastData] CABleServerSenderQueueEnqueueMessage failed \n");
358 u_mutex_unlock(gBleIsServerMutex);
364 result = CABLEClientSendData(endpoint, data, dataLen);
365 if (CA_STATUS_OK != result)
367 OIC_LOG(ERROR, CALEADAPTER_TAG,
368 "[SendLEUnicastData] CABleClientSenderQueueEnqueueMessage failed \n");
369 u_mutex_unlock(gBleIsServerMutex);
373 u_mutex_unlock(gBleIsServerMutex);
375 char *tempPath = "temp_path";
376 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
377 #endif //#ifdef __TIZEN__
378 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
383 uint32_t CASendLEMulticastData(void *data, uint32_t dataLen)
385 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
388 VERIFY_NON_NULL(data, NULL, "Data is null");
392 OIC_LOG(ERROR, CALEADAPTER_TAG, "Invalid Parameter");
396 CAResult_t result = CA_STATUS_FAILED;
398 u_mutex_lock(gBleIsServerMutex);
399 if (CA_TRUE == gIsServer)
401 result = CABLEServerSendData(NULL, data, dataLen);
402 if (CA_STATUS_OK != result)
404 OIC_LOG(ERROR, CALEADAPTER_TAG,
405 "[SendLEMulticastDataToAll] CABleServerSenderQueueEnqueueMessage failed" );
406 u_mutex_unlock(gBleIsServerMutex);
412 result = CABLEClientSendData(NULL, data, dataLen);
413 if (CA_STATUS_OK != result)
415 OIC_LOG(ERROR, CALEADAPTER_TAG,
416 "[SendLEMulticastDataToAll] CABleClientSenderQueueEnqueueMessage failed" );
417 u_mutex_unlock(gBleIsServerMutex);
421 u_mutex_unlock(gBleIsServerMutex);
423 char *tempPath = "temp_path";
424 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
425 #endif //#ifdef __TIZEN__
426 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
430 CAResult_t CAGetLEInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
432 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
434 VERIFY_NON_NULL(info, NULL, "CALocalConnectivity info is null");
438 char *local_address = NULL;
440 bt_adapter_get_address(&local_address);
441 if (NULL == local_address)
443 OIC_LOG(ERROR, CALEADAPTER_TAG, "Get local bt adapter address failed");
444 return CA_STATUS_FAILED;
447 #endif //#if ARDUINODUE
449 (*info) = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t));
452 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failure!");
453 return CA_STATUS_FAILED;
455 memset((*info), 0x0, sizeof(CALocalConnectivity_t));
457 strncpy((*info)->addressInfo.BT.btMacAddress, local_address, strlen(local_address));
458 u_mutex_lock(gBleLocalAddressMutex);
459 strncpy(gLocalBLEAddress, local_address, sizeof(gLocalBLEAddress));
460 u_mutex_unlock(gBleLocalAddressMutex);
462 (*info)->type = CA_LE;
464 OICFree(local_address);
466 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
470 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback)
472 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
474 u_mutex_lock(gBleNetworkCbMutex);
475 gNetworkCallback = netCallback;
476 u_mutex_unlock(gBleNetworkCbMutex);
481 ret = bt_adapter_set_state_changed_cb(CALEDeviceStateChangedCb, NULL);
484 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
489 ret = bt_adapter_unset_state_changed_cb();
492 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
495 #endif //#ifdef __TIZEN__
496 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
502 void CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state, void *user_data)
504 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
506 CALocalConnectivity_t localEndpoint;
508 u_mutex_lock(gBleLocalAddressMutex);
509 strncpy(localEndpoint.addressInfo.BT.btMacAddress, gLocalBLEAddress, strlen(gLocalBLEAddress));
510 u_mutex_unlock(gBleLocalAddressMutex);
512 // Start a GattServer/Client if gLeServerStatus is SET
513 if (CA_LISTENING_SERVER == gLeServerStatus)
515 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Before CAStartBleGattServer");
516 CAStartBleGattServer();
518 else if (CA_DISCOVERY_SERVER == gLeServerStatus)
520 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Before CAStartBleGattClient");
521 CAStartBLEGattClient();
523 gLeServerStatus = CA_SERVER_NOTSTARTED;
525 u_mutex_lock(gBleNetworkCbMutex);
526 if (NULL != gNetworkCallback)
528 gNetworkCallback(&localEndpoint, adapter_state);
532 OIC_LOG(ERROR, CALEADAPTER_TAG, "gNetworkCallback is NULL");
534 u_mutex_unlock(gBleNetworkCbMutex);
536 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
539 CAResult_t CAInitBleAdapterMutex()
541 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
544 if (NULL == gBleIsServerMutex)
546 gBleIsServerMutex = u_mutex_new();
547 if (NULL == gBleIsServerMutex)
549 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
550 return CA_STATUS_FAILED;
554 if (NULL == gBleNetworkCbMutex)
556 gBleNetworkCbMutex = u_mutex_new();
557 if (NULL == gBleNetworkCbMutex)
559 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
560 return CA_STATUS_FAILED;
564 if (NULL == gBleLocalAddressMutex)
566 gBleLocalAddressMutex = u_mutex_new();
567 if (NULL == gBleLocalAddressMutex)
569 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
570 return CA_STATUS_FAILED;
574 if (NULL == gBleAdapterThreadPoolMutex)
576 gBleAdapterThreadPoolMutex = u_mutex_new();
577 if (NULL == gBleAdapterThreadPoolMutex)
579 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
580 return CA_STATUS_FAILED;
584 if (NULL == gBleClientSendDataMutex)
586 gBleClientSendDataMutex = u_mutex_new();
587 if (NULL == gBleClientSendDataMutex)
589 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
590 return CA_STATUS_FAILED;
594 if (NULL == gBleClientReceiveDataMutex)
596 gBleClientReceiveDataMutex = u_mutex_new();
597 if (NULL == gBleClientReceiveDataMutex)
599 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
600 return CA_STATUS_FAILED;
604 if (NULL == gBleServerSendDataMutex)
606 gBleServerSendDataMutex = u_mutex_new();
607 if (NULL == gBleServerSendDataMutex)
609 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
610 return CA_STATUS_FAILED;
614 if (NULL == gBleServerReceiveDataMutex)
616 gBleServerReceiveDataMutex = u_mutex_new();
617 if (NULL == gBleServerReceiveDataMutex)
619 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
620 return CA_STATUS_FAILED;
624 if (NULL == gBleAdapterReqRespCbMutex)
626 gBleAdapterReqRespCbMutex = u_mutex_new();
627 if (NULL == gBleAdapterReqRespCbMutex)
629 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
630 return CA_STATUS_FAILED;
634 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
637 CAResult_t CATermiateBleAdapterMutex()
639 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
641 u_mutex_free(gBleIsServerMutex);
642 gBleIsServerMutex = NULL;
644 u_mutex_free(gBleNetworkCbMutex);
645 gBleNetworkCbMutex = NULL;
647 u_mutex_free(gBleLocalAddressMutex);
648 gBleLocalAddressMutex = NULL;
650 u_mutex_free(gBleAdapterThreadPoolMutex);
651 gBleAdapterThreadPoolMutex = NULL;
653 u_mutex_free(gBleClientSendDataMutex);
654 gBleClientSendDataMutex = NULL;
656 u_mutex_free(gBleClientReceiveDataMutex);
657 gBleClientReceiveDataMutex = NULL;
659 u_mutex_free(gBleServerSendDataMutex);
660 gBleServerSendDataMutex = NULL;
662 u_mutex_free(gBleServerReceiveDataMutex);
663 gBleServerReceiveDataMutex = NULL;
665 u_mutex_free(gBleAdapterReqRespCbMutex);
666 gBleAdapterReqRespCbMutex = NULL;
668 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
672 void CAInitBleQueues()
674 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
676 CAResult_t result = CAInitBleServerQueues();
677 if (CA_STATUS_OK != result)
679 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
683 result = CAInitBleClientQueues();
684 if (CA_STATUS_OK != result)
686 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
690 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
695 CAResult_t CAInitBleServerQueues()
697 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
699 u_mutex_lock(gBleAdapterThreadPoolMutex);
701 CAResult_t result = CAInitBleServerSenderQueue();
702 if (CA_STATUS_OK != result)
704 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
705 u_mutex_unlock(gBleAdapterThreadPoolMutex);
706 return CA_STATUS_FAILED;
709 result = CAInitBleServerReceiverQueue();
710 if (CA_STATUS_OK != result)
712 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
713 u_mutex_unlock(gBleAdapterThreadPoolMutex);
714 return CA_STATUS_FAILED;
717 gDataReceiverHandlerState = true;
719 u_mutex_unlock(gBleAdapterThreadPoolMutex);
721 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
725 CAResult_t CAInitBleClientQueues()
727 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
729 u_mutex_lock(gBleAdapterThreadPoolMutex);
731 CAResult_t result = CAInitBleClientSenderQueue();
732 if (CA_STATUS_OK != result)
734 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
735 u_mutex_unlock(gBleAdapterThreadPoolMutex);
736 return CA_STATUS_FAILED;
739 result = CAInitBleClientReceiverQueue();
740 if (CA_STATUS_OK != result)
742 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
743 u_mutex_unlock(gBleAdapterThreadPoolMutex);
744 return CA_STATUS_FAILED;
747 gDataReceiverHandlerState = true;
749 u_mutex_unlock(gBleAdapterThreadPoolMutex);
751 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
755 CAResult_t CAInitBleServerSenderQueue()
757 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
758 // Check if the message queue is already initialized
759 if (gSendQueueHandle)
761 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
765 // Create send message queue
766 gSendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
767 if (!gSendQueueHandle)
769 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
770 return CA_MEMORY_ALLOC_FAILED;
773 if (CA_STATUS_OK != CAQueueingThreadInitialize(gSendQueueHandle, gBleAdapterThreadPool,
774 CABLEServerSendDataThread))
776 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
777 OICFree(gSendQueueHandle);
778 gSendQueueHandle = NULL;
779 return CA_STATUS_FAILED;
782 if (CA_STATUS_OK != CAQueueingThreadStart(gSendQueueHandle))
784 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
785 OICFree(gSendQueueHandle);
786 gSendQueueHandle = NULL;
787 return CA_STATUS_FAILED;
791 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
796 CAResult_t CAInitBleClientSenderQueue()
798 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
800 if (gBLEClientSendQueueHandle)
802 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
806 // Create send message queue
807 gBLEClientSendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
808 if (!gBLEClientSendQueueHandle)
810 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
811 return CA_MEMORY_ALLOC_FAILED;
814 if (CA_STATUS_OK != CAQueueingThreadInitialize(gBLEClientSendQueueHandle, gBleAdapterThreadPool,
815 CABLEClientSendDataThread))
817 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
818 OICFree(gBLEClientSendQueueHandle);
819 gBLEClientSendQueueHandle = NULL;
820 return CA_STATUS_FAILED;
823 if (CA_STATUS_OK != CAQueueingThreadStart(gBLEClientSendQueueHandle))
825 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
826 OICFree(gBLEClientSendQueueHandle);
827 gBLEClientSendQueueHandle = NULL;
828 return CA_STATUS_FAILED;
831 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
835 CAResult_t CAInitBleServerReceiverQueue()
837 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
838 // Check if the message queue is already initialized
839 if (gCABleServerReceiverQueue)
841 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
845 // Create send message queue
846 gCABleServerReceiverQueue = OICMalloc(sizeof(CAQueueingThread_t));
847 if (!gCABleServerReceiverQueue)
849 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
850 OICFree(gSendQueueHandle);
851 return CA_MEMORY_ALLOC_FAILED;
854 if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleServerReceiverQueue, gBleAdapterThreadPool,
855 CABLEServerDataReceiverHandler))
857 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
858 OICFree(gCABleServerReceiverQueue);
859 gCABleServerReceiverQueue = NULL;
860 return CA_STATUS_FAILED;
863 if (CA_STATUS_OK != CAQueueingThreadStart(gCABleServerReceiverQueue))
865 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
866 OICFree(gCABleServerReceiverQueue);
867 gCABleServerReceiverQueue = NULL;
868 return CA_STATUS_FAILED;
871 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
875 CAResult_t CAInitBleClientReceiverQueue()
877 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
879 // Check if the message queue is already initialized
880 if (gCABleClientReceiverQueue)
882 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
886 // Create send message queue
887 gCABleClientReceiverQueue = OICMalloc(sizeof(CAQueueingThread_t));
888 if (!gCABleClientReceiverQueue)
890 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
891 OICFree(gBLEClientSendQueueHandle);
892 return CA_MEMORY_ALLOC_FAILED;
895 if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleClientReceiverQueue, gBleAdapterThreadPool,
896 CABLEClientDataReceiverHandler))
898 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
899 OICFree(gBLEClientSendQueueHandle);
900 OICFree(gCABleClientReceiverQueue);
901 gCABleClientReceiverQueue = NULL;
902 return CA_STATUS_FAILED;
905 //gClientUp = CA_TRUE; //AMOGH
907 if (CA_STATUS_OK != CAQueueingThreadStart(gCABleClientReceiverQueue))
909 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
910 OICFree(gCABleClientReceiverQueue);
911 gCABleClientReceiverQueue = NULL;
912 return CA_STATUS_FAILED;
915 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
919 void CATerminateBleQueues()
921 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
923 u_mutex_lock(gBleClientSendDataMutex);
924 if (NULL != gBLEClientSendQueueHandle)
926 CAQueueingThreadStop(gBLEClientSendQueueHandle);
927 gBLEClientSendQueueHandle = NULL;
929 u_mutex_unlock(gBleClientSendDataMutex);
931 u_mutex_lock(gBleClientReceiveDataMutex);
932 if (NULL != gCABleClientReceiverQueue)
934 CAQueueingThreadStop(gCABleClientReceiverQueue);
935 gCABleClientReceiverQueue = NULL;
937 u_mutex_unlock(gBleClientReceiveDataMutex);
939 u_mutex_lock(gBleServerSendDataMutex);
940 if (NULL != gBLEClientSendQueueHandle)
942 CAQueueingThreadStop(gBLEClientSendQueueHandle);
943 gBLEClientSendQueueHandle = NULL;
945 u_mutex_unlock(gBleServerSendDataMutex);
947 u_mutex_lock(gBleServerReceiveDataMutex);
948 if (NULL != gCABleServerReceiverQueue)
950 CAQueueingThreadStop(gCABleServerReceiverQueue);
951 gCABleServerReceiverQueue = NULL;
953 u_mutex_unlock(gBleServerReceiveDataMutex);
955 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
958 void CABLEServerDataReceiverHandler(void *threadData)
960 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
962 // CAAdapterMessage_t *message = NULL;
963 static const char *remoteAddress = NULL;
964 static const char *serviceUUID = NULL;
965 static uint32_t recvDataLen = 0;
966 static uint32_t totalDataLen = 0;
967 static char *defragData = NULL;
968 static bool isHeaderAvailable = false;
969 static CARemoteEndpoint_t *remoteEndpoint = NULL;
971 u_mutex_lock(gBleClientReceiveDataMutex);
973 if (gDataReceiverHandlerState)
975 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
977 CABLEData *bleData = (CABLEData *) threadData;
980 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid wifidata!");
984 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
986 if (!isHeaderAvailable)
988 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Parsing the header");
989 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
990 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "header is NULL");
992 memcpy(header, bleData->data, CA_HEADER_LENGTH);
993 totalDataLen = CAParseHeader(header);
994 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
995 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "data received in the first packet [%d] bytes", bleData->dataLen);
996 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
997 if (NULL == defragData)
999 OIC_LOG(ERROR, CALEADAPTER_TAG, "defragData is NULL!");
1006 remoteAddress = bleData->remoteEndpoint->addressInfo.LE.leMacAddress;
1007 serviceUUID = bleData->remoteEndpoint->resourceUri;
1009 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
1012 memcpy(defragData + recvDataLen, bleData->data + CA_HEADER_LENGTH,
1013 bleData->dataLen - CA_HEADER_LENGTH);
1014 recvDataLen += bleData->dataLen - CA_HEADER_LENGTH;
1015 isHeaderAvailable = true;
1019 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Copying the data of length [%d]", bleData->dataLen);
1020 memcpy(defragData + recvDataLen, bleData->data, bleData->dataLen);
1021 recvDataLen += bleData->dataLen ;
1022 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
1023 totalDataLen, recvDataLen);
1025 CAFreeBLEData(bleData);
1026 if (totalDataLen == recvDataLen)
1028 u_mutex_lock(gBleAdapterReqRespCbMutex);
1029 if (NULL == gNetworkPacketReceivedCallback)
1031 OIC_LOG(ERROR, CALEADAPTER_TAG, "gReqRespCallback is NULL!");
1032 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1035 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending data up !");
1036 gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
1039 isHeaderAvailable = false;
1040 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1043 if (false == gDataReceiverHandlerState)
1045 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
1046 OICFree(defragData);
1047 OICFree(remoteEndpoint);
1048 u_mutex_unlock(gBleClientReceiveDataMutex);
1052 u_mutex_unlock(gBleClientReceiveDataMutex);
1053 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1056 void CABLEClientDataReceiverHandler(void *threadData)
1058 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1060 // CAAdapterMessage_t *message = NULL;
1061 static const char *remoteAddress = NULL;
1062 static const char *serviceUUID = NULL;
1063 static uint32_t recvDataLen = 0;
1064 static uint32_t totalDataLen = 0;
1065 static char *defragData = NULL;
1066 static bool isHeaderAvailable = false;
1067 static CARemoteEndpoint_t *remoteEndpoint = NULL;
1069 u_mutex_lock(gBleClientReceiveDataMutex);
1071 if (gDataReceiverHandlerState)
1073 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
1075 CABLEData *bleData = (CABLEData *) threadData;
1078 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid wifidata!");
1082 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
1084 if (!isHeaderAvailable)
1086 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Parsing the header");
1087 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1088 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "header is NULL");
1090 memcpy(header, bleData->data, CA_HEADER_LENGTH);
1091 totalDataLen = CAParseHeader(header);
1092 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
1093 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received in the first packet [%d] bytes", bleData->dataLen);
1094 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
1095 if (NULL == defragData)
1097 OIC_LOG(ERROR, CALEADAPTER_TAG, "defragData is NULL!");
1104 remoteAddress = bleData->remoteEndpoint->addressInfo.LE.leMacAddress;
1105 serviceUUID = bleData->remoteEndpoint->resourceUri;
1107 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
1110 memcpy(defragData , bleData->data + CA_HEADER_LENGTH,
1111 bleData->dataLen - CA_HEADER_LENGTH);
1112 recvDataLen += bleData->dataLen - CA_HEADER_LENGTH;
1113 isHeaderAvailable = true;
1117 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Copying the data of length [%d]", bleData->dataLen);
1118 memcpy(defragData + recvDataLen, bleData->data, bleData->dataLen);
1119 recvDataLen += bleData->dataLen ;
1120 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
1121 totalDataLen, recvDataLen);
1123 CAFreeBLEData(bleData);
1124 if (totalDataLen == recvDataLen)
1126 u_mutex_lock(gBleAdapterReqRespCbMutex);
1127 if (NULL == gNetworkPacketReceivedCallback)
1129 OIC_LOG(ERROR, CALEADAPTER_TAG, "gReqRespCallback is NULL!");
1130 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1133 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending data up !");
1134 gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
1137 isHeaderAvailable = false;
1138 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1141 if (false == gDataReceiverHandlerState)
1143 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
1144 OICFree(defragData);
1145 OICFree(remoteEndpoint);
1146 u_mutex_unlock(gBleClientReceiveDataMutex);
1150 u_mutex_unlock(gBleClientReceiveDataMutex);
1151 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1154 void CABLEServerSendDataThread(void *threadData)
1156 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1158 CABLEData *bleData = (CABLEData *) threadData;
1161 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid bledata!");
1164 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1165 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
1167 char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH);
1168 if (NULL == dataSegment)
1170 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
1175 memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
1176 memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen );
1178 CAResult_t result = CAGenerateHeader(header, bleData->dataLen);
1179 if (CA_STATUS_OK != result )
1181 OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
1183 OICFree(dataSegment);
1187 memcpy(dataSegment, header, CA_HEADER_LENGTH);
1190 if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
1192 length = bleData->dataLen + CA_HEADER_LENGTH;
1193 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1194 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data, bleData->dataLen);
1198 length = CA_SUPPORTED_BLE_MTU_SIZE;
1199 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1200 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data,
1201 CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
1204 int32_t iter = bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
1206 u_mutex_lock(gBleServerSendDataMutex);
1207 // Send the first segment with the header.
1208 result = CAUpdateCharacteristicsInGattServer(dataSegment, length);
1209 for (index = 1; index < iter; index++)
1211 // Send the remaining header.
1212 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending the chunk number [%d]", index);
1213 result = CAUpdateCharacteristicsInGattServer(
1214 bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
1215 CA_SUPPORTED_BLE_MTU_SIZE);
1217 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1219 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1220 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1221 result = CAUpdateCharacteristicsInGattServer(
1222 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1223 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
1226 OICFree(bleData->remoteEndpoint);
1228 u_mutex_unlock(gBleServerSendDataMutex); // AMOGH is this mutex required ?
1230 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1235 void CABLEClientSendDataThread(void *threadData)
1237 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1239 CABLEData *bleData = (CABLEData *) threadData;
1242 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid bledata!");
1245 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1246 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
1248 char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH);
1249 if (NULL == dataSegment)
1251 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
1256 memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
1257 memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen );
1259 CAResult_t result = CAGenerateHeader(header, bleData->dataLen);
1260 if (CA_STATUS_OK != result )
1262 OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
1264 OICFree(dataSegment);
1267 memcpy(dataSegment, header, CA_HEADER_LENGTH);
1270 if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
1272 length = bleData->dataLen + CA_HEADER_LENGTH;
1273 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1274 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data, bleData->dataLen);
1278 length = CA_SUPPORTED_BLE_MTU_SIZE;
1279 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1280 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data,
1281 CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
1284 int32_t iter = bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
1286 u_mutex_lock(gBleClientSendDataMutex);
1287 if (NULL != bleData->remoteEndpoint)
1289 // Send the first segment with the header.
1290 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1294 for (index = 1; index < iter; index++)
1296 // Send the remaining header.
1297 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1298 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1299 CA_SUPPORTED_BLE_MTU_SIZE,
1302 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1304 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1305 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1306 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1307 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1308 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH,
1314 // Send the first segment with the header.
1315 result = CAUpdateCharacteristicsToAllGattServers(dataSegment + (index * length),
1317 // Send the remaining header.
1318 for (index = 1; index <= iter; index++)
1320 result = CAUpdateCharacteristicsToAllGattServers(
1321 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1322 CA_SUPPORTED_BLE_MTU_SIZE);
1324 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1326 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1327 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1328 result = CAUpdateCharacteristicsToAllGattServers(
1329 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1330 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
1334 OICFree(bleData->remoteEndpoint);
1336 u_mutex_unlock(gBleClientSendDataMutex);
1338 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1343 CABLEData *CACreateBLEData(const CARemoteEndpoint_t *remoteEndpoint, void *data,
1344 uint32_t dataLength)
1346 CABLEData *bleData = (CABLEData *) OICMalloc(sizeof(CABLEData));
1349 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
1353 bleData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
1354 bleData->data = (void *)OICMalloc(dataLength);
1355 if (NULL == bleData->data)
1357 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
1358 CAFreeBLEData(bleData);
1361 memcpy(bleData->data, data, dataLength);
1362 bleData->dataLen = dataLength;
1367 void CAFreeBLEData(CABLEData *bleData)
1372 CAAdapterFreeRemoteEndpoint(bleData->remoteEndpoint);
1373 OICFree(bleData->data);
1377 CAResult_t CABLEClientSendData(const CARemoteEndpoint_t *remoteEndpoint,
1381 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN ");
1383 VERIFY_NON_NULL(data, NULL, "Param data is NULL");
1385 VERIFY_NON_NULL_RET(gBLEClientSendQueueHandle, CALEADAPTER_TAG,
1386 "gBLEClientSendQueueHandle is NULL",
1388 VERIFY_NON_NULL_RET(gBleClientSendDataMutex, CALEADAPTER_TAG,
1389 "gBleClientSendDataMutex is NULL",
1392 VERIFY_NON_NULL_RET(gBLEClientSendQueueHandle, CALEADAPTER_TAG, "gBLEClientSendQueueHandle",
1395 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data Sending to LE layer [%d]", dataLen);
1397 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLen);
1400 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1401 return CA_MEMORY_ALLOC_FAILED;
1403 // Add message to send queue
1404 u_mutex_lock(gBleClientSendDataMutex);
1405 CAQueueingThreadAddData(gBLEClientSendQueueHandle, bleData, sizeof(CABLEData));
1406 u_mutex_unlock(gBleClientSendDataMutex);
1408 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT ");
1409 return CA_STATUS_OK;
1413 CAResult_t CABLEServerSendData(const CARemoteEndpoint_t *remoteEndpoint,
1417 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN ");
1419 VERIFY_NON_NULL(data, NULL, "Param data is NULL");
1421 VERIFY_NON_NULL_RET(gSendQueueHandle, CALEADAPTER_TAG,
1422 "BleClientReceiverQueue is NULL",
1424 VERIFY_NON_NULL_RET(gBleClientSendDataMutex, CALEADAPTER_TAG,
1425 "BleClientSendDataMutex is NULL",
1428 VERIFY_NON_NULL_RET(gSendQueueHandle, CALEADAPTER_TAG, "sendQueueHandle",
1431 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data Sending to LE layer [%d]", dataLen);
1433 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLen);
1436 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1437 return CA_MEMORY_ALLOC_FAILED;
1439 // Add message to send queue
1440 u_mutex_lock(gBleServerSendDataMutex);
1441 CAQueueingThreadAddData(gSendQueueHandle, bleData, sizeof(CABLEData));
1442 u_mutex_unlock(gBleServerSendDataMutex);
1444 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT ");
1445 return CA_STATUS_OK;
1448 CAResult_t CABLEServerReceivedData(const char *remoteAddress, const char *serviceUUID,
1449 void *data, uint32_t dataLength, uint32_t *sentLength)
1451 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1454 VERIFY_NON_NULL(serviceUUID, CALEADAPTER_TAG, "service UUID is null");
1455 VERIFY_NON_NULL(data, CALEADAPTER_TAG, "Data is null");
1456 VERIFY_NON_NULL(sentLength, CALEADAPTER_TAG, "Sent data length holder is null");
1457 VERIFY_NON_NULL_RET(gCABleServerReceiverQueue, CALEADAPTER_TAG, "gCABleServerReceiverQueue",
1460 //Add message to data queue
1461 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_LE, remoteAddress,
1463 if (NULL == remoteEndpoint)
1465 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create remote endpoint !");
1466 return CA_STATUS_FAILED;
1469 // Create bleData to add to queue
1470 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received from LE layer [%d]", dataLength);
1472 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLength);
1475 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1476 return CA_MEMORY_ALLOC_FAILED;
1479 // Add message to send queue
1480 CAQueueingThreadAddData(gCABleServerReceiverQueue, bleData, sizeof(CABLEData));
1482 *sentLength = dataLength;
1487 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1488 return CA_STATUS_OK;
1491 CAResult_t CABLEClientReceivedData(const char *remoteAddress, const char *serviceUUID,
1492 void *data, uint32_t dataLength, uint32_t *sentLength)
1494 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1497 VERIFY_NON_NULL(serviceUUID, CALEADAPTER_TAG, "service UUID is null");
1498 VERIFY_NON_NULL(data, CALEADAPTER_TAG, "Data is null");
1499 VERIFY_NON_NULL(sentLength, CALEADAPTER_TAG, "Sent data length holder is null");
1500 VERIFY_NON_NULL_RET(gCABleClientReceiverQueue, CALEADAPTER_TAG, "gCABleClientReceiverQueue",
1503 //Add message to data queue
1504 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_LE, remoteAddress,
1506 if (NULL == remoteEndpoint)
1508 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create remote endpoint !");
1509 return CA_STATUS_FAILED;
1512 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received from LE layer [%d]", dataLength);
1514 // Create bleData to add to queue
1515 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLength);
1518 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1519 return CA_MEMORY_ALLOC_FAILED;
1522 // Add message to send queue
1523 CAQueueingThreadAddData(gCABleClientReceiverQueue, bleData, sizeof(CABLEData));
1525 *sentLength = dataLength;
1530 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1531 return CA_STATUS_OK;
1534 void CASetBleAdapterThreadPoolHandle(u_thread_pool_t handle)
1536 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1538 u_mutex_unlock(gBleAdapterThreadPoolMutex);
1539 gBleAdapterThreadPool = handle;
1540 u_mutex_unlock(gBleAdapterThreadPoolMutex);
1542 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1545 void CASetBLEReqRespAdapterCallback(CANetworkPacketReceivedCallback callback)
1547 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1549 u_mutex_lock(gBleAdapterReqRespCbMutex);
1551 gNetworkPacketReceivedCallback = callback;
1553 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1555 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1559 #endif //#ifdef OIC_TIZEN