
fork test
Dependencies: BLE_API WIFI_API_32kRAM mbed nRF51822
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 | }; |