Delta / Mbed OS Delta_CLI

Fork of NNN40_CLI by Delta

Committer:
gillwei7
Date:
Fri Sep 11 07:29:31 2015 +0000
Revision:
0:5c195ab2f696
Child:
3:38ec8ad317f4
Gill first commit 20150911 for NNN40_CLI Version 0; Merge mbed library to offline Keil Wifi/BLE CLI program

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