com_android_bluetooth_gatt.cpp revision 80e7d011fdb511a6583258458e97821176866baa
103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/* 203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project 303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * 403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License"); 503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * you may not use this file except in compliance with the License. 603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * You may obtain a copy of the License at 703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * 803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * http://www.apache.org/licenses/LICENSE-2.0 903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * 1003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software 1103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS, 1203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * See the License for the specific language governing permissions and 1403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * limitations under the License. 1503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 1603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 18c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_TAG "BtGatt.JNI" 1903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 20c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_NDEBUG 0 2103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 2203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define CHECK_CALLBACK_ENV \ 2303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!checkCallbackThread()) { \ 2403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Callback: '%s' is not called on the correct thread", __FUNCTION__);\ 2503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; \ 2603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 2703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 2803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "com_android_bluetooth.h" 2903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "hardware/bt_gatt.h" 3003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "utils/Log.h" 3103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "android_runtime/AndroidRuntime.h" 3203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 3303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <string.h> 3403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 3503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <cutils/log.h> 3603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define info(fmt, ...) ALOGI ("%s(L%d): " fmt,__FUNCTION__, __LINE__, ## __VA_ARGS__) 3703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define debug(fmt, ...) ALOGD ("%s(L%d): " fmt,__FUNCTION__, __LINE__, ## __VA_ARGS__) 3803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define warn(fmt, ...) ALOGW ("WARNING: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__) 3903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define error(fmt, ...) ALOGE ("ERROR: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__) 4003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define asrt(s) if(!(s)) ALOGE ("%s(L%d): ASSERT %s failed! ##",__FUNCTION__, __LINE__, #s) 4103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 4203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define BD_ADDR_LEN 6 4303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 4403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define UUID_PARAMS(uuid_ptr) \ 4503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uuid_lsb(uuid_ptr), uuid_msb(uuid_ptr) 4603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 477f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach#define GATT_ID_PARAMS(attr_ptr) \ 487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach attr_ptr->inst_id, \ 497f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach UUID_PARAMS((&attr_ptr->uuid)) 5003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 5103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define SRVC_ID_PARAMS(srvc_ptr) \ 5203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta (srvc_ptr->is_primary ? \ 5303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta BTGATT_SERVICE_TYPE_PRIMARY : BTGATT_SERVICE_TYPE_SECONDARY), \ 547f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach GATT_ID_PARAMS((&srvc_ptr->id)) 5503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 5603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 5703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void set_uuid(uint8_t* uuid, jlong uuid_msb, jlong uuid_lsb) 5803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 5903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (int i = 0; i != 8; ++i) 6003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 6103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uuid[i] = (uuid_lsb >> (8 * i)) & 0xFF; 6203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uuid[i + 8] = (uuid_msb >> (8 * i)) & 0xFF; 6303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 6403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 6503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 6603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_lsb(bt_uuid_t* uuid) 6703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 6803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint64_t lsb = 0; 6903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int i; 7003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 7103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (i = 7; i >= 0; i--) 7203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 7303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta lsb <<= 8; 7403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta lsb |= uuid->uu[i]; 7503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 7603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 7703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return lsb; 7803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 7903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_msb(bt_uuid_t* uuid) 8103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 8203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint64_t msb = 0; 8303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int i; 8403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (i = 15; i >= 8; i--) 8603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 8703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta msb <<= 8; 8803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta msb |= uuid->uu[i]; 8903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 9003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return msb; 9203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 9303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void bd_addr_str_to_addr(const char* str, uint8_t *bd_addr) 9503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 9603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int i; 9703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c; 9803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta c = *str++; 10003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (i = 0; i < BD_ADDR_LEN; i++) 10103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 10203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (c >= '0' && c <= '9') 10303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] = c - '0'; 10403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else if (c >= 'a' && c <= 'z') 10503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] = c - 'a' + 10; 10603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else // (c >= 'A' && c <= 'Z') 10703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] = c - 'A' + 10; 10803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta c = *str++; 11003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (c != ':') 11103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 11203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] <<= 4; 11303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (c >= '0' && c <= '9') 11403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] |= c - '0'; 11503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else if (c >= 'a' && c <= 'z') 11603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] |= c - 'a' + 10; 11703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else // (c >= 'A' && c <= 'Z') 11803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr[i] |= c - 'A' + 10; 11903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 12003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta c = *str++; 12103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 12203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 12303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta c = *str++; 12403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 12503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 12603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 12703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void jstr2bdaddr(JNIEnv* env, bt_bdaddr_t *bda, jstring address) 12803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 12903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta const char* c_bda = env->GetStringUTFChars(address, NULL); 13003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (c_bda != NULL && bda != NULL && strlen(c_bda) == 17) 13103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 13203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr_str_to_addr(c_bda, bda->address); 13303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseStringUTFChars(address, c_bda); 13403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 13503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 13603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 13703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battanamespace android { 13803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 13903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 14003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Client callback methods 14103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 14203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 14303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientRegistered; 14403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onScanResult; 14503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onConnected; 14603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDisconnected; 14703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadCharacteristic; 14803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteCharacteristic; 14903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteCompleted; 15003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchCompleted; 15103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchResult; 15203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescrExtProp; 15303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescriptor; 15403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteDescriptor; 15503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onNotify; 15603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetCharacteristic; 15703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetDescriptor; 15803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetIncludedService; 15903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onRegisterForNotifications; 16003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadRemoteRssi; 16124dce60783d85fbf49f550203a383b2f4a171a52Wei Wangstatic jmethodID method_onAdvertiseCallback; 162662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic jmethodID method_onConfigureMTU; 1631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onScanFilterConfig; 1641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvEnable; 1651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvUpdate; 1661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvSetAdvData; 1671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvDisable; 16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods 17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered; 17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected; 17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded; 17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded; 17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded; 17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded; 17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted; 17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped; 18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted; 18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted; 18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead; 18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite; 18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite; 18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables 18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL; 19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL; 19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL; 19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() { 19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv = getCallbackEnv(); 19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta JNIEnv* env = AndroidRuntime::getJNIEnv(); 19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sCallbackEnv != env || sCallbackEnv == NULL) return false; 19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return true; 20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks 20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid) 20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status, 21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, UUID_PARAMS(app_uuid)); 21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data) 21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb = sCallbackEnv->NewByteArray(62); 22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data); 22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult 22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , address, rssi, jb); 22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda) 23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected, 24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, conn_id, status, address); 24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda) 25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected, 26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, conn_id, status, address); 26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status) 26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted, 27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta conn_id, status); 27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id) 27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 27703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id, 27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta SRVC_ID_PARAMS(srvc_id)); 27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 28203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status, 2837f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id, 28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int char_prop) 28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic 2887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id) 28903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , char_prop); 29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 29303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status, 2947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id, 2957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t *descr_id) 29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor 2997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id) 3007f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS(descr_id)); 30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status, 30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id) 30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 30803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService 30903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id)); 31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 31203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 31303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status, 3147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id) 31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications 3187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)); 31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data) 32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X", 32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2], 32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]); 33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 33103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len); 33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value); 33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify 33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id)) 3377f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb); 33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data) 34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb; 34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( status == 0 ) //successful 35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(p_data->value.len); 35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len, 35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta (jbyte *) p_data->value.value); 35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint8_t value = 0; 35603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(1); 35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value); 35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic 36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 3627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb); 36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 36603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data) 36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic 37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 3727f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id))); 37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status) 37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted 38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status); 38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data) 38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb; 38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( p_data->value.len != 0 ) 39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(p_data->value.len); 39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len, 39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta (jbyte *) p_data->value.value); 39403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(1); 39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor 39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 4007f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id)) 40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , p_data->value_type, jb); 40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 40603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 40703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data) 40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor 41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 4127f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)) 4137f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->descr_id))); 41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status) 41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 42603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi, 42703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta client_if, address, rssi, status); 42803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 42903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 43003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 43103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 43224dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if) 43324dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{ 43424dce60783d85fbf49f550203a383b2f4a171a52Wei Wang CHECK_CALLBACK_ENV 43524dce60783d85fbf49f550203a383b2f4a171a52Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if); 43624dce60783d85fbf49f550203a383b2f4a171a52Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 43724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang} 43824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang 439662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachvoid btgattc_configure_mtu_cb(int conn_id, int status, int mtu) 440662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{ 441662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach CHECK_CALLBACK_ENV 442662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConfigureMTU, 443662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach conn_id, status, mtu); 444662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 445662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach} 446662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach 4471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_scan_filter_cb(int action, int status) 4481a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 4491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang CHECK_CALLBACK_ENV 4501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterConfig, 4511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang action, status); 4521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 4531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 4541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 4551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_enable_cb(int client_if, int status) 4561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 4571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang CHECK_CALLBACK_ENV 4581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status,client_if); 4591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 4601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 4611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 4621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_update_cb(int client_if, int status) 4631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 4641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang CHECK_CALLBACK_ENV 4651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvUpdate, status, client_if); 4661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 4671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 4681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 4691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_setadv_data_cb(int client_if, int status) 4701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 4711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang CHECK_CALLBACK_ENV 4721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetAdvData, status, client_if); 4731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 4741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 4751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 4761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_disable_cb(int client_if, int status) 4771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 4781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang CHECK_CALLBACK_ENV 4791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvDisable, status, client_if); 4801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 4811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 4821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 48303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = { 48403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_register_app_cb, 48503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_scan_result_cb, 48603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_open_cb, 48703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_close_cb, 48803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_search_complete_cb, 48903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_search_result_cb, 49003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_characteristic_cb, 49103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_descriptor_cb, 49203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_included_service_cb, 49303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_register_for_notification_cb, 49403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_notify_cb, 49503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_read_characteristic_cb, 49603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_write_characteristic_cb, 49703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_read_descriptor_cb, 49803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_write_descriptor_cb, 49903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_execute_write_cb, 50024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang btgattc_remote_rssi_cb, 501662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach btgattc_advertise_cb, 502662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach btgattc_configure_mtu_cb, 5031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang btgattc_scan_filter_cb, 5041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang btgattc_multiadv_enable_cb, 5051a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang btgattc_multiadv_update_cb, 5061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang btgattc_multiadv_setadv_data_cb, 5071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang btgattc_multiadv_disable_cb 50803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 50903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 51003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 51103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 51203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks 51303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 51403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 51503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid) 51603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 51703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 51803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered 51903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , status, server_if, UUID_PARAMS(uuid)); 52003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 52103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 52203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 523dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda) 52403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 52503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 52603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 52703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 52803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 52903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 53003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 53103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 53203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 53303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected, 534dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach address, connected, conn_id, server_if); 53503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 53603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 53703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 53803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 53903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if, 54003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t *srvc_id, int srvc_handle) 54103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 54203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 54303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status, 54403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, SRVC_ID_PARAMS(srvc_id), 54503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle); 54603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 54703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 54803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 54903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if, 55003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int srvc_handle, 55103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int incl_srvc_handle) 55203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 55303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 55403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded, 55503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, srvc_handle, incl_srvc_handle); 55603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 55703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 55803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 55903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id, 56003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int srvc_handle, int char_handle) 56103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 56203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 56303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded, 56403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, UUID_PARAMS(char_id), 56503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle, char_handle); 56603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 56703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if, 57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t *descr_id, int srvc_handle, 57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int descr_handle) 57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded, 57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, UUID_PARAMS(descr_id), 57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle, descr_handle); 57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle) 58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status, 58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 58503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 58603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 58703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 58803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle) 58903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 59003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 59103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status, 59203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 59303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 59403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 59503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 59603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle) 59703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 59803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 59903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status, 60003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda, 60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int attr_handle, int offset, bool is_long) 60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead, 61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, attr_handle, 61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta offset, is_long); 61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id, 62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t *bda, int attr_handle, 62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int offset, int length, 62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bool need_rsp, bool is_prep, uint8_t* value) 62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 62703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray val = sCallbackEnv->NewByteArray(length); 63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value); 63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite, 63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, attr_handle, 64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta offset, length, need_rsp, is_prep, val); 64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(val); 64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id, 64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t *bda, int exec_write) 64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite, 65803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, exec_write); 65903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 66203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle) 66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted, 66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, handle); 66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 67003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = { 67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_register_app_cb, 67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_connection_cb, 67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_added_cb, 67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_included_service_added_cb, 67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_characteristic_added_cb, 67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_descriptor_added_cb, 67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_started_cb, 67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_stopped_cb, 68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_deleted_cb, 68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_read_cb, 68203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_write_cb, 68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_exec_write_cb, 68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_response_confirmation_cb 68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks 68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = { 69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sizeof(btgatt_callbacks_t), 69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &sGattClientCallbacks, 69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &sGattServerCallbacks 69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions 69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) { 70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta // Client callbacks 70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V"); 70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V"); 70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onConnected = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V"); 70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V"); 70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V"); 71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V"); 71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted", "(II)V"); 71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted", "(II)V"); 71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V"); 7147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V"); 7157f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V"); 71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V"); 71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V"); 7187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V"); 71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V"); 72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V"); 72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V"); 722662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach method_onConfigureMTU = env->GetMethodID(clazz, "onConfigureMTU", "(III)V"); 7231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V"); 7241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onScanFilterConfig = env->GetMethodID(clazz, "onScanFilterConfig", "(II)V"); 7251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onMultiAdvEnable = env->GetMethodID(clazz, "onClientEnable", "(II)V"); 7261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onMultiAdvUpdate = env->GetMethodID(clazz, "onClientUpdate", "(II)V"); 7271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onMultiAdvSetAdvData = env->GetMethodID(clazz, "onClientData", "(II)V"); 7281a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang method_onMultiAdvDisable = env->GetMethodID(clazz, "onClientDisable", "(II)V"); 72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta // Server callbacks 73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V"); 733dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V"); 73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V"); 73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V"); 73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onCharacteristicAdded = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V"); 73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V"); 73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V"); 73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V"); 74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V"); 74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V"); 74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V"); 74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V"); 74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V"); 74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta info("classInitNative: Success!"); 74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf; 75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) { 75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if(btIf) 75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (btIf = getBluetoothInterface()) == NULL) { 75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Bluetooth module is not loaded"); 75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sGattIf != NULL) { 76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta ALOGW("Cleaning up Bluetooth GATT Interface before initializing..."); 76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->cleanup(); 76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (mCallbacksObj != NULL) { 76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta ALOGW("Cleaning up Bluetooth GATT callback object"); 76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->DeleteGlobalRef(mCallbacksObj); 76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = NULL; 77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (sGattIf = (btgatt_interface_t *) 77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) { 77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Failed to get Bluetooth GATT Interface"); 77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_status_t status; 77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) { 78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Failed to initialize Bluetooth GATT, status: %d", status); 78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = env->NewGlobalRef(object); 78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) { 78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_status_t status; 79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!btIf) return; 79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sGattIf != NULL) { 79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->cleanup(); 79403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (mCallbacksObj != NULL) { 79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->DeleteGlobalRef(mCallbacksObj); 79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = NULL; 80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btIf = NULL; 80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions 80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address) 80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return 0; 81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return sGattIf->client->get_device_type(&bda); 81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object, 81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong app_uuid_lsb, jlong app_uuid_msb ) 81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb); 82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->register_client(&uuid); 82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf) 82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->unregister_client(clientIf); 83003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 832f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadhamstatic void gattClientScanNative(JNIEnv* env, jobject object, jboolean start) 83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 83403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 835f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham sGattIf->client->scan(start); 83603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 83703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif, 83918591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta jstring address, jboolean isDirect, jint transport) 84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 84103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 84518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta sGattIf->client->connect(clientif, &bda, isDirect, transport); 84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 84803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf, 84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address, jint conn_id) 85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->disconnect(clientIf, &bda, conn_id); 85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf, 85803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address) 85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 86203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 86303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 86403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->refresh(clientIf, &bda); 86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id, 86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb) 86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb); 87403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid); 87503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object, 87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, 87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb) 88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8927f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (char_id_uuid_lsb == 0) 89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_characteristic(conn_id, &srvc_id, 0); 89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id); 90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object, 90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, 90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 9107f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb) 91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 91403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9207f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 9257f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 9267f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (descr_id_uuid_lsb == 0) 92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0); 93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id); 93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object, 93703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint incl_service_id_inst_id, jint incl_service_type, 94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb) 94103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 94203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 94303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t incl_srvc_id; 95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id; 95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb); 95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 95403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (incl_service_id_uuid_lsb == 0) 95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_included_service(conn_id, &srvc_id, 0); 95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id); 95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 96203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object, 96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint authReq) 96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9767f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq); 98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object, 98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 98703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 9887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb, 99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint authReq) 99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 99303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 99403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 99503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 99603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 99703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 99803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 10047f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 10057f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 100703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq); 100803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 100903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object, 101103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint write_type, jint auth_req, jbyteArray value) 101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint16_t len = (uint16_t) env->GetArrayLength(value); 102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte *p_value = env->GetByteArrayElements(value, NULL); 103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (p_value == NULL) return; 103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id, 103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta write_type, len, auth_req, (char*)p_value); 103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(value, p_value, 0); 103503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object, 103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jboolean execute) 103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->execute_write(conn_id, execute ? 1 : 0); 104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object, 104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 104603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 10497f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb, 105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint write_type, jint auth_req, jbyteArray value) 105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1055460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach if (value == NULL) { 1056460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach warn("gattClientWriteDescriptorNative() ignoring NULL array"); 1057460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach return; 1058460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach } 1059460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach 106003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 106103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 106203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 106303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 106403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10657f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 106603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 106703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 106803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10697f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 10707f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 10717f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 107203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 107303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint16_t len = (uint16_t) env->GetArrayLength(value); 107403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte *p_value = env->GetByteArrayElements(value, NULL); 107503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (p_value == NULL) return; 107603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 107703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id, 107803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta write_type, len, auth_req, (char*)p_value); 107903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(value, p_value, 0); 108003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 108103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 108203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object, 108303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint clientIf, jstring address, 108403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 108503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 108603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 108703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 108803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jboolean enable) 108903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 109003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 109103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 109203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 109503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10977f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bd_addr; 110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta const char *c_address = env->GetStringUTFChars(address, NULL); 110303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr_str_to_addr(c_address, bd_addr.address); 110403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 110503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (enable) 110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id); 110703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else 110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id); 110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif, 111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address) 111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_remote_rssi(clientif, &bda); 112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1122873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object, 112397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach jint client_if, jboolean start) 112497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{ 112597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach if (!sGattIf) return; 112697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach sGattIf->client->listen(client_if, start); 112797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach} 112897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 112997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbachstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if, jboolean setScanRsp, 1130873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jboolean inclName, jboolean inclTxPower, jint minInterval, jint maxInterval, 1131873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jint appearance, jbyteArray manufacturerData, jbyteArray serviceData, 1132873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyteArray serviceUuid) 113397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{ 113497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach if (!sGattIf) return; 1135873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL); 113697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData); 113797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 1138873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* service_data = env->GetByteArrayElements(serviceData, NULL); 1139873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData); 1140873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang 1141873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL); 1142873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid); 1143873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang 114497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower, 1145873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang minInterval, maxInterval, appearance, arr_len, (char*)arr_data, 1146873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang service_data_len, (char*)service_data, service_uuid_len, 1147873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang (char*)service_uuid); 114897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 114997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT); 1150873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT); 1151873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT); 115297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach} 115397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 115453f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadhamstatic void gattSetScanParametersNative(JNIEnv* env, jobject object, 115553f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham jint scan_interval, jint scan_window) 115653f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham{ 115753f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham if (!sGattIf) return; 115853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham sGattIf->client->set_scan_parameters(scan_interval, scan_window); 115953f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham} 116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 11611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 11621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterEnableNative(JNIEnv* env, jobject object, jboolean enable) 11631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 11641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 11651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->scan_filter_enable(enable ? 1 : 0); 11661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 116780e7d011fdb511a6583258458e97821176866baaWei Wang 11681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jint type, 11691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jint company_id, jint company_mask, jlong uuid_lsb, jlong uuid_msb, 11701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jlong uuid_mask_lsb, jlong uuid_mask_msb, 11711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jstring name, jstring address, jbyte addr_type, jbyteArray data) 11721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 11731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 11741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 11751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang switch(type) 11761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang { 11771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 0: // BTM_BLE_PF_ADDR_FILTER 11781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang bt_bdaddr_t bda; 11791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jstr2bdaddr(env, &bda, address); 118080e7d011fdb511a6583258458e97821176866baaWei Wang sGattIf->client->scan_filter_add(type, 0, 0, 0, 0, 0, &bda, addr_type, 0); 11811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 11821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 11831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 1: // BTM_BLE_PF_SRVC_DATA 118480e7d011fdb511a6583258458e97821176866baaWei Wang sGattIf->client->scan_filter_add(type, 0, 0, 0, 0, 0, 0, 0, 0); 11851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 11861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 11871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 2: // BTM_BLE_PF_SRVC_UUID 11881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 3: // BTM_BLE_PF_SRVC_SOL_UUID 11891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang { 11901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang bt_uuid_t uuid, uuid_mask; 11911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang set_uuid(uuid.uu, uuid_msb, uuid_lsb); 11921a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang set_uuid(uuid_mask.uu, uuid_mask_msb, uuid_mask_lsb); 11931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (uuid_mask_lsb != 0 && uuid_mask_msb != 0) 119480e7d011fdb511a6583258458e97821176866baaWei Wang sGattIf->client->scan_filter_add(type, 0, 0, 0, &uuid, &uuid_mask, 0, 0, 0); 11951a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang else 119680e7d011fdb511a6583258458e97821176866baaWei Wang sGattIf->client->scan_filter_add(type, 0, 0, 0, &uuid, 0, 0, 0, 0); 11971a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 11981a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang } 11991a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12001a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 4: // BTM_BLE_PF_LOCAL_NAME 12011a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang { 12021a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang const char* c_name = env->GetStringUTFChars(name, NULL); 12031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (c_name != NULL && strlen(c_name) != 0) 12041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang { 120580e7d011fdb511a6583258458e97821176866baaWei Wang sGattIf->client->scan_filter_add(type, 0, 0, strlen(c_name), 0, 0, 0, 0, c_name); 12061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang env->ReleaseStringUTFChars(name, c_name); 12071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang } 12081a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 12091a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang } 12101a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12111a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang case 5: // BTM_BLE_PF_MANU_DATA 12121a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang { 12131a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jbyte* data_array = env->GetByteArrayElements(data, 0); 12141a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang int data_len = env->GetArrayLength(data) / 2; // Array contains mask 12151a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12161a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->scan_filter_add(type, company_id,company_mask, data_len, 121780e7d011fdb511a6583258458e97821176866baaWei Wang 0, 0, 0, 0, (char*)data_array); 12181a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang env->ReleaseByteArrayElements(data, data_array, JNI_ABORT); 12191a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 12201a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang } 12211a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12221a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang default: 12231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang break; 12241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang } 12251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterClearNative(JNIEnv* env, jobject object) 12281a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 12291a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 12301a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->scan_filter_clear(); 12311a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12321a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 1233662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic void gattClientConfigureMTUNative(JNIEnv *env, jobject object, 1234662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach jint conn_id, jint mtu) 1235662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{ 1236662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach if (!sGattIf) return; 1237662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach sGattIf->client->configure_mtu(conn_id, mtu); 1238662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach} 1239662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach 12401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientEnableAdvNative(JNIEnv* env, jobject object, jint client_if, 12411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power) 12421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 12431a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 12441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12451a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->multi_adv_enable(client_if, min_interval, max_interval, adv_type, chnl_map, 12461a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang tx_power); 12471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12481a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientUpdateAdvNative(JNIEnv* env, jobject object, jint client_if, 12501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power) 12511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 12521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 12531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->multi_adv_update(client_if, min_interval, max_interval, adv_type, chnl_map, 12551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang tx_power); 12561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientSetAdvDataNative(JNIEnv* env, jobject object , jint client_if, 12591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jboolean set_scan_rsp, jboolean incl_name, jboolean incl_txpower, jint appearance, 12601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jbyteArray manufacturer_data,jbyteArray service_data, jbyteArray service_uuid) 12611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 12621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 12631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jbyte* manu_data = env->GetByteArrayElements(manufacturer_data, NULL); 12641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang uint16_t manu_len = (uint16_t) env->GetArrayLength(manufacturer_data); 12651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jbyte* serv_data = env->GetByteArrayElements(service_data, NULL); 12671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang uint16_t serv_data_len = (uint16_t) env->GetArrayLength(service_data); 12681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jbyte* serv_uuid = env->GetByteArrayElements(service_uuid, NULL); 12701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang uint16_t serv_uuid_len = (uint16_t) env->GetArrayLength(service_uuid); 12711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->multi_adv_set_inst_data(client_if, set_scan_rsp, incl_name,incl_txpower, 12731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang appearance, manu_len, (char*)manu_data, 12741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang serv_data_len, (char*)serv_data, serv_uuid_len, 12751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang (char*)serv_uuid); 12761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang env->ReleaseByteArrayElements(manufacturer_data, manu_data, JNI_ABORT); 12781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang env->ReleaseByteArrayElements(service_data, serv_data, JNI_ABORT); 12791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang env->ReleaseByteArrayElements(service_uuid, serv_uuid, JNI_ABORT); 12801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 12821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientDisableAdvNative(JNIEnv* env, jobject object, jint client_if) 12831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{ 12841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang if (!sGattIf) return; 12851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sGattIf->client->multi_adv_disable(client_if); 12861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang} 12871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions 129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object, 129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong app_uuid_lsb, jlong app_uuid_msb ) 129303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 129403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 129503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 129603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb); 129703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->register_server(&uuid); 129803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 129903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 130003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf) 130103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 130203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 130303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->unregister_server(serverIf); 130403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 130503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 130603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object, 130718591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta jint server_if, jstring address, jboolean is_direct, jint transport) 130803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 130903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 131003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 131103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bd_addr; 131203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta const char *c_address = env->GetStringUTFChars(address, NULL); 131303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr_str_to_addr(c_address, bd_addr.address); 131403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 131518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta sGattIf->server->connect(server_if, &bd_addr, is_direct, transport); 131603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 131703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 131803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf, 131903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address, jint conn_id) 132003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 132103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 132203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 132303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 132403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->disconnect(serverIf, &bda, conn_id); 132503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 132603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 132703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object, 132803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint service_type, jint service_id_inst_id, 132903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 133003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint num_handles) 133103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 133303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 133403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 133503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 133603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 133703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 133803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 133903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_service(server_if, &srvc_id, num_handles); 134003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 134103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 134203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object, 134303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, jint included_svc_handle) 134403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 134503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 134603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_included_service(server_if, svc_handle, 134703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta included_svc_handle); 134803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 134903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 135003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object, 135103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, 135203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_uuid_lsb, jlong char_uuid_msb, 135303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint properties, jint permissions) 135403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 135503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 135603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 135703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 135803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb); 135903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 136003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_characteristic(server_if, svc_handle, 136103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &uuid, properties, permissions); 136203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 136303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 136403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object, 136503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, 136603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong desc_uuid_lsb, jlong desc_uuid_msb, 136703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint permissions) 136803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 136903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 137003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 137103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 137203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb); 137303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 137403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions); 137503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 137603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 137703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object, 137803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, jint transport ) 137903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 138003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 138103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->start_service(server_if, svc_handle, transport); 138203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 138303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 138403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object, 138503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle) 138603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 138703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 138803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->stop_service(server_if, svc_handle); 138903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 139003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 139103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object, 139203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle) 139303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 139403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 139503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->delete_service(server_if, svc_handle); 139603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 139703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 139803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object, 139903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint attr_handle, jint conn_id, jbyteArray val) 140003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 140103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 140203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 140303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 140403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int val_len = env->GetArrayLength(val); 140503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 140603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len, 140703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta /*confirm*/ 1, (char*)array); 140803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 140903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 141003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 141103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object, 141203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint attr_handle, jint conn_id, jbyteArray val) 141303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 141403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 141503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 141603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 141703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int val_len = env->GetArrayLength(val); 141803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 141903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len, 142003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta /*confirm*/ 0, (char*)array); 142103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 142203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 142303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 142403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object, 142503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint conn_id, jint trans_id, jint status, 142603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint handle, jint offset, jbyteArray val, jint auth_req) 142703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 142803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 142903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 143003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_response_t response; 143103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 143203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.handle = handle; 143303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.auth_req = auth_req; 143403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.offset = offset; 143503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.len = 0; 143603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 143703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (val != NULL) 143803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 143903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.len = (uint16_t) env->GetArrayLength(val); 144003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 144103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 144203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (int i = 0; i != response.attr_value.len; ++i) 144303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.value[i] = (uint8_t) array[i]; 144403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 144503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 144603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 144703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_response(conn_id, trans_id, status, &response); 144803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 144903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 145003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command, 145103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong uuid1_lsb, jlong uuid1_msb, jstring bda1, 145203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint p1, jint p2, jint p3, jint p4, jint p5 ) 145303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 145403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 145503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 145603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bt_bda1; 145703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bt_bda1, bda1); 145803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 145903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid1; 146003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb); 146103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 146203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_test_params_t params; 146303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.bda1 = &bt_bda1; 146403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.uuid1 = &uuid1; 146503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u1 = p1; 146603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u2 = p2; 146703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u3 = p3; 146803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u4 = p4; 146903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u5 = p5; 147003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->test_command(command, ¶ms); 147103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 147203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 147303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 147403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos 147503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 147603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 14771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattStateMachine class. 14781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic JNINativeMethod sStateMachineMethods[] = { 14791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientScanNative", "(Z)V", (void *) gattClientScanNative}, 14801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientScanFilterEnableNative", "(Z)V", (void *) gattClientScanFilterEnableNative}, 14811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientScanFilterAddNative", "(IIIJJJJLjava/lang/String;Ljava/lang/String;B[B)V", (void *) gattClientScanFilterAddNative}, 14821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientScanFilterClearNative", "()V", (void *) gattClientScanFilterClearNative}, 14831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientEnableAdvNative", "(IIIIII)V", (void *) gattClientEnableAdvNative}, 14841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientUpdateAdvNative", "(IIIIII)V", (void *) gattClientUpdateAdvNative}, 14851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientSetAdvDataNative", "(IZZZI[B[B[B)V", (void *) gattClientSetAdvDataNative}, 14861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang {"gattClientDisableAdvNative", "(I)V", (void *) gattClientDisableAdvNative}, 14871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}; 14881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang 14891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattService class. 149003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = { 149103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"classInitNative", "()V", (void *) classInitNative}, 149203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"initializeNative", "()V", (void *) initializeNative}, 149303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"cleanupNative", "()V", (void *) cleanupNative}, 149403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 149503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative}, 149603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative}, 149703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative}, 149818591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta {"gattClientConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattClientConnectNative}, 149903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative}, 150003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative}, 150103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative}, 150203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative}, 15037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative}, 150403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative}, 150503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative}, 15067f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative}, 150703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative}, 15087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative}, 150903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative}, 151003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative}, 151103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative}, 1512873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative}, 1513662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach {"gattClientConfigureMTUNative", "(II)V", (void *) gattClientConfigureMTUNative}, 151403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 151503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative}, 151603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative}, 151718591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta {"gattServerConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattServerConnectNative}, 151803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative}, 151903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative}, 152003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative}, 152103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative}, 152203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative}, 152303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative}, 152403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative}, 152503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative}, 152603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative}, 152703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative}, 152803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative}, 152903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1530873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative}, 153153f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative}, 153253f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative}, 153303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 153403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 153503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env) 153603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 15371a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang int register_success = 15381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattServiceStateMachine", 15391a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sStateMachineMethods, NELEM(sStateMachineMethods)); 15401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang return register_success & 15411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService", 15421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang sMethods, NELEM(sMethods)); 154303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 154403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 154503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 1546