Files
BLV_C1F_Module/BasicCode/Drive/BLE/multiCentral.c

1621 lines
56 KiB
C
Raw Normal View History

/********************************** (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, &centralBondCB, &centralRoleCB );
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 **************************/