X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fbt_le_adapter%2Ftizen%2Fcaleclient_vd.c;h=0b79771ec01d2c924064d9c4ee1717dcf1bededc;hb=f3e031e6dd51fcc5c831ff754d134ac03ff5a5bb;hp=2b9410e20a405052191e898bff6d6c5b96fd43cd;hpb=a6893016debf5d510538fd8a25f67b369e2cb4e8;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleclient_vd.c b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleclient_vd.c index 2b9410e..0b79771 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleclient_vd.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleclient_vd.c @@ -46,6 +46,13 @@ #define MICROSECS_PER_SEC 1000000 #define WAIT_TIME_WRITE_CHARACTERISTIC 10 * MICROSECS_PER_SEC +//For custom uuid ble server +#define CA_GATT_CUSTOM_UUID "4209" +#define CA_GATT_CUSTOM_UUID2 "4204" +#define CUSTOM_UUID_LEN 4 + +static const int samsung_code = 117; + uint64_t const TIMEOUT = 30 * MICROSECS_PER_SEC; /** @@ -153,6 +160,16 @@ static oc_mutex g_threadWriteCharacteristicMutex = NULL; static oc_cond g_threadWriteCharacteristicCond = NULL; /** + * Mutex to synchronize the task for MTU Changed. + */ +static oc_mutex g_threadMTUChangedMutex = NULL; + +/** + * Condition for MTU Changed. + */ +static oc_cond g_threadMTUChangedCond = NULL; + +/** * Flag to check status of write characteristic. */ static bool g_isSignalSetFlag = false; @@ -205,6 +222,17 @@ void CALEGattCharacteristicChangedCb(bt_gatt_h characteristic, OIC_LOG(DEBUG, TAG, "OUT"); } +void CALEGattClientMTUChangedCb(bt_gatt_client_h client_handle, const bt_gatt_client_att_mtu_info_s *mtu_info, void *user_data) +{ + OIC_LOG(DEBUG, TAG, "IN"); + oc_mutex_lock(g_threadMTUChangedMutex); + OIC_LOG(DEBUG, TAG, "MTU changed signal"); + oc_cond_signal(g_threadMTUChangedCond); + oc_mutex_unlock(g_threadMTUChangedMutex); + OIC_LOG(DEBUG, TAG, "OUT"); +} + + void CALEGattCharacteristicWriteCb(int result, bt_gatt_h reqHandle, void *userData) { (void)reqHandle; @@ -305,8 +333,9 @@ void CALEGattConnectionStateChanged(bool connected, const char *remoteAddress) g_isConnectionInProgress = false; oc_mutex_unlock(g_isConnectionInProgressMutex); - // Resume the scanning - oc_mutex_lock(g_scanMutex); + + // TODO:Disabling scanning for now.Need to check. + /*oc_mutex_lock(g_scanMutex); if (g_isMulticastInProgress || g_isUnicastScanInProgress) { CAResult_t ret = CALEGattStartDeviceScanning(); @@ -316,7 +345,7 @@ void CALEGattConnectionStateChanged(bool connected, const char *remoteAddress) } } oc_mutex_unlock(g_scanMutex); - +*/ LEServerInfo *serverInfo = NULL; oc_mutex_lock(g_LEServerListMutex); if (CA_STATUS_OK != CAGetLEServerInfo(g_LEServerList, remoteAddress, &serverInfo)) @@ -382,6 +411,32 @@ static bool CALEIsHaveServiceImpl(bt_adapter_le_device_scan_result_info_s *scanI } OICFree(uuids); } + + if(ret == false){ + char *man_data = NULL; + int man_data_len; + int man_id; + result = bt_adapter_le_get_scan_result_manufacturer_data(scanInfo, + pkt_type, &man_id, &man_data, &man_data_len); + + if (result == BT_ERROR_NONE && NULL != man_data) + { + char *compare_man_data = OICMalloc((man_data_len*2)+1); + int pos =0; + for(int i=0;iremote_address); + ret = true; + } + OICFree(compare_man_data); + OICFree(man_data); + } + } return ret; } @@ -401,7 +456,6 @@ void CALEAdapterScanResultCb(int result, bt_adapter_le_device_scan_result_info_s void *userData) { (void)userData; - OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_VOID(scanInfo, TAG, "scanInfo"); @@ -425,81 +479,19 @@ void CALEAdapterScanResultCb(int result, bt_adapter_le_device_scan_result_info_s } oc_mutex_unlock(g_isScanningInProgressMutex); - oc_mutex_lock(g_scanMutex); - bool isMulticastInProgress = g_isMulticastInProgress; - oc_mutex_unlock(g_scanMutex); - - LEServerInfo *serverInfo = NULL; - oc_mutex_lock(g_LEServerListMutex); - CAResult_t ret = CAGetLEServerInfo(g_LEServerList, scanInfo->remote_address, &serverInfo); - - if (CA_STATUS_OK == ret && serverInfo->status == LE_STATUS_UNICAST_PENDING) + if (CALEIsHaveService(scanInfo, CA_GATT_SERVICE_UUID) || + CALEIsHaveService(scanInfo, CA_GATT_CUSTOM_UUID)|| + CALEIsHaveService(scanInfo, CA_GATT_CUSTOM_UUID2)) { - // Stop the scan if no other device is in unicast pending - // state and if multicast is not in progress - LEServerInfoList *curNode = g_LEServerList; - for (; curNode; curNode = curNode->next) - { - if (curNode->serverInfo == serverInfo) - { - continue; - } - if (curNode->serverInfo->status == LE_STATUS_UNICAST_PENDING) - { - break; - } - } - - if (NULL == curNode) - { - oc_mutex_lock(g_scanMutex); - if (!g_isMulticastInProgress && g_isUnicastScanInProgress) - { - CALEGattStopDeviceScanning(); - g_isUnicastScanInProgress = false; - oc_cond_signal(g_scanningTimeCond); - } - oc_mutex_unlock(g_scanMutex); - } + OIC_LOG_V(DEBUG, TAG, "Device [%s] supports OIC or custom service", scanInfo->remote_address); - if (!CALEIsHaveService(scanInfo, CA_GATT_SERVICE_UUID)) - { - serverInfo->status = LE_STATUS_INVALID; - OIC_LOG_V(DEBUG, TAG, "Device [%s] does not support OIC service", serverInfo->remoteAddress); - oc_mutex_unlock(g_LEServerListMutex); - return; - } - - bt_gatt_client_h clientHandle = NULL; - int32_t ret = bt_gatt_client_create(remoteAddress, &clientHandle); - if (BT_ERROR_NONE != ret || NULL == clientHandle) - { - OIC_LOG_V(ERROR, TAG, - "bt_gatt_client_create Failed with ret value [%s] ", CALEGetErrorMsg(ret)); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; - } - serverInfo->clientHandle = clientHandle; - - serverInfo->status = LE_STATUS_CONNECTION_INITIATED; - if (CA_STATUS_OK != CALEGattInitiateConnection(serverInfo->remoteAddress)) - { - serverInfo->status = LE_STATUS_DISCOVERED; - OIC_LOG_V(ERROR, TAG, "Could not initiate connection to [%s]", serverInfo->remoteAddress); - oc_mutex_unlock(g_LEServerListMutex); - return; - } - oc_mutex_unlock(g_LEServerListMutex); - OIC_LOG(DEBUG, TAG, "OUT"); - return; - } - - if (isMulticastInProgress) - { + LEServerInfo *serverInfo = NULL; + oc_mutex_lock(g_LEServerListMutex); + CAResult_t ret = CAGetLEServerInfo(g_LEServerList, scanInfo->remote_address, &serverInfo); if (CA_STATUS_OK != ret) { OIC_LOG_V(DEBUG, TAG, - "Newly discovered device with address [%s], adding to list", scanInfo->remote_address); + "Newly discovered device with address [%s] ", scanInfo->remote_address); char *addr = OICStrdup(scanInfo->remote_address); if (NULL == addr) @@ -526,51 +518,35 @@ void CALEAdapterScanResultCb(int result, bt_adapter_le_device_scan_result_info_s CAFreeLEServerInfo(serverInfo); return; } + }else { + OIC_LOG_V(DEBUG, TAG, + "Device Present with address [%s] ", scanInfo->remote_address); - if (!CALEIsHaveService(scanInfo, CA_GATT_SERVICE_UUID)) - { - serverInfo->status = LE_STATUS_INVALID; - OIC_LOG_V(DEBUG, TAG, "Device [%s] does not support OIC service", serverInfo->remoteAddress); - oc_mutex_unlock(g_LEServerListMutex); - return; - } - - oc_mutex_lock(g_multicastDataListMutex); - uint32_t lengthData = u_arraylist_length(g_multicastDataList); - for (uint32_t len = 0; len < lengthData; ++len) - { - LEData *multicastData = (LEData *)u_arraylist_get(g_multicastDataList, len); - if (NULL == multicastData) - { - OIC_LOG(ERROR, TAG, "multicastData is NULL"); - continue; - } - if (CA_STATUS_OK != CAAddLEDataToList(&serverInfo->pendingDataList, - multicastData->data, multicastData->dataLength)) + if(serverInfo->status == LE_STATUS_UNICAST_PENDING){ + bt_gatt_client_h clientHandle = NULL; + int32_t ret = bt_gatt_client_create(serverInfo->remoteAddress, &clientHandle); + if (BT_ERROR_NONE != ret || NULL == clientHandle) { - OIC_LOG(ERROR, TAG, "Failed to add to pending list"); - continue; + OIC_LOG_V(ERROR, TAG, + "bt_gatt_client_create Failed with ret value [%s] ", CALEGetErrorMsg(ret)); + CALEGattDisConnect(serverInfo->remoteAddress); + oc_mutex_unlock(g_LEServerListMutex); + return ; } - } - oc_mutex_unlock(g_multicastDataListMutex); - } + serverInfo->clientHandle = clientHandle; - if (serverInfo->status == LE_STATUS_DISCOVERED) - { - // Initiate connection if not yet initiated - serverInfo->status = LE_STATUS_CONNECTION_INITIATED; - if (CA_STATUS_OK != CALEGattInitiateConnection(serverInfo->remoteAddress)) - { - OIC_LOG_V(ERROR, TAG, "Could not initiate connection to [%s]", serverInfo->remoteAddress); - serverInfo->status = LE_STATUS_DISCOVERED; - } - } - else - { - OIC_LOG_V(DEBUG, TAG, "Device already discovered, status= [%d]", serverInfo->status); - } + serverInfo->status = LE_STATUS_CONNECTION_INITIATED; + if (CA_STATUS_OK != CALEGattInitiateConnection(serverInfo->remoteAddress)) + { + OIC_LOG_V(ERROR, TAG, "Could not initiate connection to [%s]", serverInfo->remoteAddress); + serverInfo->status = LE_STATUS_DISCOVERED; + CADestroyLEDataList(&serverInfo->pendingDataList); + oc_mutex_unlock(g_LEServerListMutex); + return ; + } + } + } } - oc_mutex_unlock(g_LEServerListMutex); OIC_LOG(DEBUG, TAG, "OUT"); } @@ -646,12 +622,50 @@ CAResult_t CAStartLEGattClient() oc_mutex_unlock(g_LEClientThreadPoolMutex); return CA_STATUS_FAILED; } + + result= ca_thread_pool_add_task(g_LEClientThreadPool, CALEClientScanThread, + NULL, NULL); + if (CA_STATUS_OK != result) + { + OIC_LOG(ERROR, TAG, "ca_thread_pool_add_task failed"); + CATerminateGattClientMutexVariables(); + oc_mutex_unlock(g_LEClientThreadPoolMutex); + return CA_STATUS_FAILED; + } oc_mutex_unlock(g_LEClientThreadPoolMutex); OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } +void CALEClientScanThread() +{ + oc_mutex_lock(g_scanMutex); + if (!g_isMulticastInProgress && !g_isUnicastScanInProgress) + { + CAResult_t result = CALEGattStartDeviceScanning(); + if (CA_STATUS_OK != result) + { + oc_mutex_unlock(g_scanMutex); + OIC_LOG(ERROR, TAG, "CALEGattStartDeviceScanning failed"); + return ; + } + g_isUnicastScanInProgress = true; + // Start Timer + oc_cond_signal(g_startTimerCond); + } + else + { + g_isUnicastScanInProgress = true; + // Reset Timer + oc_cond_signal(g_scanningTimeCond); + } + oc_mutex_unlock(g_scanMutex); + + OIC_LOG(DEBUG, TAG, "OUT"); + return ; +} + void CAStartTimerThread(void *data) { (void)data; @@ -883,6 +897,16 @@ CAResult_t CAInitGattClientMutexVariables() } } + if (NULL == g_threadMTUChangedMutex) + { + g_threadMTUChangedMutex = oc_mutex_new(); + if (NULL == g_threadMTUChangedMutex) + { + OIC_LOG(ERROR, TAG, "oc_mutex_new has failed"); + return CA_STATUS_FAILED; + } + } + if (NULL == g_startTimerCond) { g_startTimerCond = oc_cond_new(); @@ -913,6 +937,17 @@ CAResult_t CAInitGattClientMutexVariables() } } + if (NULL == g_threadMTUChangedCond) + { + g_threadMTUChangedCond = oc_cond_new(); + if (NULL == g_threadMTUChangedCond) + { + OIC_LOG(ERROR, TAG, "oc_cond_new failed"); + return CA_STATUS_FAILED; + } + } + + OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } @@ -951,6 +986,9 @@ void CATerminateGattClientMutexVariables() oc_mutex_free(g_threadWriteCharacteristicMutex); g_threadWriteCharacteristicMutex = NULL; + oc_mutex_free(g_threadMTUChangedMutex); + g_threadMTUChangedMutex = NULL; + oc_cond_free(g_startTimerCond); g_startTimerCond = NULL; @@ -961,6 +999,9 @@ void CATerminateGattClientMutexVariables() g_threadWriteCharacteristicCond = NULL; g_isSignalSetFlag = false; + oc_cond_free(g_threadMTUChangedCond); + g_threadMTUChangedCond = NULL; + OIC_LOG(DEBUG, TAG, "OUT"); } @@ -1037,6 +1078,7 @@ void CALEGattStopDeviceScanning() return; } g_isScanningInProgress = false; + g_isUnicastScanInProgress= false; } else { @@ -1079,7 +1121,7 @@ CAResult_t CALEGattConnect(const char *remoteAddress) oc_mutex_lock(g_LEClientConnectMutex); CAResult_t result = CA_STATUS_OK; - int ret = bt_gatt_connect(remoteAddress, false); + int ret = bt_gatt_connect(remoteAddress, true); if (BT_ERROR_NONE != ret) { OIC_LOG_V(ERROR, TAG, "bt_gatt_connect Failed with ret value [%s] ", @@ -1219,6 +1261,7 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) "remote address is NULL", CA_STATUS_FAILED); LEServerInfo *serverInfo = NULL; + unsigned int mtu_size; oc_mutex_lock(g_LEServerListMutex); if (CA_STATUS_OK != CAGetLEServerInfo(g_LEServerList, remoteAddress, &serverInfo)) { @@ -1229,14 +1272,12 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) } bt_gatt_h serviceHandle = NULL; - ret = bt_gatt_client_get_service(serverInfo->clientHandle, CA_GATT_SERVICE_UUID, &serviceHandle); + int32_t ret = bt_gatt_client_get_service(serverInfo->clientHandle, CA_GATT_SERVICE_UUID, &serviceHandle); if (BT_ERROR_NONE != ret || NULL == serviceHandle) { OIC_LOG_V(ERROR, TAG, "bt_gatt_client_get_service Failed with ret value [%s] ", CALEGetErrorMsg(ret)); - bt_gatt_client_destroy(serverInfo->clientHandle); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; + goto error_exit; } // Server will read data on this characteristic. @@ -1248,9 +1289,7 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) OIC_LOG_V(ERROR, TAG, "bt_gatt_service_get_characteristic Failed with ret value [%s] ", CALEGetErrorMsg(ret)); - bt_gatt_client_destroy(serverInfo->clientHandle); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; + goto error_exit; } // Server will notify data on this characteristic. @@ -1262,20 +1301,15 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) OIC_LOG_V(ERROR, TAG, "bt_gatt_service_get_characteristic Failed with ret value [%s] ", CALEGetErrorMsg(ret)); - bt_gatt_client_destroy(serverInfo->clientHandle); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; + goto error_exit; } - //TODO: This data has to be freed while unsetting the callback. char *addr = OICStrdup(remoteAddress); if (NULL == addr) { OIC_LOG(ERROR, TAG, "addr is NULL"); - bt_gatt_client_destroy(serverInfo->clientHandle); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; + goto error_exit; } ret = bt_gatt_client_set_characteristic_value_changed_cb(readChrHandle, @@ -1286,15 +1320,51 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) OIC_LOG_V(ERROR, TAG, "bt_gatt_client_set_characteristic_value_changed_cb Failed with ret value [%s]", CALEGetErrorMsg(ret)); - bt_gatt_client_destroy(serverInfo->clientHandle); - CALEGattDisConnect(remoteAddress); - return CA_STATUS_FAILED; + goto error_exit; + } + + ret = bt_gatt_client_set_att_mtu_changed_cb(serverInfo->clientHandle, + CALEGattClientMTUChangedCb, + (void *)serverInfo->remoteAddress); + if (BT_ERROR_NONE != ret) + { + OIC_LOG_V(ERROR, TAG, + "bt_gatt_client_set_att_mtu_changed_cb Failed with ret value [%s]", + CALEGetErrorMsg(ret)); + goto error_exit; + } + + oc_mutex_lock(g_threadMTUChangedMutex); + ret = bt_gatt_client_request_att_mtu_change(serverInfo->clientHandle, CA_SUPPORTED_BLE_MTU_SIZE - CA_BLE_MTU_HEADER_SIZE); + if (BT_ERROR_NONE != ret) + { + OIC_LOG_V(ERROR, TAG, + "bt_gatt_client_request_att_mtu_change Failed with ret value [%s]", + CALEGetErrorMsg(ret)); + oc_mutex_unlock(g_threadMTUChangedMutex); + goto error_exit; + } + + OIC_LOG(DEBUG, TAG, "wait for callback to notify MTU Changed Callback"); + oc_cond_wait(g_threadMTUChangedCond, g_threadMTUChangedMutex); + oc_mutex_unlock(g_threadMTUChangedMutex); + + OIC_LOG(DEBUG, TAG, "Done MTU"); + ret = bt_gatt_client_get_att_mtu(serverInfo->clientHandle, &mtu_size); + if (BT_ERROR_NONE != ret) + { + OIC_LOG_V(ERROR, TAG, + "bt_gatt_client_get_att_mtu Failed with ret value [%s]", + CALEGetErrorMsg(ret)); + goto error_exit; } + OIC_LOG_V(DEBUG, TAG,"Negotiated MTU Size %d",mtu_size); serverInfo->serviceHandle = serviceHandle; serverInfo->readChar = readChrHandle; serverInfo->writeChar = writeChrHandle; serverInfo->status = LE_STATUS_SERVICES_DISCOVERED; + serverInfo->mtu_size = mtu_size; while (serverInfo->pendingDataList) { @@ -1314,6 +1384,13 @@ CAResult_t CALEGattDiscoverServices(const char *remoteAddress) OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; + +error_exit: + bt_gatt_client_destroy(serverInfo->clientHandle); + serverInfo->clientHandle = NULL; + oc_mutex_unlock(g_LEServerListMutex); + CALEGattDisConnect(remoteAddress); + return CA_STATUS_FAILED; } CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, @@ -1347,7 +1424,6 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, OIC_LOG(ERROR, TAG, "Device address is NULL"); return CA_STATUS_FAILED; } - serverInfo = (LEServerInfo *)OICCalloc(1, sizeof(LEServerInfo)); if (NULL == serverInfo) { @@ -1356,14 +1432,13 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, OICFree(addr); return CA_STATUS_FAILED; } - serverInfo->remoteAddress = addr; serverInfo->status = LE_STATUS_UNICAST_PENDING; if (CA_STATUS_OK != CAAddLEServerInfoToList(&g_LEServerList, serverInfo)) { oc_mutex_unlock(g_LEServerListMutex); - OIC_LOG_V(ERROR, TAG, "Could not add [%s] to server list", serverInfo->remoteAddress); + OIC_LOG_V(ERROR, TAG, "Could not add [%s] to server list", remoteAddress); CAFreeLEServerInfo(serverInfo); return CA_STATUS_FAILED; } @@ -1375,8 +1450,6 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, return CA_STATUS_FAILED; } - oc_mutex_unlock(g_LEServerListMutex); - oc_mutex_lock(g_scanMutex); if (!g_isMulticastInProgress && !g_isUnicastScanInProgress) { @@ -1399,8 +1472,6 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, } oc_mutex_unlock(g_scanMutex); - OIC_LOG(DEBUG, TAG, "OUT"); - return CA_STATUS_OK; } if (serverInfo->status == LE_STATUS_DISCOVERED) @@ -1413,12 +1484,12 @@ CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, } bt_gatt_client_h clientHandle = NULL; - int32_t ret = bt_gatt_client_create(remoteAddress, &clientHandle); + int32_t ret = bt_gatt_client_create(serverInfo->remoteAddress, &clientHandle); if (BT_ERROR_NONE != ret || NULL == clientHandle) { OIC_LOG_V(ERROR, TAG, - "bt_gatt_client_create Failed with ret value [%s] ", CALEGetErrorMsg(ret)); - CALEGattDisConnect(remoteAddress); + "bt_gatt_client_create Failed with ret value [%s] ", CALEGetErrorMsg(ret)); + CALEGattDisConnect(serverInfo->remoteAddress); return CA_STATUS_FAILED; } serverInfo->clientHandle = clientHandle; @@ -1549,3 +1620,22 @@ exit: OIC_LOG(DEBUG, TAG, "OUT "); return CA_STATUS_OK; } + +uint16_t CALEClientGetMtuSize(const char* remote_address) +{ + LEServerInfo *serverInfo = NULL; + oc_mutex_lock(g_LEServerListMutex); + if (CA_STATUS_OK == CAGetLEServerInfo(g_LEServerList, remote_address, &serverInfo)) + { + if (serverInfo->status == LE_STATUS_SERVICES_DISCOVERED){ + //OIC_LOG_V(DEBUG, TAG, "Mtu Size [%d]", serverInfo->mtu_size); + OIC_LOG_V(INFO, TAG, "Test: returning Mtu Size [%d]", serverInfo->mtu_size - CA_BLE_MTU_HEADER_SIZE); + oc_mutex_unlock(g_LEServerListMutex); + //return serverInfo->mtu_size; + return serverInfo->mtu_size - CA_BLE_MTU_HEADER_SIZE; + } + } + oc_mutex_unlock(g_LEServerListMutex); + return CA_DEFAULT_BLE_MTU_SIZE; + +}