Delta / Mbed OS Delta_CLI

Fork of NNN40_CLI by Delta

Committer:
tsungta
Date:
Thu Oct 20 03:14:33 2016 +0000
Revision:
21:72d7a6e85d7f
Parent:
20:bd1760975052
Child:
23:620896909655
bug fix for cynb txPow when using NNN40

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