CAResult_t CAManagerProcessRecovery(JNIEnv *env, uint16_t adapter_state) { VERIFY_NON_NULL(env, TAG, "env"); OIC_LOG(DEBUG, TAG, "IN - CAManagerProcessRecovery"); ca_mutex_lock(g_recoveryMutex); CAResult_t res = CA_STATUS_OK; switch(adapter_state) { case STATE_OFF: // adapter will be enabled automatically after WAITING_TIME. if (ca_cond_wait_for(g_recoveryCond, g_recoveryMutex, WAITING_TIME) == 0) { OIC_LOG(INFO, TAG, "BT recovery was canceled"); } else { // enabled if (!CAManagerControlAdapter(env, true)) { OIC_LOG(ERROR, TAG, "BT recovery(enable) failure"); res = CA_STATUS_FAILED; } } CAManagerSetBTRecovery(false); break; case START_RECOVERY: if (!CAManagerControlAdapter(env, false)) { OIC_LOG(ERROR, TAG, "BT recovery(disable) failure"); res = CA_STATUS_FAILED; } CAManagerSetBTRecovery(true); break; default: break; } ca_mutex_unlock(g_recoveryMutex); OIC_LOG(DEBUG, TAG, "OUT - CAManagerProcessRecovery"); return res; }
JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caManagerAdapterStateChangedCallback( JNIEnv *env, jobject obj, jint state) { OIC_LOG(DEBUG, TAG, "caManagerAdapterStateChangedCallback"); VERIFY_NON_NULL_VOID(env, TAG, "env"); VERIFY_NON_NULL_VOID(obj, TAG, "obj"); jint state_on = CALEGetConstantsValue(env, CLASSPATH_BT_ADAPTER, "STATE_ON"); jint state_off = CALEGetConstantsValue(env, CLASSPATH_BT_ADAPTER, "STATE_OFF"); jint state_turning_off = CALEGetConstantsValue(env, CLASSPATH_BT_ADAPTER, "STATE_TURNING_OFF"); if (state_on == state) { OIC_LOG(DEBUG, TAG, "AdapterStateChangedCallback : state_on"); if (g_adapterStateCB) { g_adapterStateCB(CA_ADAPTER_GATT_BTLE, true); } // when BT state is on. recovery flag has to be reset. CAManagerSetBTRecovery(false); // find target device for autoconnect size_t length = CAManagerGetACDataLength(); OIC_LOG_V(DEBUG, TAG, "target device : %d", length); for (size_t idx = 0; idx < length; idx++) { jstring leAddress = CAManagerGetLEAddressFromACData(env, idx); if (leAddress) { CAResult_t res = CAManagerStartAutoConnection(env, leAddress); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "CAManagerStartAutoConnection has failed"); return; } } } } else if (state_off == state) { OIC_LOG(DEBUG, TAG, "AdapterStateChangedCallback : state_off"); if (g_adapterStateCB) { g_adapterStateCB(CA_ADAPTER_GATT_BTLE, false); } // reset autoconnect flag for all target devices size_t length = CAManagerGetACDataLength(); for (size_t idx = 0; idx < length; idx++) { jstring address = CAManagerGetLEAddressFromACData(env, idx); if (address) { CAManagerSetAutoConnectionFlag(env, address, false); } } // check whether BT recovery is needed or not if (CAManagerIsRecoveryFlagSet()) { CAManagerProcessRecovery(env, STATE_OFF); } } else if (state_turning_off == state) { OIC_LOG(DEBUG, TAG, "AdapterStateChangedCallback : state_turning_off"); return; } else { OIC_LOG(INFO, TAG, "AdapterStateChangedCallback state is not available"); return; } }