Delta / Mbed OS Delta_CLI

Fork of NNN40_CLI by Delta

Committer:
tsungta
Date:
Mon Sep 19 02:26:11 2016 +0000
Revision:
17:03c8af30087a
Parent:
16:d1682a3e93f5
Child:
18:4f5b317c04b9
BLE CLI based mbed-os.; Both NNN40 and NQ620 are supported.

Who changed what in which revision?

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