Delta / Mbed OS Delta_CLI

Fork of NNN40_CLI by Delta

Committer:
silviaChen
Date:
Fri Nov 04 06:46:58 2016 +0000
Revision:
23:620896909655
Parent:
21:72d7a6e85d7f
Child:
24:838a0b25934b
CLI V1.17, bug fix for advStart and scanStart when parameter set over range

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gillwei7 0:5c195ab2f696 1 /**
gillwei7 0:5c195ab2f696 2 * File: ble-cli.c
gillwei7 0:5c195ab2f696 3 * Description: BLE CLI commands used by all applications BLE of profile.
gillwei7 0:5c195ab2f696 4 *
gillwei7 0:5c195ab2f696 5 * Copyright 2014 by CYNTEC Corporation. All rights reserved.
gillwei7 0:5c195ab2f696 6 */
gillwei7 3:38ec8ad317f4 7
gillwei7 9:ff3ccba5dc16 8 #include "ble_cli.h" // All #include define in ble_cli.h
gillwei7 9:ff3ccba5dc16 9
gillwei7 9:ff3ccba5dc16 10 // Genral configuration parameters
gillwei7 14:397f6514bb2c 11 #define BLE_DEBUG 0
gillwei7 12:a91455702763 12 #define MAX_DEVNAME_LEN 32
silviaChen 23:620896909655 13 #define CLI_FWVERION "DELTA_CLI_V1.17"
silviaChen 18:4f5b317c04b9 14
silviaChen 18:4f5b317c04b9 15 //0920 Silvia modify
tsungta 19:e2de6c1776eb 16 #if defined(TARGET_DELTA_DFBM_NQ620)
silviaChen 18:4f5b317c04b9 17 #define MODULE_NAME "DFBM-NQ620"
tsungta 19:e2de6c1776eb 18 #else if defined(TARGET_DELTA_DFCM_NNN40)
gillwei7 9:ff3ccba5dc16 19 #define MODULE_NAME "DFCM-NNN40-DT1R"
silviaChen 18:4f5b317c04b9 20 #endif
silviaChen 18:4f5b317c04b9 21 //0920 Silvia modify
gillwei7 9:ff3ccba5dc16 22
gillwei7 9:ff3ccba5dc16 23 // Advertising configuration parameters
gillwei7 4:b52035367aee 24 #define APP_ADV_INTERVAL 40 /**< The advertising interval (in units of ms). */
gillwei7 0:5c195ab2f696 25 #define APP_ADV_TIMEOUT_IN_SECONDS 180 /**< The advertising timeout (in units of seconds). */
gillwei7 4:b52035367aee 26 #define APP_ADV_INTERVAL_MAX 10240 // correspond to 10.24s
gillwei7 4:b52035367aee 27 #define APP_ADV_INTERVAL_MIN 20 // correspond to 20ms
silviaChen 23:620896909655 28 #define APP_ADV_TIMEOUT_LIMITED_MAX 16383 //1102 Silvia add
silviaChen 23:620896909655 29 #define APP_ADV_TIMEOUT_LIMITED_MIN 1 //1102 Silvia add
gillwei7 9:ff3ccba5dc16 30 #define APP_ADV_DATA_OFFSET 2 // Offset for Advertising Data.
gillwei7 9:ff3ccba5dc16 31 //#define ADVERTISING_LED_PIN_NO LED1
silviaChen 23:620896909655 32
silviaChen 23:620896909655 33 //1102 Silvia add
silviaChen 23:620896909655 34 //Scanning configuration parameters
silviaChen 23:620896909655 35 #define BLE_SCAN_INTERVAL_LIMITED_MAX 10240
silviaChen 23:620896909655 36 #define BLE_SCAN_INTERVAL_LIMITED_MIN 3
silviaChen 23:620896909655 37 #define BLE_SCAN_WINDOW_LIMITED_MAX 10240
silviaChen 23:620896909655 38 #define BLE_SCAN_WINDOW_LIMITED_MIN 3
silviaChen 23:620896909655 39 #define BLE_SCAN_TIMEOUT_LIMITED_MAX 16383
silviaChen 23:620896909655 40 #define BLE_SCAN_TIMEOUT_LIMITED_MIN 1
silviaChen 23:620896909655 41
gillwei7 9:ff3ccba5dc16 42 // Peripheral mode operation parameters
gillwei7 0:5c195ab2f696 43 #define CLI_SERVICE_MAX_NUM 10
gillwei7 0:5c195ab2f696 44 #define CLI_CHAR_MAX_NUM 10
gillwei7 0:5c195ab2f696 45 #define MAX_VALUE_LENGTH 20
gillwei7 9:ff3ccba5dc16 46 // Central mode operation parameters
gillwei7 3:38ec8ad317f4 47 #define DEFAULT_SCAN_INTERVAL 500
gillwei7 3:38ec8ad317f4 48 #define DEFAULT_SCAN_WINDOW 400
gillwei7 4:b52035367aee 49 #define DEFAULT_SCAN_TIMEOUT 0x0005
gillwei7 3:38ec8ad317f4 50 #define BLE_MAX_ADDRESS_NUMBER 10
gillwei7 4:b52035367aee 51 #define TARGET_DEVNAME_LEN 30
gillwei7 0:5c195ab2f696 52
gillwei7 0:5c195ab2f696 53 typedef struct bufferGattChar {
gillwei7 15:d627ee60bb78 54 uint8_t props;
gillwei7 4:b52035367aee 55 UUID char_uuid;
gillwei7 4:b52035367aee 56 uint8_t value[MAX_VALUE_LENGTH];
gillwei7 7:33214585c606 57 uint16_t char_value_handle;
gillwei7 14:397f6514bb2c 58 uint16_t valueLength;
gillwei7 0:5c195ab2f696 59 } bufferGattChar_t;
gillwei7 0:5c195ab2f696 60
gillwei7 0:5c195ab2f696 61 typedef struct bufferGattService {
gillwei7 4:b52035367aee 62 UUID ser_uuid;
gillwei7 3:38ec8ad317f4 63 bufferGattChar_t bufferGattChar[CLI_CHAR_MAX_NUM];
gillwei7 4:b52035367aee 64 //uint16_t service_handle;
gillwei7 0:5c195ab2f696 65 } bufferGattService_t;
gillwei7 0:5c195ab2f696 66
gillwei7 3:38ec8ad317f4 67 // gill 20150916 for scan
gillwei7 3:38ec8ad317f4 68 typedef struct {
gillwei7 3:38ec8ad317f4 69 const uint8_t * p_data; /**< Pointer to data. */
gillwei7 3:38ec8ad317f4 70 uint8_t data_len; /**< Length of data. */
gillwei7 3:38ec8ad317f4 71 } data_t;
gillwei7 3:38ec8ad317f4 72
gillwei7 9:ff3ccba5dc16 73 /*************** General parameters**********************************/
gillwei7 9:ff3ccba5dc16 74 bufferGattService_t bufferService[CLI_SERVICE_MAX_NUM]; /* save entry services */
gillwei7 9:ff3ccba5dc16 75 static GattCharacteristic *charAry[CLI_SERVICE_MAX_NUM][CLI_CHAR_MAX_NUM];
silviaChen 16:d1682a3e93f5 76 DiscoveredService discoverServiceArr[CLI_SERVICE_MAX_NUM]; //Silvia add
silviaChen 16:d1682a3e93f5 77 DiscoveredCharacteristic discoverCharArr[CLI_SERVICE_MAX_NUM][CLI_CHAR_MAX_NUM]; //Silvia add
gillwei7 4:b52035367aee 78 extern Serial console;
gillwei7 4:b52035367aee 79 BLE deltaBLE; //gill 0904
gillwei7 4:b52035367aee 80 extern const char* cyntecCommandErrorNames[];
gillwei7 9:ff3ccba5dc16 81
gillwei7 9:ff3ccba5dc16 82 /*************** GATT Configuration parameters************************/
gillwei7 7:33214585c606 83 static bool connState = false; // gill 0904, define currently connecting state
gillwei7 4:b52035367aee 84 static uint8_t service_count=0;
gillwei7 4:b52035367aee 85 static uint8_t char_count=0;
silviaChen 16:d1682a3e93f5 86 static uint8_t discoverService_count=0; //Silvia add
silviaChen 16:d1682a3e93f5 87 static uint8_t discoverChar_count=0; //Silvia add
gillwei7 9:ff3ccba5dc16 88 static uint16_t test_conn_handle; //Connection handle, assign after trigger onConnectionCallback
gillwei7 5:ee474e3133eb 89 //extern bool advState; // currently no use
gillwei7 3:38ec8ad317f4 90 static Gap::Address_t saveAddr[BLE_MAX_ADDRESS_NUMBER]; // check in advertisementCallback
gillwei7 3:38ec8ad317f4 91 static uint8_t bleDevInd;
silviaChen 16:d1682a3e93f5 92 //static const unsigned ADDR_LEN = BLEProtocol::ADDR_LEN; //Silvia add, Length (in octets) of the BLE MAC address
silviaChen 16:d1682a3e93f5 93 static BLEProtocol::AddressBytes_t targetAddr; //Silvia add, For connect target device
gillwei7 7:33214585c606 94 static char targetDevName[TARGET_DEVNAME_LEN]; // For connect target device
gillwei7 6:1243f9e584f4 95 //static char DEVICE_NAME[] = "nRF5x"; // default device name, same as defined in Gap.h
gillwei7 4:b52035367aee 96 static bool conn_action = false; // Gill add 20151015
gillwei7 9:ff3ccba5dc16 97 static ble_gap_addr_t m_peer_addr;
gillwei7 9:ff3ccba5dc16 98 //DigitalOut led1(p7);
gillwei7 9:ff3ccba5dc16 99 //DigitalOut led2(p13);
gillwei7 10:5f1fa331d07c 100 DigitalOut BLEWriteInt(p13); // used in OnDataWritten()
gillwei7 0:5c195ab2f696 101
gillwei7 0:5c195ab2f696 102 /******************************************************
gillwei7 0:5c195ab2f696 103 * Function Definitions
gillwei7 0:5c195ab2f696 104 ******************************************************/
gillwei7 0:5c195ab2f696 105
gillwei7 5:ee474e3133eb 106 //DiscoveredCharacteristic ledCharacteristic;
gillwei7 0:5c195ab2f696 107
gillwei7 4:b52035367aee 108 void serviceDiscoveryCallback(const DiscoveredService *service)
gillwei7 4:b52035367aee 109 {
silviaChen 18:4f5b317c04b9 110 console.printf("serviceDiscoveryCallback\r\n");
gillwei7 4:b52035367aee 111 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 18:4f5b317c04b9 112 console.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
gillwei7 4:b52035367aee 113 } else {
silviaChen 18:4f5b317c04b9 114 console.printf("S UUID-");
gillwei7 4:b52035367aee 115 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
gillwei7 4:b52035367aee 116 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
silviaChen 18:4f5b317c04b9 117 console.printf("%02x", longUUIDBytes[i]);
gillwei7 4:b52035367aee 118 }
silviaChen 18:4f5b317c04b9 119 console.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
gillwei7 4:b52035367aee 120 }
silviaChen 16:d1682a3e93f5 121
silviaChen 16:d1682a3e93f5 122 discoverServiceArr[discoverService_count] = *service;
silviaChen 16:d1682a3e93f5 123 discoverService_count++;
silviaChen 16:d1682a3e93f5 124 discoverChar_count = 0;
gillwei7 4:b52035367aee 125 }
gillwei7 4:b52035367aee 126
gillwei7 4:b52035367aee 127 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP)
gillwei7 4:b52035367aee 128 {
silviaChen 16:d1682a3e93f5 129 //Silvia modify
silviaChen 16:d1682a3e93f5 130 if (characteristicP->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 18:4f5b317c04b9 131 console.printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
silviaChen 16:d1682a3e93f5 132 }
silviaChen 16:d1682a3e93f5 133 else {
silviaChen 18:4f5b317c04b9 134 console.printf(" C UUID-");
silviaChen 16:d1682a3e93f5 135 const uint8_t *longUUIDBytes = characteristicP->getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 136 for (unsigned i = (UUID::LENGTH_OF_LONG_UUID) - 1; i < UUID::LENGTH_OF_LONG_UUID; i--) {
silviaChen 18:4f5b317c04b9 137 console.printf("%02x ", longUUIDBytes[i]);
silviaChen 16:d1682a3e93f5 138 }
silviaChen 18:4f5b317c04b9 139 console.printf(" valueAttr[%u] props[%x]\r\n", characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
silviaChen 16:d1682a3e93f5 140 // uvCharacteristic = *characteristicP;
silviaChen 16:d1682a3e93f5 141 }
silviaChen 16:d1682a3e93f5 142
silviaChen 16:d1682a3e93f5 143 discoverCharArr[discoverService_count - 1][discoverChar_count] = *characteristicP;
silviaChen 16:d1682a3e93f5 144 discoverChar_count++;
gillwei7 4:b52035367aee 145 }
gillwei7 4:b52035367aee 146 void discoveryTerminationCallback(Gap::Handle_t connectionHandle)
gillwei7 4:b52035367aee 147 {
silviaChen 18:4f5b317c04b9 148 console.printf("terminated SD for handle %u\r\n", connectionHandle);
gillwei7 4:b52035367aee 149 }
gillwei7 4:b52035367aee 150
gillwei7 0:5c195ab2f696 151 void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
gillwei7 0:5c195ab2f696 152 {
gillwei7 0:5c195ab2f696 153 test_conn_handle = params->handle;
gillwei7 0:5c195ab2f696 154 connState = true;
gillwei7 14:397f6514bb2c 155 #if BLE_DEBUG
gillwei7 4:b52035367aee 156 console.printf("Connect: connState write to %d\r\n",connState);
gillwei7 4:b52035367aee 157 #endif
silviaChen 16:d1682a3e93f5 158 //Silvia modify
silviaChen 16:d1682a3e93f5 159 if (params->role == Gap::CENTRAL) {
silviaChen 16:d1682a3e93f5 160 deltaBLE.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
silviaChen 16:d1682a3e93f5 161 deltaBLE.gattClient().launchServiceDiscovery(test_conn_handle, serviceDiscoveryCallback, characteristicDiscoveryCallback);
silviaChen 16:d1682a3e93f5 162 }
silviaChen 16:d1682a3e93f5 163 //Silvia modify
gillwei7 0:5c195ab2f696 164 }
gillwei7 0:5c195ab2f696 165
gillwei7 5:ee474e3133eb 166 void onTimeoutCallback(Gap::TimeoutSource_t source)
gillwei7 5:ee474e3133eb 167 {
gillwei7 7:33214585c606 168 //led1 = !led1;
silviaChen 16:d1682a3e93f5 169
silviaChen 16:d1682a3e93f5 170 //Silvia add
silviaChen 16:d1682a3e93f5 171 switch (source) {
silviaChen 16:d1682a3e93f5 172 case Gap::TIMEOUT_SRC_ADVERTISING:
silviaChen 18:4f5b317c04b9 173 console.printf("Advertising timeout\r\n");
silviaChen 16:d1682a3e93f5 174 break;
silviaChen 16:d1682a3e93f5 175 case Gap::TIMEOUT_SRC_SECURITY_REQUEST:
silviaChen 18:4f5b317c04b9 176 console.printf("Security request timeout\r\n");
silviaChen 16:d1682a3e93f5 177 break;
silviaChen 16:d1682a3e93f5 178 case Gap::TIMEOUT_SRC_SCAN:
silviaChen 18:4f5b317c04b9 179 console.printf("Scanning timeout\r\n");
silviaChen 16:d1682a3e93f5 180 break;
silviaChen 16:d1682a3e93f5 181 case Gap::TIMEOUT_SRC_CONN:
silviaChen 18:4f5b317c04b9 182 console.printf("Connection timeout\r\n");
silviaChen 16:d1682a3e93f5 183 break;
silviaChen 16:d1682a3e93f5 184 }
silviaChen 16:d1682a3e93f5 185 //Silvia add
gillwei7 5:ee474e3133eb 186 }
gillwei7 5:ee474e3133eb 187
gillwei7 4:b52035367aee 188 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
gillwei7 0:5c195ab2f696 189 {
silviaChen 18:4f5b317c04b9 190 console.printf("Disconnected\r\n"); //Silvia add
gillwei7 0:5c195ab2f696 191 //console.printf("connState:%d\r\n",connState);
gillwei7 3:38ec8ad317f4 192 //Gap::GapState_t->connected = 0;
gillwei7 0:5c195ab2f696 193 connState = false;
gillwei7 0:5c195ab2f696 194 }
gillwei7 0:5c195ab2f696 195
gillwei7 7:33214585c606 196 void onDataWrittenCallback(const GattWriteCallbackParams *params)
gillwei7 7:33214585c606 197 {
gillwei7 14:397f6514bb2c 198 #if BLE_DEBUG
gillwei7 7:33214585c606 199 console.printf("onDataWritten\r\n");
gillwei7 7:33214585c606 200 #endif
gillwei7 7:33214585c606 201 // trigger Host GPIO interrupt
gillwei7 10:5f1fa331d07c 202 BLEWriteInt = !BLEWriteInt;
gillwei7 10:5f1fa331d07c 203 BLEWriteInt = !BLEWriteInt;
gillwei7 14:397f6514bb2c 204 #if BLE_DEBUG
gillwei7 7:33214585c606 205 console.printf("handle:%04X\r\n",params->handle);
gillwei7 7:33214585c606 206 console.printf("conn_handle:%04X,writeOp:%d,offset:%04X\r\n",params->connHandle,params->writeOp,params->offset);
gillwei7 7:33214585c606 207 #endif
gillwei7 12:a91455702763 208 console.printf("w%d,",params->writeOp);
gillwei7 7:33214585c606 209 const uint8_t* cpSerBaseUUID;
gillwei7 7:33214585c606 210 const uint8_t* cpCharBaseUUID;
gillwei7 12:a91455702763 211
gillwei7 7:33214585c606 212 // Find specific handle Characteristic
gillwei7 7:33214585c606 213 for ( int i = 0 ; i < service_count ; i++ ) {
gillwei7 7:33214585c606 214 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
gillwei7 7:33214585c606 215 GattAttribute& tempValueAttr = charAry[i][j]->getValueAttribute();
gillwei7 7:33214585c606 216 if (tempValueAttr.getHandle()==params->handle) {
gillwei7 14:397f6514bb2c 217 #if BLE_DEBUG
gillwei7 7:33214585c606 218 console.printf("ser_count,char_count:%d,%d\r\n",i,j);
gillwei7 5:ee474e3133eb 219 #endif
gillwei7 7:33214585c606 220 if (bufferService[i].ser_uuid.shortOrLong()==0)
gillwei7 7:33214585c606 221 console.printf("%04X",bufferService[i].ser_uuid.getShortUUID());
gillwei7 7:33214585c606 222 else {
gillwei7 7:33214585c606 223 cpSerBaseUUID = bufferService[i].ser_uuid.getBaseUUID();
gillwei7 7:33214585c606 224 for (int i=15; i>=0; i--) {
gillwei7 7:33214585c606 225 console.printf("%02X",cpSerBaseUUID[i]);
gillwei7 7:33214585c606 226 }
gillwei7 7:33214585c606 227 }
gillwei7 7:33214585c606 228 console.printf(",");
gillwei7 7:33214585c606 229 //console.printf("char_uuid:");
gillwei7 7:33214585c606 230 if (bufferService[i].bufferGattChar[j].char_uuid.shortOrLong()==0) // Short UUID
gillwei7 7:33214585c606 231 console.printf("%04X",bufferService[i].bufferGattChar[j].char_uuid.getShortUUID());
gillwei7 7:33214585c606 232 else { // Long UUID
gillwei7 7:33214585c606 233 cpCharBaseUUID = bufferService[i].bufferGattChar[j].char_uuid.getBaseUUID();
gillwei7 7:33214585c606 234 for (int i=15; i>=0; i--) {
gillwei7 7:33214585c606 235 console.printf("%02X",cpCharBaseUUID[i]);
gillwei7 7:33214585c606 236 }
gillwei7 7:33214585c606 237 }
gillwei7 7:33214585c606 238 console.printf(",");
gillwei7 14:397f6514bb2c 239 // update char value length
gillwei7 14:397f6514bb2c 240 bufferService[i].bufferGattChar[j].valueLength = params->len;
gillwei7 7:33214585c606 241 break;
gillwei7 7:33214585c606 242 }
gillwei7 7:33214585c606 243 }
gillwei7 7:33214585c606 244 }
gillwei7 7:33214585c606 245 console.printf("%d,",params->len);
gillwei7 7:33214585c606 246 for(int i=0; i<params->len; i++) {
gillwei7 7:33214585c606 247 console.printf("%02X",params->data[i]);
gillwei7 7:33214585c606 248 }
gillwei7 7:33214585c606 249 console.printf(";\r\n");
gillwei7 5:ee474e3133eb 250 }
gillwei7 0:5c195ab2f696 251
gillwei7 0:5c195ab2f696 252 static void cyntecPrintOk(void)
gillwei7 0:5c195ab2f696 253 {
gillwei7 3:38ec8ad317f4 254 console.printf("\r\nOK\r\n\r\n");
gillwei7 0:5c195ab2f696 255 }
gillwei7 0:5c195ab2f696 256
gillwei7 0:5c195ab2f696 257 static void cyntecPrintError(uint8_t errIdx)
gillwei7 0:5c195ab2f696 258 {
gillwei7 3:38ec8ad317f4 259 console.printf("\r\nERROR;");
gillwei7 3:38ec8ad317f4 260 console.printf(cyntecCommandErrorNames[errIdx]);
gillwei7 3:38ec8ad317f4 261 console.printf("\r\n\r\n");
gillwei7 3:38ec8ad317f4 262 }
gillwei7 3:38ec8ad317f4 263
gillwei7 0:5c195ab2f696 264 static void cynAdvertiseStartCommand(void)
gillwei7 0:5c195ab2f696 265 {
gillwei7 3:38ec8ad317f4 266 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 267 uint8_t *arg;
gillwei7 3:38ec8ad317f4 268 uint16_t advInterval;
gillwei7 3:38ec8ad317f4 269 uint16_t advTimeout;
gillwei7 3:38ec8ad317f4 270
gillwei7 3:38ec8ad317f4 271 switch (cyntecGetCommandTokenCnt()) {
gillwei7 3:38ec8ad317f4 272 case 2:
gillwei7 3:38ec8ad317f4 273 advInterval = APP_ADV_INTERVAL;
gillwei7 3:38ec8ad317f4 274 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 275 break;
gillwei7 3:38ec8ad317f4 276 case 3:
gillwei7 3:38ec8ad317f4 277 /* arg1 is adv interval parameter */
gillwei7 4:b52035367aee 278 arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 279 advInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 280 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 281 break;
gillwei7 3:38ec8ad317f4 282 case 4:
gillwei7 4:b52035367aee 283 arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 4:b52035367aee 284 advInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 285 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 286 advTimeout = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 287 break;
gillwei7 3:38ec8ad317f4 288 default:
gillwei7 3:38ec8ad317f4 289 advInterval = APP_ADV_INTERVAL;
gillwei7 3:38ec8ad317f4 290 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 291 break;
gillwei7 3:38ec8ad317f4 292 }
gillwei7 3:38ec8ad317f4 293
silviaChen 23:620896909655 294 if ( advInterval< APP_ADV_INTERVAL_MIN | advInterval> APP_ADV_INTERVAL_MAX | advTimeout < APP_ADV_TIMEOUT_LIMITED_MIN | advTimeout > APP_ADV_TIMEOUT_LIMITED_MAX ) {
silviaChen 23:620896909655 295 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
silviaChen 23:620896909655 296 return;
silviaChen 23:620896909655 297 }
gillwei7 14:397f6514bb2c 298 #if BLE_DEBUG
gillwei7 4:b52035367aee 299 console.printf("advInterval:%d,advTimeout:%d",advInterval,advTimeout);
gillwei7 4:b52035367aee 300 #endif
gillwei7 6:1243f9e584f4 301 uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"};
gillwei7 7:33214585c606 302 uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET;
gillwei7 7:33214585c606 303 uint32_t err_code;
gillwei7 6:1243f9e584f4 304
gillwei7 7:33214585c606 305 err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen);
gillwei7 14:397f6514bb2c 306 #if BLE_DEBUG
gillwei7 6:1243f9e584f4 307 console.printf("%08X,%s\r\n",err_code,bleName+APP_ADV_DATA_OFFSET);
gillwei7 6:1243f9e584f4 308 #endif
gillwei7 4:b52035367aee 309 deltaBLE.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
gillwei7 4:b52035367aee 310 //deltaBLE.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
gillwei7 6:1243f9e584f4 311 deltaBLE.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, bleName+APP_ADV_DATA_OFFSET, bleLen);
gillwei7 4:b52035367aee 312 deltaBLE.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
gillwei7 4:b52035367aee 313 deltaBLE.gap().setAdvertisingInterval(advInterval); /* minisecond. */
gillwei7 4:b52035367aee 314 deltaBLE.gap().setAdvertisingTimeout(advTimeout); /* second. */
gillwei7 4:b52035367aee 315 deltaBLE.gap().startAdvertising();
gillwei7 4:b52035367aee 316 cyntecPrintOk();
gillwei7 9:ff3ccba5dc16 317 //nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO);
gillwei7 0:5c195ab2f696 318 }
gillwei7 0:5c195ab2f696 319
gillwei7 0:5c195ab2f696 320 /**@brief Function for stop advertising.
gillwei7 0:5c195ab2f696 321 */
gillwei7 0:5c195ab2f696 322 static void cynAdvertiseStopCommand(void)
gillwei7 0:5c195ab2f696 323 {
gillwei7 4:b52035367aee 324 deltaBLE.gap().stopAdvertising();
gillwei7 4:b52035367aee 325 cyntecPrintOk();
gillwei7 9:ff3ccba5dc16 326 //nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO);
gillwei7 0:5c195ab2f696 327 }
gillwei7 0:5c195ab2f696 328
silviaChen 16:d1682a3e93f5 329 //Silvia modify
gillwei7 0:5c195ab2f696 330 static void cynBLENameCommand(void)
gillwei7 0:5c195ab2f696 331 {
gillwei7 12:a91455702763 332 uint8_t nameLen = 0; // Name char number, max is TARGET_DEVNAME_LEN
gillwei7 12:a91455702763 333 uint8_t nameLenCharNum = 0; // Name length number is 1 or 2
gillwei7 12:a91455702763 334 uint8_t *nameLeng = cyntecGetCommandArgument(0,&nameLenCharNum);
gillwei7 12:a91455702763 335 nameLen = cyntecAtoi(nameLeng,nameLenCharNum);
gillwei7 12:a91455702763 336 #ifdef BLE_DEUG
gillwei7 12:a91455702763 337 console.printf("nameLenCharNum:%i\r\nOK;",nameLenCharNum);
gillwei7 12:a91455702763 338 console.printf("nameLen:%i\r\nOK;",nameLen);
gillwei7 12:a91455702763 339 #endif
gillwei7 12:a91455702763 340 uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"};
gillwei7 12:a91455702763 341 uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET;
gillwei7 12:a91455702763 342 ble_gap_conn_sec_mode_t sec_mode;
gillwei7 12:a91455702763 343 uint32_t err_code;
gillwei7 12:a91455702763 344 uint8_t * argName2 = cyntecGetCommandTotalBuffer();
gillwei7 7:33214585c606 345
gillwei7 12:a91455702763 346 // Get name string
gillwei7 12:a91455702763 347 if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 3:38ec8ad317f4 348 err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen);
gillwei7 3:38ec8ad317f4 349 console.printf("\r\nOK;");
gillwei7 3:38ec8ad317f4 350 console.printf("%s",bleName+APP_ADV_DATA_OFFSET);
gillwei7 3:38ec8ad317f4 351 console.printf(";\r\n");
gillwei7 12:a91455702763 352 }
gillwei7 12:a91455702763 353 // Set name
gillwei7 12:a91455702763 354 if (cyntecGetCommandTokenCnt() >= 3) {
gillwei7 12:a91455702763 355 if (nameLen>TARGET_DEVNAME_LEN || nameLen <=0)
gillwei7 12:a91455702763 356 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 12:a91455702763 357 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
gillwei7 12:a91455702763 358 err_code = sd_ble_gap_device_name_set(&sec_mode,
gillwei7 12:a91455702763 359 (const uint8_t *) &argName2[11+nameLenCharNum],
gillwei7 12:a91455702763 360 (uint16_t) nameLen);//(uint16_t) (cyntecGetTotalIndex()-11-nameLenCharNum));
gillwei7 12:a91455702763 361 if (err_code == NRF_SUCCESS)
gillwei7 12:a91455702763 362 cyntecPrintOk();
gillwei7 12:a91455702763 363 else
gillwei7 12:a91455702763 364 cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL);
gillwei7 12:a91455702763 365 #ifdef BLE_DEUG
gillwei7 12:a91455702763 366 console.printf("LengNum:%i,string:%s,index:%i\r\n",nameLenCharNum,(const uint8_t *) &argName2[11+nameLenCharNum],cyntecGetTotalIndex());
gillwei7 12:a91455702763 367 #endif
gillwei7 3:38ec8ad317f4 368 }
gillwei7 0:5c195ab2f696 369 }
gillwei7 12:a91455702763 370
gillwei7 0:5c195ab2f696 371 static void cynBLEInfoCommand(void)
gillwei7 0:5c195ab2f696 372 {
silviaChen 18:4f5b317c04b9 373 console.printf("\r\nOK;%s;%s\r\n\r\n", CLI_FWVERION, MODULE_NAME);
gillwei7 0:5c195ab2f696 374 }
silviaChen 18:4f5b317c04b9 375 //Silvia modify
gillwei7 0:5c195ab2f696 376
gillwei7 0:5c195ab2f696 377 /**@brief Set the radio's transmit power.
gillwei7 0:5c195ab2f696 378 *
gillwei7 0:5c195ab2f696 379 * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -30, -20, -16, -12, -8, -4, 0, and 4 dBm).
gillwei7 0:5c195ab2f696 380 *
gillwei7 0:5c195ab2f696 381 * @note -40 dBm will not actually give -40 dBm, but will instead be remapped to -30 dBm.
gillwei7 0:5c195ab2f696 382 */
gillwei7 0:5c195ab2f696 383 static void cynBLESetTxPowerCommand (void)
gillwei7 0:5c195ab2f696 384 {
gillwei7 4:b52035367aee 385 if (cyntecGetCommandTokenCnt() != 3) {
gillwei7 3:38ec8ad317f4 386 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 387 return;
gillwei7 3:38ec8ad317f4 388 }
gillwei7 4:b52035367aee 389 uint32_t err_code;
gillwei7 4:b52035367aee 390 uint8_t txLen=0;
gillwei7 4:b52035367aee 391 uint8_t *arg = cyntecGetCommandArgument(0,&txLen);
tsungta 21:72d7a6e85d7f 392
gillwei7 4:b52035367aee 393 bool inputSwitch = false; // if find matched case in TxPow, assign true
gillwei7 4:b52035367aee 394
tsungta 21:72d7a6e85d7f 395 #if defined(TARGET_DELTA_DFBM_NQ620)
tsungta 21:72d7a6e85d7f 396 const uint8_t NUM_TXPOW = 7;
tsungta 21:72d7a6e85d7f 397 int8_t validTxPow[NUM_TXPOW] = {-20, -16, -12, -8, -4, 0, 4};
tsungta 21:72d7a6e85d7f 398 #else if defined(TARGET_DELTA_DFCM_NNN40)
tsungta 21:72d7a6e85d7f 399 const uint8_t NUM_TXPOW = 9;
gillwei7 4:b52035367aee 400 int8_t validTxPow[NUM_TXPOW] = {-40, -30, -20, -16, -12, -8, -4, 0, 4};
tsungta 21:72d7a6e85d7f 401 #endif
gillwei7 4:b52035367aee 402 uint8_t i;
gillwei7 4:b52035367aee 403 int8_t setValue;
gillwei7 4:b52035367aee 404
gillwei7 4:b52035367aee 405 if ( arg != NULL ) {
tsungta 21:72d7a6e85d7f 406 #if defined(TARGET_DELTA_DFBM_NQ620)
gillwei7 4:b52035367aee 407 setValue = atoi((const char *)arg);
tsungta 21:72d7a6e85d7f 408 #else if defined(TARGET_DELTA_DFCM_NNN40)
tsungta 21:72d7a6e85d7f 409 setValue = cyntecAtoInt(arg);//work around for NNN40 since somehow atoi doesn't work properly
tsungta 21:72d7a6e85d7f 410 #endif
gillwei7 4:b52035367aee 411 for (i = 0; i < NUM_TXPOW; i++) {
gillwei7 4:b52035367aee 412 if (setValue == validTxPow[i]) {
gillwei7 4:b52035367aee 413 err_code = sd_ble_gap_tx_power_set(setValue);
gillwei7 6:1243f9e584f4 414 //APP_ERROR_CHECK(err_code);
gillwei7 4:b52035367aee 415 inputSwitch = true;
gillwei7 4:b52035367aee 416 break;
gillwei7 4:b52035367aee 417 }
gillwei7 4:b52035367aee 418 }
gillwei7 4:b52035367aee 419
gillwei7 4:b52035367aee 420 if ( inputSwitch )
gillwei7 4:b52035367aee 421 cyntecPrintOk();
gillwei7 4:b52035367aee 422 else
gillwei7 4:b52035367aee 423 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 4:b52035367aee 424
gillwei7 4:b52035367aee 425 }
gillwei7 4:b52035367aee 426 clearBuffer(); // clear the commandState.buffer
gillwei7 4:b52035367aee 427 return;
gillwei7 0:5c195ab2f696 428 }
gillwei7 0:5c195ab2f696 429
gillwei7 0:5c195ab2f696 430 static void cynBLEAddressCommand(void)
gillwei7 0:5c195ab2f696 431 {
gillwei7 3:38ec8ad317f4 432 if (cyntecGetCommandTokenCnt() == 3) {
gillwei7 3:38ec8ad317f4 433 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 434 uint8_t *arg = cyntecGetCommandArgument(0, &argLen);
gillwei7 3:38ec8ad317f4 435 uint32_t err_code;
gillwei7 3:38ec8ad317f4 436 uint8_t addr,i;
gillwei7 3:38ec8ad317f4 437
gillwei7 3:38ec8ad317f4 438 /* should with "0x" + 12 len addr */
gillwei7 3:38ec8ad317f4 439 if (argLen == 14) {
gillwei7 3:38ec8ad317f4 440 if (arg[0] != '0' || arg[1] != 'x') {
gillwei7 3:38ec8ad317f4 441 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 442 return;
gillwei7 3:38ec8ad317f4 443 }
gillwei7 0:5c195ab2f696 444
gillwei7 3:38ec8ad317f4 445 m_peer_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
gillwei7 3:38ec8ad317f4 446
gillwei7 3:38ec8ad317f4 447 for ( i = 1 ; i < 7 ; i++) {
gillwei7 3:38ec8ad317f4 448 addr = cyntecArgToUint8(arg+2*i, 2);
gillwei7 3:38ec8ad317f4 449 /* 5 - (i-1) */
gillwei7 3:38ec8ad317f4 450 m_peer_addr.addr[6-i] = addr;
gillwei7 3:38ec8ad317f4 451 }
gillwei7 3:38ec8ad317f4 452
gillwei7 3:38ec8ad317f4 453 err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_peer_addr);
gillwei7 6:1243f9e584f4 454 //APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 455
gillwei7 3:38ec8ad317f4 456 } else { //argLen != 14
gillwei7 3:38ec8ad317f4 457 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 458 return;
gillwei7 3:38ec8ad317f4 459 }
gillwei7 0:5c195ab2f696 460
gillwei7 14:397f6514bb2c 461 //#if BLE_DEBUG
gillwei7 0:5c195ab2f696 462 // uint8_t buf2[20];
gillwei7 0:5c195ab2f696 463 // console.printf("\r\nSet BLE Address: ");
gillwei7 3:38ec8ad317f4 464 // sprintf((char *)&buf2[0],(const char *)"[%02X %02X %02X %02X %02X %02X]",
gillwei7 3:38ec8ad317f4 465 // m_peer_addr.addr[0], m_peer_addr.addr[1], m_peer_addr.addr[2],
gillwei7 3:38ec8ad317f4 466 // m_peer_addr.addr[3], m_peer_addr.addr[4], m_peer_addr.addr[5]);
gillwei7 0:5c195ab2f696 467 // console.printf(buf2);
gillwei7 3:38ec8ad317f4 468 //#endif
gillwei7 3:38ec8ad317f4 469
gillwei7 3:38ec8ad317f4 470 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 471 } else if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 0:5c195ab2f696 472
gillwei7 3:38ec8ad317f4 473 uint32_t err_code;
gillwei7 3:38ec8ad317f4 474 err_code = sd_ble_gap_address_get(&m_peer_addr);
gillwei7 6:1243f9e584f4 475 //APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 476
silviaChen 16:d1682a3e93f5 477 // cyntecPrintOk();
gillwei7 3:38ec8ad317f4 478
silviaChen 16:d1682a3e93f5 479 console.printf("OK;[%02X %02X %02X %02X %02X %02X];\r\n",
gillwei7 3:38ec8ad317f4 480 m_peer_addr.addr[5], m_peer_addr.addr[4], m_peer_addr.addr[3],
gillwei7 3:38ec8ad317f4 481 m_peer_addr.addr[2], m_peer_addr.addr[1], m_peer_addr.addr[0]);
gillwei7 3:38ec8ad317f4 482 } else { //cyntecGetCommandTokenCnt() not equal to 2 or 3
gillwei7 3:38ec8ad317f4 483 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 484 }
gillwei7 3:38ec8ad317f4 485 return;
gillwei7 0:5c195ab2f696 486 }
gillwei7 0:5c195ab2f696 487
gillwei7 4:b52035367aee 488 static uint32_t adv_report_parse(uint8_t type, data_t * p_advdata, data_t * p_typedata)
gillwei7 4:b52035367aee 489 {
gillwei7 4:b52035367aee 490 uint32_t index = 0;
gillwei7 4:b52035367aee 491 const uint8_t * p_data;
gillwei7 4:b52035367aee 492
gillwei7 4:b52035367aee 493 p_data = p_advdata->p_data;
gillwei7 4:b52035367aee 494
gillwei7 4:b52035367aee 495 while (index < p_advdata->data_len) {
gillwei7 4:b52035367aee 496 uint8_t field_length = p_data[index];
gillwei7 4:b52035367aee 497 uint8_t field_type = p_data[index+1];
gillwei7 4:b52035367aee 498
gillwei7 4:b52035367aee 499 if (field_type == type) {
gillwei7 4:b52035367aee 500 p_typedata->p_data = &p_data[index+2];
gillwei7 4:b52035367aee 501 p_typedata->data_len = field_length-1;
gillwei7 4:b52035367aee 502 return NRF_SUCCESS;
gillwei7 4:b52035367aee 503 }
gillwei7 4:b52035367aee 504 index += field_length+1;
gillwei7 4:b52035367aee 505 }
gillwei7 4:b52035367aee 506 return NRF_ERROR_NOT_FOUND;
gillwei7 4:b52035367aee 507 }
gillwei7 4:b52035367aee 508
gillwei7 4:b52035367aee 509 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
gillwei7 4:b52035367aee 510 {
silviaChen 16:d1682a3e93f5 511 //Silvia modify
gillwei7 4:b52035367aee 512 Gap::Address_t newAddr[6];
gillwei7 4:b52035367aee 513 memcpy(newAddr,params->peerAddr,6);
silviaChen 16:d1682a3e93f5 514
silviaChen 16:d1682a3e93f5 515 if (conn_action == true) {
silviaChen 16:d1682a3e93f5 516 conn_action = false;
silviaChen 16:d1682a3e93f5 517
silviaChen 16:d1682a3e93f5 518 if (memcmp(targetAddr,newAddr,6)==0) {
silviaChen 18:4f5b317c04b9 519 deltaBLE.gap().connect(params->peerAddr, Gap::ADDR_TYPE_PUBLIC, NULL, NULL); //0920 Silvia change address type
silviaChen 16:d1682a3e93f5 520 return;
gillwei7 4:b52035367aee 521 }
silviaChen 16:d1682a3e93f5 522 } else {
silviaChen 16:d1682a3e93f5 523 bool flagRepeat=false;
silviaChen 16:d1682a3e93f5 524
silviaChen 16:d1682a3e93f5 525 for(int i=0; i<BLE_MAX_ADDRESS_NUMBER; i++) {
silviaChen 16:d1682a3e93f5 526 if (memcmp(newAddr,saveAddr[i],6)==0) {
silviaChen 16:d1682a3e93f5 527 #if BLE_DEBUG
silviaChen 16:d1682a3e93f5 528 console.printf("Repeated\r\n");
silviaChen 16:d1682a3e93f5 529 #endif
silviaChen 16:d1682a3e93f5 530 flagRepeat = true;
silviaChen 16:d1682a3e93f5 531 //return;
silviaChen 16:d1682a3e93f5 532 }
silviaChen 16:d1682a3e93f5 533 }
gillwei7 4:b52035367aee 534
silviaChen 16:d1682a3e93f5 535 #if BLE_DEBUG
silviaChen 16:d1682a3e93f5 536 console.printf("addr cmp result :%i\r\n",memcmp(newAddr,params->peerAddr,6));
silviaChen 16:d1682a3e93f5 537 console.printf("ADV data:%X,%i\r\n",&(params->advertisingData),params->advertisingDataLen);
silviaChen 16:d1682a3e93f5 538 #endif
silviaChen 16:d1682a3e93f5 539 data_t adv_data;
silviaChen 16:d1682a3e93f5 540 data_t type_data;
silviaChen 16:d1682a3e93f5 541 //Initialize advertisement report for parsing.
silviaChen 16:d1682a3e93f5 542 adv_data.p_data = params->advertisingData;
silviaChen 16:d1682a3e93f5 543 adv_data.data_len = params->advertisingDataLen;
silviaChen 16:d1682a3e93f5 544 // Parsing Device Name
silviaChen 16:d1682a3e93f5 545 uint32_t err_code = adv_report_parse(BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
silviaChen 16:d1682a3e93f5 546 &adv_data,
silviaChen 16:d1682a3e93f5 547 &type_data);
silviaChen 16:d1682a3e93f5 548 #if BLE_DEBUG
silviaChen 16:d1682a3e93f5 549 console.printf("error code:%X\r\n",err_code);
silviaChen 16:d1682a3e93f5 550 console.printf("type_data.data_len:%i\r\n",type_data.data_len);
silviaChen 16:d1682a3e93f5 551 #endif
silviaChen 16:d1682a3e93f5 552 if (flagRepeat == false) {
silviaChen 16:d1682a3e93f5 553 if (err_code == 0) {
silviaChen 16:d1682a3e93f5 554 for (int i=0; i<type_data.data_len; i++) {
silviaChen 16:d1682a3e93f5 555 console.printf("%c",type_data.p_data[i]);
silviaChen 16:d1682a3e93f5 556 }
silviaChen 16:d1682a3e93f5 557 //console.printf("\r\n");
silviaChen 16:d1682a3e93f5 558 }
silviaChen 16:d1682a3e93f5 559 console.printf(",ADV,[%02X %02X %02X %02X %02X %02X],%d,%u\r\n",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3],
silviaChen 16:d1682a3e93f5 560 params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi,params->type);
silviaChen 16:d1682a3e93f5 561 memcpy(saveAddr[bleDevInd],params->peerAddr,6);
silviaChen 16:d1682a3e93f5 562 bleDevInd++;
silviaChen 16:d1682a3e93f5 563 }
gillwei7 4:b52035367aee 564 }
gillwei7 4:b52035367aee 565
gillwei7 4:b52035367aee 566 /*
gillwei7 4:b52035367aee 567 Check short name, not implemented
gillwei7 4:b52035367aee 568 */
gillwei7 4:b52035367aee 569 //else
gillwei7 4:b52035367aee 570 // {
gillwei7 4:b52035367aee 571 // uint32_t err_code_2 = adv_report_parse(BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME,
gillwei7 4:b52035367aee 572 // &adv_data,
gillwei7 4:b52035367aee 573 // &type_data);
gillwei7 4:b52035367aee 574 // console.printf("error code:%X\r\n",err_code_2);
gillwei7 4:b52035367aee 575 // console.printf("%i\r\n",type_data.data_len);
gillwei7 4:b52035367aee 576 // console.printf("%s\r\n",type_data.p_data);
gillwei7 4:b52035367aee 577 //
gillwei7 4:b52035367aee 578 // }
gillwei7 4:b52035367aee 579 }
gillwei7 4:b52035367aee 580
gillwei7 3:38ec8ad317f4 581
gillwei7 3:38ec8ad317f4 582 /**@brief Function to start scanning.
gillwei7 0:5c195ab2f696 583 */
gillwei7 0:5c195ab2f696 584 static void scan_start(void)
gillwei7 0:5c195ab2f696 585 {
silviaChen 16:d1682a3e93f5 586 memset(saveAddr,0,sizeof(saveAddr)); //Silvia add, Clear saving address set
gillwei7 3:38ec8ad317f4 587 deltaBLE.gap().startScan(advertisementCallback);
gillwei7 3:38ec8ad317f4 588 //APP_ERROR_CHECK(err_code);
gillwei7 0:5c195ab2f696 589 }
gillwei7 0:5c195ab2f696 590
gillwei7 0:5c195ab2f696 591 static void scan_stop(void)
gillwei7 0:5c195ab2f696 592 {
gillwei7 3:38ec8ad317f4 593 deltaBLE.stopScan();
gillwei7 3:38ec8ad317f4 594 //APP_ERROR_CHECK(err_code);
gillwei7 0:5c195ab2f696 595 }
gillwei7 0:5c195ab2f696 596
gillwei7 3:38ec8ad317f4 597 // gill 20150916 modify
gillwei7 0:5c195ab2f696 598 static void cynBLEScanCommand(void)
gillwei7 0:5c195ab2f696 599 {
gillwei7 3:38ec8ad317f4 600 uint16_t setInterval = DEFAULT_SCAN_INTERVAL;
gillwei7 3:38ec8ad317f4 601 uint16_t setWindow = DEFAULT_SCAN_WINDOW;
gillwei7 3:38ec8ad317f4 602 uint16_t setTimeout = DEFAULT_SCAN_TIMEOUT;
gillwei7 4:b52035367aee 603 if (cyntecGetCommandTokenCnt()!= 2 & cyntecGetCommandTokenCnt()!= 5) {
gillwei7 4:b52035367aee 604 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 4:b52035367aee 605 return;
gillwei7 4:b52035367aee 606 }
gillwei7 7:33214585c606 607 // If user input scan parameters, overwrite the default value
gillwei7 4:b52035367aee 608 if (cyntecGetCommandTokenCnt()== 5) {
gillwei7 4:b52035367aee 609 uint8_t argLen = 0;
gillwei7 4:b52035367aee 610 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 4:b52035367aee 611 setInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 4:b52035367aee 612 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 4:b52035367aee 613 setWindow = cyntecAtoiUint16( arg, argLen );
gillwei7 4:b52035367aee 614 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 4:b52035367aee 615 setTimeout = cyntecAtoiUint16( arg, argLen );
gillwei7 4:b52035367aee 616 }
silviaChen 23:620896909655 617
silviaChen 23:620896909655 618 //1102 Silvia modify
silviaChen 23:620896909655 619 if ( setInterval < BLE_SCAN_INTERVAL_LIMITED_MIN | setInterval > BLE_SCAN_INTERVAL_LIMITED_MAX | setWindow < BLE_SCAN_WINDOW_LIMITED_MIN | setWindow > BLE_SCAN_WINDOW_LIMITED_MAX | setTimeout > BLE_SCAN_TIMEOUT_LIMITED_MAX | (setTimeout < BLE_SCAN_TIMEOUT_LIMITED_MIN && setTimeout != 0 ) | (setInterval < setWindow)) {
silviaChen 23:620896909655 620 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
silviaChen 23:620896909655 621 return;
silviaChen 23:620896909655 622 }
silviaChen 23:620896909655 623
gillwei7 14:397f6514bb2c 624 #if BLE_DEBUG
gillwei7 4:b52035367aee 625 console.printf("Interval:%d,Window:%d,timeout:%d\r\n",setInterval,setWindow,setTimeout);
gillwei7 3:38ec8ad317f4 626 #endif
silviaChen 16:d1682a3e93f5 627 // memset(saveAddr,0,sizeof(saveAddr)); // Clear saving address set
gillwei7 4:b52035367aee 628 //deltaBLE.gap().setScanParams(setInterval,setWindow,setTimeout,false);
gillwei7 4:b52035367aee 629 deltaBLE.gap().setScanInterval(setInterval);
gillwei7 4:b52035367aee 630 deltaBLE.gap().setScanWindow(setWindow);
gillwei7 4:b52035367aee 631 deltaBLE.gap().setScanTimeout(setTimeout);
gillwei7 5:ee474e3133eb 632 console.printf("Start Scan\r\n");
gillwei7 3:38ec8ad317f4 633 scan_start();
gillwei7 4:b52035367aee 634
gillwei7 3:38ec8ad317f4 635 }
gillwei7 3:38ec8ad317f4 636
gillwei7 3:38ec8ad317f4 637 static void cynBLEScanStopCommand(void)
gillwei7 3:38ec8ad317f4 638 {
gillwei7 4:b52035367aee 639 console.printf("\r\nStop Scanning\r\n");
gillwei7 3:38ec8ad317f4 640 scan_stop();
gillwei7 0:5c195ab2f696 641 }
gillwei7 0:5c195ab2f696 642
gillwei7 4:b52035367aee 643 static void cynBLEConnectCommand(void)
gillwei7 4:b52035367aee 644 {
silviaChen 16:d1682a3e93f5 645 //Silvia modify for specific address
gillwei7 4:b52035367aee 646 if (cyntecGetCommandTokenCnt() != 3) {
gillwei7 4:b52035367aee 647 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 4:b52035367aee 648 return;
gillwei7 4:b52035367aee 649 }
silviaChen 16:d1682a3e93f5 650 uint8_t argLen = 0;
silviaChen 16:d1682a3e93f5 651 uint8_t *arg = cyntecGetCommandArgument(0, &argLen);
silviaChen 16:d1682a3e93f5 652 ble_error_t err_code;
silviaChen 16:d1682a3e93f5 653 uint8_t addr,i;
gillwei7 4:b52035367aee 654
silviaChen 16:d1682a3e93f5 655 /* should with "0x" + 12 len addr */
silviaChen 16:d1682a3e93f5 656 if (argLen == 14) {
silviaChen 16:d1682a3e93f5 657 if (arg[0] != '0' || arg[1] != 'x') {
silviaChen 16:d1682a3e93f5 658 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
silviaChen 16:d1682a3e93f5 659 return;
silviaChen 16:d1682a3e93f5 660 }
silviaChen 16:d1682a3e93f5 661 memset(targetAddr,0,sizeof(targetAddr));
gillwei7 4:b52035367aee 662
silviaChen 16:d1682a3e93f5 663 for ( i = 1 ; i < 7 ; i++) {
silviaChen 16:d1682a3e93f5 664 addr = cyntecArgToUint8(arg+2*i, 2);
silviaChen 16:d1682a3e93f5 665 /* 5 - (i-1) */
silviaChen 16:d1682a3e93f5 666 targetAddr[6-i] = addr;
silviaChen 16:d1682a3e93f5 667 }
silviaChen 16:d1682a3e93f5 668
silviaChen 16:d1682a3e93f5 669 for(int i=0; i<BLE_MAX_ADDRESS_NUMBER; i++) {
silviaChen 16:d1682a3e93f5 670 if (memcmp(targetAddr,saveAddr[i],6)==0) {
silviaChen 18:4f5b317c04b9 671 err_code = deltaBLE.gap().connect(targetAddr, Gap::ADDR_TYPE_PUBLIC, NULL, NULL); //0920 Silvia change address type
silviaChen 16:d1682a3e93f5 672
silviaChen 16:d1682a3e93f5 673 if (err_code != 0) {
silviaChen 18:4f5b317c04b9 674 console.printf("Error:%d\r\n",err_code);
silviaChen 16:d1682a3e93f5 675 } else {
silviaChen 16:d1682a3e93f5 676 cyntecPrintOk();
silviaChen 16:d1682a3e93f5 677 }
silviaChen 16:d1682a3e93f5 678
silviaChen 16:d1682a3e93f5 679 return;
silviaChen 16:d1682a3e93f5 680 }
silviaChen 16:d1682a3e93f5 681 }
silviaChen 16:d1682a3e93f5 682
silviaChen 16:d1682a3e93f5 683 conn_action = true;
silviaChen 16:d1682a3e93f5 684 scan_start();
silviaChen 16:d1682a3e93f5 685 } else { //argLen != 14
silviaChen 16:d1682a3e93f5 686 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
silviaChen 16:d1682a3e93f5 687 return;
silviaChen 16:d1682a3e93f5 688 }
silviaChen 16:d1682a3e93f5 689
silviaChen 16:d1682a3e93f5 690 //if (cyntecGetCommandTokenCnt() != 3) {
silviaChen 16:d1682a3e93f5 691 // cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
silviaChen 16:d1682a3e93f5 692 // return;
silviaChen 16:d1682a3e93f5 693 // }
silviaChen 16:d1682a3e93f5 694 //
silviaChen 16:d1682a3e93f5 695 // uint8_t devNameLen = 0;
silviaChen 16:d1682a3e93f5 696 // uint8_t *argDevName = cyntecGetCommandArgument(0, &devNameLen);
silviaChen 16:d1682a3e93f5 697 //
silviaChen 16:d1682a3e93f5 698 // //if ( argDevName != NULL ) {
silviaChen 16:d1682a3e93f5 699 //// uint8_t i;
silviaChen 16:d1682a3e93f5 700 //// for (i = 0; i < devNameLen; i++) {
silviaChen 16:d1682a3e93f5 701 //// targetDevName[i] = argDevName[i];
silviaChen 16:d1682a3e93f5 702 //// }
silviaChen 16:d1682a3e93f5 703 //// if (i < devNameLen)
silviaChen 16:d1682a3e93f5 704 //// targetDevName[i] = '\0';
silviaChen 16:d1682a3e93f5 705 //// }
silviaChen 16:d1682a3e93f5 706 //
silviaChen 16:d1682a3e93f5 707 // memset( targetDevName , 0, TARGET_DEVNAME_LEN);
silviaChen 16:d1682a3e93f5 708 // memcpy( targetDevName, argDevName, devNameLen);
silviaChen 16:d1682a3e93f5 709 //#if BLE_DEBUG
silviaChen 16:d1682a3e93f5 710 // console.printf("Search for device name:%s\r\n",argDevName);
silviaChen 16:d1682a3e93f5 711 // console.printf("Target:%s\r\n",targetDevName);
silviaChen 16:d1682a3e93f5 712 //#endif
silviaChen 16:d1682a3e93f5 713 // conn_action = true;
silviaChen 16:d1682a3e93f5 714 // scan_start();
gillwei7 4:b52035367aee 715
gillwei7 4:b52035367aee 716 }
gillwei7 3:38ec8ad317f4 717
gillwei7 0:5c195ab2f696 718
gillwei7 0:5c195ab2f696 719 static void cynBLEDisconnectCommand(void)
gillwei7 0:5c195ab2f696 720 {
gillwei7 4:b52035367aee 721 ble_error_t err_code;
gillwei7 4:b52035367aee 722 err_code = deltaBLE.gap().disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION);
gillwei7 4:b52035367aee 723 //err_code = sd_ble_gap_disconnect(test_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
gillwei7 4:b52035367aee 724 //err_code = sd_ble_gap_connect_cancel(); // No function defined currently
gillwei7 14:397f6514bb2c 725 #if BLE_DEBUG
gillwei7 4:b52035367aee 726 console.printf("Error:%d\r\n",err_code);
gillwei7 4:b52035367aee 727 #endif
gillwei7 4:b52035367aee 728 cyntecPrintOk();
gillwei7 0:5c195ab2f696 729 }
gillwei7 0:5c195ab2f696 730
gillwei7 0:5c195ab2f696 731 static void cynBLESystemOffCommand(void)
gillwei7 0:5c195ab2f696 732 {
gillwei7 3:38ec8ad317f4 733 if (cyntecGetCommandTokenCnt() == 3) {
gillwei7 3:38ec8ad317f4 734 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 735 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 736 uint8_t gpioNum = cyntecAtoi( arg, argLen );
tsungta 20:bd1760975052 737
tsungta 20:bd1760975052 738 if (gpioNum < 1 || gpioNum > 4) {
gillwei7 3:38ec8ad317f4 739 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 3:38ec8ad317f4 740 return;
gillwei7 3:38ec8ad317f4 741 }
tsungta 20:bd1760975052 742 if (gpioNum == 1)
tsungta 20:bd1760975052 743 nrf_gpio_cfg_sense_input(BUTTON1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
tsungta 20:bd1760975052 744 #if defined(TARGET_DELTA_DFBM_NQ620)//Tsungta, temp use only, will be fix in NNN50
tsungta 20:bd1760975052 745 else if (gpioNum == 2)
tsungta 20:bd1760975052 746 nrf_gpio_cfg_sense_input(BUTTON2, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
tsungta 20:bd1760975052 747 else if (gpioNum == 3)
tsungta 20:bd1760975052 748 nrf_gpio_cfg_sense_input(BUTTON3, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
tsungta 20:bd1760975052 749 else if (gpioNum == 4)
tsungta 20:bd1760975052 750 nrf_gpio_cfg_sense_input(BUTTON4, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
tsungta 20:bd1760975052 751 #endif
tsungta 20:bd1760975052 752 else {
tsungta 20:bd1760975052 753 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
tsungta 20:bd1760975052 754 return;
tsungta 20:bd1760975052 755 }
gillwei7 3:38ec8ad317f4 756 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 757 } else if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 3:38ec8ad317f4 758 /* default wake up pin is uart Rx pin */
gillwei7 3:38ec8ad317f4 759 nrf_gpio_cfg_sense_input(RX_PIN_NUMBER,
gillwei7 3:38ec8ad317f4 760 NRF_GPIO_PIN_PULLUP,
gillwei7 3:38ec8ad317f4 761 NRF_GPIO_PIN_SENSE_LOW);
gillwei7 3:38ec8ad317f4 762 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 763 } else {
gillwei7 3:38ec8ad317f4 764 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 12:a91455702763 765 return;
gillwei7 3:38ec8ad317f4 766 }
gillwei7 3:38ec8ad317f4 767 sd_power_system_off();
gillwei7 0:5c195ab2f696 768 }
gillwei7 0:5c195ab2f696 769
gillwei7 0:5c195ab2f696 770 static void cynBLEGPIOCommand(void)
gillwei7 0:5c195ab2f696 771 {
gillwei7 3:38ec8ad317f4 772
gillwei7 3:38ec8ad317f4 773 if (cyntecGetCommandTokenCnt() == 4) {
gillwei7 3:38ec8ad317f4 774 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 775 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 776 uint8_t gpioNum = cyntecAtoi( arg, argLen );
gillwei7 3:38ec8ad317f4 777
tsungta 20:bd1760975052 778 if (gpioNum < 1 || gpioNum > 4) {
gillwei7 3:38ec8ad317f4 779 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 3:38ec8ad317f4 780 return;
gillwei7 3:38ec8ad317f4 781 }
gillwei7 3:38ec8ad317f4 782
gillwei7 3:38ec8ad317f4 783 /* arg2 is set or clear */
gillwei7 3:38ec8ad317f4 784 uint8_t *action = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 785
gillwei7 3:38ec8ad317f4 786 if ( cyntecStrCmp(action,(unsigned char *)"set",argLen) == 1 ) {
tsungta 20:bd1760975052 787 if (gpioNum == 1) { DigitalOut CLI_LED(LED1); CLI_LED = 1; }
tsungta 20:bd1760975052 788 else if (gpioNum == 2) { DigitalOut CLI_LED(LED2); CLI_LED = 1; }
tsungta 20:bd1760975052 789 else if (gpioNum == 3) { DigitalOut CLI_LED(LED3); CLI_LED = 1; }
tsungta 20:bd1760975052 790 else if (gpioNum == 4) { DigitalOut CLI_LED(LED4); CLI_LED = 1; }
gillwei7 3:38ec8ad317f4 791 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 792 } else if ( cyntecStrCmp(action,(unsigned char *)"clear",argLen) == 1 ) {
tsungta 20:bd1760975052 793 if (gpioNum == 1) { DigitalOut CLI_LED(LED1); CLI_LED = 0; }
tsungta 20:bd1760975052 794 else if (gpioNum == 2) { DigitalOut CLI_LED(LED2); CLI_LED = 0; }
tsungta 20:bd1760975052 795 else if (gpioNum == 3) { DigitalOut CLI_LED(LED3); CLI_LED = 0; }
tsungta 20:bd1760975052 796 else if (gpioNum == 4) { DigitalOut CLI_LED(LED4); CLI_LED = 0; }
gillwei7 3:38ec8ad317f4 797 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 798 } else {
gillwei7 3:38ec8ad317f4 799 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 800 }
gillwei7 3:38ec8ad317f4 801 } else {
gillwei7 3:38ec8ad317f4 802 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 803 }
gillwei7 0:5c195ab2f696 804 }
gillwei7 0:5c195ab2f696 805
gillwei7 0:5c195ab2f696 806 static void cynResetCommand(void)
gillwei7 0:5c195ab2f696 807 {
gillwei7 3:38ec8ad317f4 808 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 809 // On assert, the system can only recover with a reset.
gillwei7 3:38ec8ad317f4 810 NVIC_SystemReset();
gillwei7 0:5c195ab2f696 811 }
gillwei7 0:5c195ab2f696 812
gillwei7 4:b52035367aee 813 void triggerRead(const GattReadCallbackParams *response)
gillwei7 4:b52035367aee 814 {
gillwei7 4:b52035367aee 815 //if (response->handle == ledCharacteristic.getValueHandle()) {
gillwei7 4:b52035367aee 816 #if DUMP_READ_DATA
gillwei7 4:b52035367aee 817 printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
gillwei7 4:b52035367aee 818 for (unsigned index = 0; index < response->len; index++) {
gillwei7 4:b52035367aee 819 printf("%c[%02x]", response->data[index], response->data[index]);
gillwei7 4:b52035367aee 820 }
gillwei7 4:b52035367aee 821 printf("\r\n");
gillwei7 4:b52035367aee 822 #endif
gillwei7 4:b52035367aee 823 //
gillwei7 4:b52035367aee 824 // uint8_t toggledValue = response->data[0] ^ 0x1;
gillwei7 4:b52035367aee 825 // ledCharacteristic.write(1, &toggledValue);
gillwei7 4:b52035367aee 826 // }
gillwei7 4:b52035367aee 827 }
silviaChen 16:d1682a3e93f5 828
silviaChen 16:d1682a3e93f5 829 //Silvia modify
silviaChen 16:d1682a3e93f5 830 void centralReadCallback(const GattReadCallbackParams *response) {
silviaChen 16:d1682a3e93f5 831 // printf("centralReadCallback Handle: %d\r\n", response->handle);
silviaChen 16:d1682a3e93f5 832
silviaChen 16:d1682a3e93f5 833 for (unsigned index = 0; index < response->len; index++) {
silviaChen 18:4f5b317c04b9 834 console.printf("[%02x]", response->data[index]);
silviaChen 16:d1682a3e93f5 835 }
silviaChen 18:4f5b317c04b9 836 console.printf("\r\n");
silviaChen 16:d1682a3e93f5 837 }
silviaChen 16:d1682a3e93f5 838
silviaChen 16:d1682a3e93f5 839 void centralWriteCallback(const GattWriteCallbackParams *response) {
silviaChen 16:d1682a3e93f5 840 // printf("centralWriteCallback: %d\r\n", response->len);
silviaChen 16:d1682a3e93f5 841
silviaChen 16:d1682a3e93f5 842 for (unsigned index = 0; index < response->len; index++) {
silviaChen 18:4f5b317c04b9 843 console.printf("[%02x]", response->data[index]);
silviaChen 16:d1682a3e93f5 844 }
silviaChen 18:4f5b317c04b9 845 console.printf("\r\n");
silviaChen 16:d1682a3e93f5 846 }
silviaChen 16:d1682a3e93f5 847
silviaChen 16:d1682a3e93f5 848 void centralHvxCallback(const GattHVXCallbackParams *response) {
silviaChen 16:d1682a3e93f5 849 // printf("centralHvxCallback handle %u, type %02x, len %u\r\n", response->handle, response->type, response->len);
silviaChen 16:d1682a3e93f5 850 for (unsigned index = 0; index < response->len; index++) {
silviaChen 18:4f5b317c04b9 851 console.printf("[%02x]", response->data[index]);
silviaChen 16:d1682a3e93f5 852 }
silviaChen 18:4f5b317c04b9 853 console.printf("\r\n");
silviaChen 16:d1682a3e93f5 854 }
silviaChen 16:d1682a3e93f5 855 //Silvia modify
silviaChen 16:d1682a3e93f5 856
gillwei7 14:397f6514bb2c 857 static void cynBLEUpdateDataCommand(void)
gillwei7 0:5c195ab2f696 858 {
gillwei7 14:397f6514bb2c 859 if (cyntecGetCommandTokenCnt() != 6) {
gillwei7 3:38ec8ad317f4 860 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 861 return;
gillwei7 4:b52035367aee 862 }
gillwei7 4:b52035367aee 863 UUID buf_ser_uuid ;
gillwei7 4:b52035367aee 864 uint8_t bufferUuidVs[16];
gillwei7 4:b52035367aee 865 UUID buf_char_uuid;
gillwei7 4:b52035367aee 866 uint8_t bufVal[MAX_VALUE_LENGTH] = {0};
gillwei7 4:b52035367aee 867 uint16_t valueLen = 0;
gillwei7 4:b52035367aee 868 bool readmatchFlag = false;
gillwei7 4:b52035367aee 869 uint8_t argLen = 0;
gillwei7 4:b52035367aee 870 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 871
gillwei7 4:b52035367aee 872 // Handle input parameter - Service UUID
gillwei7 4:b52035367aee 873 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 874 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 875 }
gillwei7 4:b52035367aee 876 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 877 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 878 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 3:38ec8ad317f4 879 }
gillwei7 4:b52035367aee 880 buf_ser_uuid.setupLong(bufferUuidVs);
gillwei7 4:b52035367aee 881 }
gillwei7 3:38ec8ad317f4 882
gillwei7 4:b52035367aee 883 // Handle input parameter - Characteristic UUID
gillwei7 4:b52035367aee 884 argLen = 0;
gillwei7 4:b52035367aee 885 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 4:b52035367aee 886 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 887 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 888 }
gillwei7 4:b52035367aee 889 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 890 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 891 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 4:b52035367aee 892 }
gillwei7 4:b52035367aee 893 buf_char_uuid.setupLong(bufferUuidVs);
gillwei7 4:b52035367aee 894 }
gillwei7 14:397f6514bb2c 895 // Input Value Type
gillwei7 14:397f6514bb2c 896 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 14:397f6514bb2c 897 uint8_t type = *arg;
gillwei7 14:397f6514bb2c 898 //type = cyntecArgToUint8(arg,2);
gillwei7 14:397f6514bb2c 899 //printf("type:%d\r\n",type);
gillwei7 14:397f6514bb2c 900 if(type != '0' && type != '1') // Original Data
gillwei7 14:397f6514bb2c 901 {
gillwei7 14:397f6514bb2c 902 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 14:397f6514bb2c 903 }
gillwei7 14:397f6514bb2c 904
gillwei7 4:b52035367aee 905 // Input value
gillwei7 14:397f6514bb2c 906 arg = cyntecGetCommandArgument(3,&argLen);
gillwei7 14:397f6514bb2c 907 if(type == '0') // Original Data
gillwei7 14:397f6514bb2c 908 {
gillwei7 14:397f6514bb2c 909 valueLen = argLen;
gillwei7 14:397f6514bb2c 910 memcpy(bufVal,arg,argLen);
gillwei7 14:397f6514bb2c 911 }
gillwei7 14:397f6514bb2c 912 if(type == '1') // Char Data
gillwei7 14:397f6514bb2c 913 {
gillwei7 14:397f6514bb2c 914 valueLen = (argLen-2)/2; // uint8_t to uint16_t transform
gillwei7 14:397f6514bb2c 915 for (int i=0 ; i < valueLen; i++) {
gillwei7 14:397f6514bb2c 916 bufVal[i] = cyntecArgToUint8(arg+2+2*i,2);
gillwei7 14:397f6514bb2c 917 }
gillwei7 14:397f6514bb2c 918 }
gillwei7 14:397f6514bb2c 919 #if BLE_DEBUG
gillwei7 14:397f6514bb2c 920 printf("type:%i,bufVal:",type);
gillwei7 14:397f6514bb2c 921 printf("valueLength:%i\r\n",valueLen);
gillwei7 14:397f6514bb2c 922 for (int i=0 ; i < valueLen; i++) {
gillwei7 14:397f6514bb2c 923 printf("%02X ",bufVal[i]);
gillwei7 14:397f6514bb2c 924 }
gillwei7 14:397f6514bb2c 925 printf("\r\n");
gillwei7 14:397f6514bb2c 926 #endif
gillwei7 7:33214585c606 927
gillwei7 4:b52035367aee 928 for ( int i = 0 ; i < service_count ; i++ ) {
gillwei7 4:b52035367aee 929 if ( (bufferService[i].ser_uuid == buf_ser_uuid) & (readmatchFlag == false)) {
gillwei7 4:b52035367aee 930 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
gillwei7 4:b52035367aee 931 if (( bufferService[i].bufferGattChar[j].char_uuid == buf_char_uuid)& (readmatchFlag == false)) {
gillwei7 4:b52035367aee 932 GattAttribute& valueAttr = charAry[i][j]->getValueAttribute();
gillwei7 7:33214585c606 933 ble_error_t err;
gillwei7 7:33214585c606 934 if (!connState)
gillwei7 7:33214585c606 935 err = deltaBLE.gattServer().write(valueAttr.getHandle(),bufVal,valueLen,true);
gillwei7 4:b52035367aee 936 else
gillwei7 7:33214585c606 937 err = deltaBLE.gattServer().write(test_conn_handle,valueAttr.getHandle(),bufVal,valueLen,false);
gillwei7 14:397f6514bb2c 938
gillwei7 14:397f6514bb2c 939 // update valueLength
gillwei7 14:397f6514bb2c 940 bufferService[i].bufferGattChar[j].valueLength = valueLen;
gillwei7 5:ee474e3133eb 941
gillwei7 14:397f6514bb2c 942 #if BLE_DEBUG
gillwei7 7:33214585c606 943 console.printf("Write ERR:%i\r\n",err);
gillwei7 14:397f6514bb2c 944 printf("valueLen:%i\r\n",valueLen);
gillwei7 4:b52035367aee 945 #endif
gillwei7 7:33214585c606 946 console.printf("\r\nOK;");
gillwei7 7:33214585c606 947 for (uint16_t n=0; n<valueLen; n++) {
gillwei7 7:33214585c606 948 console.printf("%02X",bufVal[n]);
gillwei7 7:33214585c606 949 }
gillwei7 4:b52035367aee 950 console.printf("\r\n");
gillwei7 4:b52035367aee 951 readmatchFlag = true;
gillwei7 4:b52035367aee 952 return;
gillwei7 3:38ec8ad317f4 953 }
gillwei7 3:38ec8ad317f4 954 }
gillwei7 3:38ec8ad317f4 955 }
gillwei7 4:b52035367aee 956 }
gillwei7 4:b52035367aee 957 // no matched case, can not read
gillwei7 4:b52035367aee 958 if (readmatchFlag == false) {
gillwei7 4:b52035367aee 959 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
gillwei7 3:38ec8ad317f4 960 }
gillwei7 0:5c195ab2f696 961 }
gillwei7 0:5c195ab2f696 962
gillwei7 0:5c195ab2f696 963 static void cynBLEReadDataCommand(void)
gillwei7 3:38ec8ad317f4 964 {
gillwei7 14:397f6514bb2c 965 //#if BLE_DEBUG
gillwei7 14:397f6514bb2c 966 // printf("Saved Char:\r\n");
gillwei7 14:397f6514bb2c 967 // for (int i=0; i<service_count; i++) {
gillwei7 14:397f6514bb2c 968 // console.printf("ser_uuid:%04X",bufferService[service_count-1].ser_uuid.getShortUUID());
gillwei7 14:397f6514bb2c 969 // for (int j=0; j<CLI_CHAR_MAX_NUM; j++) {
gillwei7 14:397f6514bb2c 970 // printf(" %i,char_uuid%04X,",j,bufferService[service_count-1].bufferGattChar[char_count-1].char_uuid.getShortUUID());
gillwei7 14:397f6514bb2c 971 // printf("len%d,",bufferService[service_count-1].bufferGattChar[char_count-1].valueLength);
gillwei7 14:397f6514bb2c 972 // printf("val%02X;",bufferService[service_count-1].bufferGattChar[char_count-1].value[0]);
gillwei7 14:397f6514bb2c 973 // }
gillwei7 14:397f6514bb2c 974 // }
gillwei7 14:397f6514bb2c 975 // printf("\r\n");
gillwei7 14:397f6514bb2c 976 //#endif
gillwei7 3:38ec8ad317f4 977 if (cyntecGetCommandTokenCnt() != 4) {
gillwei7 3:38ec8ad317f4 978 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 4:b52035367aee 979 return;
gillwei7 4:b52035367aee 980 }
gillwei7 4:b52035367aee 981 UUID buf_ser_uuid ;
gillwei7 4:b52035367aee 982 uint8_t bufferUuidVs[16];
gillwei7 4:b52035367aee 983 UUID buf_char_uuid;
gillwei7 4:b52035367aee 984 uint8_t bufVal[MAX_VALUE_LENGTH] = {0};
gillwei7 4:b52035367aee 985 uint16_t valueLen=0;
gillwei7 14:397f6514bb2c 986 //uint16_t * valueLenPtr;
gillwei7 4:b52035367aee 987 bool readmatchFlag = false;
gillwei7 4:b52035367aee 988 uint8_t argLen = 0;
gillwei7 4:b52035367aee 989 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 990
gillwei7 4:b52035367aee 991 // Handle input parameter - Service UUID
gillwei7 4:b52035367aee 992 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 993 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 994 }
gillwei7 4:b52035367aee 995 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 996 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 997 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 3:38ec8ad317f4 998 }
gillwei7 4:b52035367aee 999 buf_ser_uuid.setupLong(bufferUuidVs);
gillwei7 4:b52035367aee 1000 }
gillwei7 3:38ec8ad317f4 1001
gillwei7 4:b52035367aee 1002 // Handle input parameter - Characteristic UUID
gillwei7 4:b52035367aee 1003 argLen = 0;
gillwei7 4:b52035367aee 1004 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 4:b52035367aee 1005 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 1006 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 1007 }
gillwei7 4:b52035367aee 1008 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 1009 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 1010 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 3:38ec8ad317f4 1011 }
gillwei7 4:b52035367aee 1012 buf_char_uuid.setupLong(bufferUuidVs);
gillwei7 4:b52035367aee 1013 }
gillwei7 14:397f6514bb2c 1014
gillwei7 4:b52035367aee 1015 for ( int i = 0 ; i < service_count ; i++ ) {
gillwei7 4:b52035367aee 1016 if ( (bufferService[i].ser_uuid == buf_ser_uuid) & (readmatchFlag == false)) {
gillwei7 4:b52035367aee 1017 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
gillwei7 4:b52035367aee 1018 if (( bufferService[i].bufferGattChar[j].char_uuid == buf_char_uuid)& (readmatchFlag == false)) {
gillwei7 4:b52035367aee 1019 GattAttribute& valueAttr = charAry[i][j]->getValueAttribute();
gillwei7 14:397f6514bb2c 1020 // valueLenPtr = valueAttr.getLengthPtr();
silviaChen 16:d1682a3e93f5 1021 valueLen = bufferService[i].bufferGattChar[j].valueLength;
silviaChen 16:d1682a3e93f5 1022 uint16_t * valueLenPtr = &bufferService[i].bufferGattChar[j].valueLength;
gillwei7 4:b52035367aee 1023 ble_error_t err = deltaBLE.gattServer().read(valueAttr.getHandle(),bufVal,valueLenPtr);
gillwei7 14:397f6514bb2c 1024 #if BLE_DEBUG
gillwei7 7:33214585c606 1025 console.printf("Read ERR:%i\r\n",err);
silviaChen 16:d1682a3e93f5 1026 printf("valueLen:%i\r\n",valueLen);
gillwei7 4:b52035367aee 1027 #endif
gillwei7 7:33214585c606 1028 console.printf("\r\nOK;");
gillwei7 4:b52035367aee 1029 console.printf("0x");
gillwei7 4:b52035367aee 1030 for (uint16_t n=0; n<valueLen; n++) {
gillwei7 4:b52035367aee 1031 console.printf("%02X",bufVal[n]);
gillwei7 3:38ec8ad317f4 1032 }
gillwei7 4:b52035367aee 1033 console.printf("\r\n");
gillwei7 4:b52035367aee 1034 readmatchFlag = true;
gillwei7 4:b52035367aee 1035 return;
gillwei7 3:38ec8ad317f4 1036 }
gillwei7 3:38ec8ad317f4 1037 }
gillwei7 3:38ec8ad317f4 1038 }
gillwei7 4:b52035367aee 1039
gillwei7 3:38ec8ad317f4 1040 }
gillwei7 4:b52035367aee 1041 // no matched case, can not read
gillwei7 4:b52035367aee 1042 if (readmatchFlag == false) {
gillwei7 4:b52035367aee 1043 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
gillwei7 4:b52035367aee 1044 }
gillwei7 0:5c195ab2f696 1045 }
gillwei7 0:5c195ab2f696 1046
gillwei7 0:5c195ab2f696 1047 static void cynGattCharCommand(void)
gillwei7 0:5c195ab2f696 1048 {
gillwei7 4:b52035367aee 1049 uint8_t i;
gillwei7 4:b52035367aee 1050 uint8_t valueLengthBuffer;
gillwei7 3:38ec8ad317f4 1051
gillwei7 3:38ec8ad317f4 1052 if (cyntecGetCommandTokenCnt() != 5) {
gillwei7 3:38ec8ad317f4 1053 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 1054 return;
gillwei7 4:b52035367aee 1055 }
silviaChen 18:4f5b317c04b9 1056
silviaChen 18:4f5b317c04b9 1057 //Silvia add
silviaChen 18:4f5b317c04b9 1058 if (service_count == 0) {
silviaChen 18:4f5b317c04b9 1059 cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION);
silviaChen 18:4f5b317c04b9 1060 return;
silviaChen 18:4f5b317c04b9 1061 }
silviaChen 18:4f5b317c04b9 1062 //Silvia add
silviaChen 23:620896909655 1063
silviaChen 23:620896909655 1064 if (char_count >= CLI_CHAR_MAX_NUM) {
silviaChen 23:620896909655 1065 cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL);
silviaChen 23:620896909655 1066 #if BLE_DEBUG
silviaChen 23:620896909655 1067 console.printf("Error: char_count>CLI_CHAR_MAX_NUM\r\n");
silviaChen 23:620896909655 1068 #endif
silviaChen 23:620896909655 1069 return;
silviaChen 23:620896909655 1070 }
gillwei7 7:33214585c606 1071
gillwei7 4:b52035367aee 1072 /* handle parameter - UUID */
gillwei7 4:b52035367aee 1073 /* Only support 16-bit or 128-bit UUID type */
gillwei7 4:b52035367aee 1074 uint8_t argLen = 0;
gillwei7 4:b52035367aee 1075 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 4:b52035367aee 1076 if (arg[0] != '0' || arg[1] != 'x' || (argLen != 6 && argLen != 34)) {
gillwei7 4:b52035367aee 1077 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 4:b52035367aee 1078 return;
gillwei7 4:b52035367aee 1079 }
gillwei7 4:b52035367aee 1080 /* len: 6 => 0xXXXX */
gillwei7 4:b52035367aee 1081 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 1082 UUID::ShortUUIDBytes_t buffer_uuid_short;
gillwei7 4:b52035367aee 1083 buffer_uuid_short = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 1084 UUID uuid_short(buffer_uuid_short);
gillwei7 4:b52035367aee 1085 bufferService[service_count-1].bufferGattChar[char_count].char_uuid = uuid_short;
gillwei7 4:b52035367aee 1086 }
gillwei7 4:b52035367aee 1087 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 1088 // Initialize LongUUIDBytes_t, then use default constructor to setupLong(longUUID)
gillwei7 4:b52035367aee 1089 UUID::LongUUIDBytes_t buffer_uuid_vs;
gillwei7 4:b52035367aee 1090 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 1091 buffer_uuid_vs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 3:38ec8ad317f4 1092 }
gillwei7 4:b52035367aee 1093 bufferService[service_count-1].bufferGattChar[char_count].char_uuid.setupLong(buffer_uuid_vs);
gillwei7 3:38ec8ad317f4 1094 }
gillwei7 3:38ec8ad317f4 1095
gillwei7 4:b52035367aee 1096 /* handle 3rd parameter - attribute mode */
gillwei7 4:b52035367aee 1097 argLen = 0;
gillwei7 4:b52035367aee 1098 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 4:b52035367aee 1099 if (arg[0] != '0' || arg[1] != 'x' ) {
gillwei7 4:b52035367aee 1100 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 4:b52035367aee 1101 return;
gillwei7 4:b52035367aee 1102 }
gillwei7 15:d627ee60bb78 1103 uint8_t prop = cyntecArgToUint8(arg+2,2);
gillwei7 0:5c195ab2f696 1104
gillwei7 4:b52035367aee 1105 /* handle 4th parameter - attribute value */
gillwei7 4:b52035367aee 1106 argLen = 0;
gillwei7 4:b52035367aee 1107 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 4:b52035367aee 1108 if (arg[0] != '0' || arg[1] != 'x' | argLen%2 != 0) {
gillwei7 4:b52035367aee 1109 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 1110 return;
gillwei7 4:b52035367aee 1111 }
gillwei7 4:b52035367aee 1112 valueLengthBuffer = (argLen-2)/2;
gillwei7 4:b52035367aee 1113 memset(bufferService[service_count-1].bufferGattChar[char_count].value,0,MAX_VALUE_LENGTH);
gillwei7 4:b52035367aee 1114 for (i=0 ; i < (argLen-2)/2; i++) {
gillwei7 4:b52035367aee 1115 bufferService[service_count-1].bufferGattChar[char_count].value[i] = cyntecArgToUint8(arg+2*(i+1), 2);
gillwei7 4:b52035367aee 1116 //console.printf("%02X ",bufferService[service_count-1].bufferGattChar[char_count].value[i]);
gillwei7 3:38ec8ad317f4 1117 }
gillwei7 14:397f6514bb2c 1118 #if BLE_DEBUG
gillwei7 15:d627ee60bb78 1119 printf("prop:%02X\r\n",prop);
gillwei7 4:b52035367aee 1120 console.printf("valueLengthBuffer:%d\r\n",valueLengthBuffer);
gillwei7 4:b52035367aee 1121 console.printf("value:");
gillwei7 4:b52035367aee 1122 for (i=0 ; i < valueLengthBuffer; i++) {
gillwei7 4:b52035367aee 1123 console.printf("%02X",bufferService[service_count-1].bufferGattChar[char_count].value[i]);
gillwei7 4:b52035367aee 1124 }
gillwei7 4:b52035367aee 1125 #endif
gillwei7 4:b52035367aee 1126 bufferService[service_count-1].bufferGattChar[char_count].valueLength = valueLengthBuffer;
gillwei7 4:b52035367aee 1127 bufferService[service_count-1].bufferGattChar[char_count].props = prop;
gillwei7 4:b52035367aee 1128 //bufferService[service_count-1].bufferGattChar[char_count].char_value_handle = testHandle;
silviaChen 23:620896909655 1129
gillwei7 4:b52035367aee 1130 cyntecPrintOk();
gillwei7 4:b52035367aee 1131 char_count++;
gillwei7 0:5c195ab2f696 1132 }
gillwei7 0:5c195ab2f696 1133
gillwei7 4:b52035367aee 1134 static void cynRegServiceCommand(void)
gillwei7 3:38ec8ad317f4 1135 {
gillwei7 4:b52035367aee 1136 //GattCharacteristic *charAry[char_count];
gillwei7 4:b52035367aee 1137 //GattCharacteristic **charAry;
gillwei7 4:b52035367aee 1138 //charAry = new GattCharacteristic *[char_count];
gillwei7 14:397f6514bb2c 1139 #if BLE_DEBUG
gillwei7 4:b52035367aee 1140 console.printf("Current char_count:%d\r\n",char_count);
gillwei7 4:b52035367aee 1141 console.printf("Current service_count:%d\r\n",service_count);
gillwei7 4:b52035367aee 1142 #endif
gillwei7 4:b52035367aee 1143 for (uint8_t i=0; i<char_count; i++) {
gillwei7 4:b52035367aee 1144 charAry[service_count-1][i] = new GattCharacteristic (
gillwei7 4:b52035367aee 1145 bufferService[service_count-1].bufferGattChar[i].char_uuid,
gillwei7 4:b52035367aee 1146 bufferService[service_count-1].bufferGattChar[i].value,
gillwei7 4:b52035367aee 1147 bufferService[service_count-1].bufferGattChar[i].valueLength,
gillwei7 4:b52035367aee 1148 MAX_VALUE_LENGTH,
gillwei7 4:b52035367aee 1149 bufferService[service_count-1].bufferGattChar[i].props
gillwei7 4:b52035367aee 1150 );
gillwei7 4:b52035367aee 1151 }
gillwei7 4:b52035367aee 1152 GattService newService(bufferService[service_count-1].ser_uuid, charAry[service_count-1], char_count );
gillwei7 4:b52035367aee 1153 ble_error_t err_code;
gillwei7 4:b52035367aee 1154 err_code = deltaBLE.addService(newService);
gillwei7 7:33214585c606 1155 if (err_code != 0) {
gillwei7 14:397f6514bb2c 1156 #if BLE_DEBUG
gillwei7 7:33214585c606 1157 console.printf("addService error:%d\r\n",err_code);
gillwei7 4:b52035367aee 1158 #endif
gillwei7 7:33214585c606 1159 cyntecPrintError(CYNTEC_CMD_ERR_CALL_FAIL);
gillwei7 7:33214585c606 1160 } else
gillwei7 7:33214585c606 1161 cyntecPrintOk();
gillwei7 4:b52035367aee 1162 //char_count = 0; // already did in gattService
gillwei7 0:5c195ab2f696 1163 }
gillwei7 0:5c195ab2f696 1164
gillwei7 0:5c195ab2f696 1165 static void cynGattServiceCommand(void)
gillwei7 0:5c195ab2f696 1166 {
gillwei7 3:38ec8ad317f4 1167 if (cyntecGetCommandTokenCnt() != 3) {
gillwei7 3:38ec8ad317f4 1168 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 1169 return;
gillwei7 4:b52035367aee 1170 }
gillwei7 4:b52035367aee 1171 /* handle first parameter - Service UUID */
gillwei7 4:b52035367aee 1172 uint8_t argLen = 0;
gillwei7 4:b52035367aee 1173 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 1174
gillwei7 4:b52035367aee 1175 /* Service uuid is 16 bits */
gillwei7 4:b52035367aee 1176 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 4:b52035367aee 1177 UUID::ShortUUIDBytes_t buffer_uuid_short;
gillwei7 4:b52035367aee 1178 buffer_uuid_short = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 14:397f6514bb2c 1179 #if BLE_DEBUG
gillwei7 4:b52035367aee 1180 console.printf("%4X",buffer_uuid_short);
gillwei7 0:5c195ab2f696 1181 #endif
gillwei7 4:b52035367aee 1182 UUID uuid_short(buffer_uuid_short);
gillwei7 4:b52035367aee 1183 bufferService[service_count].ser_uuid = uuid_short;
gillwei7 4:b52035367aee 1184 //buffer_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 4:b52035367aee 1185 }
gillwei7 3:38ec8ad317f4 1186
gillwei7 4:b52035367aee 1187 /* Service uuid is 128 bits */
gillwei7 4:b52035367aee 1188 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 4:b52035367aee 1189 // Initialize LongUUIDBytes_t, then use default constructor to setupLong(longUUID)
gillwei7 4:b52035367aee 1190 UUID::LongUUIDBytes_t buffer_uuid_vs;
gillwei7 4:b52035367aee 1191 for (uint8_t i=0; i<16; i++) {
gillwei7 4:b52035367aee 1192 buffer_uuid_vs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
gillwei7 14:397f6514bb2c 1193 #if BLE_DEBUG
gillwei7 4:b52035367aee 1194 console.printf("%2X ",buffer_uuid_vs[i]);
gillwei7 4:b52035367aee 1195 #endif
gillwei7 3:38ec8ad317f4 1196 }
gillwei7 4:b52035367aee 1197 UUID uuid_long(buffer_uuid_vs);
gillwei7 4:b52035367aee 1198 bufferService[service_count].ser_uuid = uuid_long;
gillwei7 3:38ec8ad317f4 1199 }
gillwei7 4:b52035367aee 1200 cyntecPrintOk();
gillwei7 4:b52035367aee 1201 service_count++;
gillwei7 4:b52035367aee 1202 char_count = 0;
gillwei7 3:38ec8ad317f4 1203 }
gillwei7 0:5c195ab2f696 1204
tsungta 17:03c8af30087a 1205 /*Tsungta, @0913 modify to compatiable with mbed os 5.0*/
tsungta 17:03c8af30087a 1206 #include <mbed-events/events.h>
tsungta 17:03c8af30087a 1207 void onBleInitError(BLE &ble, ble_error_t error)
tsungta 17:03c8af30087a 1208 {
tsungta 17:03c8af30087a 1209 (void)ble;
tsungta 17:03c8af30087a 1210 (void)error;
tsungta 17:03c8af30087a 1211 /* Initialization error handling should go here */
tsungta 17:03c8af30087a 1212 }
tsungta 17:03c8af30087a 1213
tsungta 17:03c8af30087a 1214 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
gillwei7 0:5c195ab2f696 1215 {
tsungta 17:03c8af30087a 1216
tsungta 17:03c8af30087a 1217 }
tsungta 17:03c8af30087a 1218
tsungta 17:03c8af30087a 1219 static EventQueue eventQueue(
tsungta 17:03c8af30087a 1220 /* event count */ 16 * /* event size */ 32
tsungta 17:03c8af30087a 1221 );
tsungta 17:03c8af30087a 1222
tsungta 17:03c8af30087a 1223 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
tsungta 17:03c8af30087a 1224 BLE &deltaBLE = BLE::Instance();
tsungta 17:03c8af30087a 1225 eventQueue.post(Callback<void()>(&deltaBLE, &BLE::processEvents));
tsungta 17:03c8af30087a 1226 }
tsungta 17:03c8af30087a 1227
tsungta 17:03c8af30087a 1228 void cynBLEInitCommand(void)
silviaChen 18:4f5b317c04b9 1229 {
tsungta 17:03c8af30087a 1230 BLE &deltaBLE = BLE::Instance();
tsungta 17:03c8af30087a 1231
tsungta 17:03c8af30087a 1232 deltaBLE.onEventsToProcess(scheduleBleEventsProcessing);
tsungta 17:03c8af30087a 1233 deltaBLE.init(bleInitComplete);
gillwei7 3:38ec8ad317f4 1234 deltaBLE.onDisconnection(disconnectionCallback);
gillwei7 3:38ec8ad317f4 1235 deltaBLE.onConnection(onConnectionCallback);
gillwei7 3:38ec8ad317f4 1236 deltaBLE.onTimeout(onTimeoutCallback);
gillwei7 7:33214585c606 1237 deltaBLE.gattServer().onDataRead(triggerRead);
gillwei7 12:a91455702763 1238
silviaChen 18:4f5b317c04b9 1239 console.printf("\r\nOK;%s;%s\r\n\r\n", CLI_FWVERION, MODULE_NAME); //0920 Silvia add
tsungta 17:03c8af30087a 1240 while (true) {
tsungta 17:03c8af30087a 1241 eventQueue.dispatch();
tsungta 17:03c8af30087a 1242 }
gillwei7 0:5c195ab2f696 1243 }
tsungta 17:03c8af30087a 1244 /*Tsungta, end of @0913 modification*/
silviaChen 16:d1682a3e93f5 1245
silviaChen 16:d1682a3e93f5 1246 //Silvia modify
silviaChen 16:d1682a3e93f5 1247 static void cynBLECenInitCommand(void)
silviaChen 16:d1682a3e93f5 1248 {
silviaChen 16:d1682a3e93f5 1249 deltaBLE.init();
silviaChen 16:d1682a3e93f5 1250 deltaBLE.onDisconnection(disconnectionCallback);
silviaChen 16:d1682a3e93f5 1251 deltaBLE.onConnection(onConnectionCallback);
silviaChen 16:d1682a3e93f5 1252 deltaBLE.onTimeout(onTimeoutCallback);
silviaChen 16:d1682a3e93f5 1253 deltaBLE.gattClient().onDataRead(centralReadCallback);
silviaChen 16:d1682a3e93f5 1254 deltaBLE.gattClient().onDataWrite(centralWriteCallback);
silviaChen 16:d1682a3e93f5 1255 deltaBLE.gattClient().onHVX(centralHvxCallback);
silviaChen 16:d1682a3e93f5 1256
silviaChen 16:d1682a3e93f5 1257 cyntecPrintOk();
silviaChen 16:d1682a3e93f5 1258 }
silviaChen 16:d1682a3e93f5 1259
silviaChen 16:d1682a3e93f5 1260 static void cynBLECenReadDataCommand(void)
silviaChen 16:d1682a3e93f5 1261 {
silviaChen 16:d1682a3e93f5 1262 if (cyntecGetCommandTokenCnt() != 4) {
silviaChen 16:d1682a3e93f5 1263 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
silviaChen 16:d1682a3e93f5 1264 return;
silviaChen 16:d1682a3e93f5 1265 }
silviaChen 16:d1682a3e93f5 1266 UUID buf_ser_uuid ;
silviaChen 16:d1682a3e93f5 1267 uint8_t bufferUuidVs[16];
silviaChen 16:d1682a3e93f5 1268 UUID buf_char_uuid;
silviaChen 16:d1682a3e93f5 1269 bool readmatchFlag = false;
silviaChen 16:d1682a3e93f5 1270 uint8_t argLen = 0;
silviaChen 16:d1682a3e93f5 1271 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
silviaChen 16:d1682a3e93f5 1272
silviaChen 16:d1682a3e93f5 1273 // Handle input parameter - Service UUID
silviaChen 16:d1682a3e93f5 1274 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1275 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1276 }
silviaChen 16:d1682a3e93f5 1277 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1278 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1279 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1280 }
silviaChen 16:d1682a3e93f5 1281 buf_ser_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1282 }
silviaChen 16:d1682a3e93f5 1283
silviaChen 16:d1682a3e93f5 1284 // Handle input parameter - Characteristic UUID
silviaChen 16:d1682a3e93f5 1285 argLen = 0;
silviaChen 16:d1682a3e93f5 1286 arg = cyntecGetCommandArgument(1,&argLen);
silviaChen 16:d1682a3e93f5 1287 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1288 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1289 }
silviaChen 16:d1682a3e93f5 1290 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1291 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1292 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1293 }
silviaChen 16:d1682a3e93f5 1294 buf_char_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1295 }
silviaChen 16:d1682a3e93f5 1296
silviaChen 16:d1682a3e93f5 1297 for ( int i = 0 ; i < discoverService_count ; i++ ) {
silviaChen 16:d1682a3e93f5 1298 UUID sUUID, cUUID;
silviaChen 16:d1682a3e93f5 1299 if (discoverServiceArr[i].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1300 sUUID = UUID(discoverServiceArr[i].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1301 } else {
silviaChen 16:d1682a3e93f5 1302 const uint8_t *longUUIDBytes = discoverServiceArr[i].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1303 sUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1304 }
silviaChen 16:d1682a3e93f5 1305 if ((sUUID == buf_ser_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1306 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
silviaChen 16:d1682a3e93f5 1307 if (discoverCharArr[i][j].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1308 cUUID = UUID(discoverCharArr[i][j].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1309 } else {
silviaChen 16:d1682a3e93f5 1310 const uint8_t *longUUIDBytes = discoverCharArr[i][j].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1311 cUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1312 }
silviaChen 16:d1682a3e93f5 1313 if ((cUUID == buf_char_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1314 cyntecPrintOk();
silviaChen 16:d1682a3e93f5 1315 discoverCharArr[i][j].read();
silviaChen 16:d1682a3e93f5 1316
silviaChen 16:d1682a3e93f5 1317 readmatchFlag = true;
silviaChen 16:d1682a3e93f5 1318 return;
silviaChen 16:d1682a3e93f5 1319 }
silviaChen 16:d1682a3e93f5 1320 }
silviaChen 16:d1682a3e93f5 1321 }
silviaChen 16:d1682a3e93f5 1322 }
silviaChen 16:d1682a3e93f5 1323
silviaChen 16:d1682a3e93f5 1324 // no matched case, can not read
silviaChen 16:d1682a3e93f5 1325 if (readmatchFlag == false) {
silviaChen 16:d1682a3e93f5 1326 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
silviaChen 16:d1682a3e93f5 1327 }
silviaChen 16:d1682a3e93f5 1328 }
silviaChen 16:d1682a3e93f5 1329
silviaChen 16:d1682a3e93f5 1330 static void cynBLECenWriteDataCommand(void) {
silviaChen 16:d1682a3e93f5 1331 if (cyntecGetCommandTokenCnt() != 6) {
silviaChen 16:d1682a3e93f5 1332 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
silviaChen 16:d1682a3e93f5 1333 return;
silviaChen 16:d1682a3e93f5 1334 }
silviaChen 16:d1682a3e93f5 1335 UUID buf_ser_uuid ;
silviaChen 16:d1682a3e93f5 1336 uint8_t bufferUuidVs[16];
silviaChen 16:d1682a3e93f5 1337 UUID buf_char_uuid;
silviaChen 16:d1682a3e93f5 1338 bool readmatchFlag = false;
silviaChen 16:d1682a3e93f5 1339 uint16_t valueLen = 0;
silviaChen 16:d1682a3e93f5 1340 uint8_t argLen = 0;
silviaChen 16:d1682a3e93f5 1341 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
silviaChen 16:d1682a3e93f5 1342 uint8_t bufVal[MAX_VALUE_LENGTH] = {0};
silviaChen 16:d1682a3e93f5 1343
silviaChen 16:d1682a3e93f5 1344 // Handle input parameter - Service UUID
silviaChen 16:d1682a3e93f5 1345 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1346 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1347 }
silviaChen 16:d1682a3e93f5 1348 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1349 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1350 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1351 }
silviaChen 16:d1682a3e93f5 1352 buf_ser_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1353 }
silviaChen 16:d1682a3e93f5 1354
silviaChen 16:d1682a3e93f5 1355 // Handle input parameter - Characteristic UUID
silviaChen 16:d1682a3e93f5 1356 argLen = 0;
silviaChen 16:d1682a3e93f5 1357 arg = cyntecGetCommandArgument(1,&argLen);
silviaChen 16:d1682a3e93f5 1358 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1359 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1360 }
silviaChen 16:d1682a3e93f5 1361 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1362 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1363 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1364 }
silviaChen 16:d1682a3e93f5 1365 buf_char_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1366 }
silviaChen 16:d1682a3e93f5 1367
silviaChen 16:d1682a3e93f5 1368 //// Input Value Type
silviaChen 16:d1682a3e93f5 1369 arg = cyntecGetCommandArgument(2,&argLen);
silviaChen 16:d1682a3e93f5 1370 uint8_t type = *arg;
silviaChen 16:d1682a3e93f5 1371 //type = cyntecArgToUint8(arg,2);
silviaChen 16:d1682a3e93f5 1372 // printf("type:%d\r\n",type);
silviaChen 16:d1682a3e93f5 1373 if(type != '0' && type != '1') {
silviaChen 16:d1682a3e93f5 1374 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
silviaChen 16:d1682a3e93f5 1375 }
silviaChen 16:d1682a3e93f5 1376
silviaChen 16:d1682a3e93f5 1377 // Input value
silviaChen 16:d1682a3e93f5 1378 arg = cyntecGetCommandArgument(3,&argLen);
silviaChen 16:d1682a3e93f5 1379 if(type == '0') {
silviaChen 16:d1682a3e93f5 1380 valueLen = argLen;
silviaChen 16:d1682a3e93f5 1381 memcpy(bufVal,arg,argLen);
silviaChen 16:d1682a3e93f5 1382 }
silviaChen 16:d1682a3e93f5 1383 if(type == '1') {
silviaChen 16:d1682a3e93f5 1384 valueLen = (argLen-2)/2; // uint8_t to uint16_t transform
silviaChen 16:d1682a3e93f5 1385 for (int i=0 ; i < valueLen; i++) {
silviaChen 16:d1682a3e93f5 1386 bufVal[i] = cyntecArgToUint8(arg+2+2*i,2);
silviaChen 16:d1682a3e93f5 1387 }
silviaChen 16:d1682a3e93f5 1388 }
silviaChen 16:d1682a3e93f5 1389 #if BLE_DEBUG
silviaChen 16:d1682a3e93f5 1390 printf("type:%i,bufVal:",type);
silviaChen 16:d1682a3e93f5 1391 printf("valueLength:%i\r\n",valueLen);
silviaChen 16:d1682a3e93f5 1392 for (int i=0 ; i < valueLen; i++) {
silviaChen 16:d1682a3e93f5 1393 printf("%02X ",bufVal[i]);
silviaChen 16:d1682a3e93f5 1394 }
silviaChen 16:d1682a3e93f5 1395 printf("\r\n");
silviaChen 16:d1682a3e93f5 1396 #endif
silviaChen 16:d1682a3e93f5 1397
silviaChen 16:d1682a3e93f5 1398 for ( int i = 0 ; i < discoverService_count ; i++ ) {
silviaChen 16:d1682a3e93f5 1399 UUID sUUID, cUUID;
silviaChen 16:d1682a3e93f5 1400 if (discoverServiceArr[i].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1401 sUUID = UUID(discoverServiceArr[i].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1402 } else {
silviaChen 16:d1682a3e93f5 1403 const uint8_t *longUUIDBytes = discoverServiceArr[i].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1404 sUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1405 }
silviaChen 16:d1682a3e93f5 1406 if ((sUUID == buf_ser_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1407 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
silviaChen 16:d1682a3e93f5 1408 if (discoverCharArr[i][j].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1409 cUUID = UUID(discoverCharArr[i][j].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1410 } else {
silviaChen 16:d1682a3e93f5 1411 const uint8_t *longUUIDBytes = discoverCharArr[i][j].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1412 cUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1413 }
silviaChen 16:d1682a3e93f5 1414 if ((cUUID == buf_char_uuid) & (readmatchFlag == false)) {
silviaChen 18:4f5b317c04b9 1415 console.printf("OK;");
silviaChen 16:d1682a3e93f5 1416 for (int i=0 ; i < valueLen; i++) {
silviaChen 18:4f5b317c04b9 1417 console.printf("%02X",bufVal[i]);
silviaChen 16:d1682a3e93f5 1418 }
silviaChen 18:4f5b317c04b9 1419 console.printf("\r\n");
silviaChen 16:d1682a3e93f5 1420 deltaBLE.gattClient().write(GattClient::GATT_OP_WRITE_REQ, discoverCharArr[i][j].getConnectionHandle(), discoverCharArr[i][j].getValueHandle(), valueLen, bufVal);
silviaChen 16:d1682a3e93f5 1421 readmatchFlag = true;
silviaChen 16:d1682a3e93f5 1422 return;
silviaChen 16:d1682a3e93f5 1423 }
silviaChen 16:d1682a3e93f5 1424 }
silviaChen 16:d1682a3e93f5 1425 }
silviaChen 16:d1682a3e93f5 1426 }
silviaChen 16:d1682a3e93f5 1427
silviaChen 16:d1682a3e93f5 1428 // no matched case, can not read
silviaChen 16:d1682a3e93f5 1429 if (readmatchFlag == false) {
silviaChen 16:d1682a3e93f5 1430 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
silviaChen 16:d1682a3e93f5 1431 }
silviaChen 16:d1682a3e93f5 1432 }
silviaChen 16:d1682a3e93f5 1433
silviaChen 16:d1682a3e93f5 1434 static void cynBLECenEnNotifyCommand(void)
silviaChen 16:d1682a3e93f5 1435 {
silviaChen 16:d1682a3e93f5 1436 if (cyntecGetCommandTokenCnt() != 4) {
silviaChen 16:d1682a3e93f5 1437 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
silviaChen 16:d1682a3e93f5 1438 return;
silviaChen 16:d1682a3e93f5 1439 }
silviaChen 16:d1682a3e93f5 1440 UUID buf_ser_uuid ;
silviaChen 16:d1682a3e93f5 1441 uint8_t bufferUuidVs[16];
silviaChen 16:d1682a3e93f5 1442 UUID buf_char_uuid;
silviaChen 16:d1682a3e93f5 1443 bool readmatchFlag = false;
silviaChen 16:d1682a3e93f5 1444 uint8_t argLen = 0;
silviaChen 16:d1682a3e93f5 1445 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
silviaChen 16:d1682a3e93f5 1446
silviaChen 16:d1682a3e93f5 1447 // Handle input parameter - Service UUID
silviaChen 16:d1682a3e93f5 1448 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1449 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1450 }
silviaChen 16:d1682a3e93f5 1451 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1452 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1453 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1454 }
silviaChen 16:d1682a3e93f5 1455 buf_ser_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1456 }
silviaChen 16:d1682a3e93f5 1457
silviaChen 16:d1682a3e93f5 1458 // Handle input parameter - Characteristic UUID
silviaChen 16:d1682a3e93f5 1459 argLen = 0;
silviaChen 16:d1682a3e93f5 1460 arg = cyntecGetCommandArgument(1,&argLen);
silviaChen 16:d1682a3e93f5 1461 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1462 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1463 }
silviaChen 16:d1682a3e93f5 1464 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1465 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1466 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1467 }
silviaChen 16:d1682a3e93f5 1468 buf_char_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1469 }
silviaChen 16:d1682a3e93f5 1470
silviaChen 16:d1682a3e93f5 1471 for ( int i = 0 ; i < discoverService_count ; i++ ) {
silviaChen 16:d1682a3e93f5 1472 UUID sUUID, cUUID;
silviaChen 16:d1682a3e93f5 1473 if (discoverServiceArr[i].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1474 sUUID = UUID(discoverServiceArr[i].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1475 } else {
silviaChen 16:d1682a3e93f5 1476 const uint8_t *longUUIDBytes = discoverServiceArr[i].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1477 sUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1478 }
silviaChen 16:d1682a3e93f5 1479 if ((sUUID == buf_ser_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1480 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
silviaChen 16:d1682a3e93f5 1481 if (discoverCharArr[i][j].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1482 cUUID = UUID(discoverCharArr[i][j].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1483 } else {
silviaChen 16:d1682a3e93f5 1484 const uint8_t *longUUIDBytes = discoverCharArr[i][j].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1485 cUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1486 }
silviaChen 16:d1682a3e93f5 1487 if ((cUUID == buf_char_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1488 cyntecPrintOk();
silviaChen 16:d1682a3e93f5 1489 uint16_t value = BLE_HVX_NOTIFICATION;
silviaChen 16:d1682a3e93f5 1490 deltaBLE.gattClient().write(GattClient::GATT_OP_WRITE_REQ, discoverCharArr[i][j].getConnectionHandle(), discoverCharArr[i][j].getValueHandle() + 1, 2, (uint8_t *)&value);
silviaChen 16:d1682a3e93f5 1491 readmatchFlag = true;
silviaChen 16:d1682a3e93f5 1492 return;
silviaChen 16:d1682a3e93f5 1493 }
silviaChen 16:d1682a3e93f5 1494 }
silviaChen 16:d1682a3e93f5 1495 }
silviaChen 16:d1682a3e93f5 1496 }
silviaChen 16:d1682a3e93f5 1497
silviaChen 16:d1682a3e93f5 1498 // no matched case, can not read
silviaChen 16:d1682a3e93f5 1499 if (readmatchFlag == false) {
silviaChen 16:d1682a3e93f5 1500 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
silviaChen 16:d1682a3e93f5 1501 }
silviaChen 16:d1682a3e93f5 1502 }
silviaChen 16:d1682a3e93f5 1503
silviaChen 16:d1682a3e93f5 1504 static void cynBLECenDisNotifyCommand(void) {
silviaChen 16:d1682a3e93f5 1505 if (cyntecGetCommandTokenCnt() != 4) {
silviaChen 16:d1682a3e93f5 1506 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
silviaChen 16:d1682a3e93f5 1507 return;
silviaChen 16:d1682a3e93f5 1508 }
silviaChen 16:d1682a3e93f5 1509 UUID buf_ser_uuid ;
silviaChen 16:d1682a3e93f5 1510 uint8_t bufferUuidVs[16];
silviaChen 16:d1682a3e93f5 1511 UUID buf_char_uuid;
silviaChen 16:d1682a3e93f5 1512 bool readmatchFlag = false;
silviaChen 16:d1682a3e93f5 1513 uint8_t argLen = 0;
silviaChen 16:d1682a3e93f5 1514 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
silviaChen 16:d1682a3e93f5 1515
silviaChen 16:d1682a3e93f5 1516 // Handle input parameter - Service UUID
silviaChen 16:d1682a3e93f5 1517 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1518 buf_ser_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1519 }
silviaChen 16:d1682a3e93f5 1520 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1521 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1522 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1523 }
silviaChen 16:d1682a3e93f5 1524 buf_ser_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1525 }
silviaChen 16:d1682a3e93f5 1526
silviaChen 16:d1682a3e93f5 1527 // Handle input parameter - Characteristic UUID
silviaChen 16:d1682a3e93f5 1528 argLen = 0;
silviaChen 16:d1682a3e93f5 1529 arg = cyntecGetCommandArgument(1,&argLen);
silviaChen 16:d1682a3e93f5 1530 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
silviaChen 16:d1682a3e93f5 1531 buf_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
silviaChen 16:d1682a3e93f5 1532 }
silviaChen 16:d1682a3e93f5 1533 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
silviaChen 16:d1682a3e93f5 1534 for (uint8_t i=0; i<16; i++) {
silviaChen 16:d1682a3e93f5 1535 bufferUuidVs[i] = cyntecArgToUint8( (arg + 2+2*i), 2);
silviaChen 16:d1682a3e93f5 1536 }
silviaChen 16:d1682a3e93f5 1537 buf_char_uuid.setupLong(bufferUuidVs);
silviaChen 16:d1682a3e93f5 1538 }
silviaChen 16:d1682a3e93f5 1539
silviaChen 16:d1682a3e93f5 1540 for ( int i = 0 ; i < discoverService_count ; i++ ) {
silviaChen 16:d1682a3e93f5 1541 UUID sUUID, cUUID;
silviaChen 16:d1682a3e93f5 1542 if (discoverServiceArr[i].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1543 sUUID = UUID(discoverServiceArr[i].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1544 } else {
silviaChen 16:d1682a3e93f5 1545 const uint8_t *longUUIDBytes = discoverServiceArr[i].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1546 sUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1547 }
silviaChen 16:d1682a3e93f5 1548 if ((sUUID == buf_ser_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1549 for (int j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
silviaChen 16:d1682a3e93f5 1550 if (discoverCharArr[i][j].getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
silviaChen 16:d1682a3e93f5 1551 cUUID = UUID(discoverCharArr[i][j].getUUID().getShortUUID());
silviaChen 16:d1682a3e93f5 1552 } else {
silviaChen 16:d1682a3e93f5 1553 const uint8_t *longUUIDBytes = discoverCharArr[i][j].getUUID().getBaseUUID();
silviaChen 16:d1682a3e93f5 1554 cUUID = UUID(longUUIDBytes);
silviaChen 16:d1682a3e93f5 1555 }
silviaChen 16:d1682a3e93f5 1556 if ((cUUID == buf_char_uuid) & (readmatchFlag == false)) {
silviaChen 16:d1682a3e93f5 1557 cyntecPrintOk();
silviaChen 16:d1682a3e93f5 1558 uint16_t value = 0x00;
silviaChen 16:d1682a3e93f5 1559 deltaBLE.gattClient().write(GattClient::GATT_OP_WRITE_REQ, discoverCharArr[i][j].getConnectionHandle(), discoverCharArr[i][j].getValueHandle() + 1, 2, (uint8_t *)&value);
silviaChen 16:d1682a3e93f5 1560 readmatchFlag = true;
silviaChen 16:d1682a3e93f5 1561 return;
silviaChen 16:d1682a3e93f5 1562 }
silviaChen 16:d1682a3e93f5 1563 }
silviaChen 16:d1682a3e93f5 1564 }
silviaChen 16:d1682a3e93f5 1565 }
silviaChen 16:d1682a3e93f5 1566
silviaChen 16:d1682a3e93f5 1567 // no matched case, can not read
silviaChen 16:d1682a3e93f5 1568 if (readmatchFlag == false) {
silviaChen 16:d1682a3e93f5 1569 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
silviaChen 16:d1682a3e93f5 1570 }
silviaChen 16:d1682a3e93f5 1571 }
silviaChen 16:d1682a3e93f5 1572 //Silvia modify
silviaChen 16:d1682a3e93f5 1573
gillwei7 7:33214585c606 1574 static void cynBLEDataIntCommand(void)
gillwei7 7:33214585c606 1575 {
gillwei7 12:a91455702763 1576 cyntecPrintOk();
gillwei7 12:a91455702763 1577 deltaBLE.gattServer().onDataWritten().add(onDataWrittenCallback);
gillwei7 7:33214585c606 1578 }
gillwei7 7:33214585c606 1579 static void cynBLEDisDataIntCommand(void)
gillwei7 7:33214585c606 1580 {
gillwei7 12:a91455702763 1581 cyntecPrintOk();
gillwei7 12:a91455702763 1582 deltaBLE.gattServer().onDataWritten().detach(onDataWrittenCallback);
gillwei7 7:33214585c606 1583 }
gillwei7 0:5c195ab2f696 1584
gillwei7 14:397f6514bb2c 1585 #if BLE_DEBUG
gillwei7 4:b52035367aee 1586 static void cynBLETestCommand(void)
gillwei7 4:b52035367aee 1587 {
gillwei7 4:b52035367aee 1588 // gill test 1021
gillwei7 4:b52035367aee 1589 uint8_t bufVal[20] = {0};
gillwei7 7:33214585c606 1590 //uint8_t valWrite[2] = {0x22,0x33};
gillwei7 4:b52035367aee 1591 //uint16_t bufhandle = 0x0001;
gillwei7 7:33214585c606 1592 //uint8_t valRead[2] = {0,0};
gillwei7 4:b52035367aee 1593
gillwei7 7:33214585c606 1594 // uint16_t handle = charAry[0][0]->getValueHandle(); // No used?
gillwei7 4:b52035367aee 1595 GattAttribute& valueAttr = charAry[0][0]->getValueAttribute();
gillwei7 4:b52035367aee 1596 //valueAttr.setHandle(bufhandle);
gillwei7 4:b52035367aee 1597 console.printf("Handle:%04X ",valueAttr.getHandle());
gillwei7 4:b52035367aee 1598 console.printf("UUID:%04X ",valueAttr.getUUID().getShortUUID());
gillwei7 4:b52035367aee 1599
gillwei7 4:b52035367aee 1600 uint16_t* valueLenPtr = valueAttr.getLengthPtr();
gillwei7 4:b52035367aee 1601 deltaBLE.gattServer().read(valueAttr.getHandle(),bufVal,valueLenPtr);
gillwei7 7:33214585c606 1602 console.printf("gatt val[0][1]:%02X %02X\r\n",bufVal[0],bufVal[1]);
gillwei7 4:b52035367aee 1603 }
gillwei7 5:ee474e3133eb 1604 #endif
gillwei7 4:b52035367aee 1605
gillwei7 0:5c195ab2f696 1606 CyntecCommandEntry bleCommandSets[] = {
gillwei7 4:b52035367aee 1607 // General
gillwei7 14:397f6514bb2c 1608 #if BLE_DEBUG
gillwei7 4:b52035367aee 1609 {"TEST", cynBLETestCommand, NULL, "test"},
gillwei7 4:b52035367aee 1610 #endif
gillwei7 4:b52035367aee 1611 //
gillwei7 4:b52035367aee 1612 #if SIMPLE_CMD_NAME
tsungta 17:03c8af30087a 1613 //{"INT", cynBLEInitCommand, NULL, "Init BLE stack"},//Tsungta, INT is called in main.cpp
gillwei7 4:b52035367aee 1614 {"GIO", cynBLEGPIOCommand, NULL, "Config gpio, Usage: <GPIO NO> <set|clear>"},
gillwei7 4:b52035367aee 1615 {"SLP", cynBLESystemOffCommand, NULL, "System off mode, Usage: <GPIO NO>"},
gillwei7 4:b52035367aee 1616 {"RST", cynResetCommand, NULL, "Soft reset"},
silviaChen 16:d1682a3e93f5 1617 {"INF", cynBLEInfoCommand, NULL, "Get module information"},
silviaChen 16:d1682a3e93f5 1618 {"POW", cynBLESetTxPowerCommand, NULL, "Set BLE tx power, Usage: <TX POWER>"},
silviaChen 16:d1682a3e93f5 1619 {"NAM", cynBLENameCommand, NULL, "Set/Get friendly for BLE module, Usage: <LENGTH> <NAME>"},
gillwei7 4:b52035367aee 1620 // GATT
gillwei7 4:b52035367aee 1621 {"GRS", cynRegServiceCommand, NULL, "Register standby service"},
silviaChen 16:d1682a3e93f5 1622 {"GAC", cynGattCharCommand, NULL, "Set SIG defined characteristic or Create your own,Usage: <CHAR UUID> <PROPS> <VALUE>"},
silviaChen 16:d1682a3e93f5 1623 {"GAS", cynGattServiceCommand, NULL, "Set SIG defined service or Create your own,Usage: <SERVICE UUID>"},
silviaChen 16:d1682a3e93f5 1624 {"ADS", cynAdvertiseStartCommand, NULL, "Start broadcast advertise packet,Usage: <INTERVAL> <WINDOW>"},
gillwei7 4:b52035367aee 1625 {"ADP", cynAdvertiseStopCommand, NULL, "Stop broadcast advertise packet"},
silviaChen 16:d1682a3e93f5 1626 {"SCS", cynBLEScanCommand, NULL, "Start to scan BLE device, Usage: <INTERVAL> <WINDOW> <TIMEOUT>"},
gillwei7 4:b52035367aee 1627 {"SCP", cynBLEScanStopCommand, NULL, "Stop to scan BLE device"},
silviaChen 16:d1682a3e93f5 1628 {"CON", cynBLEConnectCommand, NULL, "Connect to specific BLE device by Device Address, Usage: <ADDR>"},
silviaChen 16:d1682a3e93f5 1629 {"DCN", cynBLEDisconnectCommand, NULL, "Disconnection"},
silviaChen 16:d1682a3e93f5 1630 {"ADR", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address, Usage: <ADDR>"},
silviaChen 16:d1682a3e93f5 1631 {"WRT", cynBLEUpdateDataCommand, NULL, "Update value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID> <TYPE> <VALUE>"},
silviaChen 16:d1682a3e93f5 1632 {"RED", cynBLEReadDataCommand, NULL, "Read value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
gillwei7 7:33214585c606 1633 {"EDI", cynBLEDataIntCommand, NULL, "Trigger remote write detection, give interrupt to Host."},
gillwei7 7:33214585c606 1634 {"DDI", cynBLEDisDataIntCommand, NULL, "Disable remote write detection."},
silviaChen 16:d1682a3e93f5 1635 //Silvia add BLE central commands
silviaChen 16:d1682a3e93f5 1636 {"CIN", cynBLECenInitCommand, NULL, "Init BLE Central stack"},
silviaChen 16:d1682a3e93f5 1637 {"CRD", cynBLECenReadDataCommand, NULL, "BLE Central read value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
silviaChen 16:d1682a3e93f5 1638 {"CWD", cynBLECenWriteDataCommand, NULL, "BLE Central write value to specific characteristics, Usage: <SERVICE UUID> <CHAR UUID> <TYPE> <VALUE>"},
silviaChen 16:d1682a3e93f5 1639 {"CEN", cynBLECenEnNotifyCommand, NULL, "BLE Central enable notification of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
silviaChen 16:d1682a3e93f5 1640 {"CDN", cynBLECenDisNotifyCommand, NULL, "BLE Central disable notification of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
gillwei7 4:b52035367aee 1641 {NULL, NULL, NULL, NULL},
gillwei7 4:b52035367aee 1642 #else
tsungta 17:03c8af30087a 1643 //{"init", cynBLEInitCommand, NULL, "Init BLE stack"},//Tsungta, init is called in main.cpp
gillwei7 5:ee474e3133eb 1644 {"gpio", cynBLEGPIOCommand, NULL, "Config gpio, Usage: <GPIO NO> <set|clear>"},
gillwei7 5:ee474e3133eb 1645 {"sleep", cynBLESystemOffCommand, NULL, "System off mode, Usage: <GPIO NO>"},
gillwei7 5:ee474e3133eb 1646 {"reset", cynResetCommand, NULL, "Soft reset"},
gillwei7 5:ee474e3133eb 1647 {"info", cynBLEInfoCommand, NULL, "Get module information"},
silviaChen 16:d1682a3e93f5 1648 {"txPow", cynBLESetTxPowerCommand, NULL, "Set BLE tx power, Usage: <TX POWER>"},
silviaChen 16:d1682a3e93f5 1649 {"name", cynBLENameCommand, NULL, "Set/Get friendly for BLE module, Usage: <LENGTH> <NAME>"},
gillwei7 4:b52035367aee 1650 // GATT
gillwei7 5:ee474e3133eb 1651 {"regService", cynRegServiceCommand, NULL, "Register standby service"},
gillwei7 5:ee474e3133eb 1652 {"gattChar", cynGattCharCommand, NULL, "Set SIG defined characteristic or Create your own,Usage: <CHAR UUID> <PROPS> <VALUE>"},
gillwei7 5:ee474e3133eb 1653 {"gattService", cynGattServiceCommand, NULL, "Set SIG defined service or Create your own,Usage: <SERVICE UUID>"},
gillwei7 5:ee474e3133eb 1654 {"advStart", cynAdvertiseStartCommand, NULL, "Start broadcast advertise packet,Usage: <INTERVAL> <WINDOW>"},
gillwei7 3:38ec8ad317f4 1655 {"advStop", cynAdvertiseStopCommand, NULL, "Stop broadcast advertise packet"},
silviaChen 16:d1682a3e93f5 1656 {"scanStart", cynBLEScanCommand, NULL, "Start to scan BLE device, Usage: <INTERVAL> <WINDOW> <TIMEOUT>"}, //BLE central
silviaChen 16:d1682a3e93f5 1657 {"scanStop", cynBLEScanStopCommand, NULL, "Stop to scan BLE device"}, //BLE central
silviaChen 16:d1682a3e93f5 1658 {"connect", cynBLEConnectCommand, NULL, "Connect to specific BLE device by Device Address, Usage: <ADDR>"}, //Silvia modify, BLE central
gillwei7 4:b52035367aee 1659 {"disconn", cynBLEDisconnectCommand, NULL, "Disconnection, Usage: cynb disconn"},
gillwei7 5:ee474e3133eb 1660 {"bleAddr", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address, Usage: <ADDR>"},
silviaChen 16:d1682a3e93f5 1661 {"update", cynBLEUpdateDataCommand, NULL, "Update value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID> <TYPE> <VALUE>"},
gillwei7 5:ee474e3133eb 1662 {"readData", cynBLEReadDataCommand, NULL, "Read value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
gillwei7 7:33214585c606 1663 {"enInt", cynBLEDataIntCommand, NULL, "Trigger remote write detection, give interrupt to Host."},
gillwei7 7:33214585c606 1664 {"disInt", cynBLEDisDataIntCommand, NULL, "Disable remote write detection."},
silviaChen 16:d1682a3e93f5 1665 //Silvia add BLE central commands
silviaChen 16:d1682a3e93f5 1666 {"initBleCen", cynBLECenInitCommand, NULL, "Init BLE Central stack"},
silviaChen 16:d1682a3e93f5 1667 {"cenReadData", cynBLECenReadDataCommand, NULL, "BLE Central read value of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
silviaChen 16:d1682a3e93f5 1668 {"cenWriteData", cynBLECenWriteDataCommand, NULL, "BLE Central write value to specific characteristics, Usage: <SERVICE UUID> <CHAR UUID> <TYPE> <VALUE>"},
silviaChen 16:d1682a3e93f5 1669 {"cenEnNotify", cynBLECenEnNotifyCommand, NULL, "BLE Central enable notification of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
silviaChen 16:d1682a3e93f5 1670 {"cenDisNotify", cynBLECenDisNotifyCommand, NULL, "BLE Central disable notification of specific characteristics, Usage: <SERVICE UUID> <CHAR UUID>"},
gillwei7 3:38ec8ad317f4 1671 {NULL, NULL, NULL, NULL},
gillwei7 4:b52035367aee 1672 #endif
gillwei7 0:5c195ab2f696 1673 };