コード例 #1
0
void FmpAppCallback(FmpChannel *channel, FmpEvent event, U32 status, void *ptr, U16 len)
{
    FmpCallbackParms parms;

    switch (event)
    {
        case FMPEVENT_OPEN:
        case FMPEVENT_CLOSED:
            parms.parm.rem_dev = ptr;
            break;
        case FMPEVENT_GATT_QUERY_CNF:
            if (status != BT_STATUS_SUCCESS)
            {
                fmp_free(channel->servicedb);
            }
            break;
        case FMPEVENT_SET_ALERT_LEVEL_REQ:
        case FMPEVENT_SET_ALERT_LEVEL_CNF:
            parms.parm.level = *(U8 *)ptr;
            break;
        default:
            break;
    }
    
    parms.event = event;
    parms.len = len;
    parms.status = status;
    
    FMP(fmp_callback)(channel, &parms);
}
コード例 #2
0
BtStatus FMP_Close(FmpChannel *channel)
{
    BtStatus status = BT_STATUS_FAILED;

    /* Validate parameters */
    CheckUnlockedParm(BT_STATUS_INVALID_PARM, channel != 0);

    OS_LockStack();

    CheckLockedParm(BT_STATUS_NOT_FOUND, 
                    IsNodeOnList(&FMP(dev_list), &(channel->node)));

    // check state
    if (channel->state == FMP_STATE_OPEN)
    {
        status = GattDisconnect(channel->link);
    }

    if (status == BT_STATUS_SUCCESS)
    {
        FmpClearConnection(channel, status);
    }


    OS_UnlockStack();
    return status;
}
コード例 #3
0
FmpChannel *FmpFindChannelByAddr(BD_ADDR *bd_addr)
{
    FmpChannel *channel;

    channel = (FmpChannel *)GetHeadList(&FMP(dev_list));
    while ((ListEntry *)channel != &FMP(dev_list))
    {
        if ((channel->link != NULL) &&
            fmp_dev_addr_equal(bd_addr, &channel->link->bdAddr))
        {
            return channel;
        }

        /* try the next node in the device list */
        channel = (FmpChannel *)GetNextNode(&channel->node);		
    }

    return NULL;
}
コード例 #4
0
FmpChannel *FmpFindChannelByLink(BtRemoteDevice *remote_dev)
{
    FmpChannel *channel;

    channel = (FmpChannel *)GetHeadList(&FMP(dev_list));
    while ((ListEntry *)channel != &FMP(dev_list))
    {
        if ((channel->link == remote_dev) ||
            ((channel->cmgr_handler.bdc != 0) &&
            (channel->cmgr_handler.bdc->link == remote_dev)) )
        {
            return channel;
        }

        /* try the next node in the device list */
        channel = (FmpChannel *)GetNextNode(&channel->node);		
    }

    return NULL;
}
コード例 #5
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;
}
コード例 #6
0
void FMP_Init(void)
{
    OS_LockStack();

#if XA_CONTEXT_PTR == XA_ENABLED
    OS_MemSet((U8 *)fmpcx, 0, sizeof(FmpContext));
#else /* XA_CONTEXT_PTR == XA_ENABLED */
    OS_MemSet((U8 *)&fmpcx, 0, sizeof(FmpContext));
#endif /* XA_CONTEXT_PTR == XA_ENABLED */
    
    /* Initialize Lists */
    InitializeListHead(&FMP(dev_list));
    
    kal_trace(BT_TRACE_BLE_PROFILES, FMP_INITIALIZED);
    
    OS_UnlockStack();
    
}
コード例 #7
0
BtStatus FMP_Deregister(FmpServiceTypeFlag service_flag)
{
    BtStatus status = BT_STATUS_SUCCESS;

    OS_LockStack();

    if (FMP(service_flag) == 0)
    {
        /* It is actually invalid deregistration, return directly */
        return status;
    }

    if ((service_flag & FMP_SERVICE_TYPE_LOCATOR_FLAG) &&
	(FMP(service_flag) & FMP_SERVICE_TYPE_LOCATOR_FLAG))
    {
        FMP(service_flag) &= ~FMP_SERVICE_TYPE_LOCATOR_FLAG;
    }
	
    if ((service_flag & FMP_SERVICE_TYPE_TARGET_FLAG) &&
	(FMP(service_flag) & FMP_SERVICE_TYPE_TARGET_FLAG))
    {
        FmpAttDB_Deregistration();
        FMP(service_flag) &= ~FMP_SERVICE_TYPE_TARGET_FLAG;
    }

	
    if (FMP(service_flag) == 0)
    {
        BT_GattUnregisterConnectedEvent(&FMP(gatt_handler));
        ATTDB_UnRegisterBondStatus(&FMP(bond_handler));        
        FMP(fmp_callback) = NULL;
    }

    OS_UnlockStack();
    return status;	
}
コード例 #8
0
BtStatus FMP_Register(FmpCallback callback, FmpServiceTypeFlag service_flag)
{
    BtStatus status = BT_STATUS_FAILED;

    OS_LockStack();

    if ((service_flag & FMP_SERVICE_TYPE_LOCATOR_FLAG) &&
	((FMP(service_flag) & FMP_SERVICE_TYPE_LOCATOR_FLAG) == 0))
    {
        status = BT_STATUS_SUCCESS;		
    }

    if ((service_flag & FMP_SERVICE_TYPE_TARGET_FLAG) &&
	((FMP(service_flag) & FMP_SERVICE_TYPE_TARGET_FLAG) == 0))
    {
        status = FmpAttDB_Registration();
    }

    if (status == BT_STATUS_SUCCESS)
    {
        if (FMP(service_flag) == 0)
        {
            /* register the GATT callback to handle connection */
            BT_GattRegisterConnectedEvent(&(FMP(gatt_handler)), FmpGattEventCallback);

            /* register bond callback to obtain bond status */
            FMP(bond_handler).callback = FmpBondingCallback;
            ATTDB_RegisterBondStatus(&FMP(bond_handler));

            FMP(fmp_callback) = callback;
        }
        FMP(service_flag) |= service_flag;
    }

    OS_UnlockStack();
    return status;	
}
コード例 #9
0
FmpChannel *FmpNewChannel(void)
{
    FmpChannel *ch;
    U8 i;

    ch = (FmpChannel *)fmp_malloc(sizeof(FmpChannel));
    if (ch != NULL)
    {
        OS_MemSet((U8 *)ch, 0, sizeof(FmpChannel));
        InsertTailList(&FMP(dev_list), &(ch->node));
        CMGR_RegisterHandler(&ch->cmgr_handler, FmpCmgrCallback);	   

        /* Initialize packet pool for each device */
        InitializeListHead(&ch->packet_pool);
        for (i = 0; i < FMP_NUM_TX_PACKETS; i++) 
        {
            InsertTailList(&ch->packet_pool, &ch->packets[i].node);
        }
    }

    return ch;	
}