Example #1
0
BtStatus time_gatt_connect_service(TimeCTransport *pChnl) {
	BtStatus status;
	TIMEASSERT(pChnl->check_byte == TIME_CHECK_BYTE);

	if (pChnl->handler.remDev) {
		_cur_timec_chnl = pChnl;
		// Wait for BT_GATT_APP_EVENT_CONNECTED
		status = GattClientConnect(pChnl->handler.remDev);
		OS_Report("[Time] GattClientConnect() returns %d", status);
	} else {
		status = BT_STATUS_INVALID_PARM;
		OS_Report("[Time] Error: pChnl->handler.remDev is NULL");
	}

	return status;
}
Example #2
0
BtStatus FMP_Open(FmpChannel **channel, BD_ADDR *addr)
{
    BtStatus status = BT_STATUS_FAILED;
    FmpChannel *ch; 

    CheckUnlockedParm(BT_STATUS_INVALID_PARM, addr != 0);

    OS_LockStack();

    kal_trace(BT_TRACE_BLE_PROFILES, FMP_OPENCONNECTION);
    if ((*channel != NULL) && IsNodeOnList(&FMP(dev_list), &((*channel)->node)))
    {
        ch = *channel;
    }
    else
    {
        ch = FmpNewChannel();
        if (ch == NULL)
        {
            return BT_STATUS_NO_RESOURCES;
        }
    }

    if (ch->state == FMP_STATE_CLOSED)
    {
        status = CMGR_CreateDataLink(&ch->cmgr_handler, addr);
        kal_trace(BT_TRACE_BLE_PROFILES, FMP_CREATEDATALINK_STATUS, status);
        if (status == BT_STATUS_SUCCESS)
        {
            status = GattClientConnect(ch->cmgr_handler.remDev);
        }

        if (status != BT_STATUS_SUCCESS && status != BT_STATUS_PENDING)
        {
            FmpFreeChannel(ch);
            return status;          
        }

        ch->state = FMP_STATE_OPENING;
        *channel = ch;      
    }

    OS_UnlockStack();
    return status;
}
Example #3
0
/*---------------------------------------------------------------------------
 *            HidCmgrCallback()
 *---------------------------------------------------------------------------
 *
 * Synopsis:  Called by connection manager with link state events.
 *
 * Return:    (See header file)
 *
 */
void HidCmgrCallback(CmgrHandler *Handler, CmgrEvent Event, BtStatus Status) 
{
    BtStatus ret;
    HidChannel *channel = ContainingRecord(Handler, HidChannel, cmgrHandler);
    kal_trace(BT_TRACE_G2_PROFILES,HIDCMGRCALLBACKx02X ,Event);
    switch (Event) {
    case CMEVENT_DATA_LINK_CON_CNF:
        if (channel == NULL)
        {
            kal_trace(BT_TRACE_G2_PROFILES,HID_NOT_THE_CONNECT_BD_ADDR);
            return;
        }

        if(channel->cmgrHandler.bdc == 0)
        {
            kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNELCMGRHANDLERBDC0);
            return;
        }
		
        kal_trace(BT_TRACE_G2_PROFILES,HID_STATUSx02X ,Status);
        if (Status != BT_STATUS_SUCCESS) 
        {
            /* Indicate the query response failure to the application */
            HidClearConnection(channel, Status, 0);
            return;
        }
        else
        {
#ifdef __BT_4_0_BLE__
            kal_trace(BT_TRACE_BLE_PROFILES, HID_CMGRCALLBACK_DEVTYPE, channel->cmgrHandler.bdc->devType);
            if (channel->cmgrHandler.bdc->devType == BT_DEV_TYPE_LE)
            {
                ret = GattClientConnect(channel->cmgrHandler.remDev);
                Report(("[HID] GattClientConnect ret: %d", ret));
                /* Since HID Gatt callback will be called even if connection is existed, there is unnecessary
                to handle return success case here. */
/*
                if (ret == BT_STATUS_SUCCESS)
                {
                    ret = HidStartGattServiceQuery(channel);
                    if (ret != BT_STATUS_PENDING)
                    {
                        channel->flags &= ~CHNL_FLAG_SERVICE_QUERY;
                        HidAppCallback(channel, HIDEVENT_QUERY_CNF, ret,
                                       &channel->queryRsp, (U16)(sizeof(HidQueryRsp)));
                    }
                }
*/                
            }
            else
#endif
            {
                if (channel->flags & CHNL_FLAG_SERVICE_QUERY)
                {
                    HidStartServiceQuery(channel);
                }
                else
                {
                    kal_trace(BT_TRACE_G2_PROFILES,HID_START_L2CAP_CONNECTION);
                    /* Start the L2CAP connection */
                    if (L2CAP_ConnectReq(&HID(hidCtrlPsm), BT_PSM_HID_CTRL, 
                                          channel->cmgrHandler.remDev, 0, 
                                          &(channel->ctrlCid)) == BT_STATUS_PENDING) {
                        channel->state = HID_STATE_CONN_PENDING;
                        channel->flags |= CHNL_FLAG_INITIATOR;
                        break;
                    }
                }
            }
        }
        break;
	case CMEVENT_DATA_LINK_DIS:
	{
		HidClearConnection(channel, Status, 0);
		return;
	}
    default:
        break;
    }
}