fork test

Dependencies:   BLE_API WIFI_API_32kRAM mbed nRF51822

Fork of NNN40_CLI by Delta

Committer:
gillwei7
Date:
Fri Oct 02 10:36:29 2015 +0000
Revision:
3:38ec8ad317f4
Parent:
0:5c195ab2f696
Child:
4:b52035367aee
Gill Wei commit 20151002 update with WIFI_API_32kRAM Rev. 12, provide Scan, Read version and other wifi function, Set AP mode not ready.

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 0:5c195ab2f696 8 #include <stdio.h>
gillwei7 0:5c195ab2f696 9 #include <stdlib.h>
gillwei7 0:5c195ab2f696 10 #include <stdint.h>
gillwei7 0:5c195ab2f696 11 #include <string.h>
gillwei7 0:5c195ab2f696 12 #include "command-interpreter.h"
gillwei7 0:5c195ab2f696 13 #include "simple_uart.h"
gillwei7 0:5c195ab2f696 14 #include "mbed.h"
gillwei7 0:5c195ab2f696 15 #include "BLE.h"
gillwei7 0:5c195ab2f696 16 #include "Gap.h"
gillwei7 0:5c195ab2f696 17 #include "nrf_gpio.h"
gillwei7 0:5c195ab2f696 18 #include "nrf_soc.h"
gillwei7 0:5c195ab2f696 19 #include "ble_cli.h"
gillwei7 0:5c195ab2f696 20 #include "ble_hci.h"
gillwei7 0:5c195ab2f696 21 #include "app_error.h"
gillwei7 0:5c195ab2f696 22 #include "PinNames.h"
gillwei7 0:5c195ab2f696 23 //#include "custom_helper.h"
gillwei7 0:5c195ab2f696 24 extern "C" {
gillwei7 3:38ec8ad317f4 25 #include "ble_advdata.h"
gillwei7 0:5c195ab2f696 26 }
gillwei7 0:5c195ab2f696 27
gillwei7 3:38ec8ad317f4 28 //#define S110_BLE_PERIPHERAL
gillwei7 3:38ec8ad317f4 29 //#define S120_BLE_CENTRAL
gillwei7 0:5c195ab2f696 30
gillwei7 0:5c195ab2f696 31 #define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
gillwei7 0:5c195ab2f696 32 #define APP_ADV_TIMEOUT_IN_SECONDS 180 /**< The advertising timeout (in units of seconds). */
gillwei7 0:5c195ab2f696 33 #define APP_ADV_INTERVAL_MAX 16384 // correspond to 10.24s
gillwei7 0:5c195ab2f696 34 #define APP_ADV_INTERVAL_MIN 32 // correspond to 20ms
gillwei7 0:5c195ab2f696 35 // Offset for Advertising Data.
gillwei7 0:5c195ab2f696 36 #define APP_ADV_DATA_OFFSET 2
gillwei7 0:5c195ab2f696 37
gillwei7 0:5c195ab2f696 38 #define MAX_DEVNAME_LEN 32
gillwei7 0:5c195ab2f696 39 #define CLI_SERVICE_MAX_NUM 10
gillwei7 0:5c195ab2f696 40 #define CLI_CHAR_MAX_NUM 10
gillwei7 0:5c195ab2f696 41 #define MAX_VALUE_LENGTH 20
gillwei7 0:5c195ab2f696 42
gillwei7 0:5c195ab2f696 43 #define CLI_CHAR_MODE_NONE 0
gillwei7 0:5c195ab2f696 44 #define CLI_CHAR_MODE_READ 1
gillwei7 0:5c195ab2f696 45 #define CLI_CHAR_MODE_WRITE 2
gillwei7 0:5c195ab2f696 46 #define CLI_CHAR_MODE_INDICATE 3
gillwei7 0:5c195ab2f696 47 #define CLI_CHAR_MODE_NOTIFY 4
gillwei7 0:5c195ab2f696 48
gillwei7 0:5c195ab2f696 49 #define CLI_FWVERION "DELTA_CLI_V1.6"
gillwei7 0:5c195ab2f696 50 #define MODULE_NAME "DFCM-NNN40-DT1R"
gillwei7 0:5c195ab2f696 51 #define ADVERTISING_LED_PIN_NO LED1
gillwei7 3:38ec8ad317f4 52 //#define DELTA_DEBUG
gillwei7 0:5c195ab2f696 53 //#define LBS_UUID_BASE {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00}
gillwei7 0:5c195ab2f696 54 #define NEW_VS_SERVICE 0x0001
gillwei7 3:38ec8ad317f4 55 #define DEFAULT_SCAN_INTERVAL 500
gillwei7 3:38ec8ad317f4 56 #define DEFAULT_SCAN_WINDOW 400
gillwei7 3:38ec8ad317f4 57 #define DEFAULT_SCAN_TIMEOUT 5
gillwei7 3:38ec8ad317f4 58 #define BLE_MAX_ADDRESS_NUMBER 10
gillwei7 0:5c195ab2f696 59
gillwei7 0:5c195ab2f696 60 static ble_gap_addr_t m_peer_addr;
gillwei7 0:5c195ab2f696 61 extern Serial console;
gillwei7 0:5c195ab2f696 62 BLE deltaBLE; //gill 0904
gillwei7 0:5c195ab2f696 63 extern const char* cyntecCommandErrorNames[];
gillwei7 3:38ec8ad317f4 64 static bool connState = false; // gill 0904
gillwei7 0:5c195ab2f696 65
gillwei7 0:5c195ab2f696 66 typedef struct bufferGattChar {
gillwei7 0:5c195ab2f696 67 // bool flag;
gillwei7 3:38ec8ad317f4 68 uint8_t mode;
gillwei7 3:38ec8ad317f4 69 ble_uuid_t char_uuid;
gillwei7 3:38ec8ad317f4 70 //uint8_t value[MAX_VALUE_LENGTH];
gillwei7 3:38ec8ad317f4 71 uint16_t char_value_handle;
gillwei7 3:38ec8ad317f4 72 uint8_t valueLength;
gillwei7 0:5c195ab2f696 73 } bufferGattChar_t;
gillwei7 0:5c195ab2f696 74
gillwei7 0:5c195ab2f696 75 typedef struct bufferGattService {
gillwei7 0:5c195ab2f696 76 // uint16_t service_uuid_vs[8];
gillwei7 0:5c195ab2f696 77 // uint16_t service_uuid;
gillwei7 0:5c195ab2f696 78 // bool flag;
gillwei7 3:38ec8ad317f4 79 ble_uuid_t service_uuid;
gillwei7 3:38ec8ad317f4 80 bufferGattChar_t bufferGattChar[CLI_CHAR_MAX_NUM];
gillwei7 3:38ec8ad317f4 81 uint16_t service_handle;
gillwei7 0:5c195ab2f696 82 } bufferGattService_t;
gillwei7 0:5c195ab2f696 83
gillwei7 3:38ec8ad317f4 84 // gill 20150916 for scan
gillwei7 3:38ec8ad317f4 85 typedef struct {
gillwei7 3:38ec8ad317f4 86 const uint8_t * p_data; /**< Pointer to data. */
gillwei7 3:38ec8ad317f4 87 uint8_t data_len; /**< Length of data. */
gillwei7 3:38ec8ad317f4 88 } data_t;
gillwei7 3:38ec8ad317f4 89
gillwei7 0:5c195ab2f696 90 /* save entry services */
gillwei7 0:5c195ab2f696 91 bufferGattService_t bufferGattTest;
gillwei7 0:5c195ab2f696 92 bufferGattService_t bufferService[CLI_SERVICE_MAX_NUM];
gillwei7 0:5c195ab2f696 93
gillwei7 0:5c195ab2f696 94
gillwei7 0:5c195ab2f696 95 //static uint8_t debugMess[20]; // used in print debug
gillwei7 0:5c195ab2f696 96 uint8_t service_count=0;
gillwei7 0:5c195ab2f696 97 uint8_t char_count=0;
gillwei7 0:5c195ab2f696 98 static uint16_t test_conn_handle; //Connection handle, assign after connected
gillwei7 0:5c195ab2f696 99 extern bool advState; // currently no use
gillwei7 3:38ec8ad317f4 100 static Gap::Address_t saveAddr[BLE_MAX_ADDRESS_NUMBER]; // check in advertisementCallback
gillwei7 3:38ec8ad317f4 101 static uint8_t bleDevInd;
gillwei7 3:38ec8ad317f4 102 static Gap::GapState_t nowState;
gillwei7 0:5c195ab2f696 103
gillwei7 0:5c195ab2f696 104 DigitalOut led1(p7);
gillwei7 0:5c195ab2f696 105 DigitalOut led2(p13);
gillwei7 0:5c195ab2f696 106
gillwei7 0:5c195ab2f696 107 /******************************************************
gillwei7 0:5c195ab2f696 108 * Function Definitions
gillwei7 0:5c195ab2f696 109 ******************************************************/
gillwei7 0:5c195ab2f696 110
gillwei7 0:5c195ab2f696 111 void onTimeoutCallback(Gap::TimeoutSource_t source)
gillwei7 0:5c195ab2f696 112 {
gillwei7 3:38ec8ad317f4 113 led1 = !led1;
gillwei7 0:5c195ab2f696 114 }
gillwei7 0:5c195ab2f696 115
gillwei7 0:5c195ab2f696 116 void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
gillwei7 0:5c195ab2f696 117 {
gillwei7 0:5c195ab2f696 118 test_conn_handle = params->handle;
gillwei7 0:5c195ab2f696 119 //console.printf("connState:%d\r\n",connState);
gillwei7 0:5c195ab2f696 120 connState = true;
gillwei7 0:5c195ab2f696 121 led2 = !led2;
gillwei7 0:5c195ab2f696 122 }
gillwei7 0:5c195ab2f696 123
gillwei7 0:5c195ab2f696 124 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
gillwei7 0:5c195ab2f696 125 {
gillwei7 0:5c195ab2f696 126 //console.printf("connState:%d\r\n",connState);
gillwei7 3:38ec8ad317f4 127 //Gap::GapState_t->connected = 0;
gillwei7 0:5c195ab2f696 128 connState = false;
gillwei7 0:5c195ab2f696 129 }
gillwei7 0:5c195ab2f696 130
gillwei7 0:5c195ab2f696 131
gillwei7 0:5c195ab2f696 132 static void cyntecPrintOk(void)
gillwei7 0:5c195ab2f696 133 {
gillwei7 3:38ec8ad317f4 134 console.printf("\r\nOK\r\n\r\n");
gillwei7 0:5c195ab2f696 135 }
gillwei7 0:5c195ab2f696 136
gillwei7 0:5c195ab2f696 137 static void cyntecPrintError(uint8_t errIdx)
gillwei7 0:5c195ab2f696 138 {
gillwei7 3:38ec8ad317f4 139 console.printf("\r\nERROR;");
gillwei7 3:38ec8ad317f4 140 console.printf(cyntecCommandErrorNames[errIdx]);
gillwei7 3:38ec8ad317f4 141 console.printf("\r\n\r\n");
gillwei7 3:38ec8ad317f4 142 }
gillwei7 3:38ec8ad317f4 143
gillwei7 3:38ec8ad317f4 144
gillwei7 3:38ec8ad317f4 145 static uint32_t adv_report_parse(uint8_t type, data_t * p_advdata, data_t * p_typedata)
gillwei7 3:38ec8ad317f4 146 {
gillwei7 3:38ec8ad317f4 147 uint32_t index = 0;
gillwei7 3:38ec8ad317f4 148 const uint8_t * p_data;
gillwei7 3:38ec8ad317f4 149
gillwei7 3:38ec8ad317f4 150 p_data = p_advdata->p_data;
gillwei7 3:38ec8ad317f4 151
gillwei7 3:38ec8ad317f4 152 while (index < p_advdata->data_len) {
gillwei7 3:38ec8ad317f4 153 uint8_t field_length = p_data[index];
gillwei7 3:38ec8ad317f4 154 uint8_t field_type = p_data[index+1];
gillwei7 3:38ec8ad317f4 155
gillwei7 3:38ec8ad317f4 156 if (field_type == type) {
gillwei7 3:38ec8ad317f4 157 p_typedata->p_data = &p_data[index+2];
gillwei7 3:38ec8ad317f4 158 p_typedata->data_len = field_length-1;
gillwei7 3:38ec8ad317f4 159 return NRF_SUCCESS;
gillwei7 3:38ec8ad317f4 160 }
gillwei7 3:38ec8ad317f4 161 index += field_length+1;
gillwei7 3:38ec8ad317f4 162 }
gillwei7 3:38ec8ad317f4 163 return NRF_ERROR_NOT_FOUND;
gillwei7 0:5c195ab2f696 164 }
gillwei7 0:5c195ab2f696 165
gillwei7 3:38ec8ad317f4 166 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
gillwei7 0:5c195ab2f696 167 {
gillwei7 3:38ec8ad317f4 168 bool flagRepeat=false;
gillwei7 3:38ec8ad317f4 169 Gap::Address_t newAddr[6];
gillwei7 3:38ec8ad317f4 170 memcpy(newAddr,params->peerAddr,6);
gillwei7 3:38ec8ad317f4 171
gillwei7 3:38ec8ad317f4 172 for(int i=0; i<BLE_MAX_ADDRESS_NUMBER; i++) {
gillwei7 3:38ec8ad317f4 173 if (memcmp(newAddr,saveAddr[i],6)==0) {
gillwei7 3:38ec8ad317f4 174 #ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 175 console.printf("Repeated\r\n");
gillwei7 3:38ec8ad317f4 176 #endif
gillwei7 3:38ec8ad317f4 177 flagRepeat = true;
gillwei7 3:38ec8ad317f4 178 //return;
gillwei7 3:38ec8ad317f4 179 }
gillwei7 3:38ec8ad317f4 180 }
gillwei7 3:38ec8ad317f4 181
gillwei7 3:38ec8ad317f4 182 #ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 183 console.printf("addr cmp result :%i\r\n",memcmp(newAddr,params->peerAddr,6));
gillwei7 3:38ec8ad317f4 184 console.printf("ADV data:%X,%i\r\n",&(params->advertisingData),params->advertisingDataLen);
gillwei7 3:38ec8ad317f4 185 #endif
gillwei7 3:38ec8ad317f4 186 data_t adv_data;
gillwei7 3:38ec8ad317f4 187 data_t type_data;
gillwei7 3:38ec8ad317f4 188 //Initialize advertisement report for parsing.
gillwei7 3:38ec8ad317f4 189 adv_data.p_data = params->advertisingData;
gillwei7 3:38ec8ad317f4 190 adv_data.data_len = params->advertisingDataLen;
gillwei7 3:38ec8ad317f4 191 // Parsing Device Name
gillwei7 3:38ec8ad317f4 192 uint32_t err_code = adv_report_parse(BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
gillwei7 3:38ec8ad317f4 193 &adv_data,
gillwei7 3:38ec8ad317f4 194 &type_data);
gillwei7 3:38ec8ad317f4 195 #ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 196 console.printf("error code:%X\r\n",err_code);
gillwei7 3:38ec8ad317f4 197 console.printf("type_data.data_len:%i\r\n",type_data.data_len);
gillwei7 0:5c195ab2f696 198 #endif
gillwei7 3:38ec8ad317f4 199 if (flagRepeat == false) {
gillwei7 3:38ec8ad317f4 200 if (err_code == 0) {
gillwei7 3:38ec8ad317f4 201 for (int i=0; i<type_data.data_len; i++) {
gillwei7 3:38ec8ad317f4 202 console.printf("%c",type_data.p_data[i]);
gillwei7 3:38ec8ad317f4 203 }
gillwei7 3:38ec8ad317f4 204 //console.printf("\r\n");
gillwei7 3:38ec8ad317f4 205 }
gillwei7 3:38ec8ad317f4 206 console.printf(",ADV,[%02X %02X %02X %02X %02X %02X],%d,%u\r\n",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3],
gillwei7 3:38ec8ad317f4 207 params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi,params->type);
gillwei7 3:38ec8ad317f4 208 memcpy(saveAddr[bleDevInd],params->peerAddr,6);
gillwei7 3:38ec8ad317f4 209 bleDevInd++;
gillwei7 3:38ec8ad317f4 210 }
gillwei7 3:38ec8ad317f4 211
gillwei7 3:38ec8ad317f4 212 /*
gillwei7 3:38ec8ad317f4 213 Check short name, not implemented
gillwei7 3:38ec8ad317f4 214 */
gillwei7 3:38ec8ad317f4 215 //else
gillwei7 3:38ec8ad317f4 216 // {
gillwei7 3:38ec8ad317f4 217 // uint32_t err_code_2 = adv_report_parse(BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME,
gillwei7 3:38ec8ad317f4 218 // &adv_data,
gillwei7 3:38ec8ad317f4 219 // &type_data);
gillwei7 3:38ec8ad317f4 220 // console.printf("error code:%X\r\n",err_code_2);
gillwei7 3:38ec8ad317f4 221 // console.printf("%i\r\n",type_data.data_len);
gillwei7 3:38ec8ad317f4 222 // console.printf("%s\r\n",type_data.p_data);
gillwei7 3:38ec8ad317f4 223 //
gillwei7 3:38ec8ad317f4 224 // }
gillwei7 3:38ec8ad317f4 225 //ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
gillwei7 3:38ec8ad317f4 226 }
gillwei7 0:5c195ab2f696 227
gillwei7 3:38ec8ad317f4 228
gillwei7 3:38ec8ad317f4 229
gillwei7 0:5c195ab2f696 230 /**@brief Function for the Advertising functionality initialization.
gillwei7 0:5c195ab2f696 231 *
gillwei7 0:5c195ab2f696 232 * @details Encodes the required advertising data and passes it to the stack.
gillwei7 0:5c195ab2f696 233 * Also builds a structure to be passed to the stack when starting advertising.
gillwei7 0:5c195ab2f696 234 */
gillwei7 0:5c195ab2f696 235 static void advertising_init(void)
gillwei7 0:5c195ab2f696 236 {
gillwei7 0:5c195ab2f696 237 uint32_t err_code;
gillwei7 0:5c195ab2f696 238 ble_advdata_t advdata;
gillwei7 0:5c195ab2f696 239 ble_advdata_t scanrsp;
gillwei7 0:5c195ab2f696 240 //uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
gillwei7 3:38ec8ad317f4 241
gillwei7 0:5c195ab2f696 242 ble_uuid_t adv_uuids[] = {{bufferService[0].service_uuid.uuid, 0x01}};
gillwei7 0:5c195ab2f696 243
gillwei7 0:5c195ab2f696 244 memset(&advdata, 0, sizeof(advdata));
gillwei7 0:5c195ab2f696 245 advdata.name_type = BLE_ADVDATA_FULL_NAME;
gillwei7 0:5c195ab2f696 246 advdata.include_appearance = false;
gillwei7 0:5c195ab2f696 247 advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
gillwei7 0:5c195ab2f696 248 // advdata.flags.size = sizeof(flags);
gillwei7 0:5c195ab2f696 249 // advdata.flags.p_data = &flags;
gillwei7 0:5c195ab2f696 250
gillwei7 0:5c195ab2f696 251 memset(&scanrsp, 0, sizeof(scanrsp));
gillwei7 0:5c195ab2f696 252 scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
gillwei7 0:5c195ab2f696 253 scanrsp.uuids_complete.p_uuids = adv_uuids;
gillwei7 3:38ec8ad317f4 254
gillwei7 0:5c195ab2f696 255 err_code = ble_advdata_set(&advdata, &scanrsp);
gillwei7 0:5c195ab2f696 256 APP_ERROR_CHECK(err_code);
gillwei7 0:5c195ab2f696 257 }
gillwei7 0:5c195ab2f696 258
gillwei7 0:5c195ab2f696 259
gillwei7 0:5c195ab2f696 260 /**@brief Function for starting advertising.
gillwei7 0:5c195ab2f696 261 */
gillwei7 0:5c195ab2f696 262 static uint8_t advertising_start(uint16_t advInterval, uint16_t advTimeout)
gillwei7 0:5c195ab2f696 263 {
gillwei7 0:5c195ab2f696 264 uint32_t err_code;
gillwei7 0:5c195ab2f696 265 ble_gap_adv_params_t adv_params;
gillwei7 3:38ec8ad317f4 266
gillwei7 0:5c195ab2f696 267 // Start advertising
gillwei7 0:5c195ab2f696 268 memset(&adv_params, 0, sizeof(adv_params));
gillwei7 3:38ec8ad317f4 269
gillwei7 0:5c195ab2f696 270 adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; /**< Connectable undirected. */
gillwei7 0:5c195ab2f696 271 adv_params.p_peer_addr = NULL;
gillwei7 0:5c195ab2f696 272 adv_params.fp = BLE_GAP_ADV_FP_ANY; /**< Allow scan requests and connect requests from any device. */
gillwei7 0:5c195ab2f696 273 adv_params.interval = advInterval;
gillwei7 0:5c195ab2f696 274 adv_params.timeout = advTimeout;
gillwei7 0:5c195ab2f696 275
gillwei7 0:5c195ab2f696 276 err_code = sd_ble_gap_adv_start(&adv_params);
gillwei7 0:5c195ab2f696 277 //APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 278 return err_code;
gillwei7 0:5c195ab2f696 279 }
gillwei7 0:5c195ab2f696 280
gillwei7 0:5c195ab2f696 281
gillwei7 0:5c195ab2f696 282
gillwei7 0:5c195ab2f696 283 static void cynAdvertiseStartCommand(void)
gillwei7 0:5c195ab2f696 284 {
gillwei7 3:38ec8ad317f4 285 // adv start or adv stop or syntax error
gillwei7 3:38ec8ad317f4 286 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 287 uint8_t *arg;
gillwei7 3:38ec8ad317f4 288 /* arg0 is start or stop advertising */
gillwei7 3:38ec8ad317f4 289 uint8_t *action = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 290 uint16_t advInterval;
gillwei7 3:38ec8ad317f4 291 uint16_t advTimeout;
gillwei7 3:38ec8ad317f4 292
gillwei7 3:38ec8ad317f4 293 switch (cyntecGetCommandTokenCnt()) {
gillwei7 3:38ec8ad317f4 294 case 2:
gillwei7 3:38ec8ad317f4 295 advInterval = APP_ADV_INTERVAL;
gillwei7 3:38ec8ad317f4 296 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 297 break;
gillwei7 0:5c195ab2f696 298
gillwei7 3:38ec8ad317f4 299 case 3:
gillwei7 3:38ec8ad317f4 300 /* arg1 is adv interval parameter */
gillwei7 3:38ec8ad317f4 301 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 302 advInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 303 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 304 break;
gillwei7 3:38ec8ad317f4 305
gillwei7 3:38ec8ad317f4 306 case 4:
gillwei7 3:38ec8ad317f4 307 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 308 advInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 309 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 3:38ec8ad317f4 310 advTimeout = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 311 break;
gillwei7 3:38ec8ad317f4 312
gillwei7 3:38ec8ad317f4 313 default:
gillwei7 3:38ec8ad317f4 314 advInterval = APP_ADV_INTERVAL;
gillwei7 3:38ec8ad317f4 315 advTimeout = APP_ADV_TIMEOUT_IN_SECONDS;
gillwei7 3:38ec8ad317f4 316 break;
gillwei7 3:38ec8ad317f4 317 }
gillwei7 3:38ec8ad317f4 318
gillwei7 3:38ec8ad317f4 319 //if ( advInterval< APP_ADV_INTERVAL_MIN | advInterval> APP_ADV_INTERVAL_MAX | advTimeout < 1| advTimeout > BLE_GAP_ADV_TIMEOUT_LIMITED_MAX ) {
gillwei7 3:38ec8ad317f4 320 // cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 3:38ec8ad317f4 321 // return;
gillwei7 3:38ec8ad317f4 322 // }
gillwei7 3:38ec8ad317f4 323 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 324 //sprintf((char *)&debugMess[0],"[%d][%d]", advInterval,advTimeout);
gillwei7 0:5c195ab2f696 325 //console.printf(debugMess);
gillwei7 0:5c195ab2f696 326 //#endif
gillwei7 0:5c195ab2f696 327 // service_Test();
gillwei7 3:38ec8ad317f4 328 advertising_init();
gillwei7 3:38ec8ad317f4 329 uint8_t error_code = advertising_start(advInterval, advTimeout);
gillwei7 3:38ec8ad317f4 330
gillwei7 3:38ec8ad317f4 331 if (error_code==NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 332 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 333 nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO);
gillwei7 3:38ec8ad317f4 334 } else if (error_code==NRF_ERROR_INVALID_STATE) {
gillwei7 3:38ec8ad317f4 335 cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION);
gillwei7 3:38ec8ad317f4 336 return;
gillwei7 3:38ec8ad317f4 337 } else {
gillwei7 3:38ec8ad317f4 338 console.printf("ERROR;\r\n");
gillwei7 3:38ec8ad317f4 339 }
gillwei7 0:5c195ab2f696 340 }
gillwei7 0:5c195ab2f696 341
gillwei7 0:5c195ab2f696 342 /**@brief Function for stop advertising.
gillwei7 0:5c195ab2f696 343 */
gillwei7 0:5c195ab2f696 344 static void cynAdvertiseStopCommand(void)
gillwei7 0:5c195ab2f696 345 {
gillwei7 3:38ec8ad317f4 346 uint8_t advStopErr = 0;
gillwei7 3:38ec8ad317f4 347 advStopErr = sd_ble_gap_adv_stop();
gillwei7 3:38ec8ad317f4 348 if (advStopErr == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 349 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 350 nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO);
gillwei7 3:38ec8ad317f4 351 } else if (advStopErr==NRF_ERROR_INVALID_STATE) {
gillwei7 3:38ec8ad317f4 352 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 353 return;
gillwei7 3:38ec8ad317f4 354 } else {
gillwei7 3:38ec8ad317f4 355 console.printf("ERROR;\r\n");
gillwei7 3:38ec8ad317f4 356 }
gillwei7 0:5c195ab2f696 357 }
gillwei7 0:5c195ab2f696 358
gillwei7 0:5c195ab2f696 359 //gill modify 20150904 for accept blank in name
gillwei7 0:5c195ab2f696 360 static void cynBLENameCommand(void)
gillwei7 0:5c195ab2f696 361 {
gillwei7 3:38ec8ad317f4 362 if (cyntecGetCommandTokenCnt() >= 3) {
gillwei7 3:38ec8ad317f4 363 uint8_t tempNameLen = 0;
gillwei7 3:38ec8ad317f4 364 // check first and last char is "
gillwei7 3:38ec8ad317f4 365 uint8_t *argName1 = cyntecGetCommandArgument(0, &tempNameLen);
gillwei7 3:38ec8ad317f4 366 uint8_t *argNameLast = cyntecGetCommandArgument(cyntecGetCommandTokenCnt() - 3, &tempNameLen);
gillwei7 3:38ec8ad317f4 367 char bracket = '*';
gillwei7 3:38ec8ad317f4 368 //console.printf("%02X\r\n",tempNameLen);
gillwei7 3:38ec8ad317f4 369 if (!memcmp(&argName1[0],&bracket,sizeof(char)) && !memcmp(&argNameLast[tempNameLen - 1],&bracket,sizeof(char)))
gillwei7 3:38ec8ad317f4 370 //if (!memcmp(&argName1[0],&bracket,sizeof(char)))
gillwei7 3:38ec8ad317f4 371 {
gillwei7 3:38ec8ad317f4 372 uint8_t nameLen = 0;
gillwei7 3:38ec8ad317f4 373 uint8_t *argName = cyntecGetCommandArgument(0, &nameLen);
gillwei7 3:38ec8ad317f4 374 uint8_t * argName2 = cyntecGetCommandTotalBuffer();
gillwei7 3:38ec8ad317f4 375 uint32_t err_code;
gillwei7 3:38ec8ad317f4 376 ble_gap_conn_sec_mode_t sec_mode;
gillwei7 3:38ec8ad317f4 377 //console.printf("%02X\r\n",cyntecGetTotalIndex());
gillwei7 3:38ec8ad317f4 378 console.printf("\r\nSet BLE Name: ");
gillwei7 3:38ec8ad317f4 379 uint8_t i = 0;
gillwei7 3:38ec8ad317f4 380 for(i = 0; i < cyntecGetTotalIndex()-12; i++) {
gillwei7 3:38ec8ad317f4 381 console.printf("%c",argName2[11+i]);
gillwei7 3:38ec8ad317f4 382 }
gillwei7 3:38ec8ad317f4 383 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
gillwei7 3:38ec8ad317f4 384 err_code = sd_ble_gap_device_name_set(&sec_mode,
gillwei7 3:38ec8ad317f4 385 (const uint8_t *) &argName2[11],
gillwei7 3:38ec8ad317f4 386 (uint16_t) (cyntecGetTotalIndex()-12));
gillwei7 3:38ec8ad317f4 387 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 388 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 389 } else {
gillwei7 3:38ec8ad317f4 390 console.printf("ERROR;%04X\r\n",err_code);
gillwei7 3:38ec8ad317f4 391 }
gillwei7 3:38ec8ad317f4 392 APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 393
gillwei7 3:38ec8ad317f4 394
gillwei7 3:38ec8ad317f4 395 //#ifdef DELTADEBUG
gillwei7 3:38ec8ad317f4 396 //console.printf("\r\nSet BLE Name: ");
gillwei7 0:5c195ab2f696 397 // uint8_t i = 0;
gillwei7 0:5c195ab2f696 398 // for(i = 0; i < nameLen; i++)
gillwei7 0:5c195ab2f696 399 // {
gillwei7 0:5c195ab2f696 400 // console.printf("%c",argName[i]);
gillwei7 0:5c195ab2f696 401 // }
gillwei7 0:5c195ab2f696 402
gillwei7 0:5c195ab2f696 403 //#endif
gillwei7 3:38ec8ad317f4 404 //console.printf("\r\nPrint buffer:\r\n");
gillwei7 3:38ec8ad317f4 405 //console.printf("%s\r\n",cyntecGetCommandTotalBuffer());
gillwei7 3:38ec8ad317f4 406
gillwei7 3:38ec8ad317f4 407 /* Re-init application setting */
gillwei7 3:38ec8ad317f4 408 //cyntecCLIAppInit();
gillwei7 3:38ec8ad317f4 409 } else {
gillwei7 3:38ec8ad317f4 410 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 411 }
gillwei7 3:38ec8ad317f4 412 } else if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 3:38ec8ad317f4 413 uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"};
gillwei7 3:38ec8ad317f4 414 uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET;
gillwei7 3:38ec8ad317f4 415 uint32_t err_code;
gillwei7 3:38ec8ad317f4 416
gillwei7 3:38ec8ad317f4 417 err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen);
gillwei7 3:38ec8ad317f4 418 APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 419
gillwei7 3:38ec8ad317f4 420 console.printf("\r\nOK;");
gillwei7 3:38ec8ad317f4 421 console.printf("%s",bleName+APP_ADV_DATA_OFFSET);
gillwei7 3:38ec8ad317f4 422 console.printf(";\r\n");
gillwei7 3:38ec8ad317f4 423 } else {
gillwei7 3:38ec8ad317f4 424 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 425 return;
gillwei7 3:38ec8ad317f4 426 }
gillwei7 0:5c195ab2f696 427 }
gillwei7 3:38ec8ad317f4 428
gillwei7 0:5c195ab2f696 429
gillwei7 0:5c195ab2f696 430 static void cynBLEInfoCommand(void)
gillwei7 0:5c195ab2f696 431 {
gillwei7 3:38ec8ad317f4 432 console.printf("\r\nOK;F/W version:");
gillwei7 3:38ec8ad317f4 433 console.printf(CLI_FWVERION);
gillwei7 3:38ec8ad317f4 434 console.printf(";Module name:");
gillwei7 3:38ec8ad317f4 435 console.printf(MODULE_NAME);
gillwei7 3:38ec8ad317f4 436 console.printf("\r\n\r\n");
gillwei7 0:5c195ab2f696 437 }
gillwei7 0:5c195ab2f696 438
gillwei7 0:5c195ab2f696 439 /**@brief Set the radio's transmit power.
gillwei7 0:5c195ab2f696 440 *
gillwei7 0:5c195ab2f696 441 * @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 442 *
gillwei7 0:5c195ab2f696 443 * @note -40 dBm will not actually give -40 dBm, but will instead be remapped to -30 dBm.
gillwei7 0:5c195ab2f696 444 */
gillwei7 0:5c195ab2f696 445 static void cynBLESetTxPowerCommand (void)
gillwei7 0:5c195ab2f696 446 {
gillwei7 3:38ec8ad317f4 447 if (cyntecGetCommandTokenCnt() == 3) {
gillwei7 3:38ec8ad317f4 448 uint32_t err_code;
gillwei7 3:38ec8ad317f4 449 uint8_t txLen=0;
gillwei7 3:38ec8ad317f4 450 uint8_t *arg = cyntecGetCommandArgument(0,&txLen);
gillwei7 3:38ec8ad317f4 451
gillwei7 0:5c195ab2f696 452 // uint8_t *arg = cyntecGetMinusArgument(0,&txLen);
gillwei7 3:38ec8ad317f4 453
gillwei7 0:5c195ab2f696 454 // cyntecGetMinusArgument();
gillwei7 0:5c195ab2f696 455 // const char *value = (const char *)arg;
gillwei7 0:5c195ab2f696 456 // sprintf((char *)&debugMess[0],"\r\n[%i]\r\n",*value);
gillwei7 0:5c195ab2f696 457 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 458 const uint8_t NUM_TXPOW = 9;
gillwei7 3:38ec8ad317f4 459 bool inputSwitch = false; // if find matched case in TxPow, assign true
gillwei7 3:38ec8ad317f4 460
gillwei7 3:38ec8ad317f4 461 int8_t validTxPow[NUM_TXPOW] = {-40, -30, -20, -16, -12, -8, -4, 0, 4};
gillwei7 3:38ec8ad317f4 462 uint8_t i;
gillwei7 3:38ec8ad317f4 463 int8_t setValue;
gillwei7 3:38ec8ad317f4 464
gillwei7 3:38ec8ad317f4 465 if ( arg != NULL ) {
gillwei7 3:38ec8ad317f4 466 setValue = atoi((const char *)arg);
gillwei7 0:5c195ab2f696 467 // sprintf((char *)&debugMess[0],"\r\n[%i]\r\n",setValue);
gillwei7 0:5c195ab2f696 468 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 469 for (i = 0; i < NUM_TXPOW; i++) {
gillwei7 3:38ec8ad317f4 470 if (setValue == validTxPow[i]) {
gillwei7 3:38ec8ad317f4 471 err_code = sd_ble_gap_tx_power_set(setValue);
gillwei7 3:38ec8ad317f4 472 APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 473 inputSwitch = true;
gillwei7 3:38ec8ad317f4 474 break;
gillwei7 3:38ec8ad317f4 475 }
gillwei7 3:38ec8ad317f4 476 }
gillwei7 3:38ec8ad317f4 477
gillwei7 3:38ec8ad317f4 478 if ( inputSwitch )
gillwei7 3:38ec8ad317f4 479 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 480 else
gillwei7 3:38ec8ad317f4 481 console.printf("\r\nWrong Input; Accept Tx Pow: -40, -30, -20, -16, -12, -8, -4, 0, 4\r\n");
gillwei7 3:38ec8ad317f4 482 }
gillwei7 3:38ec8ad317f4 483 clearBuffer(); // clear the commandState.buffer
gillwei7 3:38ec8ad317f4 484 return;
gillwei7 3:38ec8ad317f4 485 } else {
gillwei7 3:38ec8ad317f4 486 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 487 return;
gillwei7 3:38ec8ad317f4 488 }
gillwei7 0:5c195ab2f696 489 }
gillwei7 0:5c195ab2f696 490
gillwei7 0:5c195ab2f696 491 static void cynBLEAddressCommand(void)
gillwei7 0:5c195ab2f696 492 {
gillwei7 3:38ec8ad317f4 493 if (cyntecGetCommandTokenCnt() == 3) {
gillwei7 3:38ec8ad317f4 494 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 495 uint8_t *arg = cyntecGetCommandArgument(0, &argLen);
gillwei7 3:38ec8ad317f4 496 uint32_t err_code;
gillwei7 3:38ec8ad317f4 497 uint8_t addr,i;
gillwei7 3:38ec8ad317f4 498
gillwei7 3:38ec8ad317f4 499 /* should with "0x" + 12 len addr */
gillwei7 3:38ec8ad317f4 500 if (argLen == 14) {
gillwei7 3:38ec8ad317f4 501 if (arg[0] != '0' || arg[1] != 'x') {
gillwei7 3:38ec8ad317f4 502 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 503 return;
gillwei7 3:38ec8ad317f4 504 }
gillwei7 0:5c195ab2f696 505
gillwei7 3:38ec8ad317f4 506 m_peer_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
gillwei7 3:38ec8ad317f4 507
gillwei7 3:38ec8ad317f4 508 for ( i = 1 ; i < 7 ; i++) {
gillwei7 3:38ec8ad317f4 509 addr = cyntecArgToUint8(arg+2*i, 2);
gillwei7 3:38ec8ad317f4 510 /* 5 - (i-1) */
gillwei7 3:38ec8ad317f4 511 m_peer_addr.addr[6-i] = addr;
gillwei7 3:38ec8ad317f4 512 }
gillwei7 3:38ec8ad317f4 513
gillwei7 3:38ec8ad317f4 514 err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_peer_addr);
gillwei7 3:38ec8ad317f4 515 APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 516
gillwei7 3:38ec8ad317f4 517 } else { //argLen != 14
gillwei7 3:38ec8ad317f4 518 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 519 return;
gillwei7 3:38ec8ad317f4 520 }
gillwei7 0:5c195ab2f696 521
gillwei7 0:5c195ab2f696 522 //#ifdef DELTADEBUG
gillwei7 0:5c195ab2f696 523 // uint8_t buf2[20];
gillwei7 0:5c195ab2f696 524 // console.printf("\r\nSet BLE Address: ");
gillwei7 3:38ec8ad317f4 525 // sprintf((char *)&buf2[0],(const char *)"[%02X %02X %02X %02X %02X %02X]",
gillwei7 3:38ec8ad317f4 526 // m_peer_addr.addr[0], m_peer_addr.addr[1], m_peer_addr.addr[2],
gillwei7 3:38ec8ad317f4 527 // m_peer_addr.addr[3], m_peer_addr.addr[4], m_peer_addr.addr[5]);
gillwei7 0:5c195ab2f696 528 // console.printf(buf2);
gillwei7 3:38ec8ad317f4 529 //#endif
gillwei7 3:38ec8ad317f4 530
gillwei7 3:38ec8ad317f4 531 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 532 } else if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 0:5c195ab2f696 533
gillwei7 3:38ec8ad317f4 534 uint32_t err_code;
gillwei7 3:38ec8ad317f4 535 err_code = sd_ble_gap_address_get(&m_peer_addr);
gillwei7 3:38ec8ad317f4 536 APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 537
gillwei7 3:38ec8ad317f4 538 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 539
gillwei7 3:38ec8ad317f4 540 console.printf("[%02X %02X %02X %02X %02X %02X]",
gillwei7 3:38ec8ad317f4 541 m_peer_addr.addr[5], m_peer_addr.addr[4], m_peer_addr.addr[3],
gillwei7 3:38ec8ad317f4 542 m_peer_addr.addr[2], m_peer_addr.addr[1], m_peer_addr.addr[0]);
gillwei7 3:38ec8ad317f4 543 } else { //cyntecGetCommandTokenCnt() not equal to 2 or 3
gillwei7 3:38ec8ad317f4 544 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 545 }
gillwei7 3:38ec8ad317f4 546 return;
gillwei7 0:5c195ab2f696 547 }
gillwei7 0:5c195ab2f696 548
gillwei7 3:38ec8ad317f4 549
gillwei7 3:38ec8ad317f4 550 /**@brief Function to start scanning.
gillwei7 0:5c195ab2f696 551 */
gillwei7 0:5c195ab2f696 552 static void scan_start(void)
gillwei7 0:5c195ab2f696 553 {
gillwei7 3:38ec8ad317f4 554 deltaBLE.gap().startScan(advertisementCallback);
gillwei7 3:38ec8ad317f4 555 //APP_ERROR_CHECK(err_code);
gillwei7 0:5c195ab2f696 556 }
gillwei7 0:5c195ab2f696 557
gillwei7 0:5c195ab2f696 558 static void scan_stop(void)
gillwei7 0:5c195ab2f696 559 {
gillwei7 3:38ec8ad317f4 560 deltaBLE.stopScan();
gillwei7 3:38ec8ad317f4 561 //APP_ERROR_CHECK(err_code);
gillwei7 0:5c195ab2f696 562 }
gillwei7 0:5c195ab2f696 563
gillwei7 3:38ec8ad317f4 564 // gill 20150916 modify
gillwei7 0:5c195ab2f696 565 static void cynBLEScanCommand(void)
gillwei7 0:5c195ab2f696 566 {
gillwei7 3:38ec8ad317f4 567 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 568 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 569 uint16_t setInterval = DEFAULT_SCAN_INTERVAL;
gillwei7 3:38ec8ad317f4 570 uint16_t setWindow = DEFAULT_SCAN_WINDOW;
gillwei7 3:38ec8ad317f4 571 uint16_t setTimeout = DEFAULT_SCAN_TIMEOUT;
gillwei7 3:38ec8ad317f4 572 setInterval = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 573 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 574 setWindow = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 575 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 3:38ec8ad317f4 576 setTimeout = cyntecAtoiUint16( arg, argLen );
gillwei7 3:38ec8ad317f4 577 #ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 578 console.printf("%i\r\n",setTimeout);
gillwei7 3:38ec8ad317f4 579 #endif
gillwei7 3:38ec8ad317f4 580 memset(saveAddr,0,sizeof(saveAddr)); // Clear saving address set
gillwei7 0:5c195ab2f696 581
gillwei7 3:38ec8ad317f4 582 deltaBLE.gap().setScanParams(setInterval,setWindow,setTimeout,1);
gillwei7 3:38ec8ad317f4 583 console.printf("Start Scanning\r\n");
gillwei7 3:38ec8ad317f4 584 scan_start();
gillwei7 3:38ec8ad317f4 585
gillwei7 3:38ec8ad317f4 586 }
gillwei7 3:38ec8ad317f4 587
gillwei7 3:38ec8ad317f4 588 static void cynBLEScanStopCommand(void)
gillwei7 3:38ec8ad317f4 589 {
gillwei7 3:38ec8ad317f4 590 console.printf("\r\nStop Scanning");
gillwei7 3:38ec8ad317f4 591 scan_stop();
gillwei7 0:5c195ab2f696 592 }
gillwei7 0:5c195ab2f696 593
gillwei7 3:38ec8ad317f4 594 //static void cynBLEConnectCommand(void)
gillwei7 3:38ec8ad317f4 595 //{
gillwei7 3:38ec8ad317f4 596 // if (cyntecGetCommandTokenCnt() == 3)
gillwei7 3:38ec8ad317f4 597 // {
gillwei7 3:38ec8ad317f4 598 // uint8_t devNameLen = 0;
gillwei7 3:38ec8ad317f4 599 // uint8_t *argDevName = cyntecGetCommandArgument(0, &devNameLen);
gillwei7 3:38ec8ad317f4 600 // uint8_t *targetDevName[devNameLen];
gillwei7 3:38ec8ad317f4 601 // if ( argDevName != NULL ) {
gillwei7 3:38ec8ad317f4 602 // uint8_t i;
gillwei7 3:38ec8ad317f4 603 // for (i = 0; i < devNameLen; i++) {
gillwei7 3:38ec8ad317f4 604 // targetDevName[i] = argDevName[i];
gillwei7 3:38ec8ad317f4 605 // }
gillwei7 3:38ec8ad317f4 606 // if (i < devNameLen)
gillwei7 3:38ec8ad317f4 607 // targetDevName[i] = '\0';
gillwei7 3:38ec8ad317f4 608 // }
gillwei7 3:38ec8ad317f4 609 //#ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 610 // console.printf("\r\nSearch for device name:");
gillwei7 3:38ec8ad317f4 611 // console.printf(argDevName);
gillwei7 3:38ec8ad317f4 612 //#endif
gillwei7 3:38ec8ad317f4 613 // scan_start();
gillwei7 3:38ec8ad317f4 614 // } else {
gillwei7 3:38ec8ad317f4 615 // console.printf("\r\nUsage: cynb connect <Device Name>");
gillwei7 3:38ec8ad317f4 616 // console.printf("\r\n(Ex:cynb connect CYN_DEVICE");
gillwei7 3:38ec8ad317f4 617 // }
gillwei7 3:38ec8ad317f4 618 //}
gillwei7 3:38ec8ad317f4 619
gillwei7 0:5c195ab2f696 620
gillwei7 0:5c195ab2f696 621 static void cynBLEDisconnectCommand(void)
gillwei7 0:5c195ab2f696 622 {
gillwei7 3:38ec8ad317f4 623 uint32_t err_code;
gillwei7 3:38ec8ad317f4 624
gillwei7 3:38ec8ad317f4 625 //marcus need to modify
gillwei7 3:38ec8ad317f4 626 err_code = sd_ble_gap_disconnect(test_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
gillwei7 3:38ec8ad317f4 627
gillwei7 3:38ec8ad317f4 628
gillwei7 3:38ec8ad317f4 629
gillwei7 3:38ec8ad317f4 630 err_code = sd_ble_gap_connect_cancel(); // No function defined currently
gillwei7 0:5c195ab2f696 631
gillwei7 3:38ec8ad317f4 632 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 633
gillwei7 3:38ec8ad317f4 634 cyntecPrintOk();
gillwei7 0:5c195ab2f696 635 // APP_ERROR_CHECK(err_code);
gillwei7 3:38ec8ad317f4 636 } else if (err_code ==NRF_ERROR_INVALID_STATE) {
gillwei7 3:38ec8ad317f4 637 cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION);
gillwei7 3:38ec8ad317f4 638 } else {
gillwei7 3:38ec8ad317f4 639 console.printf("ERROR;\r\n");
gillwei7 3:38ec8ad317f4 640 }
gillwei7 0:5c195ab2f696 641 }
gillwei7 0:5c195ab2f696 642
gillwei7 3:38ec8ad317f4 643 uint8_t isValidGPIO(uint8_t num)
gillwei7 0:5c195ab2f696 644 {
gillwei7 3:38ec8ad317f4 645 uint8_t cfgPin[] = {0,1,2,3,4,5,6,7,13,16,17,23,24,25,29};
gillwei7 3:38ec8ad317f4 646 uint8_t i;
gillwei7 3:38ec8ad317f4 647
gillwei7 3:38ec8ad317f4 648 for ( i = 0; i < sizeof(cfgPin) ; i++ ) {
gillwei7 3:38ec8ad317f4 649 if ( num == cfgPin[i] )
gillwei7 3:38ec8ad317f4 650 return 1;
gillwei7 3:38ec8ad317f4 651 }
gillwei7 3:38ec8ad317f4 652
gillwei7 3:38ec8ad317f4 653 return 0;
gillwei7 0:5c195ab2f696 654 }
gillwei7 0:5c195ab2f696 655
gillwei7 0:5c195ab2f696 656 static void cynBLESystemOffCommand(void)
gillwei7 0:5c195ab2f696 657 {
gillwei7 3:38ec8ad317f4 658 if (cyntecGetCommandTokenCnt() == 3) {
gillwei7 3:38ec8ad317f4 659 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 660 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 661 uint8_t gpioNum = cyntecAtoi( arg, argLen );
gillwei7 3:38ec8ad317f4 662 // Can only use 0,1,2,3,4,5,6,7,13,16,17,23,24,25,29
gillwei7 3:38ec8ad317f4 663 if (!isValidGPIO(gpioNum)) {
gillwei7 3:38ec8ad317f4 664 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 3:38ec8ad317f4 665 return;
gillwei7 3:38ec8ad317f4 666 }
gillwei7 3:38ec8ad317f4 667 nrf_gpio_cfg_sense_input(gpioNum,
gillwei7 3:38ec8ad317f4 668 NRF_GPIO_PIN_PULLUP,
gillwei7 3:38ec8ad317f4 669 NRF_GPIO_PIN_SENSE_LOW);
gillwei7 3:38ec8ad317f4 670 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 671 } else if (cyntecGetCommandTokenCnt() == 2) {
gillwei7 3:38ec8ad317f4 672 /* default wake up pin is uart Rx pin */
gillwei7 3:38ec8ad317f4 673 nrf_gpio_cfg_sense_input(RX_PIN_NUMBER,
gillwei7 3:38ec8ad317f4 674 NRF_GPIO_PIN_PULLUP,
gillwei7 3:38ec8ad317f4 675 NRF_GPIO_PIN_SENSE_LOW);
gillwei7 3:38ec8ad317f4 676 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 677 } else {
gillwei7 3:38ec8ad317f4 678 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 679 }
gillwei7 3:38ec8ad317f4 680 sd_power_system_off();
gillwei7 0:5c195ab2f696 681 }
gillwei7 0:5c195ab2f696 682
gillwei7 0:5c195ab2f696 683 static void cynBLEGPIOCommand(void)
gillwei7 0:5c195ab2f696 684 {
gillwei7 3:38ec8ad317f4 685
gillwei7 3:38ec8ad317f4 686 if (cyntecGetCommandTokenCnt() == 4) {
gillwei7 3:38ec8ad317f4 687 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 688 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 689 uint8_t gpioNum = cyntecAtoi( arg, argLen );
gillwei7 3:38ec8ad317f4 690
gillwei7 3:38ec8ad317f4 691 if (!isValidGPIO(gpioNum)) {
gillwei7 3:38ec8ad317f4 692 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE);
gillwei7 3:38ec8ad317f4 693 return;
gillwei7 3:38ec8ad317f4 694 }
gillwei7 3:38ec8ad317f4 695
gillwei7 3:38ec8ad317f4 696 /* arg2 is set or clear */
gillwei7 3:38ec8ad317f4 697 uint8_t *action = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 698
gillwei7 3:38ec8ad317f4 699 if ( cyntecStrCmp(action,(unsigned char *)"set",argLen) == 1 ) {
gillwei7 3:38ec8ad317f4 700 nrf_gpio_cfg_output(gpioNum);
gillwei7 3:38ec8ad317f4 701 nrf_gpio_pin_set(gpioNum);
gillwei7 3:38ec8ad317f4 702 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 703 } else if ( cyntecStrCmp(action,(unsigned char *)"clear",argLen) == 1 ) {
gillwei7 3:38ec8ad317f4 704 nrf_gpio_cfg_output(gpioNum);
gillwei7 3:38ec8ad317f4 705 nrf_gpio_pin_clear(gpioNum);
gillwei7 3:38ec8ad317f4 706 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 707 } else {
gillwei7 3:38ec8ad317f4 708 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 709 }
gillwei7 3:38ec8ad317f4 710 } else {
gillwei7 3:38ec8ad317f4 711 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 712 }
gillwei7 0:5c195ab2f696 713 }
gillwei7 0:5c195ab2f696 714
gillwei7 0:5c195ab2f696 715 static void cynResetCommand(void)
gillwei7 0:5c195ab2f696 716 {
gillwei7 3:38ec8ad317f4 717 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 718 // On assert, the system can only recover with a reset.
gillwei7 3:38ec8ad317f4 719 NVIC_SystemReset();
gillwei7 0:5c195ab2f696 720 }
gillwei7 0:5c195ab2f696 721
gillwei7 0:5c195ab2f696 722 // gill modify for update value in non-connect state 20150904
gillwei7 3:38ec8ad317f4 723 // Change set value connection handle
gillwei7 0:5c195ab2f696 724 static void cynBLEUpdateUUIDCommand(void)
gillwei7 0:5c195ab2f696 725 {
gillwei7 3:38ec8ad317f4 726 uint8_t i,j;
gillwei7 3:38ec8ad317f4 727 uint8_t value[MAX_VALUE_LENGTH];
gillwei7 3:38ec8ad317f4 728 memset(value, 0, sizeof(value));
gillwei7 0:5c195ab2f696 729 // uint8_t buf_char_uuid_type;
gillwei7 3:38ec8ad317f4 730 ble_uuid_t buf_service_uuid;
gillwei7 3:38ec8ad317f4 731 ble_uuid_t buf_char_uuid;
gillwei7 3:38ec8ad317f4 732 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 733 uint8_t *arg;
gillwei7 3:38ec8ad317f4 734 uint8_t valueLengthBuffer = 0;
gillwei7 3:38ec8ad317f4 735 uint8_t modeType;
gillwei7 3:38ec8ad317f4 736 bool updatematchFlag = false; // Check matched characteristic found
gillwei7 3:38ec8ad317f4 737 uint16_t len = MAX_VALUE_LENGTH;
gillwei7 3:38ec8ad317f4 738 uint32_t err_code;
gillwei7 3:38ec8ad317f4 739 // check if argument count is right
gillwei7 3:38ec8ad317f4 740 if (cyntecGetCommandTokenCnt() != 5) {
gillwei7 3:38ec8ad317f4 741 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 742 return;
gillwei7 3:38ec8ad317f4 743 } else {
gillwei7 3:38ec8ad317f4 744 arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 745 if (arg[0] != '0' | arg[1] != 'x' | argLen%2 != 0) {
gillwei7 3:38ec8ad317f4 746 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 747 return;
gillwei7 3:38ec8ad317f4 748 } else {
gillwei7 3:38ec8ad317f4 749 // Handle input parameter - Service UUID
gillwei7 3:38ec8ad317f4 750 arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 751
gillwei7 3:38ec8ad317f4 752 if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 753 buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 754 buf_service_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 755 }
gillwei7 3:38ec8ad317f4 756 if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 757 buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4);
gillwei7 3:38ec8ad317f4 758 buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN;
gillwei7 3:38ec8ad317f4 759 }
gillwei7 3:38ec8ad317f4 760
gillwei7 3:38ec8ad317f4 761 // Handle input parameter - Characteristic UUID
gillwei7 3:38ec8ad317f4 762 argLen = 0;
gillwei7 3:38ec8ad317f4 763 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 764
gillwei7 3:38ec8ad317f4 765 if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 766 buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 767 buf_char_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 768 }
gillwei7 3:38ec8ad317f4 769 if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 770 buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4);
gillwei7 3:38ec8ad317f4 771 buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN;
gillwei7 3:38ec8ad317f4 772 }
gillwei7 0:5c195ab2f696 773 // sprintf((char *)&debugMess[0],"buf_service_uuid[%d,%4X]\r\n",buf_service_uuid.type,buf_service_uuid.uuid);
gillwei7 0:5c195ab2f696 774 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 775
gillwei7 3:38ec8ad317f4 776 // Handle input parameter - value
gillwei7 3:38ec8ad317f4 777 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 3:38ec8ad317f4 778 valueLengthBuffer = (argLen-2)/2;
gillwei7 3:38ec8ad317f4 779 for (i=0 ; i < (argLen-2)/2; i++) {
gillwei7 3:38ec8ad317f4 780 value[i] = cyntecArgToUint8(arg+2*(i+1), 2);
gillwei7 3:38ec8ad317f4 781 // debug
gillwei7 3:38ec8ad317f4 782 // sprintf((char *)&buf[0],"[%2X]",value[i]);
gillwei7 3:38ec8ad317f4 783 // console.printf(buf);
gillwei7 3:38ec8ad317f4 784 }
gillwei7 3:38ec8ad317f4 785
gillwei7 3:38ec8ad317f4 786 }
gillwei7 3:38ec8ad317f4 787 // debug message
gillwei7 0:5c195ab2f696 788 // sprintf((char *)&buf[0],"value:[%02X]", value);
gillwei7 0:5c195ab2f696 789 // console.printf(buf);
gillwei7 3:38ec8ad317f4 790
gillwei7 3:38ec8ad317f4 791 for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) {
gillwei7 3:38ec8ad317f4 792 if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (updatematchFlag == false)) {
gillwei7 3:38ec8ad317f4 793 //readmatchFlag = true;
gillwei7 3:38ec8ad317f4 794 for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
gillwei7 3:38ec8ad317f4 795 if ( (bufferService[i].bufferGattChar[j].char_uuid.uuid == buf_char_uuid.uuid) &(bufferService[i].bufferGattChar[j].char_uuid.type == buf_char_uuid.type)& (updatematchFlag == false)) {
gillwei7 3:38ec8ad317f4 796 modeType = bufferService[i].bufferGattChar[j].mode;
gillwei7 3:38ec8ad317f4 797 //memset(bufferService[i].bufferGattChar[j].value, 0, sizeof(bufferService[i].bufferGattChar[j].value));
gillwei7 3:38ec8ad317f4 798 // Identify characteristic property is notify or indicate
gillwei7 3:38ec8ad317f4 799 if (((modeType & (1 << CLI_CHAR_MODE_INDICATE)) | (modeType & (1 << CLI_CHAR_MODE_NOTIFY))) ) {
gillwei7 3:38ec8ad317f4 800 if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_INDICATE))
gillwei7 3:38ec8ad317f4 801 modeType = BLE_GATT_HVX_INDICATION ;
gillwei7 3:38ec8ad317f4 802 if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_NOTIFY))
gillwei7 3:38ec8ad317f4 803 modeType = BLE_GATT_HVX_NOTIFICATION;
gillwei7 3:38ec8ad317f4 804 ble_gatts_hvx_params_t hvx_params;
gillwei7 3:38ec8ad317f4 805 memset(&hvx_params, 0, sizeof(hvx_params));
gillwei7 3:38ec8ad317f4 806 hvx_params.handle = bufferService[i].bufferGattChar[j].char_value_handle;
gillwei7 3:38ec8ad317f4 807 hvx_params.type = modeType;
gillwei7 3:38ec8ad317f4 808 hvx_params.offset = 0;
gillwei7 3:38ec8ad317f4 809 hvx_params.p_len = &len;
gillwei7 3:38ec8ad317f4 810 hvx_params.p_data = value;
gillwei7 3:38ec8ad317f4 811 if (connState) { // If connected, send notification/indication
gillwei7 3:38ec8ad317f4 812 err_code = sd_ble_gatts_hvx(test_conn_handle, &hvx_params);
gillwei7 3:38ec8ad317f4 813
gillwei7 3:38ec8ad317f4 814 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 815 //do nothing
gillwei7 3:38ec8ad317f4 816 } else if ((err_code != NRF_SUCCESS) &&
gillwei7 3:38ec8ad317f4 817 (err_code != NRF_ERROR_INVALID_STATE) &&
gillwei7 3:38ec8ad317f4 818 (err_code != BLE_ERROR_NO_TX_BUFFERS) &&
gillwei7 3:38ec8ad317f4 819 (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
gillwei7 3:38ec8ad317f4 820 ) {
gillwei7 3:38ec8ad317f4 821 console.printf("HVX ERROR;%04X\r\n",err_code);
gillwei7 3:38ec8ad317f4 822 }
gillwei7 3:38ec8ad317f4 823 }
gillwei7 3:38ec8ad317f4 824
gillwei7 3:38ec8ad317f4 825 }
gillwei7 3:38ec8ad317f4 826
gillwei7 3:38ec8ad317f4 827 // Update database
gillwei7 3:38ec8ad317f4 828 bufferService[i].bufferGattChar[j].valueLength = valueLengthBuffer;
gillwei7 3:38ec8ad317f4 829 ble_gatts_value_t bufGattsValue;
gillwei7 3:38ec8ad317f4 830 memset(&bufGattsValue, 0, sizeof(bufGattsValue));
gillwei7 3:38ec8ad317f4 831 bufGattsValue.len = len;
gillwei7 3:38ec8ad317f4 832 bufGattsValue.offset = 0;
gillwei7 3:38ec8ad317f4 833 bufGattsValue.p_value = value;
gillwei7 3:38ec8ad317f4 834 //err_code = sd_ble_gatts_value_set(bufferService[i].bufferGattChar[j].char_value_handle,
gillwei7 3:38ec8ad317f4 835 // 0,
gillwei7 3:38ec8ad317f4 836 // &len,
gillwei7 0:5c195ab2f696 837 // value);
gillwei7 3:38ec8ad317f4 838 err_code = sd_ble_gatts_value_set(
gillwei7 3:38ec8ad317f4 839 //test_conn_handle,
gillwei7 3:38ec8ad317f4 840 BLE_CONN_HANDLE_INVALID, // User can update in non-connected state
gillwei7 3:38ec8ad317f4 841 bufferService[i].bufferGattChar[j].char_value_handle,
gillwei7 3:38ec8ad317f4 842 &bufGattsValue
gillwei7 3:38ec8ad317f4 843 );
gillwei7 3:38ec8ad317f4 844
gillwei7 3:38ec8ad317f4 845 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 846 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 847 } else {
gillwei7 3:38ec8ad317f4 848 console.printf("Set ERROR;%04X\r\n",err_code);
gillwei7 3:38ec8ad317f4 849 }
gillwei7 3:38ec8ad317f4 850 updatematchFlag = true;
gillwei7 3:38ec8ad317f4 851 return;
gillwei7 3:38ec8ad317f4 852 }
gillwei7 3:38ec8ad317f4 853 }
gillwei7 3:38ec8ad317f4 854 }
gillwei7 3:38ec8ad317f4 855 }
gillwei7 3:38ec8ad317f4 856 if (updatematchFlag == false) {
gillwei7 3:38ec8ad317f4 857 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
gillwei7 3:38ec8ad317f4 858 }
gillwei7 3:38ec8ad317f4 859 }
gillwei7 0:5c195ab2f696 860 }
gillwei7 0:5c195ab2f696 861
gillwei7 0:5c195ab2f696 862 static void cynBLEReadDataCommand(void)
gillwei7 3:38ec8ad317f4 863 {
gillwei7 3:38ec8ad317f4 864
gillwei7 3:38ec8ad317f4 865 if (cyntecGetCommandTokenCnt() != 4) {
gillwei7 3:38ec8ad317f4 866 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 867 } else {
gillwei7 3:38ec8ad317f4 868 //uint16_t buf_char_uuid ;
gillwei7 3:38ec8ad317f4 869 uint8_t i,j;
gillwei7 3:38ec8ad317f4 870 uint8_t value[MAX_VALUE_LENGTH];
gillwei7 3:38ec8ad317f4 871 //uint8_t buf[20];
gillwei7 0:5c195ab2f696 872 // uint8_t buf_char_uuid_type;
gillwei7 3:38ec8ad317f4 873 ble_uuid_t buf_service_uuid;
gillwei7 3:38ec8ad317f4 874 ble_uuid_t buf_char_uuid;
gillwei7 3:38ec8ad317f4 875 uint8_t valueLengthBuffer;
gillwei7 3:38ec8ad317f4 876 bool readmatchFlag = false;
gillwei7 3:38ec8ad317f4 877 // debug message
gillwei7 0:5c195ab2f696 878 // sprintf((char *)&debugMess[0],"buf_char_uuid:[%04X]", buf_char_uuid);
gillwei7 0:5c195ab2f696 879 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 880 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 881 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 882
gillwei7 3:38ec8ad317f4 883 // Print out the service & char uuids table
gillwei7 0:5c195ab2f696 884 // for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ )
gillwei7 0:5c195ab2f696 885 // {
gillwei7 0:5c195ab2f696 886 // for ( j = 0 ; j < CLI_SERVICE_MAX_NUM ; j++ )
gillwei7 0:5c195ab2f696 887 // {
gillwei7 0:5c195ab2f696 888 // sprintf((char *)&debugMess[0],"[%4X,%d][%4X,%d]\r\n",bufferService[i].service_uuid.uuid,bufferService[i].service_uuid.type,bufferService[i].bufferGattChar[j].char_uuid.uuid,bufferService[i].bufferGattChar[j].char_uuid.type);
gillwei7 0:5c195ab2f696 889 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 890 // }
gillwei7 0:5c195ab2f696 891 // }
gillwei7 0:5c195ab2f696 892
gillwei7 3:38ec8ad317f4 893 // Handle input parameter - Service UUID
gillwei7 3:38ec8ad317f4 894 if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 895 buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 896 buf_service_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 897 }
gillwei7 3:38ec8ad317f4 898 if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 899 buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4);
gillwei7 3:38ec8ad317f4 900 buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN;
gillwei7 3:38ec8ad317f4 901 }
gillwei7 3:38ec8ad317f4 902
gillwei7 3:38ec8ad317f4 903 // Handle input parameter - Characteristic UUID
gillwei7 3:38ec8ad317f4 904 argLen = 0;
gillwei7 3:38ec8ad317f4 905 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 906 if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 907 buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 908 buf_char_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 909 }
gillwei7 3:38ec8ad317f4 910 if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 911 buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4);
gillwei7 3:38ec8ad317f4 912 buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN;
gillwei7 3:38ec8ad317f4 913 }
gillwei7 0:5c195ab2f696 914 // sprintf((char *)&debugMess[0],"buf_service_uuid[%d,%4X]\r\n",buf_service_uuid.type,buf_service_uuid.uuid);
gillwei7 0:5c195ab2f696 915 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 916 for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) {
gillwei7 3:38ec8ad317f4 917 if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (readmatchFlag == false)) {
gillwei7 3:38ec8ad317f4 918 //readmatchFlag = true;
gillwei7 3:38ec8ad317f4 919 for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) {
gillwei7 3:38ec8ad317f4 920 if ( (bufferService[i].bufferGattChar[j].char_uuid.uuid == buf_char_uuid.uuid) &(bufferService[i].bufferGattChar[j].char_uuid.type == buf_char_uuid.type)& (readmatchFlag == false)) {
gillwei7 3:38ec8ad317f4 921 // uint8_t value[] = "88";
gillwei7 3:38ec8ad317f4 922 uint16_t len = MAX_VALUE_LENGTH;
gillwei7 3:38ec8ad317f4 923 ble_gatts_value_t bufGattsValue;
gillwei7 3:38ec8ad317f4 924 memset(&bufGattsValue, 0, sizeof(bufGattsValue));
gillwei7 3:38ec8ad317f4 925 bufGattsValue.len = len;
gillwei7 3:38ec8ad317f4 926 bufGattsValue.offset = 0;
gillwei7 3:38ec8ad317f4 927 bufGattsValue.p_value = value;
gillwei7 3:38ec8ad317f4 928 //sd_ble_gatts_value_get(bufferService[i].bufferGattChar[j].char_value_handle,
gillwei7 0:5c195ab2f696 929 // 0,
gillwei7 0:5c195ab2f696 930 // &len,
gillwei7 0:5c195ab2f696 931 // value);
gillwei7 3:38ec8ad317f4 932 sd_ble_gatts_value_get( test_conn_handle,
gillwei7 3:38ec8ad317f4 933 bufferService[i].bufferGattChar[j].char_value_handle,
gillwei7 3:38ec8ad317f4 934 &bufGattsValue
gillwei7 3:38ec8ad317f4 935 );
gillwei7 3:38ec8ad317f4 936 console.printf("\r\nOK;0x");
gillwei7 3:38ec8ad317f4 937 valueLengthBuffer = bufferService[i].bufferGattChar[j].valueLength;
gillwei7 3:38ec8ad317f4 938 // sprintf((char *)&debugMess[0],"[%i]",valueLengthBuffer);
gillwei7 3:38ec8ad317f4 939 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 940
gillwei7 3:38ec8ad317f4 941 for (i=0 ; i < valueLengthBuffer; i++) {
gillwei7 3:38ec8ad317f4 942 console.printf("%02X",value[i]);
gillwei7 3:38ec8ad317f4 943 }
gillwei7 3:38ec8ad317f4 944 console.printf(";\r\n");
gillwei7 3:38ec8ad317f4 945 readmatchFlag = true;
gillwei7 3:38ec8ad317f4 946 return;
gillwei7 3:38ec8ad317f4 947 }
gillwei7 3:38ec8ad317f4 948 }
gillwei7 3:38ec8ad317f4 949 }
gillwei7 3:38ec8ad317f4 950 }
gillwei7 3:38ec8ad317f4 951 // no matched case, can not read
gillwei7 3:38ec8ad317f4 952 if (readmatchFlag == false) {
gillwei7 3:38ec8ad317f4 953 cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT);
gillwei7 3:38ec8ad317f4 954 }
gillwei7 3:38ec8ad317f4 955 }
gillwei7 3:38ec8ad317f4 956
gillwei7 3:38ec8ad317f4 957
gillwei7 0:5c195ab2f696 958 }
gillwei7 0:5c195ab2f696 959 /* Set characteristics */
gillwei7 0:5c195ab2f696 960 static void cyntecInsertCharUUID(ble_uuid_t char_UUID, uint16_t charValueHandle,uint8_t valueLengthBuffer,uint8_t mode)
gillwei7 0:5c195ab2f696 961 {
gillwei7 3:38ec8ad317f4 962 uint8_t j;
gillwei7 3:38ec8ad317f4 963 j=char_count;
gillwei7 0:5c195ab2f696 964 // sprintf((char *)&debugMess[0],"char_uuid:%4X\r\n",char_UUID.uuid);
gillwei7 3:38ec8ad317f4 965 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 966 bufferService[service_count-1].bufferGattChar[j].char_uuid.uuid = char_UUID.uuid;
gillwei7 3:38ec8ad317f4 967 bufferService[service_count-1].bufferGattChar[j].char_uuid.type = char_UUID.type;
gillwei7 3:38ec8ad317f4 968 bufferService[service_count-1].bufferGattChar[j].valueLength = valueLengthBuffer;
gillwei7 3:38ec8ad317f4 969 bufferService[service_count-1].bufferGattChar[j].mode = mode;
gillwei7 3:38ec8ad317f4 970 bufferService[service_count-1].bufferGattChar[j].char_value_handle = charValueHandle;
gillwei7 3:38ec8ad317f4 971 return;
gillwei7 0:5c195ab2f696 972 }
gillwei7 0:5c195ab2f696 973
gillwei7 0:5c195ab2f696 974 static void cynGattCharCommand(void)
gillwei7 0:5c195ab2f696 975 {
gillwei7 0:5c195ab2f696 976 // uint16_t service_uuid_ble;
gillwei7 0:5c195ab2f696 977 // uint8_t service_uuid_vs[16];
gillwei7 0:5c195ab2f696 978
gillwei7 3:38ec8ad317f4 979 uint8_t attrMode=0;
gillwei7 3:38ec8ad317f4 980 uint8_t attrValue[MAX_VALUE_LENGTH];
gillwei7 3:38ec8ad317f4 981 memset(&attrValue, 0, sizeof(attrValue));
gillwei7 3:38ec8ad317f4 982
gillwei7 3:38ec8ad317f4 983 uint8_t i;
gillwei7 0:5c195ab2f696 984 // uint8_t valueBuffer;
gillwei7 3:38ec8ad317f4 985 uint8_t err_code;
gillwei7 3:38ec8ad317f4 986 uint16_t buffer_char_uuid;
gillwei7 0:5c195ab2f696 987 // uint16_t buffer_char_uuid_ble;
gillwei7 3:38ec8ad317f4 988 uint16_t buffer_uuid_vs[8];
gillwei7 3:38ec8ad317f4 989 ble_uuid_t char_uuid;
gillwei7 3:38ec8ad317f4 990 ble_uuid128_t char_uuid_vs;
gillwei7 3:38ec8ad317f4 991
gillwei7 3:38ec8ad317f4 992 ble_gatts_char_md_t char_md;
gillwei7 3:38ec8ad317f4 993 ble_gatts_attr_t attr_char_value;
gillwei7 3:38ec8ad317f4 994
gillwei7 3:38ec8ad317f4 995 ble_gatts_attr_md_t cccd_md;
gillwei7 3:38ec8ad317f4 996 ble_gatts_attr_md_t attr_md;
gillwei7 3:38ec8ad317f4 997 // uint8_t init_value_encoded[2] = "77";
gillwei7 0:5c195ab2f696 998 // uint8_t init_value_len;
gillwei7 3:38ec8ad317f4 999 uint8_t valueLengthBuffer;
gillwei7 3:38ec8ad317f4 1000 extern uint8_t char_count;
gillwei7 3:38ec8ad317f4 1001
gillwei7 3:38ec8ad317f4 1002 if (cyntecGetCommandTokenCnt() != 5) {
gillwei7 3:38ec8ad317f4 1003 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 1004 return;
gillwei7 3:38ec8ad317f4 1005 } else {
gillwei7 3:38ec8ad317f4 1006
gillwei7 3:38ec8ad317f4 1007 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1008 //sprintf((char *)&debugMess[0],"[%04X]", service_uuid);
gillwei7 0:5c195ab2f696 1009 //console.printf(debugMess);
gillwei7 0:5c195ab2f696 1010 //#endif
gillwei7 3:38ec8ad317f4 1011
gillwei7 3:38ec8ad317f4 1012 /* handle second parameter - UUID */
gillwei7 3:38ec8ad317f4 1013 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 1014 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 3:38ec8ad317f4 1015
gillwei7 3:38ec8ad317f4 1016 /* len: 6 => 0xXXXX */
gillwei7 3:38ec8ad317f4 1017 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 1018 buffer_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 1019 BLE_UUID_BLE_ASSIGN(char_uuid, buffer_char_uuid);
gillwei7 3:38ec8ad317f4 1020 char_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 1021 }
gillwei7 3:38ec8ad317f4 1022
gillwei7 3:38ec8ad317f4 1023 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 3:38ec8ad317f4 1024 for ( i=0; i<8; i++) {
gillwei7 3:38ec8ad317f4 1025 buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4);
gillwei7 3:38ec8ad317f4 1026 if (i==1) {
gillwei7 3:38ec8ad317f4 1027 char_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4);
gillwei7 3:38ec8ad317f4 1028 }
gillwei7 0:5c195ab2f696 1029 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1030 // sprintf((char *)&debugMess[0],"%2X/",buffer_uuid_vs[7-i]);
gillwei7 0:5c195ab2f696 1031 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 1032 //#endif
gillwei7 3:38ec8ad317f4 1033 }
gillwei7 3:38ec8ad317f4 1034 memcpy(&char_uuid_vs,buffer_uuid_vs,16);
gillwei7 3:38ec8ad317f4 1035 err_code = sd_ble_uuid_vs_add(&char_uuid_vs, &char_uuid.type);
gillwei7 3:38ec8ad317f4 1036 }
gillwei7 0:5c195ab2f696 1037 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1038 // sprintf((char *)&debugMess[0],"char_uuid_type:[%d]\r\n",char_uuid.type);
gillwei7 0:5c195ab2f696 1039 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 1040 //#endif
gillwei7 3:38ec8ad317f4 1041
gillwei7 3:38ec8ad317f4 1042
gillwei7 3:38ec8ad317f4 1043 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1044 // sprintf((char *)&debugMess[0],"vs_add_Error:%d\r\n",err_code);
gillwei7 0:5c195ab2f696 1045 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 1046 //#endif
gillwei7 3:38ec8ad317f4 1047
gillwei7 3:38ec8ad317f4 1048 /* handle 3rd parameter - attribute mode */
gillwei7 3:38ec8ad317f4 1049 argLen = 0;
gillwei7 3:38ec8ad317f4 1050 arg = cyntecGetCommandArgument(1,&argLen);
gillwei7 3:38ec8ad317f4 1051
gillwei7 3:38ec8ad317f4 1052 for ( i = 0 ; i < argLen ; i++ ) {
gillwei7 3:38ec8ad317f4 1053 switch(arg[i]) {
gillwei7 3:38ec8ad317f4 1054 case 'r':
gillwei7 3:38ec8ad317f4 1055 attrMode |= (1 << CLI_CHAR_MODE_READ);
gillwei7 3:38ec8ad317f4 1056 break;
gillwei7 3:38ec8ad317f4 1057 case 'w':
gillwei7 3:38ec8ad317f4 1058 attrMode |= (1 << CLI_CHAR_MODE_WRITE);
gillwei7 3:38ec8ad317f4 1059 break;
gillwei7 3:38ec8ad317f4 1060 case 'i':
gillwei7 3:38ec8ad317f4 1061 attrMode |= (1 << CLI_CHAR_MODE_INDICATE);
gillwei7 3:38ec8ad317f4 1062 break;
gillwei7 3:38ec8ad317f4 1063 case 'n':
gillwei7 3:38ec8ad317f4 1064 attrMode |= (1 << CLI_CHAR_MODE_NOTIFY);
gillwei7 3:38ec8ad317f4 1065 break;
gillwei7 3:38ec8ad317f4 1066 default:
gillwei7 3:38ec8ad317f4 1067 break;
gillwei7 3:38ec8ad317f4 1068 }
gillwei7 3:38ec8ad317f4 1069 }
gillwei7 3:38ec8ad317f4 1070
gillwei7 3:38ec8ad317f4 1071 /* handle 4th parameter - attribute value */
gillwei7 3:38ec8ad317f4 1072 argLen = 0;
gillwei7 3:38ec8ad317f4 1073 arg = cyntecGetCommandArgument(2,&argLen);
gillwei7 3:38ec8ad317f4 1074
gillwei7 3:38ec8ad317f4 1075 if (arg[0] != '0' || arg[1] != 'x' | argLen%2 != 0) {
gillwei7 3:38ec8ad317f4 1076 cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR);
gillwei7 3:38ec8ad317f4 1077 return;
gillwei7 3:38ec8ad317f4 1078 } else {
gillwei7 3:38ec8ad317f4 1079 valueLengthBuffer = (argLen-2)/2;
gillwei7 3:38ec8ad317f4 1080 for (i=0 ; i < (argLen-2)/2; i++) {
gillwei7 3:38ec8ad317f4 1081 attrValue[i] = cyntecArgToUint8(arg+2*(i+1), 2);
gillwei7 3:38ec8ad317f4 1082
gillwei7 3:38ec8ad317f4 1083 }
gillwei7 3:38ec8ad317f4 1084 //cyntecInsertCharUUID(service_uuid, char_uuid, attrMode, attrValue,valueLengthBuffer);
gillwei7 3:38ec8ad317f4 1085 //cyntecPrintOk();
gillwei7 3:38ec8ad317f4 1086 }
gillwei7 3:38ec8ad317f4 1087 }
gillwei7 3:38ec8ad317f4 1088
gillwei7 3:38ec8ad317f4 1089
gillwei7 3:38ec8ad317f4 1090 //debug
gillwei7 0:5c195ab2f696 1091 // sprintf((char *)&debugMess[0],"value:[%02X][%02X]", value[0],value[1]);
gillwei7 0:5c195ab2f696 1092 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 1093
gillwei7 3:38ec8ad317f4 1094 //write read permission
gillwei7 3:38ec8ad317f4 1095 ble_gap_conn_sec_mode_t local_all_perm;
gillwei7 3:38ec8ad317f4 1096 local_all_perm.lv = 1;
gillwei7 3:38ec8ad317f4 1097 local_all_perm.sm = 1;
gillwei7 3:38ec8ad317f4 1098
gillwei7 3:38ec8ad317f4 1099 memset(&cccd_md, 0, sizeof(cccd_md));
gillwei7 0:5c195ab2f696 1100 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm);
gillwei7 0:5c195ab2f696 1101 cccd_md.write_perm = local_all_perm;
gillwei7 0:5c195ab2f696 1102 cccd_md.vloc = BLE_GATTS_VLOC_STACK;
gillwei7 3:38ec8ad317f4 1103
gillwei7 0:5c195ab2f696 1104 memset(&char_md, 0, sizeof(char_md));
gillwei7 3:38ec8ad317f4 1105
gillwei7 3:38ec8ad317f4 1106 if ( attrMode & (1 << CLI_CHAR_MODE_READ))
gillwei7 3:38ec8ad317f4 1107 char_md.char_props.read = 1;
gillwei7 3:38ec8ad317f4 1108 if (attrMode & (1 << CLI_CHAR_MODE_WRITE))
gillwei7 3:38ec8ad317f4 1109 char_md.char_props.write = 1;
gillwei7 3:38ec8ad317f4 1110 if (attrMode & (1 << CLI_CHAR_MODE_NOTIFY))
gillwei7 3:38ec8ad317f4 1111 char_md.char_props.notify = 1;
gillwei7 3:38ec8ad317f4 1112 if (attrMode & (1 << CLI_CHAR_MODE_INDICATE))
gillwei7 3:38ec8ad317f4 1113 char_md.char_props.indicate = 1;
gillwei7 3:38ec8ad317f4 1114
gillwei7 0:5c195ab2f696 1115 char_md.p_char_user_desc = NULL;
gillwei7 0:5c195ab2f696 1116 char_md.p_char_pf = NULL;
gillwei7 0:5c195ab2f696 1117 char_md.p_user_desc_md = NULL;
gillwei7 0:5c195ab2f696 1118 char_md.p_cccd_md = &cccd_md;
gillwei7 0:5c195ab2f696 1119 char_md.p_sccd_md = NULL;
gillwei7 3:38ec8ad317f4 1120
gillwei7 0:5c195ab2f696 1121 memset(&attr_md, 0, sizeof(attr_md));
gillwei7 0:5c195ab2f696 1122
gillwei7 0:5c195ab2f696 1123 attr_md.vloc = BLE_GATTS_VLOC_STACK;
gillwei7 0:5c195ab2f696 1124 attr_md.read_perm = local_all_perm;
gillwei7 0:5c195ab2f696 1125 attr_md.write_perm = local_all_perm;
gillwei7 0:5c195ab2f696 1126 attr_md.rd_auth = 0;
gillwei7 0:5c195ab2f696 1127 attr_md.wr_auth = 0;
gillwei7 0:5c195ab2f696 1128 attr_md.vlen = 0;
gillwei7 3:38ec8ad317f4 1129
gillwei7 0:5c195ab2f696 1130 memset(&attr_char_value, 0, sizeof(attr_char_value));
gillwei7 3:38ec8ad317f4 1131
gillwei7 0:5c195ab2f696 1132 // init_value_len = MAX_VALUE_LENGTH;
gillwei7 0:5c195ab2f696 1133
gillwei7 0:5c195ab2f696 1134 attr_char_value.p_uuid = &char_uuid;
gillwei7 0:5c195ab2f696 1135 attr_char_value.p_attr_md = &attr_md;
gillwei7 0:5c195ab2f696 1136 attr_char_value.init_len = MAX_VALUE_LENGTH;
gillwei7 0:5c195ab2f696 1137 attr_char_value.init_offs = 0;
gillwei7 0:5c195ab2f696 1138 attr_char_value.max_len = MAX_VALUE_LENGTH;
gillwei7 0:5c195ab2f696 1139 attr_char_value.p_value = attrValue;
gillwei7 3:38ec8ad317f4 1140 //debug
gillwei7 0:5c195ab2f696 1141 // sprintf((char *)&debugMess[0],"value:[%s]", attr_char_value.p_value);
gillwei7 0:5c195ab2f696 1142 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 1143 ble_gatts_char_handles_t testHandle;
gillwei7 3:38ec8ad317f4 1144 err_code = sd_ble_gatts_characteristic_add(bufferGattTest.service_handle,
gillwei7 3:38ec8ad317f4 1145 &char_md,
gillwei7 3:38ec8ad317f4 1146 &attr_char_value,
gillwei7 3:38ec8ad317f4 1147 &testHandle);
gillwei7 0:5c195ab2f696 1148 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1149 // sprintf((char *)&debugMess[0],"char_uuid:%4X\r\n",char_uuid.uuid);
gillwei7 3:38ec8ad317f4 1150 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 1151 //#endif
gillwei7 3:38ec8ad317f4 1152 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 1153 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 1154 cyntecInsertCharUUID(char_uuid, testHandle.value_handle,valueLengthBuffer,attrMode);
gillwei7 0:5c195ab2f696 1155 // sprintf((char *)&debugMess[0],"char_count:%d\r\n",char_count);
gillwei7 3:38ec8ad317f4 1156 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 1157 char_count++;
gillwei7 3:38ec8ad317f4 1158 if (char_count>10)
gillwei7 3:38ec8ad317f4 1159 char_count=0;
gillwei7 3:38ec8ad317f4 1160 } else if (err_code == NRF_ERROR_INVALID_STATE) {
gillwei7 3:38ec8ad317f4 1161 cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION);
gillwei7 3:38ec8ad317f4 1162 return;
gillwei7 3:38ec8ad317f4 1163 } else {
gillwei7 3:38ec8ad317f4 1164 console.printf("ERROR;\r\n");
gillwei7 3:38ec8ad317f4 1165 }
gillwei7 0:5c195ab2f696 1166
gillwei7 0:5c195ab2f696 1167 }
gillwei7 0:5c195ab2f696 1168
gillwei7 0:5c195ab2f696 1169 static void cyntecInsertServiceUUID(ble_uuid_t service_UUID)
gillwei7 3:38ec8ad317f4 1170 {
gillwei7 3:38ec8ad317f4 1171 /* find if the service uuid is exist */
gillwei7 3:38ec8ad317f4 1172 bufferService[service_count].service_uuid.uuid = service_UUID.uuid;
gillwei7 3:38ec8ad317f4 1173 bufferService[service_count].service_uuid.type = service_UUID.type;
gillwei7 3:38ec8ad317f4 1174 return;
gillwei7 0:5c195ab2f696 1175
gillwei7 0:5c195ab2f696 1176 }
gillwei7 0:5c195ab2f696 1177
gillwei7 0:5c195ab2f696 1178 static void cynGattServiceCommand(void)
gillwei7 0:5c195ab2f696 1179 {
gillwei7 0:5c195ab2f696 1180 // uint16_t service_uuid;
gillwei7 0:5c195ab2f696 1181 // uint8_t attrValue[MAX_VALUE_LENGTH];
gillwei7 0:5c195ab2f696 1182 // memset(&attrValue, 0, sizeof(attrValue));
gillwei7 0:5c195ab2f696 1183 // uint8_t i;
gillwei7 0:5c195ab2f696 1184 // uint8_t valueBuffer;
gillwei7 3:38ec8ad317f4 1185 extern uint8_t service_count;
gillwei7 3:38ec8ad317f4 1186
gillwei7 3:38ec8ad317f4 1187 uint32_t err_code;
gillwei7 3:38ec8ad317f4 1188 ble_uuid_t ble_uuid;
gillwei7 3:38ec8ad317f4 1189 ble_uuid128_t ble_uuid128;
gillwei7 3:38ec8ad317f4 1190 uint16_t buffer_uuid;
gillwei7 3:38ec8ad317f4 1191 uint16_t buffer_uuid_vs[8];
gillwei7 3:38ec8ad317f4 1192 int i;
gillwei7 3:38ec8ad317f4 1193
gillwei7 3:38ec8ad317f4 1194 if (cyntecGetCommandTokenCnt() != 3) {
gillwei7 3:38ec8ad317f4 1195 cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS);
gillwei7 3:38ec8ad317f4 1196 return;
gillwei7 3:38ec8ad317f4 1197 } else {
gillwei7 3:38ec8ad317f4 1198 /* handle first parameter - Service UUID */
gillwei7 3:38ec8ad317f4 1199 uint8_t argLen = 0;
gillwei7 3:38ec8ad317f4 1200 uint8_t *arg = cyntecGetCommandArgument(0,&argLen);
gillwei7 0:5c195ab2f696 1201
gillwei7 3:38ec8ad317f4 1202 /* Service uuid is 16 bits */
gillwei7 3:38ec8ad317f4 1203 if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') {
gillwei7 3:38ec8ad317f4 1204 buffer_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2));
gillwei7 3:38ec8ad317f4 1205 //ble_uuid.type = BLE_UUID_TYPE_BLE; //type assign in BLE_UUID_BLE_ASSIGN
gillwei7 3:38ec8ad317f4 1206 BLE_UUID_BLE_ASSIGN(ble_uuid, buffer_uuid);
gillwei7 3:38ec8ad317f4 1207
gillwei7 3:38ec8ad317f4 1208 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle);
gillwei7 3:38ec8ad317f4 1209 ble_uuid.type = BLE_UUID_TYPE_BLE;
gillwei7 3:38ec8ad317f4 1210
gillwei7 3:38ec8ad317f4 1211 }
gillwei7 3:38ec8ad317f4 1212
gillwei7 3:38ec8ad317f4 1213 /* Service uuid is 128 bits */
gillwei7 3:38ec8ad317f4 1214 if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) {
gillwei7 0:5c195ab2f696 1215 // uint8_t uuid_type = custom_add_uuid_base(CFG_CUSTOM_UUID_BASE);
gillwei7 3:38ec8ad317f4 1216 //ASSERT(uuid_type > 0, ERROR_NOT_FOUND);
gillwei7 3:38ec8ad317f4 1217 for ( i=0; i<8; i++) {
gillwei7 3:38ec8ad317f4 1218 buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4);
gillwei7 3:38ec8ad317f4 1219 if (i==1) {
gillwei7 3:38ec8ad317f4 1220 ble_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4);
gillwei7 3:38ec8ad317f4 1221 }
gillwei7 0:5c195ab2f696 1222 #ifdef DELTA_DEBUG
gillwei7 3:38ec8ad317f4 1223 console.printf("%2X/",buffer_uuid_vs[7-i]);
gillwei7 0:5c195ab2f696 1224 #endif
gillwei7 3:38ec8ad317f4 1225 }
gillwei7 3:38ec8ad317f4 1226 memcpy(&ble_uuid128.uuid128,buffer_uuid_vs,16);
gillwei7 0:5c195ab2f696 1227 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1228 // sprintf((char *)&debugMess[0],"%32X\r\n",ble_uuid128.uuid128);
gillwei7 0:5c195ab2f696 1229 // console.printf(debugMess);
gillwei7 0:5c195ab2f696 1230 //#endif
gillwei7 3:38ec8ad317f4 1231 err_code = sd_ble_uuid_vs_add(&ble_uuid128, &ble_uuid.type);
gillwei7 3:38ec8ad317f4 1232 //#ifdef DELTA_DEBUG
gillwei7 0:5c195ab2f696 1233 // sprintf((char *)&debugMess[0],"service_uuid_type:%d\r\n",ble_uuid.type);
gillwei7 0:5c195ab2f696 1234 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 1235 //#endif
gillwei7 3:38ec8ad317f4 1236
gillwei7 3:38ec8ad317f4 1237 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle);
gillwei7 3:38ec8ad317f4 1238
gillwei7 3:38ec8ad317f4 1239 ble_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN;
gillwei7 0:5c195ab2f696 1240
gillwei7 3:38ec8ad317f4 1241 }
gillwei7 3:38ec8ad317f4 1242 if (err_code == NRF_SUCCESS) {
gillwei7 3:38ec8ad317f4 1243 cyntecPrintOk();
gillwei7 3:38ec8ad317f4 1244 cyntecInsertServiceUUID(ble_uuid);
gillwei7 3:38ec8ad317f4 1245 service_count++;
gillwei7 3:38ec8ad317f4 1246 char_count = 0;
gillwei7 0:5c195ab2f696 1247 // sprintf((char *)&debugMess[0],"service_count:%d\r\n",service_count);
gillwei7 0:5c195ab2f696 1248 // console.printf(debugMess);
gillwei7 3:38ec8ad317f4 1249 } else {
gillwei7 3:38ec8ad317f4 1250 console.printf("ERROR;\r\n");
gillwei7 3:38ec8ad317f4 1251
gillwei7 3:38ec8ad317f4 1252 }
gillwei7 3:38ec8ad317f4 1253
gillwei7 3:38ec8ad317f4 1254 }
gillwei7 3:38ec8ad317f4 1255 }
gillwei7 0:5c195ab2f696 1256
gillwei7 0:5c195ab2f696 1257 static void cynBLEInitCommand(void)
gillwei7 0:5c195ab2f696 1258 {
gillwei7 3:38ec8ad317f4 1259 const char DEVICE_NAME[] = "DELTA_CLI";
gillwei7 3:38ec8ad317f4 1260
gillwei7 3:38ec8ad317f4 1261 deltaBLE.init();
gillwei7 3:38ec8ad317f4 1262 deltaBLE.onDisconnection(disconnectionCallback);
gillwei7 3:38ec8ad317f4 1263 deltaBLE.onConnection(onConnectionCallback);
gillwei7 3:38ec8ad317f4 1264 deltaBLE.onTimeout(onTimeoutCallback);
gillwei7 3:38ec8ad317f4 1265
gillwei7 3:38ec8ad317f4 1266 /* Setup advertising. */
gillwei7 3:38ec8ad317f4 1267 deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
gillwei7 3:38ec8ad317f4 1268 deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
gillwei7 3:38ec8ad317f4 1269 deltaBLE.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
gillwei7 3:38ec8ad317f4 1270 deltaBLE.setAdvertisingInterval(1000);
gillwei7 3:38ec8ad317f4 1271
gillwei7 3:38ec8ad317f4 1272 cyntecPrintOk();
gillwei7 0:5c195ab2f696 1273 }
gillwei7 0:5c195ab2f696 1274
gillwei7 0:5c195ab2f696 1275 CyntecCommandEntry bleCommandSets[] = {
gillwei7 3:38ec8ad317f4 1276 {"init", cynBLEInitCommand, NULL, "Init BLE stack, Usage: cynb init"},
gillwei7 3:38ec8ad317f4 1277 {"gpio", cynBLEGPIOCommand, NULL, "Config gpio, Usage: cynb gpio <GPIO NO> <set|clear>"},
gillwei7 3:38ec8ad317f4 1278 {"sleep", cynBLESystemOffCommand, NULL, "System off mode, Usage: cynb sleep <GPIO NO>"},
gillwei7 3:38ec8ad317f4 1279 {"disconn", cynBLEDisconnectCommand, NULL, "Disconnection, Usage: cynb disconn"},
gillwei7 3:38ec8ad317f4 1280 {"reset", cynResetCommand, NULL, "Soft reset, Usage: cynb reset"},
gillwei7 3:38ec8ad317f4 1281 {"info", cynBLEInfoCommand, NULL, "Module information, Usage: cynb info"},
gillwei7 3:38ec8ad317f4 1282 // s110
gillwei7 3:38ec8ad317f4 1283 {"gattChar", cynGattCharCommand, NULL, "Set SIG defined characteristic or Create your own"},
gillwei7 3:38ec8ad317f4 1284 {"gattService", cynGattServiceCommand, NULL, "Set SIG defined service or Create your own"},
gillwei7 3:38ec8ad317f4 1285 {"name", cynBLENameCommand, NULL, "Set/Get friendly for BLE module"},
gillwei7 3:38ec8ad317f4 1286 {"advStart", cynAdvertiseStartCommand, NULL, "Start broadcast advertise packet"},
gillwei7 3:38ec8ad317f4 1287 {"advStop", cynAdvertiseStopCommand, NULL, "Stop broadcast advertise packet"},
gillwei7 3:38ec8ad317f4 1288
gillwei7 3:38ec8ad317f4 1289 //s120
gillwei7 3:38ec8ad317f4 1290 {"scanStart", cynBLEScanCommand, NULL, "Start to scan BLE device"},
gillwei7 3:38ec8ad317f4 1291 {"scanStop", cynBLEScanStopCommand, NULL, "Stop to scan BLE device"},
gillwei7 3:38ec8ad317f4 1292 // {"connect", cynBLEConnectCommand, NULL, "Connect to specific BLE device by Device Name"},
gillwei7 3:38ec8ad317f4 1293
gillwei7 3:38ec8ad317f4 1294 {"txPow", cynBLESetTxPowerCommand, NULL, "Set BLE tx power"},
gillwei7 3:38ec8ad317f4 1295 {"bleAddr", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address"},
gillwei7 3:38ec8ad317f4 1296 {"update", cynBLEUpdateUUIDCommand, NULL, "Update value of specific characteristics"},
gillwei7 3:38ec8ad317f4 1297 {"readData", cynBLEReadDataCommand, NULL, "Read value of specific characteristics"},
gillwei7 3:38ec8ad317f4 1298 {NULL, NULL, NULL, NULL},
gillwei7 0:5c195ab2f696 1299 };