static CABLEDataReceivedCallback g_CABLEClientDataReceivedCallback = NULL;
+static jboolean g_autoConnectFlag = JNI_FALSE;
+
//getting jvm
void CALEClientJniInit()
{
g_threadCond = NULL;
g_threadWriteCharacteristicCond = NULL;
g_isSignalSetFlag = false;
+ CALEClientSetAutoConnectFlag(JNI_FALSE);
if (isAttached)
{
{
if (ca_cond_wait_for(g_deviceDescCond,
g_threadSendMutex,
- TIMEOUT) == 0)
+ TIMEOUT) == CA_WAIT_SUCCESS)
{
devicesDiscovered = true;
break;
}
}
+ // time out for scanning devices
if (!devicesDiscovered)
{
return CA_STATUS_FAILED;
// wait for finish to send data through "CALeGattServicesDiscoveredCallback"
// if there is no connection state.
+ ca_mutex_lock(g_threadMutex);
if (!g_isFinishedSendData)
{
- ca_mutex_lock(g_threadMutex);
+ OIC_LOG(DEBUG, TAG, "waiting send finish signal");
ca_cond_wait(g_threadCond, g_threadMutex);
OIC_LOG(DEBUG, TAG, "the data was sent");
- ca_mutex_unlock(g_threadMutex);
}
+ ca_mutex_unlock(g_threadMutex);
if (isAttached)
{
}
ca_mutex_unlock(g_threadSendMutex);
- OIC_LOG(INFO, TAG, "unicast - send success");
- return CA_STATUS_OK;
+ OIC_LOG(INFO, TAG, "unicast - send logic has finished");
+ return CALECheckSendState(address);
// error label.
error_exit:
OIC_LOG(DEBUG, TAG, "connection routine is finished for multicast");
// wait for finish to send data through "CALeGattServicesDiscoveredCallback"
+ ca_mutex_lock(g_threadMutex);
if (!g_isFinishedSendData)
{
- ca_mutex_lock(g_threadMutex);
+ OIC_LOG(DEBUG, TAG, "waiting send finish signal");
ca_cond_wait(g_threadCond, g_threadMutex);
- OIC_LOG(DEBUG, TAG, "the data was sent for All devices");
- ca_mutex_unlock(g_threadMutex);
+ OIC_LOG(DEBUG, TAG, "the data was sent");
}
+ ca_mutex_unlock(g_threadMutex);
// start LE Scan again
res = CALEClientStartScan();
ca_mutex_unlock(g_deviceStateListMutex);
return CA_SEND_FAILED;
}
+
+ OIC_LOG(INFO, TAG, "sendstate is STATE_SEND_SUCCESS");
ca_mutex_unlock(g_deviceStateListMutex);
return CA_STATUS_OK;
}
}
// connection request
- jobject newGatt = CALEClientConnect(env, device, JNI_TRUE);
+ jobject newGatt = CALEClientConnect(env, device, CALEClientGetAutoConnectFlag());
if (NULL == newGatt)
{
OIC_LOG(ERROR, TAG, "CALEClientConnect has failed");
}
else
{
+ OIC_LOG(INFO, TAG, "STATE_DISCONNECTED - start to connect LE");
+
+ // cancel previous connection request before connection
+ // if there is gatt object in g_gattObjectList.
+ if (jni_address)
+ {
+ address = (char*)(*env)->GetStringUTFChars(env, jni_address, NULL);
+ if (!address)
+ {
+ OIC_LOG(ERROR, TAG, "address is not available");
+ return CA_STATUS_FAILED;
+ }
+
+ jobject gatt = CALEClientGetGattObjInList(env, address);
+ if (gatt)
+ {
+ CAResult_t res = CALEClientDisconnect(env, gatt);
+ if (CA_STATUS_OK != res)
+ {
+ OIC_LOG(INFO, TAG, "there is no gatt object");
+ }
+ }
+ (*env)->ReleaseStringUTFChars(env, jni_address, address);
+ }
+
OIC_LOG(DEBUG, TAG, "start to connect LE");
jobject gatt = CALEClientConnect(env, device, JNI_TRUE);
if (NULL == gatt)
return CA_STATUS_OK;
}
+void CALEClientSetAutoConnectFlag(jboolean flag)
+{
+ OIC_LOG_V(INFO, TAG, "auto connect flag is set %d", flag);
+ g_autoConnectFlag = flag;
+}
+
+jboolean CALEClientGetAutoConnectFlag()
+{
+ OIC_LOG_V(INFO, TAG, "auto connect flag is %d", g_autoConnectFlag);
+ return g_autoConnectFlag;
+}
+
jobject CALEClientConnect(JNIEnv *env, jobject bluetoothDevice, jboolean autoconnect)
{
OIC_LOG(DEBUG, TAG, "CALEClientConnect");
{
OIC_LOG(ERROR, TAG, "jarrayObj is null");
(*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress);
- return CA_STATUS_FAILED;
+ return NULL;
}
OIC_LOG(DEBUG, TAG, "CALL API - bluetoothGatt.getDevice()");
*/
void CALEClientUpdateSendCnt(JNIEnv *env)
{
+ OIC_LOG(DEBUG, TAG, "CALEClientUpdateSendCnt");
+
VERIFY_NON_NULL_VOID(env, TAG, "env is null");
// mutex lock
ca_mutex_lock(g_threadMutex);
const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
if (address)
{
- res = CALEClientRemoveDeviceState(address);
+ CAResult_t res = CALEClientUpdateDeviceState(address, STATE_DISCONNECTED,
+ STATE_CHARACTER_UNSET,
+ STATE_SEND_NONE);
if (CA_STATUS_OK != res)
{
- OIC_LOG(ERROR, TAG, "CALEClientRemoveDeviceState has failed");
+ OIC_LOG(ERROR, TAG, "CALEClientUpdateDeviceState has failed");
+ (*env)->ReleaseStringUTFChars(env, jni_address, address);
goto error_exit;
}
+ OIC_LOG_V(INFO, TAG, "ConnectionStateCB - remote address : %s", address);
(*env)->ReleaseStringUTFChars(env, jni_address, address);
}
VERIFY_NON_NULL_VOID(obj, TAG, "obj is null");
VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null");
- CAResult_t res = CALEClientWriteCharacteristic(env, gatt);
- if (CA_STATUS_OK != res)
+ jint gatt_success = CALEGetConstantsValue(env, CLASSPATH_BT_GATT, "GATT_SUCCESS");
+ if (gatt_success != status) // error
{
- OIC_LOG(ERROR, TAG, "CALEClientWriteCharacteristic has failed");
goto error_exit;
}
+
+ if (g_sendBuffer)
+ {
+ CAResult_t res = CALEClientWriteCharacteristic(env, gatt);
+ if (CA_STATUS_OK != res)
+ {
+ OIC_LOG(ERROR, TAG, "CALEClientWriteCharacteristic has failed");
+ goto error_exit;
+ }
+ }
return;
// error label.