updated example name”
This commit is contained in:
@@ -0,0 +1,934 @@
|
||||
/**************************************************************************************************
|
||||
Filename: simpleBLEPeripheral.c
|
||||
Revised: $Date: 2010-08-06 08:56:11 -0700 (Fri, 06 Aug 2010) $
|
||||
Revision: $Revision: 23333 $
|
||||
|
||||
Description: This file contains the Simple BLE Peripheral sample application
|
||||
for use with the CC2540 Bluetooth Low Energy Protocol Stack.
|
||||
|
||||
Copyright 2010 - 2013 Texas Instruments Incorporated. All rights reserved.
|
||||
|
||||
IMPORTANT: Your use of this Software is limited to those specific rights
|
||||
granted under the terms of a software license agreement between the user
|
||||
who downloaded the software, his/her employer (which must be your employer)
|
||||
and Texas Instruments Incorporated (the "License"). You may not use this
|
||||
Software unless you agree to abide by the terms of the License. The License
|
||||
limits your use, and you acknowledge, that the Software may not be modified,
|
||||
copied or distributed unless embedded on a Texas Instruments microcontroller
|
||||
or used solely and exclusively in conjunction with a Texas Instruments radio
|
||||
frequency transceiver, which is integrated into your product. Other than for
|
||||
the foregoing purpose, you may not use, reproduce, copy, prepare derivative
|
||||
works of, modify, distribute, perform, display or sell this Software and/or
|
||||
its documentation for any purpose.
|
||||
|
||||
YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
|
||||
PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
|
||||
NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
|
||||
TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
|
||||
NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
|
||||
LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
|
||||
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
|
||||
OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
|
||||
OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
|
||||
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
|
||||
|
||||
Should you have any questions regarding your right to use this Software,
|
||||
contact Texas Instruments Incorporated at www.TI.com.
|
||||
**************************************************************************************************/
|
||||
|
||||
/*********************************************************************
|
||||
* INCLUDES
|
||||
*/
|
||||
|
||||
#include "bcomdef.h"
|
||||
#include "OSAL.h"
|
||||
#include "OSAL_PwrMgr.h"
|
||||
|
||||
#include "OnBoard.h"
|
||||
#include "hal_adc.h"
|
||||
#include "hal_led.h"
|
||||
#include "hal_key.h"
|
||||
#include "hal_lcd.h"
|
||||
|
||||
#include "gatt.h"
|
||||
|
||||
#include "hci.h"
|
||||
|
||||
#include "gapgattserver.h"
|
||||
#include "gattservapp.h"
|
||||
#include "devinfoservice.h"
|
||||
#include "simpleGATTprofile.h"
|
||||
|
||||
#if defined( CC2540_MINIDK )
|
||||
#include "simplekeys.h"
|
||||
#endif
|
||||
|
||||
#if defined ( PLUS_BROADCASTER )
|
||||
#include "peripheralBroadcaster.h"
|
||||
#else
|
||||
#include "peripheral.h"
|
||||
#endif
|
||||
|
||||
#include "gapbondmgr.h"
|
||||
|
||||
#include "simpleBLEPeripheral.h"
|
||||
|
||||
#if defined FEATURE_OAD
|
||||
#include "oad.h"
|
||||
#include "oad_target.h"
|
||||
#endif
|
||||
|
||||
#include "simpleble.h"
|
||||
#include "npi.h"
|
||||
|
||||
/*********************************************************************
|
||||
* MACROS
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* CONSTANTS
|
||||
*/
|
||||
|
||||
|
||||
// What is the advertising interval when device is discoverable (units of 625us, 160=100ms)
|
||||
#define DEFAULT_ADVERTISING_INTERVAL 160
|
||||
|
||||
// Limited discoverable mode advertises for 30.72s, and then stops
|
||||
// General discoverable mode advertises indefinitely
|
||||
|
||||
#if defined ( CC2540_MINIDK )
|
||||
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_LIMITED
|
||||
#else
|
||||
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
|
||||
#endif // defined ( CC2540_MINIDK )
|
||||
|
||||
// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
|
||||
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80
|
||||
|
||||
// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
|
||||
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800
|
||||
|
||||
// Slave latency to use if automatic parameter update request is enabled
|
||||
#define DEFAULT_DESIRED_SLAVE_LATENCY 0
|
||||
|
||||
// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
|
||||
#define DEFAULT_DESIRED_CONN_TIMEOUT 1000
|
||||
|
||||
// Whether to enable automatic parameter update request when a connection is formed
|
||||
#define DEFAULT_ENABLE_UPDATE_REQUEST TRUE
|
||||
|
||||
// Connection Pause Peripheral time value (in seconds)
|
||||
#define DEFAULT_CONN_PAUSE_PERIPHERAL 3
|
||||
|
||||
// Company Identifier: Texas Instruments Inc. (13)
|
||||
#define TI_COMPANY_ID 0x000D
|
||||
|
||||
#define INVALID_CONNHANDLE 0xFFFF
|
||||
|
||||
#if defined ( PLUS_BROADCASTER )
|
||||
#define ADV_IN_CONN_WAIT 500 // delay 500 ms
|
||||
#endif
|
||||
|
||||
/*********************************************************************
|
||||
* TYPEDEFS
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* GLOBAL VARIABLES
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* EXTERNAL VARIABLES
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* EXTERNAL FUNCTIONS
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* LOCAL VARIABLES
|
||||
*/
|
||||
uint8 simpleBLEPeripheral_TaskID; // Task ID for internal task/event processing
|
||||
|
||||
gaprole_States_t gapProfileState = GAPROLE_INIT;
|
||||
|
||||
bool simpleBLEChar6DoWrite2 = TRUE;
|
||||
|
||||
// GAP - Advertisement data (max size = 31 bytes, though this is
|
||||
// best kept short to conserve power while advertisting)
|
||||
static uint8 advertData[] =
|
||||
{
|
||||
// Flags; this sets the device to use limited discoverable
|
||||
// mode (advertises for 30 seconds at a time) instead of general
|
||||
// discoverable mode (advertises indefinitely)
|
||||
0x02, // length of this data
|
||||
GAP_ADTYPE_FLAGS,
|
||||
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
|
||||
|
||||
// service UUID, to notify central devices what services are included
|
||||
// in this peripheral
|
||||
0x03, // length of this data
|
||||
GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
|
||||
LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
|
||||
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
|
||||
|
||||
};
|
||||
|
||||
// GAP - Advertisement data (max size = 31 bytes, though this is
|
||||
// best kept short to conserve power while advertisting)
|
||||
static uint8 advertData_iBeacon[] =
|
||||
{
|
||||
// Flags; this sets the device to use limited discoverable
|
||||
// mode (advertises for 30 seconds at a time) instead of general
|
||||
// discoverable mode (advertises indefinitely)
|
||||
0x02, // length of this data
|
||||
GAP_ADTYPE_FLAGS,
|
||||
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
|
||||
|
||||
// in this peripheral
|
||||
0x1A, // length of this data 26byte
|
||||
GAP_ADTYPE_MANUFACTURER_SPECIFIC,
|
||||
/*Apple Pre-Amble*/
|
||||
0x4C,
|
||||
0x00,
|
||||
0x02,
|
||||
0x15,
|
||||
/*Device UUID (16 Bytes)*/
|
||||
0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48,0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0,
|
||||
/*Major Value (2 Bytes)*/
|
||||
0x00, 0x01,
|
||||
|
||||
/*Minor Value (2 Bytes)*/
|
||||
0x00,0x02,
|
||||
|
||||
/*Measured Power*/
|
||||
0xCD
|
||||
};
|
||||
//static int8 gMP = 0xCD;
|
||||
// GAP GATT Attributes
|
||||
|
||||
// GAP GATT Attributes
|
||||
//static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple BLE Peripheral";
|
||||
|
||||
/*********************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
*/
|
||||
static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg );
|
||||
static void peripheralStateNotificationCB( gaprole_States_t newState );
|
||||
static void peripheralRssiReadCB( int8 rssi );
|
||||
static void simpleProfileChangeCB( uint8 paramID );
|
||||
|
||||
//#if defined( BLE_BOND_PAIR )
|
||||
typedef enum
|
||||
{
|
||||
BOND_PAIR_STATUS_PAIRING,
|
||||
BOND_PAIR_STATUS_PAIRED,
|
||||
}BOND_PAIR_STATUS;
|
||||
|
||||
static BOND_PAIR_STATUS gPairStatus = BOND_PAIR_STATUS_PAIRING;
|
||||
|
||||
void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs );
|
||||
static void ProcessPairStateCB( uint16 connHandle, uint8 state, uint8 status );
|
||||
//#endif
|
||||
|
||||
#if defined( CC2540_MINIDK )
|
||||
static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys );
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* PROFILE CALLBACKS
|
||||
*/
|
||||
|
||||
// GAP Role Callbacks
|
||||
static gapRolesCBs_t simpleBLEPeripheral_PeripheralCBs =
|
||||
{
|
||||
peripheralStateNotificationCB, // Profile State Change Callbacks
|
||||
peripheralRssiReadCB, // When a valid RSSI is read from controller (not used by application)
|
||||
};
|
||||
|
||||
// GAP Bond Manager Callbacks
|
||||
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
|
||||
{
|
||||
//#if defined( BLE_BOND_PAIR )
|
||||
ProcessPasscodeCB,
|
||||
ProcessPairStateCB
|
||||
//#else
|
||||
// NULL, // Passcode callback (not used by application)
|
||||
// NULL // Pairing / Bonding state Callback (not used by application)
|
||||
//#endif
|
||||
};
|
||||
|
||||
// Simple GATT Profile Callbacks
|
||||
static simpleProfileCBs_t simpleBLEPeripheral_SimpleProfileCBs =
|
||||
{
|
||||
simpleProfileChangeCB // Charactersitic value change callback
|
||||
};
|
||||
|
||||
/*********************************************************************
|
||||
* PUBLIC FUNCTIONS
|
||||
*/
|
||||
|
||||
/*********************************************************************
|
||||
* @fn SimpleBLEPeripheral_Init
|
||||
*
|
||||
* @brief Initialization function for the Simple BLE Peripheral App Task.
|
||||
* This is called during initialization and should contain
|
||||
* any application specific initialization (ie. hardware
|
||||
* initialization/setup, table initialization, power up
|
||||
* notificaiton ... ).
|
||||
*
|
||||
* @param task_id - the ID assigned by OSAL. This ID should be
|
||||
* used to send messages and set timers.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
void SimpleBLEPeripheral_Init( uint8 task_id )
|
||||
{
|
||||
simpleBLEPeripheral_TaskID = task_id;
|
||||
|
||||
// Setup the GAP
|
||||
VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );
|
||||
|
||||
// Setup the GAP Peripheral Role Profile
|
||||
{
|
||||
#if defined( CC2540_MINIDK )
|
||||
// For the CC2540DK-MINI keyfob, device doesn't start advertising until button is pressed
|
||||
uint8 initial_advertising_enable = FALSE;
|
||||
#else
|
||||
// For other hardware platforms, device starts advertising upon initialization
|
||||
uint8 initial_advertising_enable = TRUE;
|
||||
#endif
|
||||
|
||||
// By setting this to zero, the device will go into the waiting state after
|
||||
// being discoverable for 30.72 second, and will not being advertising again
|
||||
// until the enabler is set back to TRUE
|
||||
uint16 gapRole_AdvertOffTime = 0;
|
||||
|
||||
uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
|
||||
uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
|
||||
uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
|
||||
uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
|
||||
uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;
|
||||
|
||||
// Set the GAP Role Parameters
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
|
||||
#if 0
|
||||
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
|
||||
#else
|
||||
{
|
||||
uint8 AttDeviceNameLen = osal_strlen((char*)GetAttDeviceName());
|
||||
uint8 pSscanRspDataLen = ( 11 + AttDeviceNameLen);
|
||||
uint8 *pSscanRspData = osal_mem_alloc(pSscanRspDataLen);
|
||||
if(pSscanRspData)
|
||||
{
|
||||
uint8 index = 0;
|
||||
|
||||
pSscanRspData[0] = AttDeviceNameLen + 1;
|
||||
pSscanRspData[1] = GAP_ADTYPE_LOCAL_NAME_COMPLETE;
|
||||
osal_memcpy(&pSscanRspData[2], GetAttDeviceName(), AttDeviceNameLen);
|
||||
|
||||
index = 2 + AttDeviceNameLen;
|
||||
|
||||
pSscanRspData[index+0] = 0x05;
|
||||
pSscanRspData[index+1] = GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE;
|
||||
pSscanRspData[index+2] = LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ); // 100ms
|
||||
pSscanRspData[index+3] = HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL );
|
||||
pSscanRspData[index+4] = LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ); // 1s
|
||||
pSscanRspData[index+5] = HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL );
|
||||
|
||||
// Tx power level
|
||||
pSscanRspData[index+6] = 0x02; // length of this data
|
||||
pSscanRspData[index+7] = GAP_ADTYPE_POWER_LEVEL;
|
||||
pSscanRspData[index+8] = 0; // 0dBm
|
||||
|
||||
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, pSscanRspDataLen, pSscanRspData );
|
||||
|
||||
osal_mem_free(pSscanRspData);
|
||||
}
|
||||
else
|
||||
{
|
||||
HalLcdWriteString( "ERR:pSscanRspData", HAL_LCD_LINE_1 );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if(CheckIfUse_iBeacon())
|
||||
{
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData_iBeacon ), advertData_iBeacon );
|
||||
}
|
||||
else
|
||||
{
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
|
||||
}
|
||||
|
||||
GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
|
||||
GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
|
||||
GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
|
||||
GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
|
||||
GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
|
||||
}
|
||||
|
||||
// Set the GAP Characteristics
|
||||
//GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );
|
||||
GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, GetAttDeviceName() );
|
||||
|
||||
// Set advertising interval
|
||||
{
|
||||
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;
|
||||
|
||||
if(CheckIfUse_iBeacon())
|
||||
{
|
||||
advInt = Get_iBeaconAdvertisingInterral();
|
||||
advInt = (advInt*1000 / 625);
|
||||
}
|
||||
|
||||
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
|
||||
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
|
||||
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
|
||||
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
|
||||
}
|
||||
|
||||
// Setup the GAP Bond Manager
|
||||
{
|
||||
uint32 passkey = 0; // passkey "000000"
|
||||
uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
|
||||
uint8 mitm = TRUE;
|
||||
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
|
||||
uint8 bonding = TRUE;
|
||||
|
||||
//#if defined( BLE_BOND_PAIR )
|
||||
if(simpleBle_GetIfNeedPassword())
|
||||
{
|
||||
pairMode = GAPBOND_PAIRING_MODE_INITIATE;
|
||||
bonding = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
|
||||
bonding = TRUE;
|
||||
}
|
||||
//#endif
|
||||
|
||||
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
|
||||
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
|
||||
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
|
||||
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
|
||||
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
|
||||
}
|
||||
|
||||
// Initialize GATT attributes
|
||||
GGS_AddService( GATT_ALL_SERVICES ); // GAP
|
||||
GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes
|
||||
DevInfo_AddService(); // Device Information Service
|
||||
SimpleProfile_AddService( GATT_ALL_SERVICES ); // Simple GATT Profile
|
||||
#if defined FEATURE_OAD
|
||||
VOID OADTarget_AddService(); // OAD Profile
|
||||
#endif
|
||||
|
||||
// Setup the SimpleProfile Characteristic Values
|
||||
{
|
||||
uint8 charValue1 = 1;
|
||||
uint8 charValue2 = 2;
|
||||
uint8 charValue3 = 3;
|
||||
uint8 charValue4 = 4;
|
||||
uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 };
|
||||
uint8 charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 1, 2, 3, 4, 5 };
|
||||
uint8 charValue7[SIMPLEPROFILE_CHAR7_LEN] = { 1, 2, 3, 4, 5 };
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN, charValue6 );
|
||||
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR7, SIMPLEPROFILE_CHAR7_LEN, charValue7 );
|
||||
}
|
||||
|
||||
|
||||
#if defined( CC2540_MINIDK )
|
||||
|
||||
SK_AddService( GATT_ALL_SERVICES ); // Simple Keys Profile
|
||||
|
||||
// Register for all key events - This app will handle all key events
|
||||
RegisterForKeys( simpleBLEPeripheral_TaskID );
|
||||
|
||||
// makes sure LEDs are off
|
||||
HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );
|
||||
|
||||
// For keyfob board set GPIO pins into a power-optimized state
|
||||
// Note that there is still some leakage current from the buzzer,
|
||||
// accelerometer, LEDs, and buttons on the PCB.
|
||||
|
||||
P0SEL = 0; // Configure Port 0 as GPIO
|
||||
P1SEL = 0; // Configure Port 1 as GPIO
|
||||
P2SEL = 0; // Configure Port 2 as GPIO
|
||||
|
||||
P0DIR = 0xFC; // Port 0 pins P0.0 and P0.1 as input (buttons),
|
||||
// all others (P0.2-P0.7) as output
|
||||
P1DIR = 0xFF; // All port 1 pins (P1.0-P1.7) as output
|
||||
P2DIR = 0x1F; // All port 1 pins (P2.0-P2.4) as output
|
||||
|
||||
P0 = 0x03; // All pins on port 0 to low except for P0.0 and P0.1 (buttons)
|
||||
P1 = 0; // All pins on port 1 to low
|
||||
P2 = 0; // All pins on port 2 to low
|
||||
|
||||
#endif // #if defined( CC2540_MINIDK )
|
||||
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
|
||||
#if defined FEATURE_OAD
|
||||
#if defined (HAL_IMAGE_A)
|
||||
HalLcdWriteStringValue( "BLE Peri-A", OAD_VER_NUM( _imgHdr.ver ), 16, HAL_LCD_LINE_1 );
|
||||
#else
|
||||
HalLcdWriteStringValue( "BLE Peri-B", OAD_VER_NUM( _imgHdr.ver ), 16, HAL_LCD_LINE_1 );
|
||||
#endif // HAL_IMAGE_A
|
||||
#else
|
||||
HalLcdWriteString( "BLE Peripheral", HAL_LCD_LINE_1 );
|
||||
#endif // FEATURE_OAD
|
||||
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
|
||||
// Register callback with SimpleGATTprofile
|
||||
VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );
|
||||
|
||||
// Enable clock divide on halt
|
||||
// This reduces active current while radio is active and CC254x MCU
|
||||
// is halted
|
||||
HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );
|
||||
//HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
|
||||
|
||||
#if defined ( DC_DC_P0_7 )
|
||||
|
||||
// Enable stack to toggle bypass control on TPS62730 (DC/DC converter)
|
||||
HCI_EXT_MapPmIoPortCmd( HCI_EXT_PM_IO_PORT_P0, HCI_EXT_PM_IO_PORT_PIN7 );
|
||||
|
||||
#endif // defined ( DC_DC_P0_7 )
|
||||
|
||||
HCI_EXT_SetTxPowerCmd(sys_config.txPower);
|
||||
|
||||
// Setup a delayed profile startup
|
||||
osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn SimpleBLEPeripheral_ProcessEvent
|
||||
*
|
||||
* @brief Simple BLE Peripheral 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 OSAL 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 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )
|
||||
{
|
||||
|
||||
VOID task_id; // OSAL required parameter that isn't used in this function
|
||||
|
||||
if ( events & SYS_EVENT_MSG )
|
||||
{
|
||||
uint8 *pMsg;
|
||||
|
||||
if ( (pMsg = osal_msg_receive( simpleBLEPeripheral_TaskID )) != NULL )
|
||||
{
|
||||
simpleBLEPeripheral_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );
|
||||
|
||||
// Release the OSAL message
|
||||
VOID osal_msg_deallocate( pMsg );
|
||||
}
|
||||
|
||||
// return unprocessed events
|
||||
return (events ^ SYS_EVENT_MSG);
|
||||
}
|
||||
|
||||
if ( events & SBP_START_DEVICE_EVT )
|
||||
{
|
||||
// Start the Device
|
||||
VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );
|
||||
|
||||
// Start Bond Manager
|
||||
VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );
|
||||
|
||||
// Set timer for first periodic event
|
||||
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
|
||||
|
||||
CheckKeyForSetAllParaDefault();
|
||||
|
||||
return ( events ^ SBP_START_DEVICE_EVT );
|
||||
}
|
||||
|
||||
if ( events & SBP_PERIODIC_EVT )
|
||||
{
|
||||
// Restart timer
|
||||
if ( SBP_PERIODIC_EVT_PERIOD )
|
||||
{
|
||||
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
|
||||
}
|
||||
|
||||
// Perform periodic application task
|
||||
performPeriodicTask();
|
||||
|
||||
return (events ^ SBP_PERIODIC_EVT);
|
||||
}
|
||||
|
||||
#if defined ( PLUS_BROADCASTER )
|
||||
if ( events & SBP_ADV_IN_CONNECTION_EVT )
|
||||
{
|
||||
uint8 turnOnAdv = TRUE;
|
||||
// Turn on advertising while in a connection
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &turnOnAdv );
|
||||
|
||||
return (events ^ SBP_ADV_IN_CONNECTION_EVT);
|
||||
}
|
||||
#endif // PLUS_BROADCASTER
|
||||
|
||||
// Discard unknown events
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn simpleBLEPeripheral_ProcessOSALMsg
|
||||
*
|
||||
* @brief Process an incoming task message.
|
||||
*
|
||||
* @param pMsg - message to process
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg )
|
||||
{
|
||||
switch ( pMsg->event )
|
||||
{
|
||||
#if defined( CC2540_MINIDK )
|
||||
case KEY_CHANGE:
|
||||
simpleBLEPeripheral_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys );
|
||||
break;
|
||||
#endif // #if defined( CC2540_MINIDK )
|
||||
|
||||
default:
|
||||
// do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined( CC2540_MINIDK )
|
||||
/*********************************************************************
|
||||
* @fn simpleBLEPeripheral_HandleKeys
|
||||
*
|
||||
* @brief Handles all key events for this device.
|
||||
*
|
||||
* @param shift - true if in shift/alt.
|
||||
* @param keys - bit field for key events. Valid entries:
|
||||
* HAL_KEY_SW_2
|
||||
* HAL_KEY_SW_1
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
|
||||
{
|
||||
uint8 SK_Keys = 0;
|
||||
|
||||
VOID shift; // Intentionally unreferenced parameter
|
||||
|
||||
if ( keys & HAL_KEY_SW_1 )
|
||||
{
|
||||
SK_Keys |= SK_KEY_LEFT;
|
||||
NPI_WriteTransport("KEY K1\n",7);
|
||||
}
|
||||
|
||||
if ( keys & HAL_KEY_SW_2 )
|
||||
{
|
||||
|
||||
SK_Keys |= SK_KEY_RIGHT;
|
||||
NPI_WriteTransport("KEY K2\n",7);
|
||||
|
||||
// if device is not in a connection, pressing the right key should toggle
|
||||
// advertising on and off
|
||||
if( gapProfileState != GAPROLE_CONNECTED )
|
||||
{
|
||||
uint8 current_adv_enabled_status;
|
||||
uint8 new_adv_enabled_status;
|
||||
|
||||
//Find the current GAP advertisement status
|
||||
GAPRole_GetParameter( GAPROLE_ADVERT_ENABLED, ¤t_adv_enabled_status );
|
||||
|
||||
if( current_adv_enabled_status == FALSE )
|
||||
{
|
||||
new_adv_enabled_status = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_adv_enabled_status = FALSE;
|
||||
}
|
||||
|
||||
//change the GAP advertisement status to opposite of current status
|
||||
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &new_adv_enabled_status );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Set the value of the keys state to the Simple Keys Profile;
|
||||
// This will send out a notification of the keys state if enabled
|
||||
SK_SetParameter( SK_KEY_ATTR, sizeof ( uint8 ), &SK_Keys );
|
||||
}
|
||||
#endif // #if defined( CC2540_MINIDK )
|
||||
|
||||
/*********************************************************************
|
||||
* @fn peripheralStateNotificationCB
|
||||
*
|
||||
* @brief Notification from the profile of a state change.
|
||||
*
|
||||
* @param newState - new state
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
static void peripheralStateNotificationCB( gaprole_States_t newState )
|
||||
{
|
||||
switch ( newState )
|
||||
{
|
||||
case GAPROLE_STARTED:
|
||||
{
|
||||
uint8 ownAddress[B_ADDR_LEN];
|
||||
uint8 systemId[DEVINFO_SYSTEM_ID_LEN];
|
||||
|
||||
GAPRole_GetParameter(GAPROLE_BD_ADDR, ownAddress);
|
||||
|
||||
// use 6 bytes of device address for 8 bytes of system ID value
|
||||
systemId[0] = ownAddress[0];
|
||||
systemId[1] = ownAddress[1];
|
||||
systemId[2] = ownAddress[2];
|
||||
|
||||
// set middle bytes to zero
|
||||
systemId[4] = 0x00;
|
||||
systemId[3] = 0x00;
|
||||
|
||||
// shift three bytes up
|
||||
systemId[7] = ownAddress[5];
|
||||
systemId[6] = ownAddress[4];
|
||||
systemId[5] = ownAddress[3];
|
||||
|
||||
DevInfo_SetParameter(DEVINFO_SYSTEM_ID, DEVINFO_SYSTEM_ID_LEN, systemId);
|
||||
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
// Display device address
|
||||
HalLcdWriteString( bdAddr2Str( ownAddress ), HAL_LCD_LINE_2 );
|
||||
HalLcdWriteString( "Initialized", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
|
||||
osal_memcpy(sys_config.mac_addr, bdAddr2Str( ownAddress )+2, 12);
|
||||
sys_config.mac_addr[12] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case GAPROLE_ADVERTISING:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "Advertising", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
}
|
||||
break;
|
||||
|
||||
case GAPROLE_CONNECTED:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "Connected", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
LedSetState(HAL_LED_MODE_OFF);
|
||||
NPI_WriteTransport("Connected\r\n", 11);
|
||||
}
|
||||
break;
|
||||
|
||||
case GAPROLE_WAITING:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "Disconnected", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
}
|
||||
break;
|
||||
|
||||
case GAPROLE_WAITING_AFTER_TIMEOUT:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "Timed Out", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
}
|
||||
break;
|
||||
|
||||
case GAPROLE_ERROR:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "Error", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteString( "", HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
gapProfileState = newState;
|
||||
|
||||
#if !defined( CC2540_MINIDK )
|
||||
VOID gapProfileState; // added to prevent compiler warning with
|
||||
// "CC2540 Slave" configurations
|
||||
#endif
|
||||
|
||||
//LCD_WRITE_STRING( "?", HAL_LCD_LINE_1 );
|
||||
|
||||
}
|
||||
|
||||
static void peripheralRssiReadCB( int8 rssi )
|
||||
{
|
||||
LCD_WRITE_STRING_VALUE( "RSSI -dB:", (uint8) (-rssi), 10, HAL_LCD_LINE_1 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* @fn simpleProfileChangeCB
|
||||
*
|
||||
* @brief Callback from SimpleBLEProfile indicating a value change
|
||||
*
|
||||
* @param paramID - parameter ID of the value that was changed.
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
static void simpleProfileChangeCB( uint8 paramID )
|
||||
{
|
||||
uint8 newValue;
|
||||
uint8 newChar6Value[SIMPLEPROFILE_CHAR6_LEN];
|
||||
uint8 returnBytes;
|
||||
|
||||
switch( paramID )
|
||||
{
|
||||
case SIMPLEPROFILE_CHAR1:
|
||||
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, &newValue, &returnBytes );
|
||||
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteStringValue( "Char 1:", (uint16)(newValue), 10, HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
|
||||
break;
|
||||
|
||||
case SIMPLEPROFILE_CHAR3:
|
||||
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &newValue, &returnBytes );
|
||||
|
||||
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10, HAL_LCD_LINE_3 );
|
||||
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
|
||||
|
||||
break;
|
||||
|
||||
case SIMPLEPROFILE_CHAR6:
|
||||
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar6Value, &returnBytes );
|
||||
if(returnBytes > 0)
|
||||
{
|
||||
NPI_WriteTransport(newChar6Value,returnBytes);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
// should not reach here!
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//#if defined( BLE_BOND_PAIR )
|
||||
static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs )
|
||||
{
|
||||
uint32 passcode;
|
||||
uint8 str[7];
|
||||
|
||||
// Create random passcode
|
||||
#if 0
|
||||
LL_Rand( ((uint8 *) &passcode), sizeof( uint32 ));
|
||||
passcode %= 1000000;
|
||||
#else
|
||||
passcode = str2Num(sys_config.pass, 6);
|
||||
passcode %= 1000000;
|
||||
#endif
|
||||
// Display passcode to user
|
||||
if ( uiOutputs != 0 )
|
||||
{
|
||||
HalLcdWriteString( "Passcode:", HAL_LCD_LINE_1 );
|
||||
HalLcdWriteString( (char *) _ltoa(passcode, str, 10), HAL_LCD_LINE_2 );
|
||||
}
|
||||
|
||||
if(simpleBle_GetIfNeedPassword())
|
||||
{
|
||||
simpleBle_PrintPassword();
|
||||
|
||||
// Send passcode response
|
||||
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
static void ProcessPairStateCB( uint16 connHandle, uint8 state, uint8 status )
|
||||
{
|
||||
if ( state == GAPBOND_PAIRING_STATE_STARTED )
|
||||
{
|
||||
HalLcdWriteString( "Pairing started", HAL_LCD_LINE_1 );
|
||||
gPairStatus = BOND_PAIR_STATUS_PAIRING;
|
||||
}
|
||||
else if ( state == GAPBOND_PAIRING_STATE_COMPLETE )
|
||||
{
|
||||
if ( status == SUCCESS )
|
||||
{
|
||||
HalLcdWriteString( "Pairing success", HAL_LCD_LINE_1 );
|
||||
gPairStatus = BOND_PAIR_STATUS_PAIRED;
|
||||
}
|
||||
else
|
||||
{
|
||||
HalLcdWriteStringValue( "Pairing fail", status, 10, HAL_LCD_LINE_1 );
|
||||
|
||||
if(status ==8)
|
||||
{
|
||||
gPairStatus = BOND_PAIR_STATUS_PAIRED;
|
||||
}
|
||||
else
|
||||
{
|
||||
gPairStatus = BOND_PAIR_STATUS_PAIRING;
|
||||
|
||||
GAPRole_TerminateConnection();
|
||||
HAL_SYSTEM_RESET();
|
||||
}
|
||||
|
||||
gPairStatus = BOND_PAIR_STATUS_PAIRING;
|
||||
}
|
||||
|
||||
if((gapProfileState == GAPROLE_CONNECTED) && (gPairStatus == BOND_PAIR_STATUS_PAIRING))
|
||||
{
|
||||
GAPRole_TerminateConnection();
|
||||
HAL_SYSTEM_RESET();
|
||||
}
|
||||
}
|
||||
else if ( state == GAPBOND_PAIRING_STATE_BONDED )
|
||||
{
|
||||
if ( status == SUCCESS )
|
||||
{
|
||||
HalLcdWriteString( "Bonding success", HAL_LCD_LINE_1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
/*********************************************************************
|
||||
*********************************************************************/
|
||||
Reference in New Issue
Block a user