fork test

Dependencies:   BLE_API WIFI_API_32kRAM mbed nRF51822

Fork of NNN40_CLI by Delta

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
 };