Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of NNN40_CLI by
CLI_Source/ble_cli.cpp@3:38ec8ad317f4, 2015-10-02 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |