1621 lines
56 KiB
C
1621 lines
56 KiB
C
|
|
/********************************** (C) COPYRIGHT *******************************
|
|||
|
|
* File Name : multiCentral.c
|
|||
|
|
* Author : WCH
|
|||
|
|
* Version : V1.0
|
|||
|
|
* Date : 2018/11/12
|
|||
|
|
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>
|
|||
|
|
* Ѱ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>,
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַĬ<EFBFBD><EFBFBD>Ϊ
|
|||
|
|
(84:C2:E4:03:02:02)<EFBFBD><EFBFBD>(84:C2:E4:03:02:03)<EFBFBD><EFBFBD>(84:C2:E4:03:02:04)
|
|||
|
|
*******************************************************************************/
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* INCLUDES
|
|||
|
|
*/
|
|||
|
|
#include "CONFIG.h"
|
|||
|
|
#include "CH57x_common.h"
|
|||
|
|
|
|||
|
|
#include "peripheral.h"
|
|||
|
|
#include "multiCentral.h"
|
|||
|
|
#include "string.h"
|
|||
|
|
#include "stdlib.h"
|
|||
|
|
#include "SPI_SRAM.h"
|
|||
|
|
/*********************************************************************
|
|||
|
|
* MACROS
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// Length of bd addr as a string
|
|||
|
|
#define B_ADDR_STR_LEN 15
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* CONSTANTS
|
|||
|
|
*/
|
|||
|
|
// Maximum number of scan responses
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|||
|
|
#define DEFAULT_MAX_SCAN_RES 10
|
|||
|
|
|
|||
|
|
// Scan duration in 0.625ms
|
|||
|
|
#define DEFAULT_SCAN_DURATION 2400
|
|||
|
|
|
|||
|
|
// Connection min interval in 1.25ms
|
|||
|
|
#define DEFAULT_MIN_CONNECTION_INTERVAL 20
|
|||
|
|
|
|||
|
|
// Connection max interval in 1.25ms
|
|||
|
|
#define DEFAULT_MAX_CONNECTION_INTERVAL 100
|
|||
|
|
|
|||
|
|
// Connection supervision timeout in 10ms
|
|||
|
|
#define DEFAULT_CONNECTION_TIMEOUT 60
|
|||
|
|
|
|||
|
|
// Discovey mode (limited, general, all)
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ޡ<EFBFBD>ͨ<EFBFBD>á<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
|||
|
|
#define DEFAULT_DISCOVERY_MODE DEVDISC_MODE_ALL
|
|||
|
|
|
|||
|
|
// TRUE to use active scan
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>TRUE<55><45><EFBFBD><EFBFBD>ʹ<EFBFBD>ûɨ<EEB6AF><C9A8>
|
|||
|
|
#define DEFAULT_DISCOVERY_ACTIVE_SCAN TRUE
|
|||
|
|
|
|||
|
|
// TRUE to use white list during discovery
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ΪTRUE<55><45><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>ڼ<EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define DEFAULT_DISCOVERY_WHITE_LIST TRUE/*FALSE*/
|
|||
|
|
|
|||
|
|
// TRUE to use high scan duty cycle when creating link
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>TRUE<55><45><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʹ<CAB1>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձ<EFBFBD>
|
|||
|
|
#define DEFAULT_LINK_HIGH_DUTY_CYCLE FALSE
|
|||
|
|
|
|||
|
|
// TRUE to use white list when creating link
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>TRUE<55><45><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʹ<CAB1>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define DEFAULT_LINK_WHITE_LIST FALSE
|
|||
|
|
|
|||
|
|
// Default read RSSI period in 0.625ms
|
|||
|
|
#define DEFAULT_RSSI_PERIOD 3600
|
|||
|
|
|
|||
|
|
// Minimum connection interval (units of 1.25ms)
|
|||
|
|
#define DEFAULT_UPDATE_MIN_CONN_INTERVAL 20
|
|||
|
|
|
|||
|
|
// Maximum connection interval (units of 1.25ms)
|
|||
|
|
#define DEFAULT_UPDATE_MAX_CONN_INTERVAL 100
|
|||
|
|
|
|||
|
|
// Slave latency to use parameter update
|
|||
|
|
#define DEFAULT_UPDATE_SLAVE_LATENCY 0
|
|||
|
|
|
|||
|
|
// Supervision timeout value (units of 10ms)
|
|||
|
|
#define DEFAULT_UPDATE_CONN_TIMEOUT 600
|
|||
|
|
|
|||
|
|
// Default passcode
|
|||
|
|
#define DEFAULT_PASSCODE 0
|
|||
|
|
|
|||
|
|
// Default GAP pairing mode
|
|||
|
|
#define DEFAULT_PAIRING_MODE GAPBOND_PAIRING_MODE_WAIT_FOR_REQ
|
|||
|
|
|
|||
|
|
// Default MITM mode (TRUE to require passcode or OOB when pairing)
|
|||
|
|
#define DEFAULT_MITM_MODE TRUE
|
|||
|
|
|
|||
|
|
// Default bonding mode, TRUE to bond, max bonding 6 devices
|
|||
|
|
#define DEFAULT_BONDING_MODE TRUE
|
|||
|
|
|
|||
|
|
// Default GAP bonding I/O capabilities
|
|||
|
|
#define DEFAULT_IO_CAPABILITIES GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT
|
|||
|
|
|
|||
|
|
// Default service discovery timer delay in 0.625ms
|
|||
|
|
#define DEFAULT_SVC_DISCOVERY_DELAY /*1600*/1
|
|||
|
|
|
|||
|
|
// Default parameter update delay in 0.625ms
|
|||
|
|
#define DEFAULT_PARAM_UPDATE_DELAY /*3200*/1000
|
|||
|
|
|
|||
|
|
// Default read or write timer delay in 0.625ms
|
|||
|
|
#define DEFAULT_READ_OR_WRITE_DELAY /*100*/1
|
|||
|
|
|
|||
|
|
// Establish link timeout in 0.625ms
|
|||
|
|
#define ESTABLISH_LINK_TIMEOUT /*3200*/1800
|
|||
|
|
|
|||
|
|
// Application states
|
|||
|
|
enum
|
|||
|
|
{
|
|||
|
|
BLE_STATE_IDLE,
|
|||
|
|
BLE_STATE_CONNECTING,
|
|||
|
|
BLE_STATE_CONNECTED,
|
|||
|
|
BLE_STATE_DISCONNECTING
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// Discovery states
|
|||
|
|
enum
|
|||
|
|
{
|
|||
|
|
BLE_DISC_STATE_IDLE, // Idle
|
|||
|
|
BLE_DISC_STATE_SVC, // Service discovery
|
|||
|
|
BLE_DISC_STATE_CHAR // Characteristic discovery
|
|||
|
|
};
|
|||
|
|
// Task ID for internal task/event processing
|
|||
|
|
static uint8 centralTaskId;
|
|||
|
|
|
|||
|
|
// Number of scan results
|
|||
|
|
static uint8 centralScanRes;
|
|||
|
|
|
|||
|
|
// Scan result list
|
|||
|
|
static gapDevRec_t centralDevList[DEFAULT_MAX_SCAN_RES];
|
|||
|
|
|
|||
|
|
// Peer device address
|
|||
|
|
//static peerAddrDefItem_t PeerAddrDef[PERIPHERAL_DEVICE_MAX_NUM] =
|
|||
|
|
//{
|
|||
|
|
// {0x02,0x02,0x03,0xE4,0xC2,0x84 },
|
|||
|
|
// {0x03,0x02,0x03,0xE4,0xC2,0x84 },
|
|||
|
|
// {0x04,0x02,0x03,0xE4,0xC2,0x84 }
|
|||
|
|
//};
|
|||
|
|
|
|||
|
|
BLE_DEVICE_CONFIG* Ble_Device_Head = NULL;
|
|||
|
|
|
|||
|
|
// Connection item list
|
|||
|
|
static centralConnItem_t centralConnList[CENTRAL_MAX_CONNECTION];
|
|||
|
|
|
|||
|
|
// Value to write
|
|||
|
|
//static uint8 centralCharVal = 0x5A;
|
|||
|
|
|
|||
|
|
// Value read/write toggle
|
|||
|
|
static uint8 centralDoWrite = TRUE;
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* LOCAL FUNCTIONS
|
|||
|
|
*/
|
|||
|
|
static void centralProcessGATTMsg( gattMsgEvent_t *pMsg );
|
|||
|
|
static void centralRssiCB( uint16 connHandle, int8 rssi );
|
|||
|
|
static void centralEventCB( gapRoleEvent_t *pEvent );
|
|||
|
|
static void centralHciMTUChangeCB( uint16 connHandle, uint16 maxTxOctets, uint16 maxRxOctets );
|
|||
|
|
static void centralPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle,
|
|||
|
|
uint8 uiInputs, uint8 uiOutputs );
|
|||
|
|
static void centralPairStateCB( uint16 connHandle, uint8 state, uint8 status );
|
|||
|
|
static uint16 connect_ProcessEvent( uint8 connect_index, uint16 events );
|
|||
|
|
static void central_ProcessTMOSMsg( tmos_event_hdr_t *pMsg );
|
|||
|
|
static void centralGATTDiscoveryEvent( uint8 connItem, gattMsgEvent_t *pMsg );
|
|||
|
|
static void centralConnIistStartDiscovery_0( void );
|
|||
|
|
static void centralAddDeviceInfo( uint8 *pAddr, uint8 addrType );
|
|||
|
|
static void centralInitConnItem( uint8 task_id, centralConnItem_t* centralConnList );
|
|||
|
|
static uint8 centralAddrCmp( /*peerAddrDefItem_t *PeerAddrDef,*/ uint8 *addr );
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* PROFILE CALLBACKS
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// GAP Role Callbacks
|
|||
|
|
static gapCentralRoleCB_t centralRoleCB =
|
|||
|
|
{
|
|||
|
|
centralRssiCB, // RSSI callback
|
|||
|
|
centralEventCB, // Event callback <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
|
centralHciMTUChangeCB // MTU change callback
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// Bond Manager Callbacks
|
|||
|
|
static gapBondCBs_t centralBondCB =
|
|||
|
|
{
|
|||
|
|
centralPasscodeCB, //<2F><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
|
|||
|
|
centralPairStateCB //<2F><><EFBFBD><EFBFBD>״̬<D7B4>ص<EFBFBD>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* PUBLIC FUNCTIONS
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn Central_Init
|
|||
|
|
*
|
|||
|
|
* @brief Initialization function for the Central App Task.
|
|||
|
|
* This is called during initialization and should contain
|
|||
|
|
* any application specific initialization (ie. hardware
|
|||
|
|
* initialization/setup, table initialization, power up
|
|||
|
|
* notification).
|
|||
|
|
*
|
|||
|
|
* @param task_id - the ID assigned by TMOS. This ID should be
|
|||
|
|
* used to send messages and set timers.
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
void Central_Init( )
|
|||
|
|
{
|
|||
|
|
centralTaskId = TMOS_ProcessEventRegister( Central_ProcessEvent );
|
|||
|
|
|
|||
|
|
// Setup GAP
|
|||
|
|
//д GAP <20><><EFBFBD><EFBFBD>
|
|||
|
|
GAP_SetParamValue( TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION ); //ִ<><D6B4>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> <20><>n*0.625<EFBFBD><EFBFBD>ms 2400*0.625
|
|||
|
|
GAP_SetParamValue( TGAP_DISC_SCAN_INT, 32); //<2F><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>ɨ<EFBFBD><C9A8>״̬<D7B4>ڼ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڷ<EFBFBD><DAB7>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|||
|
|
GAP_SetParamValue(TGAP_DISC_SCAN_WIND, 32); //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD>贰<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ0.625ms<EFBFBD><EFBFBD>ɨ<EFBFBD>贰<EFBFBD><EFBFBD>ҪС<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ16
|
|||
|
|
GAP_SetParamValue( TGAP_CONN_EST_INT_MIN, DEFAULT_MIN_CONNECTION_INTERVAL ); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>С<EFBFBD><D0A1>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD>n*1.25<EFBFBD><EFBFBD><EFBFBD>룩2*1.25
|
|||
|
|
GAP_SetParamValue( TGAP_CONN_EST_INT_MAX, DEFAULT_MAX_CONNECTION_INTERVAL ); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD>n*1.25<EFBFBD><EFBFBD><EFBFBD>룩10*1.25
|
|||
|
|
GAP_SetParamValue( TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT ); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC>ӳ<EFBFBD>ʱ<EFBFBD><CAB1>n*10<31><30><EFBFBD>룩 10*10
|
|||
|
|
|
|||
|
|
// Setup the GAP Bond Manager
|
|||
|
|
{
|
|||
|
|
uint32 passkey = DEFAULT_PASSCODE; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
|
|||
|
|
uint8 pairMode = DEFAULT_PAIRING_MODE; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint8 mitm = DEFAULT_MITM_MODE; //MITM<54><4D><EFBFBD><EFBFBD>״̬ 1
|
|||
|
|
uint8 ioCap = DEFAULT_IO_CAPABILITIES; //I/O<><4F><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
|
|||
|
|
uint8 bonding = DEFAULT_BONDING_MODE; //<2F><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
GAPBondMgr_SetParameter( GAPBOND_CENT_DEFAULT_PASSCODE, sizeof( uint32 ), &passkey );
|
|||
|
|
GAPBondMgr_SetParameter( GAPBOND_CENT_PAIRING_MODE, sizeof( uint8 ), &pairMode );
|
|||
|
|
GAPBondMgr_SetParameter( GAPBOND_CENT_MITM_PROTECTION, sizeof( uint8 ), &mitm );
|
|||
|
|
GAPBondMgr_SetParameter( GAPBOND_CENT_IO_CAPABILITIES, sizeof( uint8 ), &ioCap );
|
|||
|
|
GAPBondMgr_SetParameter( GAPBOND_CENT_BONDING_ENABLED, sizeof( uint8 ), &bonding );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Init Connection Item
|
|||
|
|
centralInitConnItem( centralTaskId, centralConnList );
|
|||
|
|
// Initialize GATT Client
|
|||
|
|
GATT_InitClient();
|
|||
|
|
|
|||
|
|
// Register to receive incoming ATT Indications/Notifications
|
|||
|
|
//ע<><D7A2><EFBFBD>Խ<EFBFBD><D4BD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD>ATTָʾ/֪ͨ
|
|||
|
|
GATT_RegisterForInd( centralTaskId );
|
|||
|
|
|
|||
|
|
// Setup a delayed profile startup
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tmos_set_event( centralTaskId, START_DEVICE_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralInitConnItem
|
|||
|
|
*
|
|||
|
|
* @brief Init Connection Item
|
|||
|
|
*
|
|||
|
|
* @param task_id -
|
|||
|
|
* centralConnList -
|
|||
|
|
*
|
|||
|
|
* @return NULL
|
|||
|
|
*/
|
|||
|
|
static void centralInitConnItem( uint8 task_id, centralConnItem_t* centralConnList )
|
|||
|
|
{
|
|||
|
|
uint8 connItem;
|
|||
|
|
for(connItem=0; connItem<CENTRAL_MAX_CONNECTION; connItem++)
|
|||
|
|
{
|
|||
|
|
// ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>taskID<49><44><EFBFBD><EFBFBD>
|
|||
|
|
centralConnList[connItem].taskID = TMOS_ProcessEventRegister( Central_ProcessEvent );
|
|||
|
|
centralConnList[connItem].connHandle = GAP_CONNHANDLE_INIT;
|
|||
|
|
centralConnList[connItem].state = BLE_STATE_IDLE;
|
|||
|
|
centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
centralConnList[connItem].charHdl = 0;
|
|||
|
|
centralConnList[connItem].svcStartHdl = 0;
|
|||
|
|
centralConnList[connItem].svcEndHdl = 0;
|
|||
|
|
memset(centralConnList[connItem].peerAddr, 0, 6);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn Central_ProcessEvent
|
|||
|
|
*
|
|||
|
|
* @brief Central Application Task event processor. This function
|
|||
|
|
* is called to process all events for the task. Events
|
|||
|
|
* include timers, messages and any other user defined events.
|
|||
|
|
*
|
|||
|
|
* @param task_id - The TMOS assigned task ID.
|
|||
|
|
* @param events - events to process. This is a bit map and can
|
|||
|
|
* contain more than one event.
|
|||
|
|
*
|
|||
|
|
* @return events not processed
|
|||
|
|
*/
|
|||
|
|
uint16 Central_ProcessEvent( uint8 task_id, uint16 events )
|
|||
|
|
{
|
|||
|
|
if ( events & SYS_EVENT_MSG )
|
|||
|
|
{
|
|||
|
|
uint8 *pMsg;
|
|||
|
|
|
|||
|
|
if ( (pMsg = tmos_msg_receive( centralTaskId )) != NULL )
|
|||
|
|
{
|
|||
|
|
central_ProcessTMOSMsg( (tmos_event_hdr_t *)pMsg );
|
|||
|
|
// Release the TMOS message
|
|||
|
|
tmos_msg_deallocate( pMsg );
|
|||
|
|
}
|
|||
|
|
// return unprocessed events
|
|||
|
|
return (events ^ SYS_EVENT_MSG);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( events & START_DEVICE_EVT )
|
|||
|
|
{
|
|||
|
|
// Start the Device
|
|||
|
|
GAPRole_CentralStartDevice( centralTaskId, ¢ralBondCB, ¢ralRoleCB );
|
|||
|
|
return ( events ^ START_DEVICE_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( events & ESTABLISH_LINK_TIMEOUT_EVT )
|
|||
|
|
{
|
|||
|
|
if(ble_send_info.wait_connected == 1) //<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
ble_send_info.wait_connected = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӱ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
|||
|
|
ble_send_info.send_state = BLE_ERR_CONNECT_FAIL; //״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
}
|
|||
|
|
PRINT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ\n");
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
Device_Info_List->connecting = CENTRAL_IDLE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD>־
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GAPRole_TerminateLink( INVALID_CONNHANDLE ); //<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ȫ<EFBFBD><C8AB>
|
|||
|
|
DEFAULT_DISCOVERY_ACTIVE_SCAN, //ʹ<>ûɨ<EEB6AF><C9A8>
|
|||
|
|
DEFAULT_DISCOVERY_WHITE_LIST ); //<2F>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>ڼ䲻ʹ<E4B2BB>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return ( events ^ ESTABLISH_LINK_TIMEOUT_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(task_id == centralConnList[CONNECT0_ITEM].taskID )
|
|||
|
|
{
|
|||
|
|
return connect_ProcessEvent( CONNECT0_ITEM, events );
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
else if(task_id == centralConnList[CONNECT1_ITEM].taskID )
|
|||
|
|
{
|
|||
|
|
return connect_ProcessEvent( CONNECT1_ITEM, events );
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
else if(task_id == centralConnList[CONNECT2_ITEM].taskID )
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
// Discard unknown events
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn connect0_ProcessEvent
|
|||
|
|
*
|
|||
|
|
* @brief Process an incoming task message.
|
|||
|
|
*
|
|||
|
|
* @param pMsg - message to process
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static uint16 connect_ProcessEvent( uint8 connect_index, uint16 events )
|
|||
|
|
{
|
|||
|
|
if ( events & START_SVC_DISCOVERY_EVT )
|
|||
|
|
{
|
|||
|
|
// start service discovery
|
|||
|
|
//centralConnIistStartDiscovery_0( ); //<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
SRAM_Write_Byte(0x02, ble_send_info.BLE_SendAddr); //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
SRAM_Write_Byte(0x01, ble_send_info.BLE_SendAddr+1); //<2F><><EFBFBD><EFBFBD>֪ͨ
|
|||
|
|
SRAM_Write_Byte(0x00, ble_send_info.BLE_SendAddr+2);
|
|||
|
|
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if( memcmp(Device_Info_List->mac, centralConnList[connect_index].peerAddr, 6) == 0/*centralAddrCmp(centralConnList[connect_index].peerAddr)*/ )
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->uuid_type == UUID_TYPE_128BIT) //128BIT uuid
|
|||
|
|
{
|
|||
|
|
UINT8 uuid_128bit[16] = { 0x9E,0xCA,0xDC,0x24,0x0E,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xE0,0xFE,0x00,0x00 }; //128bit<69><74><EFBFBD><EFBFBD>UUID
|
|||
|
|
if(memcmp(Device_Info_List->uuid_128bit, uuid_128bit, 16) == 0)
|
|||
|
|
{
|
|||
|
|
ble_send_info.char_handle = 0x10; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
switch(Device_Info_List->server_uuid)
|
|||
|
|
{
|
|||
|
|
case SIMPLEPROFILE_SERV_UUID: //0xFFE0
|
|||
|
|
ble_send_info.char_handle = 0x2D; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default: break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
PRINT("֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%X\n", ble_send_info.char_handle);
|
|||
|
|
ble_send_info.wait_send = 1; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//PRINT("ble_send_info.char_handle:%X\n", ble_send_info.char_handle);
|
|||
|
|
centralConnList[connect_index].procedureInProgress = FALSE;
|
|||
|
|
tmos_start_task( centralConnList[connect_index].taskID, START_READ_OR_WRITE_EVT, 1);
|
|||
|
|
|
|||
|
|
return ( events ^ START_SVC_DISCOVERY_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( events & START_READ_OR_WRITE_EVT )
|
|||
|
|
{
|
|||
|
|
if( centralConnList[connect_index].procedureInProgress == FALSE )
|
|||
|
|
{
|
|||
|
|
if( centralDoWrite )
|
|||
|
|
{
|
|||
|
|
// Do a write
|
|||
|
|
PRINT("BLE<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
|
attWriteReq_t req;
|
|||
|
|
req.cmd = FALSE;
|
|||
|
|
req.sig = FALSE;
|
|||
|
|
//req.handle = centralConnList[CONNECT0_ITEM].charHdl; //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>uuid
|
|||
|
|
req.handle = ble_send_info.char_handle; //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>uuid
|
|||
|
|
req.len = SRAM_Read_Byte(ble_send_info.BLE_SendAddr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
req.pValue = GATT_bm_alloc(centralConnList[connect_index].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
|
|||
|
|
if ( req.pValue != NULL )
|
|||
|
|
{
|
|||
|
|
SRAM_Read_Buff(req.pValue, req.len, ble_send_info.BLE_SendAddr+1);
|
|||
|
|
if( GATT_WriteCharValue(centralConnList[connect_index].connHandle, &req, centralTaskId) == SUCCESS )
|
|||
|
|
{
|
|||
|
|
PRINT("BLE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
|
centralConnList[connect_index].procedureInProgress = TRUE;
|
|||
|
|
//centralDoWrite = !centralDoWrite;
|
|||
|
|
//tmos_start_task( centralConnList[CONNECT0_ITEM].taskID, START_READ_OR_WRITE_EVT, 100);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// // Do a read
|
|||
|
|
// attReadReq_t req;
|
|||
|
|
//
|
|||
|
|
// req.handle = centralConnList[connect_index].charHdl;
|
|||
|
|
// if( GATT_ReadCharValue( centralConnList[connect_index].connHandle, &req, centralTaskId ) == SUCCESS )
|
|||
|
|
// {
|
|||
|
|
// centralConnList[connect_index].procedureInProgress = TRUE;
|
|||
|
|
// centralDoWrite = !centralDoWrite;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
return ( events ^ START_READ_OR_WRITE_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( events & START_PARAM_UPDATE_EVT )
|
|||
|
|
{
|
|||
|
|
// start connect parameter update
|
|||
|
|
GAPRole_UpdateLink( centralConnList[connect_index].connHandle,
|
|||
|
|
DEFAULT_UPDATE_MIN_CONN_INTERVAL, //<2F><>С<EFBFBD><D0A1><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1.25ms<EFBFBD><EFBFBD>20
|
|||
|
|
DEFAULT_UPDATE_MAX_CONN_INTERVAL, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1.25ms<EFBFBD><EFBFBD>100
|
|||
|
|
DEFAULT_UPDATE_SLAVE_LATENCY, //ʹ<>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĴ<C2B5><C4B4><EFBFBD><EFBFBD>ӳ<EFBFBD> 0
|
|||
|
|
DEFAULT_UPDATE_CONN_TIMEOUT ); //<2F><><EFBFBD>س<EFBFBD>ʱֵ<CAB1><D6B5><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>10ms<6D><73> 600
|
|||
|
|
|
|||
|
|
return ( events ^ START_PARAM_UPDATE_EVT );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( events & START_READ_RSSI_EVT )
|
|||
|
|
{
|
|||
|
|
tmos_start_task( centralConnList[connect_index].taskID, START_SVC_DISCOVERY_EVT, 3600);
|
|||
|
|
GAPRole_ReadRssiCmd(centralConnList[connect_index].connHandle);
|
|||
|
|
tmos_start_task( centralConnList[connect_index].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD );
|
|||
|
|
return (events ^ START_READ_RSSI_EVT);
|
|||
|
|
}
|
|||
|
|
// Discard unknown events
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn central_ProcessTMOSMsg
|
|||
|
|
*
|
|||
|
|
* @brief Process an incoming task message.
|
|||
|
|
*
|
|||
|
|
* @param pMsg - message to process
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void central_ProcessTMOSMsg( tmos_event_hdr_t *pMsg )
|
|||
|
|
{
|
|||
|
|
switch ( pMsg->event )
|
|||
|
|
{
|
|||
|
|
case GATT_MSG_EVENT:
|
|||
|
|
centralProcessGATTMsg( (gattMsgEvent_t *) pMsg );
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralProcessGATTMsg
|
|||
|
|
*
|
|||
|
|
* @brief Process GATT messages
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralProcessGATTMsg( gattMsgEvent_t *pMsg )
|
|||
|
|
{
|
|||
|
|
uint8 connItem;
|
|||
|
|
for(connItem=0; connItem<CENTRAL_MAX_CONNECTION; connItem++)
|
|||
|
|
{
|
|||
|
|
if( centralConnList[connItem].connHandle == pMsg->connHandle )
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( connItem == CENTRAL_MAX_CONNECTION )
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
// Should not go there
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( centralConnList[connItem].state != BLE_STATE_CONNECTED )
|
|||
|
|
{
|
|||
|
|
// In case a GATT message came after a connection has dropped,
|
|||
|
|
// ignore the message
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>GATT<54><54>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>֮<EFBFBD><EFBFBD><F3B7A2B3>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>Ϣ
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( ( pMsg->method == ATT_EXCHANGE_MTU_RSP ) ||
|
|||
|
|
( ( pMsg->method == ATT_ERROR_RSP ) &&
|
|||
|
|
( pMsg->msg.errorRsp.reqOpcode == ATT_EXCHANGE_MTU_REQ ) ) )
|
|||
|
|
{
|
|||
|
|
if ( pMsg->method == ATT_ERROR_RSP )
|
|||
|
|
{
|
|||
|
|
uint8 status = pMsg->msg.errorRsp.errCode;
|
|||
|
|
|
|||
|
|
PRINT( "Exchange MTU Error: %x\n", status );
|
|||
|
|
}
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( pMsg->method == ATT_MTU_UPDATED_EVENT )
|
|||
|
|
{
|
|||
|
|
PRINT("MTU: %x\n",pMsg->msg.mtuEvt.MTU);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( ( pMsg->method == ATT_READ_RSP ) ||
|
|||
|
|
( ( pMsg->method == ATT_ERROR_RSP ) &&
|
|||
|
|
( pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ ) ) )
|
|||
|
|
{
|
|||
|
|
if ( pMsg->method == ATT_ERROR_RSP )
|
|||
|
|
{
|
|||
|
|
uint8 status = pMsg->msg.errorRsp.errCode;
|
|||
|
|
|
|||
|
|
PRINT( "Read Error: %x\n", status );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// After a successful read, display the read value
|
|||
|
|
PRINT("Read rsp: %s\n", (char*)pMsg->msg.readRsp.pValue);
|
|||
|
|
}
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
}
|
|||
|
|
else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
|
|||
|
|
( ( pMsg->method == ATT_ERROR_RSP ) &&
|
|||
|
|
( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
|
|||
|
|
{
|
|||
|
|
PRINT( "Write pMsg->method:%X errorRsp.reqOpcode:%X\n", pMsg->method, pMsg->msg.errorRsp.reqOpcode);
|
|||
|
|
if ( pMsg->method == ATT_ERROR_RSP )
|
|||
|
|
{
|
|||
|
|
uint8 status = pMsg->msg.errorRsp.errCode;
|
|||
|
|
ble_send_info.send_state = BLE_ERR_FAIL;
|
|||
|
|
PRINT( "Write Error: %x\n", status );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// After a succesful write, display the value that was written and increment value
|
|||
|
|
PRINT( "Write sent: %d\n", SRAM_Read_Byte(ble_send_info.BLE_SendAddr));
|
|||
|
|
for(int i = 0; i< SRAM_Read_Byte(ble_send_info.BLE_SendAddr) ; i++)
|
|||
|
|
{
|
|||
|
|
PRINT( "%02X ", SRAM_Read_Byte(ble_send_info.BLE_SendAddr+1+i));
|
|||
|
|
}
|
|||
|
|
PRINT("\n");
|
|||
|
|
ble_send_info.send_state = BLE_ERR_SUCCESS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
ble_send_info.wait_send = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ͱ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
|||
|
|
GPIOB_ResetBits(GPIO_Pin_6); //ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if ( pMsg->method == ATT_HANDLE_VALUE_NOTI ) //<2F><><EFBFBD>յ<EFBFBD>֪ͨ
|
|||
|
|
{
|
|||
|
|
//PRINT("Receive noti: %s<><73> len:%d\n", (char*)pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len);
|
|||
|
|
|
|||
|
|
if(ble_send_info.BLE_WriteAddr != NULL && pMsg->msg.handleValueNoti.len <= BLE_BUFF_MAX_LEN)
|
|||
|
|
{
|
|||
|
|
PRINT( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨNotify:");
|
|||
|
|
for(int i= 0; i< pMsg->msg.handleValueNoti.len; i++)
|
|||
|
|
{
|
|||
|
|
PRINT( " %02X", pMsg->msg.handleValueNoti.pValue[i]);
|
|||
|
|
}
|
|||
|
|
PRINT( "\n");
|
|||
|
|
SRAM_Write_Byte(pMsg->msg.handleValueNoti.len, ble_send_info.BLE_WriteAddr); //<2F><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
|
|||
|
|
SRAM_Write_Buff(pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len, ble_send_info.BLE_WriteAddr +1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
ble_send_info.BLE_WriteAddr += BLE_BUFF_MAX_LEN;
|
|||
|
|
if(ble_send_info.BLE_WriteAddr >= SRAM_BLE_RECEIVE_END)
|
|||
|
|
{
|
|||
|
|
ble_send_info.BLE_WriteAddr = SRAM_BLE_RECEIVE_START;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if ( centralConnList[connItem].discState != BLE_DISC_STATE_IDLE )
|
|||
|
|
{
|
|||
|
|
//centralGATTDiscoveryEvent( connItem, pMsg );
|
|||
|
|
}
|
|||
|
|
GATT_bm_free(&pMsg->msg, pMsg->method);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralRssiCB
|
|||
|
|
*
|
|||
|
|
* @brief RSSI callback.
|
|||
|
|
*
|
|||
|
|
* @param connHandle - connection handle
|
|||
|
|
* @param rssi - RSSI
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralRssiCB( uint16 connHandle, int8 rssi )
|
|||
|
|
{
|
|||
|
|
PRINT( "RSSI -%d dB Conn - %x \n", -rssi, connHandle);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralHciMTUChangeCB
|
|||
|
|
*
|
|||
|
|
* @brief MTU changed callback.
|
|||
|
|
*
|
|||
|
|
* @param maxTxOctets - Max tx octets
|
|||
|
|
* @param maxRxOctets - Max rx octets
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralHciMTUChangeCB( uint16 connHandle, uint16 maxTxOctets, uint16 maxRxOctets )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralEventCB
|
|||
|
|
*
|
|||
|
|
* @brief Central event callback function.
|
|||
|
|
*
|
|||
|
|
* @param pEvent - pointer to event structure
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralEventCB( gapRoleEvent_t *pEvent )
|
|||
|
|
{
|
|||
|
|
switch ( pEvent->gap.opcode )
|
|||
|
|
{
|
|||
|
|
case GAP_DEVICE_INIT_DONE_EVENT: //<2F><><EFBFBD>豸<EFBFBD><E8B1B8>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ϊgapdevicenitdoneevent<6E><74>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
PRINT( "Scanning...\n" );
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ȫ<EFBFBD><C8AB>
|
|||
|
|
DEFAULT_DISCOVERY_ACTIVE_SCAN, //ʹ<>ûɨ<EEB6AF><C9A8>
|
|||
|
|
DEFAULT_DISCOVERY_WHITE_LIST ); //<2F>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>ڼ䲻ʹ<E4B2BB>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case GAP_DEVICE_INFO_EVENT: //<2F>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>豸ʱ<E8B1B8><CAB1><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>з<EFBFBD><D0B7>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ΪgapDeviceInfoEvent\t<><74>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// Add device to list
|
|||
|
|
// if(pEvent->deviceInfo.eventType == GAP_ADTYPE_ADV_NONCONN_IND)
|
|||
|
|
// {
|
|||
|
|
// char* data = (char*)malloc(pEvent->deviceInfo.dataLen);
|
|||
|
|
// memcpy(data, pEvent->deviceInfo.pEvtData, pEvent->deviceInfo.dataLen);
|
|||
|
|
// PRINT("advertData:%s\n", data);
|
|||
|
|
// free(data);
|
|||
|
|
// }
|
|||
|
|
// PRINT("ADDR_TYPE:%d pEvent->deviceInfo.pEvtData: ", pEvent->deviceInfo.addrType);
|
|||
|
|
// for(int i = 0; i < pEvent->deviceInfo.dataLen; i++)
|
|||
|
|
// {
|
|||
|
|
// PRINT("%02X ", pEvent->deviceInfo.pEvtData[i]);
|
|||
|
|
// }
|
|||
|
|
// PRINT("\n");
|
|||
|
|
centralAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType );
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case GAP_DEVICE_DISCOVERY_EVENT: //<2F><><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ΪgapDevDiscEvent<6E><74>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
uint8 i;
|
|||
|
|
// PRINT("pEvent->deviceInfo.addr: %02x %02x %02x %02x %02x %02x \n",
|
|||
|
|
// pEvent->deviceInfo.addr[0],
|
|||
|
|
// pEvent->deviceInfo.addr[1],
|
|||
|
|
// pEvent->deviceInfo.addr[2],
|
|||
|
|
// pEvent->deviceInfo.addr[3],
|
|||
|
|
// pEvent->deviceInfo.addr[4],
|
|||
|
|
// pEvent->deviceInfo.addr[5]);
|
|||
|
|
// See if peer device has been discovered
|
|||
|
|
//<2F>鿴<EFBFBD>Ƿ<EFBFBD><C7B7>ѷ<EFBFBD><D1B7>ֶԵ<D6B6><D4B5>豸
|
|||
|
|
for ( i = 0; i < centralScanRes; i++ )
|
|||
|
|
{
|
|||
|
|
if ( centralAddrCmp( /*PeerAddrDef,*/ centralDevList[i].addr ) )
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Peer device not found
|
|||
|
|
//δ<>ҵ<EFBFBD><D2B5>Ե<EFBFBD><D4B5>豸
|
|||
|
|
if(i == centralScanRes)
|
|||
|
|
{
|
|||
|
|
PRINT( "Device not found...\n" );
|
|||
|
|
centralScanRes = 0;
|
|||
|
|
GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
DEFAULT_DISCOVERY_ACTIVE_SCAN,
|
|||
|
|
DEFAULT_DISCOVERY_WHITE_LIST );
|
|||
|
|
PRINT( "Scanning...\n" );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Peer device found
|
|||
|
|
//<2F>ҵ<EFBFBD><D2B5>˶Ե<CBB6><D4B5>豸
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
PRINT( "Device found...\n" );
|
|||
|
|
int j = 0;
|
|||
|
|
for( ; j < CENTRAL_MAX_CONNECTION; j++)
|
|||
|
|
{
|
|||
|
|
if( memcmp(centralDevList[i].addr, centralConnList[j].peerAddr, 6) == 0)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( j == CENTRAL_MAX_CONNECTION ) //<2F>豸δ<E8B1B8><CEB4><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
GPIOB_SetBits(GPIO_Pin_6); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>PB6<42><36>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Set_Connecting_flg(centralDevList[i].addr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
PRINT("addrType:%d\n", centralDevList[i].addrType);
|
|||
|
|
GAPRole_CentralEstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձȡ<D5B1><C8A1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
DEFAULT_LINK_WHITE_LIST,
|
|||
|
|
centralDevList[i].addrType,
|
|||
|
|
centralDevList[i].addr );
|
|||
|
|
|
|||
|
|
// Start establish link timeout event
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
|
|||
|
|
tmos_start_task( centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
|
|||
|
|
PRINT( "Connecting...\n" );
|
|||
|
|
}
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// centralScanRes = 0;
|
|||
|
|
// GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
// DEFAULT_DISCOVERY_ACTIVE_SCAN,
|
|||
|
|
// DEFAULT_DISCOVERY_WHITE_LIST );
|
|||
|
|
// PRINT( "Scanning...\n" );
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case GAP_LINK_ESTABLISHED_EVENT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ΪgapEstLinkReqEvent\t<><74>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// GPIOB_ResetBits(GPIO_Pin_6); //ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
tmos_stop_task( centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT ); //<2F><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֹͣ
|
|||
|
|
|
|||
|
|
Clear_Connecting_flg(pEvent->linkCmpl.devAddr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1><EFBFBD>
|
|||
|
|
|
|||
|
|
if ( pEvent->gap.hdr.status == SUCCESS )
|
|||
|
|
{
|
|||
|
|
uint8 connItem;
|
|||
|
|
// <20><>ѯ<EFBFBD>Ƿ<EFBFBD><C7B7>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
for(connItem=0; connItem<CENTRAL_MAX_CONNECTION; connItem++)
|
|||
|
|
{
|
|||
|
|
if( centralConnList[connItem].connHandle == GAP_CONNHANDLE_INIT )
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( connItem == CENTRAL_MAX_CONNECTION ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
{
|
|||
|
|
GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle); //<2F><>ֹ<EFBFBD><D6B9>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
|||
|
|
memset(centralConnList[connItem].peerAddr, 0, 6); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸MAC<41><43>ַ
|
|||
|
|
PRINT( "Connection max...\n" );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
centralConnList[connItem].state = BLE_STATE_CONNECTED; //״̬<D7B4><CCAC><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
|
centralConnList[connItem].connHandle = pEvent->linkCmpl.connectionHandle; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
memcpy(centralConnList[connItem].peerAddr, pEvent->linkCmpl.devAddr, 6); //<2F><>ȡ<EFBFBD>豸mac<61><63>ַ
|
|||
|
|
PRINT("peerAddr: %02x %02x %02x %02x %02x %02x \n",
|
|||
|
|
centralConnList[connItem].peerAddr[0],
|
|||
|
|
centralConnList[connItem].peerAddr[1],
|
|||
|
|
centralConnList[connItem].peerAddr[2],
|
|||
|
|
centralConnList[connItem].peerAddr[3],
|
|||
|
|
centralConnList[connItem].peerAddr[4],
|
|||
|
|
centralConnList[connItem].peerAddr[5]);
|
|||
|
|
|
|||
|
|
printf("Conn %x - Int %x \n", pEvent->linkCmpl.connectionHandle, pEvent->linkCmpl.connInterval);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>0
|
|||
|
|
// if( connItem == CONNECT0_ITEM )
|
|||
|
|
{
|
|||
|
|
centralConnList[connItem].procedureInProgress = TRUE; //GATT <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϊ TRUE
|
|||
|
|
|
|||
|
|
// Initiate service discovery
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tmos_start_task( centralConnList[connItem].taskID, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY);
|
|||
|
|
|
|||
|
|
// Initiate connect parameter update
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
tmos_start_task( centralConnList[connItem].taskID, START_PARAM_UPDATE_EVT, DEFAULT_PARAM_UPDATE_DELAY);
|
|||
|
|
|
|||
|
|
// Start RSSI polling
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> RSSI <20><>ѯ
|
|||
|
|
tmos_start_task( centralConnList[connItem].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>1
|
|||
|
|
// else if( connItem == CONNECT1_ITEM )
|
|||
|
|
// {
|
|||
|
|
// }
|
|||
|
|
//
|
|||
|
|
// // <20><><EFBFBD><EFBFBD>2
|
|||
|
|
// else if( connItem == CONNECT2_ITEM )
|
|||
|
|
// {
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
PRINT( "Connected...\n" );
|
|||
|
|
|
|||
|
|
// See if need discover again
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ٴη<D9B4><CEB7><EFBFBD>
|
|||
|
|
// for(connItem=0; connItem<CENTRAL_MAX_CONNECTION; connItem++)
|
|||
|
|
// {
|
|||
|
|
// if( centralConnList[connItem].connHandle == GAP_CONNHANDLE_INIT )
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
// if( connItem < CENTRAL_MAX_CONNECTION )
|
|||
|
|
// {
|
|||
|
|
// PRINT( "Scanning...\n" );
|
|||
|
|
// centralScanRes = 0;
|
|||
|
|
// GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
// DEFAULT_DISCOVERY_ACTIVE_SCAN,
|
|||
|
|
// DEFAULT_DISCOVERY_WHITE_LIST );
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
} //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
PRINT( "Connect Failed...Reason:%X\n",pEvent->gap.hdr.status );
|
|||
|
|
PRINT( "Scanning...\n" );
|
|||
|
|
centralScanRes = 0;
|
|||
|
|
GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
DEFAULT_DISCOVERY_ACTIVE_SCAN,
|
|||
|
|
DEFAULT_DISCOVERY_WHITE_LIST );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case GAP_LINK_TERMINATED_EVENT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹʱ<D6B9><CAB1><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ΪgapTerminateLinkEvent
|
|||
|
|
{
|
|||
|
|
GPIOB_ResetBits(GPIO_Pin_6); //ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӶϿ<D3B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PB6
|
|||
|
|
|
|||
|
|
|
|||
|
|
uint8 connItem;
|
|||
|
|
for( connItem=0; connItem<CENTRAL_MAX_CONNECTION; connItem++ )
|
|||
|
|
{
|
|||
|
|
if( centralConnList[connItem].connHandle == pEvent->linkTerminate.connectionHandle )
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( connItem == CENTRAL_MAX_CONNECTION )
|
|||
|
|
{
|
|||
|
|
// Should not go there
|
|||
|
|
}
|
|||
|
|
PRINT( " %x Disconnected...Reason:%x\n",centralConnList[connItem].connHandle,pEvent->linkTerminate.reason );
|
|||
|
|
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if(memcmp(Device_Info_List->mac, centralConnList[connItem].peerAddr, 6) ==0)
|
|||
|
|
{
|
|||
|
|
GAPRole_CentralEstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձȡ<D5B1><C8A1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
DEFAULT_LINK_WHITE_LIST,
|
|||
|
|
Device_Info_List->addr_type,
|
|||
|
|
Device_Info_List->mac );
|
|||
|
|
PRINT("<EFBFBD><EFBFBD><EFBFBD>ӶϿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴη<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
centralConnList[connItem].state = BLE_STATE_IDLE;
|
|||
|
|
centralConnList[connItem].connHandle = GAP_CONNHANDLE_INIT;
|
|||
|
|
centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
|
|||
|
|
centralConnList[connItem].charHdl = 0;
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
|
|||
|
|
Clear_Connecting_flg(centralConnList[connItem].peerAddr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1><EFBFBD>
|
|||
|
|
|
|||
|
|
memset(centralConnList[connItem].peerAddr, 0, 6); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸MAC<41><43>ַ
|
|||
|
|
centralScanRes = 0;
|
|||
|
|
|
|||
|
|
tmos_stop_task( centralConnList[connItem].taskID, START_READ_RSSI_EVT ); //ֹͣ<CDA3><D6B9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8>RSSIֵ
|
|||
|
|
|
|||
|
|
// PRINT( "Scanning...\n" );
|
|||
|
|
// GAPRole_CentralStartDiscovery( DEFAULT_DISCOVERY_MODE, ////<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
// DEFAULT_DISCOVERY_ACTIVE_SCAN,
|
|||
|
|
// DEFAULT_DISCOVERY_WHITE_LIST );
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case GAP_LINK_PARAM_UPDATE_EVENT: //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD>¼<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ΪGaplingUpdateEvent<6E><74>tmos<6F><73>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("Update %x - Int %x \n", pEvent->linkUpdate.connectionHandle, pEvent->linkUpdate.connInterval);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn pairStateCB
|
|||
|
|
*
|
|||
|
|
* @brief Pairing state callback.
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralPairStateCB( uint16 connHandle, uint8 state, uint8 status )
|
|||
|
|
{
|
|||
|
|
if ( state == GAPBOND_PAIRING_STATE_STARTED ) //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
PRINT( "Connection %04x - Pairing started:%d\n",connHandle, status);
|
|||
|
|
}
|
|||
|
|
else if ( state == GAPBOND_PAIRING_STATE_COMPLETE ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if ( status == SUCCESS )
|
|||
|
|
{
|
|||
|
|
PRINT( "Connection %04x - Pairing success\n",connHandle );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
PRINT( "Connection %04x - Pairing fail\n",connHandle );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if ( state == GAPBOND_PAIRING_STATE_BONDED ) //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if ( status == SUCCESS )
|
|||
|
|
{
|
|||
|
|
PRINT( "Connection %04x - Bonding success\n",connHandle );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (state == GAPBOND_PAIRING_STATE_BOND_SAVED) //<2F><><EFBFBD>Ӽ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>浽 NV flash
|
|||
|
|
{
|
|||
|
|
if (status == SUCCESS)
|
|||
|
|
{
|
|||
|
|
PRINT("Connection %04x - Bond save success\n",connHandle);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
PRINT("Connection %04x - Bond save failed: %d\n",connHandle, status);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralPasscodeCB
|
|||
|
|
*
|
|||
|
|
* @brief Passcode callback.
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle,
|
|||
|
|
uint8 uiInputs, uint8 uiOutputs )
|
|||
|
|
{
|
|||
|
|
uint32 passcode;
|
|||
|
|
|
|||
|
|
// Create random passcode
|
|||
|
|
passcode = tmos_rand( );
|
|||
|
|
passcode %= 1000000;
|
|||
|
|
// Display passcode to user
|
|||
|
|
if ( uiOutputs != 0 )
|
|||
|
|
{
|
|||
|
|
PRINT("Passcode:%d\n",(int)passcode);
|
|||
|
|
}
|
|||
|
|
// Send passcode response
|
|||
|
|
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralConnIistStartDiscovery_0
|
|||
|
|
*
|
|||
|
|
* @brief Start connection 0 service discovery.
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralConnIistStartDiscovery_0( void )
|
|||
|
|
{
|
|||
|
|
uint8 uuid[ATT_BT_UUID_SIZE] = { LO_UINT16(SIMPLEPROFILE_SERV_UUID),
|
|||
|
|
HI_UINT16(SIMPLEPROFILE_SERV_UUID) };
|
|||
|
|
|
|||
|
|
// uint8 uuid[ATT_UUID_SIZE] = { 0xFB,
|
|||
|
|
// 0x34,
|
|||
|
|
// 0x9B,
|
|||
|
|
// 0x5F,
|
|||
|
|
// 0x80,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0x80,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0x10,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0xE0,
|
|||
|
|
// 0xFF,
|
|||
|
|
// 0x00,
|
|||
|
|
// 0x00,
|
|||
|
|
// };
|
|||
|
|
|
|||
|
|
// Initialize cached handles
|
|||
|
|
centralConnList[CONNECT0_ITEM].svcStartHdl = centralConnList[CONNECT0_ITEM].svcEndHdl = centralConnList[CONNECT0_ITEM].charHdl = 0;
|
|||
|
|
|
|||
|
|
centralConnList[CONNECT0_ITEM].discState = BLE_DISC_STATE_SVC;
|
|||
|
|
|
|||
|
|
// Discovery simple BLE service
|
|||
|
|
GATT_DiscPrimaryServiceByUUID( centralConnList[CONNECT0_ITEM].connHandle,
|
|||
|
|
uuid,
|
|||
|
|
ATT_BT_UUID_SIZE,
|
|||
|
|
centralTaskId );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralGATTDiscoveryEvent
|
|||
|
|
*
|
|||
|
|
* @brief Process GATT discovery event
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralGATTDiscoveryEvent( uint8 connItem, gattMsgEvent_t *pMsg )
|
|||
|
|
{
|
|||
|
|
attReadByTypeReq_t req;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>0<EFBFBD><30>ö<EFBFBD><C3B6>
|
|||
|
|
if( connItem == CONNECT0_ITEM)
|
|||
|
|
{
|
|||
|
|
if ( centralConnList[connItem].discState == BLE_DISC_STATE_SVC )
|
|||
|
|
{
|
|||
|
|
// Service found, store handles
|
|||
|
|
if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
|
|||
|
|
pMsg->msg.findByTypeValueRsp.numInfo > 0 )
|
|||
|
|
{
|
|||
|
|
centralConnList[connItem].svcStartHdl = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
|
|||
|
|
centralConnList[connItem].svcEndHdl = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
|
|||
|
|
//GPIOB_SetBits(GPIO_Pin_6); //ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// Display Profile Service handle range
|
|||
|
|
PRINT("Found Profile Service handle : %x ~ %x \n",centralConnList[connItem].svcStartHdl,centralConnList[connItem].svcEndHdl);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
// If procedure complete
|
|||
|
|
if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
|
|||
|
|
pMsg->hdr.status == bleProcedureComplete ) ||
|
|||
|
|
( pMsg->method == ATT_ERROR_RSP ) )
|
|||
|
|
{
|
|||
|
|
if ( centralConnList[connItem].svcStartHdl != 0 )
|
|||
|
|
{
|
|||
|
|
// Discover characteristic
|
|||
|
|
centralConnList[connItem].discState = BLE_DISC_STATE_CHAR;
|
|||
|
|
req.startHandle = centralConnList[connItem].svcStartHdl;
|
|||
|
|
req.endHandle = centralConnList[connItem].svcEndHdl;
|
|||
|
|
req.type.len = ATT_BT_UUID_SIZE;
|
|||
|
|
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
|
|||
|
|
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);
|
|||
|
|
// req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID);
|
|||
|
|
// req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID);
|
|||
|
|
PRINT("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
|
GATT_ReadUsingCharUUID( centralConnList[connItem].connHandle, &req, centralTaskId );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if ( centralConnList[connItem].discState == BLE_DISC_STATE_CHAR )
|
|||
|
|
{
|
|||
|
|
PRINT("pMsg->method:%d pMsg->msg.readByTypeRsp.numPairs:%d\n", pMsg->method, pMsg->msg.readByTypeRsp.numPairs);
|
|||
|
|
// Characteristic found, store handle
|
|||
|
|
if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&
|
|||
|
|
pMsg->msg.readByTypeRsp.numPairs > 0 )
|
|||
|
|
{
|
|||
|
|
centralConnList[connItem].charHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.pDataList[0],
|
|||
|
|
pMsg->msg.readByTypeRsp.pDataList[1] );
|
|||
|
|
centralConnList[connItem].procedureInProgress = FALSE;
|
|||
|
|
|
|||
|
|
// Start do read or write
|
|||
|
|
//tmos_start_task( centralConnList[connItem].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
|
|||
|
|
|
|||
|
|
// Display Characteristic 1 handle
|
|||
|
|
PRINT("Found Characteristic 1 handle : %x \n",centralConnList[0].charHdl);
|
|||
|
|
}
|
|||
|
|
centralConnList[connItem].discState = BLE_DISC_STATE_IDLE;
|
|||
|
|
//GPIOB_ResetBits(GPIO_Pin_6); //ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>PB6<42><36>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// ble_send_info.sendDATA[0] = 0x01;
|
|||
|
|
// ble_send_info.sendDATA[1] = 0x00; //<2F><><EFBFBD><EFBFBD>֪ͨ
|
|||
|
|
// ble_send_info.sendLEN = 2;
|
|||
|
|
// ble_send_info.char_handle = 0x2D; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
// //PRINT("ble_send_info.char_handle:%X\n", ble_send_info.char_handle);
|
|||
|
|
// tmos_start_task( centralConnList[connItem].taskID, START_READ_OR_WRITE_EVT, 243);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31>ö<EFBFBD><C3B6>
|
|||
|
|
else if( connItem == CONNECT1_ITEM)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32>ö<EFBFBD><C3B6>
|
|||
|
|
else if( connItem == CONNECT2_ITEM)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralAddDeviceInfo
|
|||
|
|
*
|
|||
|
|
* @brief Add a device to the device discovery result list
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static void centralAddDeviceInfo( uint8 *pAddr, uint8 addrType )
|
|||
|
|
{
|
|||
|
|
uint8 i;
|
|||
|
|
|
|||
|
|
// If result count not at max
|
|||
|
|
if ( centralScanRes < DEFAULT_MAX_SCAN_RES ) //С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|||
|
|
{
|
|||
|
|
// Check if device is already in scan results
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for ( i = 0; i < centralScanRes; i++ )
|
|||
|
|
{
|
|||
|
|
if ( tmos_memcmp( pAddr, centralDevList[i].addr , B_ADDR_LEN ) )
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Add addr to scan result list
|
|||
|
|
tmos_memcpy( centralDevList[centralScanRes].addr, pAddr, B_ADDR_LEN );
|
|||
|
|
centralDevList[centralScanRes].addrType = addrType;
|
|||
|
|
// Increment scan result count
|
|||
|
|
centralScanRes++;
|
|||
|
|
// Display device addr
|
|||
|
|
PRINT("Device %d - Addr %02x %02x %02x %02x %02x %02x \n",centralScanRes,
|
|||
|
|
centralDevList[centralScanRes-1].addr[0],
|
|||
|
|
centralDevList[centralScanRes-1].addr[1],
|
|||
|
|
centralDevList[centralScanRes-1].addr[2],
|
|||
|
|
centralDevList[centralScanRes-1].addr[3],
|
|||
|
|
centralDevList[centralScanRes-1].addr[4],
|
|||
|
|
centralDevList[centralScanRes-1].addr[5]);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
* @fn centralAddrCmp
|
|||
|
|
*
|
|||
|
|
* @brief none
|
|||
|
|
*
|
|||
|
|
* @return none
|
|||
|
|
*/
|
|||
|
|
static uint8 centralAddrCmp(/* peerAddrDefItem_t *PeerAddrDef, */uint8 *addr )
|
|||
|
|
{
|
|||
|
|
// uint8 i;
|
|||
|
|
// for(i=0; i<CENTRAL_MAX_CONNECTION; i++)
|
|||
|
|
// {
|
|||
|
|
// if ( tmos_memcmp( PeerAddrDef[i].peerAddr, addr , B_ADDR_LEN ) )
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
// if( i == CENTRAL_MAX_CONNECTION )
|
|||
|
|
// {
|
|||
|
|
// return FALSE;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// return TRUE;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if( tmos_memcmp( Device_Info_List->mac, addr , B_ADDR_LEN ) && Device_Info_List->connecting == CENTRAL_IDLE) //<2F><>ַƥ<D6B7><C6A5><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//PRINT("<22>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD><D3A6>mac<61><63>ַ\n");
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Device_Add_List(BLE_DEVICE_CONFIG* Device_node)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if(Device_node == NULL) return; //δ<><CEB4><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD>
|
|||
|
|
// BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //ͷ<>ڵ<EFBFBD>
|
|||
|
|
// while(Device_Info_List) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>,ֱ<><D6B1><EFBFBD>ҵ<EFBFBD><D2B5>յ<EFBFBD>Ϊֹ
|
|||
|
|
// {
|
|||
|
|
// if(Device_Info_List->device_type == Device_node->device_type && Device_Info_List->device_addr == Device_node->device_addr) return; //<2F><><EFBFBD>͵<EFBFBD>ַ<EFBFBD><D6B7>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
// }
|
|||
|
|
Device_node->next = Ble_Device_Head;
|
|||
|
|
Ble_Device_Head = Device_node;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/************************************************
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IS_Empty_Connection
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ѯָ<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>device_type: <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD> device_addr<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ
|
|||
|
|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>0:δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; 1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; 4:<EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**************************************************/
|
|||
|
|
|
|||
|
|
uint8 IS_Empty_Connection(u8 device_type, u8 device_addr)
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //ͷ<>ڵ<EFBFBD>
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->device_type == device_type && Device_Info_List->device_addr == device_addr) //Ѱ<>Ҷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>豸
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
for( ; i < CENTRAL_MAX_CONNECTION; i++)
|
|||
|
|
{
|
|||
|
|
if( memcmp(Device_Info_List->mac, centralConnList[i].peerAddr, 6) == 0)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( i == CENTRAL_MAX_CONNECTION ) //<2F>豸δ<E8B1B8><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
return 0;
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
return BLE_ERR_DEVICE_Not_EXIST; //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/************************************************
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Connect_Peripheral_Device
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>device_type: <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD> device_addr<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ
|
|||
|
|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>BLE_ERR_WAITING_CONNECT:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; BLE_ERR_DEVICE_Not_EXIST:<EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ; BLE_ERR_INVALID:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
**************************************************/
|
|||
|
|
uint8 Connect_Peripheral_Device(u8 device_type, u8 device_addr)
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //ͷ<>ڵ<EFBFBD>
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->device_type == device_type && Device_Info_List->device_addr == device_addr) //Ѱ<>Ҷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>豸
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
for( ; i < CENTRAL_MAX_CONNECTION; i++)
|
|||
|
|
{
|
|||
|
|
if( memcmp(Device_Info_List->mac, centralConnList[i].peerAddr, 6) == 0)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( i == CENTRAL_MAX_CONNECTION ) //<2F>豸δ<E8B1B8><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if ( centralScanRes < DEFAULT_MAX_SCAN_RES ) //С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|||
|
|
{
|
|||
|
|
// Check if device is already in scan results
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int j = 0;
|
|||
|
|
for ( ; j < centralScanRes; j++ )
|
|||
|
|
{
|
|||
|
|
if ( tmos_memcmp( Device_Info_List->mac, centralDevList[j].addr , B_ADDR_LEN ) )
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(j == centralScanRes) //ɨ<><C9A8><EFBFBD>豸<EFBFBD>б<EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>豸
|
|||
|
|
{
|
|||
|
|
return BLE_ERR_DEVICE_Not_EXIST;
|
|||
|
|
}
|
|||
|
|
else //
|
|||
|
|
{
|
|||
|
|
GAPRole_CentralEstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձȡ<D5B1><C8A1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
DEFAULT_LINK_WHITE_LIST,
|
|||
|
|
centralDevList[j].addrType,
|
|||
|
|
centralDevList[j].addr );
|
|||
|
|
|
|||
|
|
// Start establish link timeout event
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
|
|||
|
|
tmos_start_task( centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
|
|||
|
|
PRINT( "Connecting...\n" );
|
|||
|
|
return BLE_ERR_WAITING_CONNECT; //״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return BLE_ERR_INVALID; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
return BLE_ERR_DEVICE_Not_EXIST;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/************************************************
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Disconnect_Peripheral_Device
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD>ã<EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>device_type: <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD> device_addr<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ
|
|||
|
|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
|
**************************************************/
|
|||
|
|
uint8 Disconnect_Peripheral_Device(u8 device_type, u8 device_addr)
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //ͷ<>ڵ<EFBFBD>
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->device_type == device_type && Device_Info_List->device_addr == device_addr) //Ѱ<>Ҷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>豸
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
for( ; i < CENTRAL_MAX_CONNECTION; i++)
|
|||
|
|
{
|
|||
|
|
if( memcmp(Device_Info_List->mac, centralConnList[i].peerAddr, 6) == 0)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( i == CENTRAL_MAX_CONNECTION ) //<2F>豸δ<E8B1B8><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return BLE_ERR_INVALID; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
|
}
|
|||
|
|
else //<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
GAPRole_TerminateLink(centralConnList[i].connHandle); //<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return BLE_ERR_SUCCESS; //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
return BLE_ERR_DEVICE_Not_EXIST;
|
|||
|
|
}
|
|||
|
|
/************************************************
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Peripheral_Notify_Control
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵġ<EFBFBD><EFBFBD>ӻ<EFBFBD>NOTIFY
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>device_type: <EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD> device_addr<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>state :0 <EFBFBD>ر<EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ,notify_id: ֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|||
|
|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**************************************************/
|
|||
|
|
void Peripheral_Notify_Control(u8 device_type, u8 device_addr, u8 notify_id, u8 state)
|
|||
|
|
{
|
|||
|
|
if(state != 0)
|
|||
|
|
{
|
|||
|
|
SRAM_Write_Byte(0x01, ble_send_info.BLE_SendAddr+1); //<2F><><EFBFBD><EFBFBD>֪ͨ
|
|||
|
|
}
|
|||
|
|
else SRAM_Write_Byte(0x00, ble_send_info.BLE_SendAddr+1); //<2F>ر<EFBFBD>֪ͨ
|
|||
|
|
SRAM_Write_Byte(0x01, ble_send_info.BLE_SendAddr+2);
|
|||
|
|
SRAM_Write_Byte(2, ble_send_info.BLE_SendAddr); //<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
|
|||
|
|
ble_send_info.device_type = device_type; //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|||
|
|
ble_send_info.device_addr = device_addr; //<2F>豸<EFBFBD><E8B1B8>ַ
|
|||
|
|
ble_send_info.data_type = BLE_DATA_TYPE_CMD; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ble_send_info.ble_type = BLE_TYPE_PERIPHERAL; //Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>ӻ<EFBFBD>
|
|||
|
|
ble_send_info.notify_id = notify_id; //<2F><><EFBFBD><EFBFBD>id
|
|||
|
|
ble_send_info.send_flg = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Set_Connecting_flg(u8* addr)
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if( tmos_memcmp( Device_Info_List->mac, addr, B_ADDR_LEN )) //<2F><>ַƥ<D6B7><C6A5>
|
|||
|
|
{
|
|||
|
|
//PRINT("<22>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD><D3A6>mac<61><63>ַ\n");
|
|||
|
|
Device_Info_List->connecting = CENTRAL_CONNECTING; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD>־
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Clear_Connecting_flg(u8* addr)
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if( tmos_memcmp( Device_Info_List->mac, addr, B_ADDR_LEN )) //<2F><>ַƥ<D6B7><C6A5>
|
|||
|
|
{
|
|||
|
|
//PRINT("<22>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD><D3A6>mac<61><63>ַ\n");
|
|||
|
|
Device_Info_List->connecting = CENTRAL_IDLE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD>־
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/************************************************
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>BLE_Send_Task
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
**************************************************/
|
|||
|
|
void BLE_Send_Task()
|
|||
|
|
{
|
|||
|
|
uint8_t len = SRAM_Read_Byte(ble_send_info.BLE_SendAddr);
|
|||
|
|
if(ble_send_info.send_flg == 1 && len > 0 && len <= BLE_BUFF_MAX_LEN)
|
|||
|
|
{
|
|||
|
|
if(ble_send_info.ble_type == BLE_TYPE_CENTRAL) //Ŀ<><C4BF>BLE<4C>豸Ϊ<E8B1B8><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT) //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
uint8* data = malloc(len);
|
|||
|
|
if(data == NULL) return;
|
|||
|
|
SRAM_Read_Buff(data, len, ble_send_info.BLE_SendAddr +1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// peripheralChar4Notify(data, len); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ̶<DDB9>ʹ<EFBFBD><CAB9> <20><><EFBFBD><EFBFBD>4<EFBFBD><34>NOTIFY
|
|||
|
|
free(data);
|
|||
|
|
ble_send_info.send_state = BLE_ERR_SUCCESS; //<2F><><EFBFBD>ͳɹ<CDB3>
|
|||
|
|
}
|
|||
|
|
// else
|
|||
|
|
{
|
|||
|
|
ble_send_info.send_state = BLE_ERR_DEVICE_Not_EXIST; //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
// ble_send_info.send_flg = 0;
|
|||
|
|
}
|
|||
|
|
else //Ŀ<><C4BF>BLE<4C>豸Ϊ<E8B1B8>ӻ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
BLE_DEVICE_CONFIG* Device_Info_List = Ble_Device_Head; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ͷ<EFBFBD>巨
|
|||
|
|
while(Device_Info_List)
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->device_type == ble_send_info.device_type && Device_Info_List->device_addr == ble_send_info.device_addr) //Ѱ<>Ҷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>豸
|
|||
|
|
{
|
|||
|
|
// <20><>ѯ<EFBFBD><D1AF><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int i = 0;
|
|||
|
|
for( ; i < CENTRAL_MAX_CONNECTION; i++)
|
|||
|
|
{
|
|||
|
|
if( memcmp(Device_Info_List->mac, centralConnList[i].peerAddr, 6) == 0)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if( i == CENTRAL_MAX_CONNECTION ) //<2F>豸δ<E8B1B8><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// if ( centralScanRes < DEFAULT_MAX_SCAN_RES ) //С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|||
|
|
{
|
|||
|
|
// Check if device is already in scan results
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// int j = 0;
|
|||
|
|
// for ( ; j < centralScanRes; j++ )
|
|||
|
|
// {
|
|||
|
|
// if ( tmos_memcmp( Device_Info_List->mac, centralDevList[j].addr , B_ADDR_LEN ) )
|
|||
|
|
// {
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// if(j == centralScanRes) //ɨ<><C9A8><EFBFBD>豸<EFBFBD>б<EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>豸
|
|||
|
|
// {
|
|||
|
|
// ble_send_info.send_state = BLE_ERR_DEVICE_Not_EXIST; //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// ble_send_info.send_flg = 0;
|
|||
|
|
// }
|
|||
|
|
// else //
|
|||
|
|
{
|
|||
|
|
if(ble_send_info.wait_connected == 1) //<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// ble_send_info.wait_count++; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
|
//
|
|||
|
|
// if(ble_send_info.wait_count < 1000)
|
|||
|
|
// {
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
// else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ʱ
|
|||
|
|
// {
|
|||
|
|
// ble_send_info.wait_count = 0;
|
|||
|
|
// ble_send_info.wait_connected = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӱ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
|||
|
|
// ble_send_info.send_flg = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־
|
|||
|
|
// ble_send_info.send_state = BLE_ERR_CONNECT_FAIL; //״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// GAPRole_CentralEstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձȡ<D5B1><C8A1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
// DEFAULT_LINK_WHITE_LIST,
|
|||
|
|
// centralDevList[j].addrType,
|
|||
|
|
// centralDevList[j].addr );
|
|||
|
|
GAPRole_CentralEstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ɨ<EFBFBD><C9A8>ռ<EFBFBD>ձȡ<D5B1><C8A1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|||
|
|
DEFAULT_LINK_WHITE_LIST,
|
|||
|
|
Device_Info_List->addr_type,
|
|||
|
|
Device_Info_List->mac );
|
|||
|
|
Set_Connecting_flg(Device_Info_List->mac); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// Start establish link timeout event
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
|
|||
|
|
tmos_start_task( centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT);
|
|||
|
|
ble_send_info.send_state = BLE_ERR_WAITING_CONNECT; //״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ble_send_info.send_flg = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־
|
|||
|
|
ble_send_info.wait_connected = 1; //<2F><><EFBFBD>ǵȴ<C7B5><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
PRINT( "Connecting...\n" );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else //<2F>豸<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
ble_send_info.wait_connected = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӱ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
|
|||
|
|
ble_send_info.wait_count = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(ble_send_info.wait_send == 1) //<2F><>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// attWriteReq_t req;
|
|||
|
|
// req.cmd = FALSE;
|
|||
|
|
// req.sig = FALSE;
|
|||
|
|
// req.handle = centralConnList[i].charHdl; //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>uuid
|
|||
|
|
// //req.handle = ble_send_info.char_uuid; //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>uuid
|
|||
|
|
// req.len = ble_send_info.sendLEN; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
// req.pValue = GATT_bm_alloc(centralConnList[i].connHandle, ATT_WRITE_REQ, req.len, NULL, 0);
|
|||
|
|
// if ( req.pValue != NULL )
|
|||
|
|
// {
|
|||
|
|
// memcpy(req.pValue, ble_send_info.sendDATA, ble_send_info.sendLEN); //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//
|
|||
|
|
// if( GATT_WriteCharValue(centralConnList[i].connHandle, &req, /*centralTaskId*/centralConnList[i].taskID) == SUCCESS ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// {
|
|||
|
|
//// centralConnList[i].procedureInProgress = TRUE;
|
|||
|
|
//// tmos_start_task( centralConnList[CONNECT0_ITEM].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
|
|||
|
|
// ble_send_info.send_state = BLE_ERR_SUCCESS; //<2F><><EFBFBD>ͳɹ<CDB3>
|
|||
|
|
// ble_send_info.send_flg = 0;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// ble_send_info.send_state = BLE_ERR_SEND_FAIL; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
// ble_send_info.send_flg = 0;
|
|||
|
|
// GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
|
|||
|
|
PRINT( "<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d\n", i);
|
|||
|
|
centralConnList[i].procedureInProgress = FALSE;
|
|||
|
|
if(ble_send_info.data_type == BLE_DATA_TYPE_CMD) //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->uuid_type == UUID_TYPE_128BIT) //128bit
|
|||
|
|
{
|
|||
|
|
UINT8 uuid_128bit[16] = { 0x9E,0xCA,0xDC,0x24,0x0E,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xE0,0xFE,0x00,0x00 }; //128bit<69><74><EFBFBD><EFBFBD>UUID
|
|||
|
|
if(memcmp(Device_Info_List->uuid_128bit, uuid_128bit, 16) == 0)
|
|||
|
|
{
|
|||
|
|
switch(ble_send_info.notify_id)
|
|||
|
|
{
|
|||
|
|
case 0: ble_send_info.char_handle = 0x10; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>1<EFBFBD><31>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
case 1: ble_send_info.char_handle = 0x15; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>2<EFBFBD><32>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
default: break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
PRINT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<EFBFBD><EFBFBD>0x%X\n", ble_send_info.char_handle);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch(Device_Info_List->server_uuid)
|
|||
|
|
{
|
|||
|
|
case SIMPLEPROFILE_SERV_UUID: //0xFFE0
|
|||
|
|
switch(ble_send_info.notify_id)
|
|||
|
|
{
|
|||
|
|
case 0: ble_send_info.char_handle = 0x2d; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>CCC<43><43><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
break;
|
|||
|
|
default: break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default: break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if(Device_Info_List->uuid_type == UUID_TYPE_128BIT) //128bit
|
|||
|
|
{
|
|||
|
|
UINT8 uuid_128bit[16] = { 0x9E,0xCA,0xDC,0x24,0x0E,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xE0,0xFE,0x00,0x00 }; //128bit<69><74><EFBFBD><EFBFBD>UUID
|
|||
|
|
if(memcmp(Device_Info_List->uuid_128bit, uuid_128bit, 16) == 0)
|
|||
|
|
{
|
|||
|
|
ble_send_info.char_handle = 0x0D; //д<><D0B4><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch(Device_Info_List->server_uuid)
|
|||
|
|
{
|
|||
|
|
case SIMPLEPROFILE_SERV_UUID: //0xFFE0
|
|||
|
|
ble_send_info.char_handle = 0x23; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default: break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
tmos_start_task( centralConnList[i].taskID, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
|
|||
|
|
|
|||
|
|
|
|||
|
|
ble_send_info.send_state = BLE_ERR_WAITING_SEND; //״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>
|
|||
|
|
ble_send_info.wait_send = 1; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
Device_Info_List = Device_Info_List->next; //Ѱ<><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
if(Device_Info_List == NULL)
|
|||
|
|
{
|
|||
|
|
ble_send_info.send_state = BLE_ERR_DEVICE_Not_EXIST; //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>豸
|
|||
|
|
ble_send_info.send_flg = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ble_send_info.send_flg = 0;
|
|||
|
|
if(ble_send_info.send_state != BLE_ERR_SUCCESS)
|
|||
|
|
{
|
|||
|
|
PRINT("BLE_STA:%d\n", ble_send_info.send_state);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/************************ endfile @ central **************************/
|