Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of NNN40_CLI by
Diff: CLI_Source/ble_cli.cpp
- Revision:
- 7:33214585c606
- Parent:
- 6:1243f9e584f4
- Child:
- 8:291b32452887
--- a/CLI_Source/ble_cli.cpp Wed Jan 20 06:42:09 2016 +0000 +++ b/CLI_Source/ble_cli.cpp Thu Jan 21 11:23:44 2016 +0000 @@ -5,30 +5,7 @@ * Copyright 2014 by CYNTEC Corporation. All rights reserved. */ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include "command-interpreter.h" -//#include "simple_uart.h" -#include "mbed.h" -#include "BLE.h" -#include "Gap.h" -#include "nrf_gpio.h" -#include "nrf_soc.h" -#include "ble_cli.h" -#include "ble_hci.h" -#include "app_error.h" -#include "PinNames.h" -//#include "custom_helper.h" -extern "C" { -#include "ble_advdata.h" -} -#include "ble/GattCharacteristic.h" -#include "ble/UUID.h" -#include "ble/DiscoveredCharacteristic.h" -#include "ble/DiscoveredService.h" - +#include "ble_cli.h" // All #include define in ble_cli.h #define APP_ADV_INTERVAL 40 /**< The advertising interval (in units of ms). */ #define APP_ADV_TIMEOUT_IN_SECONDS 180 /**< The advertising timeout (in units of seconds). */ #define APP_ADV_INTERVAL_MAX 10240 // correspond to 10.24s @@ -44,9 +21,7 @@ #define CLI_FWVERION "DELTA_CLI_V1.8" #define MODULE_NAME "DFCM-NNN40-DT1R" #define ADVERTISING_LED_PIN_NO LED1 -//#define BLE_DEBUG -//#define LBS_UUID_BASE {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00} -#define NEW_VS_SERVICE 0x0001 +//#define BLE_DEBUG #define DEFAULT_SCAN_INTERVAL 500 #define DEFAULT_SCAN_WINDOW 400 #define DEFAULT_SCAN_TIMEOUT 0x0005 @@ -57,7 +32,7 @@ uint32_t props; UUID char_uuid; uint8_t value[MAX_VALUE_LENGTH]; - //uint16_t char_value_handle; + uint16_t char_value_handle; uint8_t valueLength; } bufferGattChar_t; @@ -79,7 +54,7 @@ extern Serial console; BLE deltaBLE; //gill 0904 extern const char* cyntecCommandErrorNames[]; -static bool connState = false; // gill 0904, define currently connecting state +static bool connState = false; // gill 0904, define currently connecting state static uint8_t service_count=0; static uint8_t char_count=0; static uint16_t test_conn_handle; //Connection handle, assign after connected @@ -87,14 +62,14 @@ static Gap::Address_t saveAddr[BLE_MAX_ADDRESS_NUMBER]; // check in advertisementCallback static uint8_t bleDevInd; //static Gap::GapState_t nowState; -static char targetDevName[TARGET_DEVNAME_LEN]; +static char targetDevName[TARGET_DEVNAME_LEN]; // For connect target device //static char DEVICE_NAME[] = "nRF5x"; // default device name, same as defined in Gap.h static bool conn_action = false; // Gill add 20151015 static GattCharacteristic *charAry[CLI_SERVICE_MAX_NUM][CLI_CHAR_MAX_NUM]; DigitalOut led1(p7); DigitalOut led2(p13); -DigitalOut WriteInterrupt(p0); +DigitalOut WriteInterrupt(p30); /****************************************************** * Function Definitions @@ -138,9 +113,6 @@ #ifdef BLE_DEBUG console.printf("Connect: connState write to %d\r\n",connState); #endif - - //led2 = !led2; - // gill test //if (params->role == Gap::CENTRAL) { // //deltaBLE.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); @@ -150,7 +122,7 @@ void onTimeoutCallback(Gap::TimeoutSource_t source) { - led1 = !led1; + //led1 = !led1; } void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) @@ -160,11 +132,57 @@ connState = false; } -void onDataWrittenCallback(const GattWriteCallbackParams *params) { +void onDataWrittenCallback(const GattWriteCallbackParams *params) +{ +#ifdef BLE_DEBUG + console.printf("onDataWritten\r\n"); +#endif + // trigger Host GPIO interrupt + WriteInterrupt = !WriteInterrupt; + WriteInterrupt = !WriteInterrupt; +#ifdef BLE_DEBUG + console.printf("handle:%04X\r\n",params->handle); + console.printf("conn_handle:%04X,writeOp:%d,offset:%04X\r\n",params->connHandle,params->writeOp,params->offset); +#endif + const uint8_t* cpSerBaseUUID; + const uint8_t* cpCharBaseUUID; + + // Find specific handle Characteristic + for ( int i = 0 ; i < service_count ; i++ ) { + for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) { + GattAttribute& tempValueAttr = charAry[i][j]->getValueAttribute(); + if (tempValueAttr.getHandle()==params->handle) { #ifdef BLE_DEBUG - console.printf("onDataWritten\r\n"); + console.printf("ser_count,char_count:%d,%d\r\n",i,j); #endif - WriteInterrupt = !WriteInterrupt; + if (bufferService[i].ser_uuid.shortOrLong()==0) + console.printf("%04X",bufferService[i].ser_uuid.getShortUUID()); + else { + cpSerBaseUUID = bufferService[i].ser_uuid.getBaseUUID(); + for (int i=15; i>=0; i--) { + console.printf("%02X",cpSerBaseUUID[i]); + } + } + console.printf(","); + //console.printf("char_uuid:"); + if (bufferService[i].bufferGattChar[j].char_uuid.shortOrLong()==0) // Short UUID + console.printf("%04X",bufferService[i].bufferGattChar[j].char_uuid.getShortUUID()); + else { // Long UUID + cpCharBaseUUID = bufferService[i].bufferGattChar[j].char_uuid.getBaseUUID(); + for (int i=15; i>=0; i--) { + console.printf("%02X",cpCharBaseUUID[i]); + } + } + console.printf(","); + break; + } + } + } + console.printf("%d,",params->len); + for(int i=0; i<params->len; i++) { + console.printf("%02X",params->data[i]); + } + console.printf(";\r\n"); } static void cyntecPrintOk(void) @@ -217,10 +235,10 @@ console.printf("advInterval:%d,advTimeout:%d",advInterval,advTimeout); #endif uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"}; - uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET; - uint32_t err_code; + uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET; + uint32_t err_code; - err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen); + err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen); #ifdef BLE_DEBUG console.printf("%08X,%s\r\n",err_code,bleName+APP_ADV_DATA_OFFSET); #endif @@ -265,7 +283,7 @@ //console.printf("%02X\r\n",cyntecGetTotalIndex()); //console.printf("\r\nSet BLE Name: "); uint8_t i = 0; - + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) &argName2[11], @@ -273,9 +291,9 @@ if (err_code == NRF_SUCCESS) { console.printf("\r\nOK;"); for(i = 0; i < cyntecGetTotalIndex()-12; i++) { - console.printf("%c",argName2[11+i]); - } - console.printf("\r\n"); + console.printf("%c",argName2[11+i]); + } + console.printf("\r\n"); } else { console.printf("ERROR;%04X\r\n",err_code); } @@ -529,7 +547,7 @@ cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); return; } - // If user input scan parameters, overwrite the default value + // If user input scan parameters, overwrite the default value if (cyntecGetCommandTokenCnt()== 5) { uint8_t argLen = 0; uint8_t *arg = cyntecGetCommandArgument(0,&argLen); @@ -740,26 +758,26 @@ for (int i=0 ; i < (argLen-2)/2; i++) { bufVal[i] = cyntecArgToUint8(arg+2*(i+1), 2); } - - + + for ( int i = 0 ; i < service_count ; i++ ) { if ( (bufferService[i].ser_uuid == buf_ser_uuid) & (readmatchFlag == false)) { for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) { if (( bufferService[i].bufferGattChar[j].char_uuid == buf_char_uuid)& (readmatchFlag == false)) { GattAttribute& valueAttr = charAry[i][j]->getValueAttribute(); - ble_error_t err; - if (!connState) - err = deltaBLE.gattServer().write(valueAttr.getHandle(),bufVal,valueLen,true); + ble_error_t err; + if (!connState) + err = deltaBLE.gattServer().write(valueAttr.getHandle(),bufVal,valueLen,true); else - err = deltaBLE.gattServer().write(test_conn_handle,valueAttr.getHandle(),bufVal,valueLen,false); + err = deltaBLE.gattServer().write(test_conn_handle,valueAttr.getHandle(),bufVal,valueLen,false); #ifdef BLE_DEBUG - console.printf("Write ERR:%i\r\n",err); + console.printf("Write ERR:%i\r\n",err); #endif - console.printf("\r\nOK;"); - for (uint16_t n=0; n<valueLen; n++) { - console.printf("%02X",bufVal[n]); - } + console.printf("\r\nOK;"); + for (uint16_t n=0; n<valueLen; n++) { + console.printf("%02X",bufVal[n]); + } console.printf("\r\n"); readmatchFlag = true; return; @@ -780,9 +798,9 @@ for (int i=0; i<service_count; i++) { console.printf("ser_uuid:%04X",bufferService[service_count-1].ser_uuid.getShortUUID()); for (int j=0; j<CLI_CHAR_MAX_NUM; j++) { - printf("%i,U%04X,",j,bufferService[service_count-1].bufferGattChar[char_count-1].char_uuid.getShortUUID()); - printf("L%d,",bufferService[service_count-1].bufferGattChar[char_count-1].valueLength); - printf("V%02X ",bufferService[service_count-1].bufferGattChar[char_count-1].value[0]); + printf(" %i,char_uuid%04X,",j,bufferService[service_count-1].bufferGattChar[char_count-1].char_uuid.getShortUUID()); + printf("len%d,",bufferService[service_count-1].bufferGattChar[char_count-1].valueLength); + printf("val%02X;",bufferService[service_count-1].bufferGattChar[char_count-1].value[0]); } } printf("\r\n"); @@ -824,7 +842,7 @@ } buf_char_uuid.setupLong(bufferUuidVs); } - + for ( int i = 0 ; i < service_count ; i++ ) { if ( (bufferService[i].ser_uuid == buf_ser_uuid) & (readmatchFlag == false)) { for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) { @@ -834,9 +852,9 @@ valueLen = valueAttr.getLength(); ble_error_t err = deltaBLE.gattServer().read(valueAttr.getHandle(),bufVal,valueLenPtr); #ifdef BLE_DEBUG - console.printf("Read ERR:%i\r\n",err); + console.printf("Read ERR:%i\r\n",err); #endif - console.printf("\r\nOK;"); + console.printf("\r\nOK;"); console.printf("0x"); for (uint16_t n=0; n<valueLen; n++) { console.printf("%02X",bufVal[n]); @@ -864,7 +882,7 @@ cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); return; } - + /* handle parameter - UUID */ /* Only support 16-bit or 128-bit UUID type */ uint8_t argLen = 0; @@ -923,6 +941,9 @@ //bufferService[service_count-1].bufferGattChar[char_count].char_value_handle = testHandle; if (char_count>CLI_CHAR_MAX_NUM) { cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); +#ifdef BLE_DEBUG + console.printf("Error: char_count>CLI_CHAR_MAX_NUM\r\n"); +#endif return; } cyntecPrintOk(); @@ -950,10 +971,13 @@ GattService newService(bufferService[service_count-1].ser_uuid, charAry[service_count-1], char_count ); ble_error_t err_code; err_code = deltaBLE.addService(newService); + if (err_code != 0) { #ifdef BLE_DEBUG - console.printf("addService error:%d\r\n",err_code); + console.printf("addService error:%d\r\n",err_code); #endif - cyntecPrintOk(); + cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL); + } else + cyntecPrintOk(); //char_count = 0; // already did in gattService } @@ -1003,35 +1027,39 @@ deltaBLE.onDisconnection(disconnectionCallback); deltaBLE.onConnection(onConnectionCallback); deltaBLE.onTimeout(onTimeoutCallback); - deltaBLE.gattClient().onDataRead(triggerRead); - deltaBLE.gattServer().onDataWritten(onDataWrittenCallback); + deltaBLE.gattServer().onDataRead(triggerRead); + cyntecPrintOk(); } +static void cynBLEDataIntCommand(void) +{ + cyntecPrintOk(); + deltaBLE.gattServer().onDataWritten().add(onDataWrittenCallback); +} +static void cynBLEDisDataIntCommand(void) +{ + cyntecPrintOk(); + deltaBLE.gattServer().onDataWritten().detach(onDataWrittenCallback); +} #ifdef BLE_DEBUG static void cynBLETestCommand(void) { // gill test 1021 uint8_t bufVal[20] = {0}; - uint8_t valWrite[2] = {0x22,0x33}; + //uint8_t valWrite[2] = {0x22,0x33}; //uint16_t bufhandle = 0x0001; - uint8_t valRead[2] = {0,0}; + //uint8_t valRead[2] = {0,0}; -// uint16_t handle = charAry[0][0]->getValueHandle(); -// console.printf("Handle:%04X\r\n",handle); +// uint16_t handle = charAry[0][0]->getValueHandle(); // No used? GattAttribute& valueAttr = charAry[0][0]->getValueAttribute(); //valueAttr.setHandle(bufhandle); console.printf("Handle:%04X ",valueAttr.getHandle()); console.printf("UUID:%04X ",valueAttr.getUUID().getShortUUID()); uint16_t* valueLenPtr = valueAttr.getLengthPtr(); - console.printf("gatt val:%02X %02X\r\n",bufVal[0],bufVal[1]); deltaBLE.gattServer().read(valueAttr.getHandle(),bufVal,valueLenPtr); - console.printf("gatt val:%02X %02X\r\n",bufVal[0],bufVal[1]); - - deltaBLE.gattServer().write(valueAttr.getHandle(),valWrite,2); - deltaBLE.gattServer().read(valueAttr.getHandle(),valRead,valueLenPtr); - console.printf("gatt val:%02X %02X\r\n",valRead[0],valRead[1]); + console.printf("gatt val[0][1]:%02X %02X\r\n",bufVal[0],bufVal[1]); } #endif @@ -1062,6 +1090,8 @@ {"ADR", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address"}, {"WRT", cynBLEUpdateUUIDCommand, NULL, "Update value of specific characteristics"}, {"RED", cynBLEReadDataCommand, NULL, "Read value of specific characteristics"}, + {"EDI", cynBLEDataIntCommand, NULL, "Trigger remote write detection, give interrupt to Host."}, + {"DDI", cynBLEDisDataIntCommand, NULL, "Disable remote write detection."}, {NULL, NULL, NULL, NULL}, #else {"init", cynBLEInitCommand, NULL, "Init BLE stack"}, @@ -1084,6 +1114,8 @@ {"bleAddr", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address, Usage: <ADDR>"}, {"update", cynBLEUpdateUUIDCommand, NULL, "Update value of specific characteristics, Usage: <UUID> <VALUE>"}, {"readData", cynBLEReadDataCommand, NULL, "Read value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"}, + {"enInt", cynBLEDataIntCommand, NULL, "Trigger remote write detection, give interrupt to Host."}, + {"disInt", cynBLEDisDataIntCommand, NULL, "Disable remote write detection."}, {NULL, NULL, NULL, NULL}, #endif };