
fork test
Dependencies: BLE_API WIFI_API_32kRAM mbed nRF51822
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 };