Beispiel #1
0
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;
    }
}