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; 16203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 16303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 16403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods 16503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 16603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered; 16703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected; 16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded; 16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded; 17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded; 17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded; 17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted; 17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped; 17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted; 17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted; 17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead; 17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite; 17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite; 17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables 18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL; 18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL; 18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL; 18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() { 18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv = getCallbackEnv(); 19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta JNIEnv* env = AndroidRuntime::getJNIEnv(); 19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sCallbackEnv != env || sCallbackEnv == NULL) return false; 19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return true; 19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks 19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid) 20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status, 20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, UUID_PARAMS(app_uuid)); 20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data) 20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb = sCallbackEnv->NewByteArray(62); 21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data); 22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult 22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , address, rssi, jb); 22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda) 23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected, 24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, conn_id, status, address); 24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda) 24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected, 25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta clientIf, conn_id, status, address); 25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status) 26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted, 26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta conn_id, status); 26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id) 26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id, 27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta SRVC_ID_PARAMS(srvc_id)); 27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status, 2777f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id, 27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int char_prop) 27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic 2827f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id) 28303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , char_prop); 28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status, 2887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id, 2897f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t *descr_id) 29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor 2937f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id) 2947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS(descr_id)); 29503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status, 29903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id) 30003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService 30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id)); 30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status, 3087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id) 30903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications 3127f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)); 31303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 31403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data) 31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 31803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X", 32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2], 32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]); 32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len); 32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value); 32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify 33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id)) 3317f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb); 33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 33703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data) 33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb; 34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( status == 0 ) //successful 34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(p_data->value.len); 34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len, 34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta (jbyte *) p_data->value.value); 34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint8_t value = 0; 35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(1); 35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value); 35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic 35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 3567f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb); 35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data) 36203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic 36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 3667f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id))); 36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status) 37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 37203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted 37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status); 37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data) 37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray jb; 38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( p_data->value.len != 0 ) 38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(p_data->value.len); 38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len, 38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta (jbyte *) p_data->value.value); 38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jb = sCallbackEnv->NewByteArray(1); 39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor 39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 3947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id)) 39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , p_data->value_type, jb); 39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(jb); 39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 40003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data) 40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor 40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id)) 4067f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->char_id)) 4077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach , GATT_ID_PARAMS((&p_data->descr_id))); 40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status) 41203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 41303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X", 41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi, 42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta client_if, address, rssi, status); 42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 42624dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if) 42724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{ 42824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang CHECK_CALLBACK_ENV 42924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if); 43024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 43124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang} 43224dce60783d85fbf49f550203a383b2f4a171a52Wei Wang 43303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = { 43403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_register_app_cb, 43503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_scan_result_cb, 43603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_open_cb, 43703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_close_cb, 43803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_search_complete_cb, 43903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_search_result_cb, 44003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_characteristic_cb, 44103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_descriptor_cb, 44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_get_included_service_cb, 44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_register_for_notification_cb, 44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_notify_cb, 44503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_read_characteristic_cb, 44603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_write_characteristic_cb, 44703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_read_descriptor_cb, 44803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_write_descriptor_cb, 44903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgattc_execute_write_cb, 45024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang btgattc_remote_rssi_cb, 45124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang btgattc_advertise_cb 45203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 45303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 45403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 45503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 45603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks 45703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 45803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 45903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid) 46003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 46103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 46203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered 46303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta , status, server_if, UUID_PARAMS(uuid)); 46403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 46503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 46603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 467dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda) 46803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 46903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 47003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 47103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 47203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 47303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 47403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 47503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 47603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 47703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected, 478dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach address, connected, conn_id, server_if); 47903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 48003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 48103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 48203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 48303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if, 48403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t *srvc_id, int srvc_handle) 48503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 48603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 48703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status, 48803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, SRVC_ID_PARAMS(srvc_id), 48903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle); 49003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 49103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 49203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 49303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if, 49403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int srvc_handle, 49503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int incl_srvc_handle) 49603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 49703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 49803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded, 49903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, srvc_handle, incl_srvc_handle); 50003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 50103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 50203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 50303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id, 50403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int srvc_handle, int char_handle) 50503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 50603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 50703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded, 50803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, UUID_PARAMS(char_id), 50903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle, char_handle); 51003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 51103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 51203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 51303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if, 51403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t *descr_id, int srvc_handle, 51503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int descr_handle) 51603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 51703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 51803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded, 51903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, server_if, UUID_PARAMS(descr_id), 52003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_handle, descr_handle); 52103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 52203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 52303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 52403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle) 52503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 52603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 52703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status, 52803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 52903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 53003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 53103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 53203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle) 53303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 53403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 53503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status, 53603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 53703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 53803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 53903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 54003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle) 54103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 54203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 54303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status, 54403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta server_if, srvc_handle); 54503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 54603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 54703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 54803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda, 54903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int attr_handle, int offset, bool is_long) 55003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 55103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 55203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 55303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 55403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 55503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 55603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 55703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 55803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 55903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead, 56003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, attr_handle, 56103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta offset, is_long); 56203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 56303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 56403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 56503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 56603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id, 56703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t *bda, int attr_handle, 56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int offset, int length, 56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bool need_rsp, bool is_prep, uint8_t* value) 57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyteArray val = sCallbackEnv->NewByteArray(length); 58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value); 58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite, 58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, attr_handle, 58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta offset, length, need_rsp, is_prep, val); 58503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 58603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(val); 58703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 58803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 58903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 59003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id, 59103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t *bda, int exec_write) 59203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 59303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 59403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 59503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char c_address[32]; 59603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X", 59703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[0], bda->address[1], bda->address[2], 59803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bda->address[3], bda->address[4], bda->address[5]); 59903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 60003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address = sCallbackEnv->NewStringUTF(c_address); 60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite, 60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta address, conn_id, trans_id, exec_write); 60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->DeleteLocalRef(address); 60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle) 60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta CHECK_CALLBACK_ENV 61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted, 61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta status, handle); 61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__); 61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = { 61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_register_app_cb, 61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_connection_cb, 61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_added_cb, 61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_included_service_added_cb, 62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_characteristic_added_cb, 62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_descriptor_added_cb, 62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_started_cb, 62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_stopped_cb, 62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_service_deleted_cb, 62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_read_cb, 62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_write_cb, 62703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_request_exec_write_cb, 62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatts_response_confirmation_cb 62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks 63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = { 63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sizeof(btgatt_callbacks_t), 63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &sGattClientCallbacks, 63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &sGattServerCallbacks 63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions 64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) { 64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta // Client callbacks 64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V"); 65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V"); 65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onConnected = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V"); 65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V"); 65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V"); 65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V"); 65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted", "(II)V"); 65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted", "(II)V"); 65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V"); 6587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V"); 6597f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V"); 66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V"); 66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V"); 6627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V"); 66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V"); 66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V"); 66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V"); 66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta // Server callbacks 66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V"); 670dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V"); 67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V"); 67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V"); 67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onCharacteristicAdded = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V"); 67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V"); 67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V"); 67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V"); 67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V"); 67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V"); 67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V"); 68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V"); 68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V"); 68224dce60783d85fbf49f550203a383b2f4a171a52Wei Wang method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V"); 68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta info("classInitNative: Success!"); 68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf; 68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) { 69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if(btIf) 69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (btIf = getBluetoothInterface()) == NULL) { 69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Bluetooth module is not loaded"); 69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sGattIf != NULL) { 69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta ALOGW("Cleaning up Bluetooth GATT Interface before initializing..."); 70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->cleanup(); 70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (mCallbacksObj != NULL) { 70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta ALOGW("Cleaning up Bluetooth GATT callback object"); 70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->DeleteGlobalRef(mCallbacksObj); 70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = NULL; 70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (sGattIf = (btgatt_interface_t *) 71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) { 71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Failed to get Bluetooth GATT Interface"); 71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 71403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 71503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_status_t status; 71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) { 71803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta error("Failed to initialize Bluetooth GATT, status: %d", status); 71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return; 72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 72203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 72303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = env->NewGlobalRef(object); 72403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 72503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 72603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) { 72703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_status_t status; 72803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!btIf) return; 72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (sGattIf != NULL) { 73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->cleanup(); 73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf = NULL; 73303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (mCallbacksObj != NULL) { 73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->DeleteGlobalRef(mCallbacksObj); 73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta mCallbacksObj = NULL; 73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btIf = NULL; 74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions 74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address) 74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return 0; 74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return sGattIf->client->get_device_type(&bda); 75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object, 75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong app_uuid_lsb, jlong app_uuid_msb ) 75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb); 76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->register_client(&uuid); 76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf) 76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->unregister_client(clientIf); 76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientScanNative(JNIEnv* env, jobject object, jint clientIf, jboolean start) 77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->scan(clientIf, start); 77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif, 77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address, jboolean isDirect) 77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->connect(clientif, &bda, isDirect); 78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf, 78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address, jint conn_id) 78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->disconnect(clientIf, &bda, conn_id); 79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 79403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf, 79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address) 79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->refresh(clientIf, &bda); 80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id, 80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb) 80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb); 81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid); 81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object, 81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, 81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb) 82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8307f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 83203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 83403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (char_id_uuid_lsb == 0) 83503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 83603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_characteristic(conn_id, &srvc_id, 0); 83703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id); 83903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 84103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object, 84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, 84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 84503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 8487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb) 85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 8627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 8637f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 8647f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (descr_id_uuid_lsb == 0) 86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0); 86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id); 87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 87403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object, 87503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint incl_service_id_inst_id, jint incl_service_type, 87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb) 87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t incl_srvc_id; 88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id; 88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb); 89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 89203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (incl_service_id_uuid_lsb == 0) 89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_included_service(conn_id, &srvc_id, 0); 89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } else { 89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id); 89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object, 90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint authReq) 90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 91003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq); 91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 92003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object, 92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 92403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 92503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 9267f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb, 92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint authReq) 92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9377f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9417f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 9427f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 9437f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq); 94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object, 94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint write_type, jint auth_req, jbyteArray value) 95403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 9627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint16_t len = (uint16_t) env->GetArrayLength(value); 96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte *p_value = env->GetByteArrayElements(value, NULL); 96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (p_value == NULL) return; 96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id, 97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta write_type, len, auth_req, (char*)p_value); 97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(value, p_value, 0); 97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object, 97603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jboolean execute) 97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->execute_write(conn_id, execute ? 1 : 0); 98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object, 98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint conn_id, jint service_type, jint service_id_inst_id, 98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 9877f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach jint descr_id_inst_id, 98803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb, 98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint write_type, jint auth_req, jbyteArray value) 99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 993460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach if (value == NULL) { 994460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach warn("gattClientWriteDescriptorNative() ignoring NULL array"); 995460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach return; 996460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach } 997460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach 99803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 99903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 100403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 100503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t descr_id; 10087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach descr_id.inst_id = (uint8_t) descr_id_inst_id; 10097f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb); 101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 101103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta uint16_t len = (uint16_t) env->GetArrayLength(value); 101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte *p_value = env->GetByteArrayElements(value, NULL); 101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (p_value == NULL) return; 101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id, 101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta write_type, len, auth_req, (char*)p_value); 101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(value, p_value, 0); 101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object, 102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint clientIf, jstring address, 102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint service_type, jint service_id_inst_id, 102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 102403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint char_id_inst_id, 102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_id_uuid_lsb, jlong char_id_uuid_msb, 102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jboolean enable) 102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 10357f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach btgatt_gatt_id_t char_id; 103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta char_id.inst_id = (uint8_t) char_id_inst_id; 103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb); 103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bd_addr; 104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta const char *c_address = env->GetStringUTFChars(address, NULL); 104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr_str_to_addr(c_address, bd_addr.address); 104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (enable) 104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id); 104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta else 104603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id); 104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 104903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif, 105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address) 105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 105503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 105603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 105703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->read_remote_rssi(clientif, &bda); 105803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 105903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1060873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object, 106197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach jint client_if, jboolean start) 106297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{ 106397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach if (!sGattIf) return; 106497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach sGattIf->client->listen(client_if, start); 106597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach} 106697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 106797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbachstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if, jboolean setScanRsp, 1068873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jboolean inclName, jboolean inclTxPower, jint minInterval, jint maxInterval, 1069873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jint appearance, jbyteArray manufacturerData, jbyteArray serviceData, 1070873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyteArray serviceUuid) 107197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{ 107297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach if (!sGattIf) return; 1073873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL); 107497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData); 107597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 1076873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* service_data = env->GetByteArrayElements(serviceData, NULL); 1077873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData); 1078873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang 1079873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL); 1080873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid); 1081873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang 108297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower, 1083873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang minInterval, maxInterval, appearance, arr_len, (char*)arr_data, 1084873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang service_data_len, (char*)service_data, service_uuid_len, 1085873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang (char*)service_uuid); 108697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 108797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT); 1088873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT); 1089873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT); 109097d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach} 109197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach 109203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions 109503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object, 109703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong app_uuid_lsb, jlong app_uuid_msb ) 109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb); 110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->register_server(&uuid); 110303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 110403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 110503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf) 110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 110703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->unregister_server(serverIf); 110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object, 111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jstring address, jboolean is_direct) 111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bd_addr; 111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta const char *c_address = env->GetStringUTFChars(address, NULL); 111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bd_addr_str_to_addr(c_address, bd_addr.address); 111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->connect(server_if, &bd_addr, is_direct); 112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 112203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 112303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf, 112403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstring address, jint conn_id) 112503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 112603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 112703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bda; 112803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bda, address); 112903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->disconnect(serverIf, &bda, conn_id); 113003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 113103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 113203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object, 113303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint service_type, jint service_id_inst_id, 113403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong service_id_uuid_lsb, jlong service_id_uuid_msb, 113503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint num_handles) 113603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 113703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 113803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 113903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_srvc_id_t srvc_id; 114003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.id.inst_id = (uint8_t) service_id_inst_id; 114103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0); 114203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb); 114303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 114403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_service(server_if, &srvc_id, num_handles); 114503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 114603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 114703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object, 114803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, jint included_svc_handle) 114903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 115003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 115103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_included_service(server_if, svc_handle, 115203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta included_svc_handle); 115303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 115403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 115503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object, 115603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, 115703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong char_uuid_lsb, jlong char_uuid_msb, 115803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint properties, jint permissions) 115903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 116103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 116203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 116303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb); 116403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 116503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_characteristic(server_if, svc_handle, 116603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta &uuid, properties, permissions); 116703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 116803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 116903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object, 117003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, 117103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong desc_uuid_lsb, jlong desc_uuid_msb, 117203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint permissions) 117303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 117403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 117503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 117603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid; 117703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb); 117803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 117903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions); 118003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 118103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 118203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object, 118303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle, jint transport ) 118403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 118503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 118603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->start_service(server_if, svc_handle, transport); 118703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 118803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 118903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object, 119003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle) 119103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 119203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 119303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->stop_service(server_if, svc_handle); 119403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 119503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 119603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object, 119703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint svc_handle) 119803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 119903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 120003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->delete_service(server_if, svc_handle); 120103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 120203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 120303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object, 120403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint attr_handle, jint conn_id, jbyteArray val) 120503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 120603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 120703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 120803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 120903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int val_len = env->GetArrayLength(val); 121003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 121103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len, 121203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta /*confirm*/ 1, (char*)array); 121303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 121403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 121503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 121603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object, 121703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint attr_handle, jint conn_id, jbyteArray val) 121803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 121903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 122003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 122103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 122203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta int val_len = env->GetArrayLength(val); 122303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 122403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len, 122503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta /*confirm*/ 0, (char*)array); 122603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 122703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 122803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 122903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object, 123003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint server_if, jint conn_id, jint trans_id, jint status, 123103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint handle, jint offset, jbyteArray val, jint auth_req) 123203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 123303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 123403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 123503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_response_t response; 123603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 123703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.handle = handle; 123803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.auth_req = auth_req; 123903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.offset = offset; 124003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.len = 0; 124103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 124203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (val != NULL) 124303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta { 124403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.len = (uint16_t) env->GetArrayLength(val); 124503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jbyte* array = env->GetByteArrayElements(val, 0); 124603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 124703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta for (int i = 0; i != response.attr_value.len; ++i) 124803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta response.attr_value.value[i] = (uint8_t) array[i]; 124903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta env->ReleaseByteArrayElements(val, array, JNI_ABORT); 125003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta } 125103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 125203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->server->send_response(conn_id, trans_id, status, &response); 125303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 125403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 125503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command, 125603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jlong uuid1_lsb, jlong uuid1_msb, jstring bda1, 125703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jint p1, jint p2, jint p3, jint p4, jint p5 ) 125803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 125903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta if (!sGattIf) return; 126003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 126103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_bdaddr_t bt_bda1; 126203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta jstr2bdaddr(env, &bt_bda1, bda1); 126303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 126403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta bt_uuid_t uuid1; 126503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb); 126603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 126703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta btgatt_test_params_t params; 126803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.bda1 = &bt_bda1; 126903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.uuid1 = &uuid1; 127003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u1 = p1; 127103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u2 = p2; 127203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u3 = p3; 127303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u4 = p4; 127403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta params.u5 = p5; 127503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sGattIf->client->test_command(command, ¶ms); 127603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 127703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 127803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/** 127903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos 128003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */ 128103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 128203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = { 128303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"classInitNative", "()V", (void *) classInitNative}, 128403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"initializeNative", "()V", (void *) initializeNative}, 128503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"cleanupNative", "()V", (void *) cleanupNative}, 128603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 128703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative}, 128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative}, 128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative}, 129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientScanNative", "(IZ)V", (void *) gattClientScanNative}, 129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientConnectNative", "(ILjava/lang/String;Z)V", (void *) gattClientConnectNative}, 129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative}, 129303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative}, 129403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative}, 129503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative}, 12967f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative}, 129703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative}, 129803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative}, 12997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative}, 130003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative}, 13017f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative}, 130203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative}, 130303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative}, 130403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative}, 1305873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative}, 130603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 130703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative}, 130803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative}, 130903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerConnectNative", "(ILjava/lang/String;Z)V", (void *) gattServerConnectNative}, 131003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative}, 131103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative}, 131203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative}, 131303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative}, 131403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative}, 131503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative}, 131603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative}, 131703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative}, 131803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative}, 131903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative}, 132003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative}, 132103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 1322873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative}, 132303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative}, 132403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}; 132503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 132603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env) 132703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{ 132803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta return jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService", 132903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta sMethods, NELEM(sMethods)); 133003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 133103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 1333