
fork test
Dependencies: BLE_API WIFI_API_32kRAM mbed nRF51822
Fork of NNN40_CLI by
Diff: CLI_Source/ble_cli.cpp
- Revision:
- 3:38ec8ad317f4
- Parent:
- 0:5c195ab2f696
- Child:
- 4:b52035367aee
--- a/CLI_Source/ble_cli.cpp Fri Sep 11 07:52:06 2015 +0000 +++ b/CLI_Source/ble_cli.cpp Fri Oct 02 10:36:29 2015 +0000 @@ -4,7 +4,7 @@ * * Copyright 2014 by CYNTEC Corporation. All rights reserved. */ - + #include <stdio.h> #include <stdlib.h> #include <stdint.h> @@ -22,10 +22,11 @@ #include "PinNames.h" //#include "custom_helper.h" extern "C" { - #include "ble_advdata.h" +#include "ble_advdata.h" } -#define S110_BLE_PERIPHERAL +//#define S110_BLE_PERIPHERAL +//#define S120_BLE_CENTRAL #define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */ #define APP_ADV_TIMEOUT_IN_SECONDS 180 /**< The advertising timeout (in units of seconds). */ @@ -48,37 +49,44 @@ #define CLI_FWVERION "DELTA_CLI_V1.6" #define MODULE_NAME "DFCM-NNN40-DT1R" #define ADVERTISING_LED_PIN_NO LED1 -#define DELTA_DEBUG 1 +//#define DELTA_DEBUG //#define LBS_UUID_BASE {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00} #define NEW_VS_SERVICE 0x0001 - +#define DEFAULT_SCAN_INTERVAL 500 +#define DEFAULT_SCAN_WINDOW 400 +#define DEFAULT_SCAN_TIMEOUT 5 +#define BLE_MAX_ADDRESS_NUMBER 10 static ble_gap_addr_t m_peer_addr; extern Serial console; BLE deltaBLE; //gill 0904 extern const char* cyntecCommandErrorNames[]; -extern void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason); -// gill 0904 -static bool connState = false; +static bool connState = false; // gill 0904 typedef struct bufferGattChar { // bool flag; - uint8_t mode; - ble_uuid_t char_uuid; - //uint8_t value[MAX_VALUE_LENGTH]; - uint16_t char_value_handle; - uint8_t valueLength; + uint8_t mode; + ble_uuid_t char_uuid; + //uint8_t value[MAX_VALUE_LENGTH]; + uint16_t char_value_handle; + uint8_t valueLength; } bufferGattChar_t; typedef struct bufferGattService { // uint16_t service_uuid_vs[8]; // uint16_t service_uuid; // bool flag; - ble_uuid_t service_uuid; - bufferGattChar_t bufferGattChar[CLI_CHAR_MAX_NUM]; - uint16_t service_handle; + ble_uuid_t service_uuid; + bufferGattChar_t bufferGattChar[CLI_CHAR_MAX_NUM]; + uint16_t service_handle; } bufferGattService_t; +// gill 20150916 for scan +typedef struct { + const uint8_t * p_data; /**< Pointer to data. */ + uint8_t data_len; /**< Length of data. */ +} data_t; + /* save entry services */ bufferGattService_t bufferGattTest; bufferGattService_t bufferService[CLI_SERVICE_MAX_NUM]; @@ -89,6 +97,9 @@ uint8_t char_count=0; static uint16_t test_conn_handle; //Connection handle, assign after connected extern bool advState; // currently no use +static Gap::Address_t saveAddr[BLE_MAX_ADDRESS_NUMBER]; // check in advertisementCallback +static uint8_t bleDevInd; +static Gap::GapState_t nowState; DigitalOut led1(p7); DigitalOut led2(p13); @@ -99,7 +110,7 @@ void onTimeoutCallback(Gap::TimeoutSource_t source) { - led1 = !led1; + led1 = !led1; } void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) @@ -113,38 +124,109 @@ void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) { //console.printf("connState:%d\r\n",connState); + //Gap::GapState_t->connected = 0; connState = false; } static void cyntecPrintOk(void) { - console.printf("\r\nOK\r\n\r\n"); + console.printf("\r\nOK\r\n\r\n"); } static void cyntecPrintError(uint8_t errIdx) { - console.printf("\r\nERROR;"); - console.printf(cyntecCommandErrorNames[errIdx]); - console.printf("\r\n\r\n"); + console.printf("\r\nERROR;"); + console.printf(cyntecCommandErrorNames[errIdx]); + console.printf("\r\n\r\n"); +} + + +static uint32_t adv_report_parse(uint8_t type, data_t * p_advdata, data_t * p_typedata) +{ + uint32_t index = 0; + const uint8_t * p_data; + + p_data = p_advdata->p_data; + + while (index < p_advdata->data_len) { + uint8_t field_length = p_data[index]; + uint8_t field_type = p_data[index+1]; + + if (field_type == type) { + p_typedata->p_data = &p_data[index+2]; + p_typedata->data_len = field_length-1; + return NRF_SUCCESS; + } + index += field_length+1; + } + return NRF_ERROR_NOT_FOUND; } -#ifdef S120_BLE_CENTRAL -/** - * @brief Scan parameters requested for scanning and connection. - */ -static const ble_gap_scan_params_t m_scan_param = +void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { - 0, // Active scanning set. - 0, // Selective scanning not set. - NULL, // White-list not set. - (uint16_t)SCAN_INTERVAL, // Scan interval. - (uint16_t)SCAN_WINDOW, // Scan window. - 0 // Never stop scanning unless explicit asked to. -}; + bool flagRepeat=false; + Gap::Address_t newAddr[6]; + memcpy(newAddr,params->peerAddr,6); + + for(int i=0; i<BLE_MAX_ADDRESS_NUMBER; i++) { + if (memcmp(newAddr,saveAddr[i],6)==0) { +#ifdef DELTA_DEBUG + console.printf("Repeated\r\n"); +#endif + flagRepeat = true; + //return; + } + } + +#ifdef DELTA_DEBUG + console.printf("addr cmp result :%i\r\n",memcmp(newAddr,params->peerAddr,6)); + console.printf("ADV data:%X,%i\r\n",&(params->advertisingData),params->advertisingDataLen); +#endif + data_t adv_data; + data_t type_data; + //Initialize advertisement report for parsing. + adv_data.p_data = params->advertisingData; + adv_data.data_len = params->advertisingDataLen; + // Parsing Device Name + uint32_t err_code = adv_report_parse(BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, + &adv_data, + &type_data); +#ifdef DELTA_DEBUG + console.printf("error code:%X\r\n",err_code); + console.printf("type_data.data_len:%i\r\n",type_data.data_len); #endif + if (flagRepeat == false) { + if (err_code == 0) { + for (int i=0; i<type_data.data_len; i++) { + console.printf("%c",type_data.p_data[i]); + } + //console.printf("\r\n"); + } + console.printf(",ADV,[%02X %02X %02X %02X %02X %02X],%d,%u\r\n",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], + params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi,params->type); + memcpy(saveAddr[bleDevInd],params->peerAddr,6); + bleDevInd++; + } + + /* + Check short name, not implemented + */ + //else +// { +// uint32_t err_code_2 = adv_report_parse(BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, +// &adv_data, +// &type_data); +// console.printf("error code:%X\r\n",err_code_2); +// console.printf("%i\r\n",type_data.data_len); +// console.printf("%s\r\n",type_data.p_data); +// +// } + //ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); +} -#ifdef S110_BLE_PERIPHERAL + + /**@brief Function for the Advertising functionality initialization. * * @details Encodes the required advertising data and passes it to the stack. @@ -156,7 +238,7 @@ ble_advdata_t advdata; ble_advdata_t scanrsp; //uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE; - + ble_uuid_t adv_uuids[] = {{bufferService[0].service_uuid.uuid, 0x01}}; memset(&advdata, 0, sizeof(advdata)); @@ -169,7 +251,7 @@ memset(&scanrsp, 0, sizeof(scanrsp)); scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); scanrsp.uuids_complete.p_uuids = adv_uuids; - + err_code = ble_advdata_set(&advdata, &scanrsp); APP_ERROR_CHECK(err_code); } @@ -181,10 +263,10 @@ { uint32_t err_code; ble_gap_adv_params_t adv_params; - + // Start advertising memset(&adv_params, 0, sizeof(adv_params)); - + adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; /**< Connectable undirected. */ adv_params.p_peer_addr = NULL; adv_params.fp = BLE_GAP_ADV_FP_ANY; /**< Allow scan requests and connect requests from any device. */ @@ -193,138 +275,125 @@ err_code = sd_ble_gap_adv_start(&adv_params); //APP_ERROR_CHECK(err_code); - return err_code; + return err_code; } static void cynAdvertiseStartCommand(void) { - // adv start or adv stop or syntax error - uint8_t argLen = 0; - uint8_t *arg; - /* arg0 is start or stop advertising */ - uint8_t *action = cyntecGetCommandArgument(0,&argLen); - uint16_t advInterval; - uint16_t advTimeout; - - switch (cyntecGetCommandTokenCnt()) - { - case 2: - advInterval = APP_ADV_INTERVAL; - advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; - break; - - case 3: - /* arg1 is adv interval parameter */ - arg = cyntecGetCommandArgument(1,&argLen); - advInterval = cyntecAtoiUint16( arg, argLen ); - advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; - break; - - case 4: - arg = cyntecGetCommandArgument(1,&argLen); - advInterval = cyntecAtoiUint16( arg, argLen ); - arg = cyntecGetCommandArgument(2,&argLen); - advTimeout = cyntecAtoiUint16( arg, argLen ); - break; - - default: - advInterval = APP_ADV_INTERVAL; - advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; - break; - } + // adv start or adv stop or syntax error + uint8_t argLen = 0; + uint8_t *arg; + /* arg0 is start or stop advertising */ + uint8_t *action = cyntecGetCommandArgument(0,&argLen); + uint16_t advInterval; + uint16_t advTimeout; + + switch (cyntecGetCommandTokenCnt()) { + case 2: + advInterval = APP_ADV_INTERVAL; + advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; + break; - if ( advInterval< APP_ADV_INTERVAL_MIN | advInterval> APP_ADV_INTERVAL_MAX | advTimeout < 1| advTimeout > BLE_GAP_ADV_TIMEOUT_LIMITED_MAX ) - { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); - return; - } -//#ifdef DELTA_DEBUG + case 3: + /* arg1 is adv interval parameter */ + arg = cyntecGetCommandArgument(1,&argLen); + advInterval = cyntecAtoiUint16( arg, argLen ); + advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; + break; + + case 4: + arg = cyntecGetCommandArgument(1,&argLen); + advInterval = cyntecAtoiUint16( arg, argLen ); + arg = cyntecGetCommandArgument(2,&argLen); + advTimeout = cyntecAtoiUint16( arg, argLen ); + break; + + default: + advInterval = APP_ADV_INTERVAL; + advTimeout = APP_ADV_TIMEOUT_IN_SECONDS; + break; + } + + //if ( advInterval< APP_ADV_INTERVAL_MIN | advInterval> APP_ADV_INTERVAL_MAX | advTimeout < 1| advTimeout > BLE_GAP_ADV_TIMEOUT_LIMITED_MAX ) { +// cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); +// return; +// } +//#ifdef DELTA_DEBUG //sprintf((char *)&debugMess[0],"[%d][%d]", advInterval,advTimeout); //console.printf(debugMess); //#endif // service_Test(); - advertising_init(); - uint8_t error_code = advertising_start(advInterval, advTimeout); - - if (error_code==NRF_SUCCESS) - { - cyntecPrintOk(); - nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO); - } - else if (error_code==NRF_ERROR_INVALID_STATE) - { - cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); - return; - } - else - { - console.printf("ERROR;\r\n"); - } + advertising_init(); + uint8_t error_code = advertising_start(advInterval, advTimeout); + + if (error_code==NRF_SUCCESS) { + cyntecPrintOk(); + nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO); + } else if (error_code==NRF_ERROR_INVALID_STATE) { + cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); + return; + } else { + console.printf("ERROR;\r\n"); + } } /**@brief Function for stop advertising. */ static void cynAdvertiseStopCommand(void) { - uint8_t advStopErr = 0; - advStopErr = sd_ble_gap_adv_stop(); - if (advStopErr == NRF_SUCCESS) - { - cyntecPrintOk(); - nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO); - } - else if (advStopErr==NRF_ERROR_INVALID_STATE) - { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } - else{ - console.printf("ERROR;\r\n"); - } + uint8_t advStopErr = 0; + advStopErr = sd_ble_gap_adv_stop(); + if (advStopErr == NRF_SUCCESS) { + cyntecPrintOk(); + nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO); + } else if (advStopErr==NRF_ERROR_INVALID_STATE) { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } else { + console.printf("ERROR;\r\n"); + } } //gill modify 20150904 for accept blank in name static void cynBLENameCommand(void) { - if (cyntecGetCommandTokenCnt() >= 3) - { - uint8_t tempNameLen = 0; - // check first and last char is " - uint8_t *argName1 = cyntecGetCommandArgument(0, &tempNameLen); - uint8_t *argNameLast = cyntecGetCommandArgument(cyntecGetCommandTokenCnt() - 3, &tempNameLen); - char bracket = '*'; - //console.printf("%02X\r\n",tempNameLen); - if (!memcmp(&argName1[0],&bracket,sizeof(char)) && !memcmp(&argNameLast[tempNameLen - 1],&bracket,sizeof(char))) - //if (!memcmp(&argName1[0],&bracket,sizeof(char))) - { - uint8_t nameLen = 0; - uint8_t *argName = cyntecGetCommandArgument(0, &nameLen); - uint8_t * argName2 = cyntecGetCommandTotalBuffer(); - uint32_t err_code; - ble_gap_conn_sec_mode_t sec_mode; - //console.printf("%02X\r\n",cyntecGetTotalIndex()); - console.printf("\r\nSet BLE Name: "); - uint8_t i = 0; - for(i = 0; i < cyntecGetTotalIndex()-12; i++) { - console.printf("%c",argName2[11+i]); - } - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); - err_code = sd_ble_gap_device_name_set(&sec_mode, - (const uint8_t *) &argName2[11], - (uint16_t) (cyntecGetTotalIndex()-12)); - if (err_code == NRF_SUCCESS) { - cyntecPrintOk(); - } - else { - console.printf("ERROR;%04X\r\n",err_code); - } - APP_ERROR_CHECK(err_code); - - -//#ifdef DELTADEBUG - //console.printf("\r\nSet BLE Name: "); + if (cyntecGetCommandTokenCnt() >= 3) { + uint8_t tempNameLen = 0; + // check first and last char is " + uint8_t *argName1 = cyntecGetCommandArgument(0, &tempNameLen); + uint8_t *argNameLast = cyntecGetCommandArgument(cyntecGetCommandTokenCnt() - 3, &tempNameLen); + char bracket = '*'; + //console.printf("%02X\r\n",tempNameLen); + if (!memcmp(&argName1[0],&bracket,sizeof(char)) && !memcmp(&argNameLast[tempNameLen - 1],&bracket,sizeof(char))) + //if (!memcmp(&argName1[0],&bracket,sizeof(char))) + { + uint8_t nameLen = 0; + uint8_t *argName = cyntecGetCommandArgument(0, &nameLen); + uint8_t * argName2 = cyntecGetCommandTotalBuffer(); + uint32_t err_code; + ble_gap_conn_sec_mode_t sec_mode; + //console.printf("%02X\r\n",cyntecGetTotalIndex()); + console.printf("\r\nSet BLE Name: "); + uint8_t i = 0; + for(i = 0; i < cyntecGetTotalIndex()-12; i++) { + console.printf("%c",argName2[11+i]); + } + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); + err_code = sd_ble_gap_device_name_set(&sec_mode, + (const uint8_t *) &argName2[11], + (uint16_t) (cyntecGetTotalIndex()-12)); + if (err_code == NRF_SUCCESS) { + cyntecPrintOk(); + } else { + console.printf("ERROR;%04X\r\n",err_code); + } + APP_ERROR_CHECK(err_code); + + +//#ifdef DELTADEBUG + //console.printf("\r\nSet BLE Name: "); // uint8_t i = 0; // for(i = 0; i < nameLen; i++) // { @@ -332,42 +401,39 @@ // } //#endif - //console.printf("\r\nPrint buffer:\r\n"); - //console.printf("%s\r\n",cyntecGetCommandTotalBuffer()); - - /* Re-init application setting */ - //cyntecCLIAppInit(); - } - else - { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - } - } else if (cyntecGetCommandTokenCnt() == 2){ - uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"}; - uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET; - uint32_t err_code; - - err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen); - APP_ERROR_CHECK(err_code); - - console.printf("\r\nOK;"); - console.printf("%s",bleName+APP_ADV_DATA_OFFSET); - console.printf(";\r\n"); - } - else{ - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } + //console.printf("\r\nPrint buffer:\r\n"); + //console.printf("%s\r\n",cyntecGetCommandTotalBuffer()); + + /* Re-init application setting */ + //cyntecCLIAppInit(); + } else { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + } + } else if (cyntecGetCommandTokenCnt() == 2) { + uint8_t bleName[BLE_GAP_DEVNAME_MAX_LEN] = {"\0"}; + uint16_t bleLen = BLE_GAP_DEVNAME_MAX_LEN - APP_ADV_DATA_OFFSET; + uint32_t err_code; + + err_code = sd_ble_gap_device_name_get(&bleName[APP_ADV_DATA_OFFSET], &bleLen); + APP_ERROR_CHECK(err_code); + + console.printf("\r\nOK;"); + console.printf("%s",bleName+APP_ADV_DATA_OFFSET); + console.printf(";\r\n"); + } else { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } } -#endif + static void cynBLEInfoCommand(void) { - console.printf("\r\nOK;F/W version:"); - console.printf(CLI_FWVERION); - console.printf(";Module name:"); - console.printf(MODULE_NAME); - console.printf("\r\n\r\n"); + console.printf("\r\nOK;F/W version:"); + console.printf(CLI_FWVERION); + console.printf(";Module name:"); + console.printf(MODULE_NAME); + console.printf("\r\n\r\n"); } /**@brief Set the radio's transmit power. @@ -378,474 +444,443 @@ */ static void cynBLESetTxPowerCommand (void) { - if (cyntecGetCommandTokenCnt() == 3) - { - uint32_t err_code; - uint8_t txLen=0; - uint8_t *arg = cyntecGetCommandArgument(0,&txLen); - + if (cyntecGetCommandTokenCnt() == 3) { + uint32_t err_code; + uint8_t txLen=0; + uint8_t *arg = cyntecGetCommandArgument(0,&txLen); + // uint8_t *arg = cyntecGetMinusArgument(0,&txLen); - + // cyntecGetMinusArgument(); // const char *value = (const char *)arg; // sprintf((char *)&debugMess[0],"\r\n[%i]\r\n",*value); // console.printf(debugMess); - const uint8_t NUM_TXPOW = 9; - bool inputSwitch = false; // if find matched case in TxPow, assign true - - int8_t validTxPow[NUM_TXPOW] = {-40, -30, -20, -16, -12, -8, -4, 0, 4}; - uint8_t i; - int8_t setValue; - - if ( arg != NULL ) { - setValue = atoi((const char *)arg); + const uint8_t NUM_TXPOW = 9; + bool inputSwitch = false; // if find matched case in TxPow, assign true + + int8_t validTxPow[NUM_TXPOW] = {-40, -30, -20, -16, -12, -8, -4, 0, 4}; + uint8_t i; + int8_t setValue; + + if ( arg != NULL ) { + setValue = atoi((const char *)arg); // sprintf((char *)&debugMess[0],"\r\n[%i]\r\n",setValue); // console.printf(debugMess); - for (i = 0; i < NUM_TXPOW; i++) - { - if (setValue == validTxPow[i]) - { - err_code = sd_ble_gap_tx_power_set(setValue); - APP_ERROR_CHECK(err_code); - inputSwitch = true; - break; - } - } - - if ( inputSwitch ) - cyntecPrintOk(); - else - console.printf("\r\nWrong Input; Accept Tx Pow: -40, -30, -20, -16, -12, -8, -4, 0, 4\r\n"); - } - clearBuffer(); // clear the commandState.buffer - return; - } - else{ - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } + for (i = 0; i < NUM_TXPOW; i++) { + if (setValue == validTxPow[i]) { + err_code = sd_ble_gap_tx_power_set(setValue); + APP_ERROR_CHECK(err_code); + inputSwitch = true; + break; + } + } + + if ( inputSwitch ) + cyntecPrintOk(); + else + console.printf("\r\nWrong Input; Accept Tx Pow: -40, -30, -20, -16, -12, -8, -4, 0, 4\r\n"); + } + clearBuffer(); // clear the commandState.buffer + return; + } else { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } } static void cynBLEAddressCommand(void) { - if (cyntecGetCommandTokenCnt() == 3) - { - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0, &argLen); - uint32_t err_code; - uint8_t addr,i; - - /* should with "0x" + 12 len addr */ - if (argLen == 14) { - if (arg[0] != '0' || arg[1] != 'x') { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - return; - } - - m_peer_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; + if (cyntecGetCommandTokenCnt() == 3) { + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0, &argLen); + uint32_t err_code; + uint8_t addr,i; + + /* should with "0x" + 12 len addr */ + if (argLen == 14) { + if (arg[0] != '0' || arg[1] != 'x') { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + return; + } - for ( i = 1 ; i < 7 ; i++) - { - addr = cyntecArgToUint8(arg+2*i, 2); - /* 5 - (i-1) */ - m_peer_addr.addr[6-i] = addr; - } - - err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_peer_addr); - APP_ERROR_CHECK(err_code); - - } else { //argLen != 14 - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - return; - } + m_peer_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; + + for ( i = 1 ; i < 7 ; i++) { + addr = cyntecArgToUint8(arg+2*i, 2); + /* 5 - (i-1) */ + m_peer_addr.addr[6-i] = addr; + } + + err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_peer_addr); + APP_ERROR_CHECK(err_code); + + } else { //argLen != 14 + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + return; + } //#ifdef DELTADEBUG // uint8_t buf2[20]; // console.printf("\r\nSet BLE Address: "); -// sprintf((char *)&buf2[0],(const char *)"[%02X %02X %02X %02X %02X %02X]", -// m_peer_addr.addr[0], m_peer_addr.addr[1], m_peer_addr.addr[2], -// m_peer_addr.addr[3], m_peer_addr.addr[4], m_peer_addr.addr[5]); +// sprintf((char *)&buf2[0],(const char *)"[%02X %02X %02X %02X %02X %02X]", +// m_peer_addr.addr[0], m_peer_addr.addr[1], m_peer_addr.addr[2], +// m_peer_addr.addr[3], m_peer_addr.addr[4], m_peer_addr.addr[5]); // console.printf(buf2); -//#endif - - cyntecPrintOk(); - } else if (cyntecGetCommandTokenCnt() == 2){ +//#endif + + cyntecPrintOk(); + } else if (cyntecGetCommandTokenCnt() == 2) { - uint32_t err_code; - err_code = sd_ble_gap_address_get(&m_peer_addr); - APP_ERROR_CHECK(err_code); - - cyntecPrintOk(); - - console.printf("[%02X %02X %02X %02X %02X %02X]", - m_peer_addr.addr[5], m_peer_addr.addr[4], m_peer_addr.addr[3], - m_peer_addr.addr[2], m_peer_addr.addr[1], m_peer_addr.addr[0]); - } - else { //cyntecGetCommandTokenCnt() not equal to 2 or 3 - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - } - return; + uint32_t err_code; + err_code = sd_ble_gap_address_get(&m_peer_addr); + APP_ERROR_CHECK(err_code); + + cyntecPrintOk(); + + console.printf("[%02X %02X %02X %02X %02X %02X]", + m_peer_addr.addr[5], m_peer_addr.addr[4], m_peer_addr.addr[3], + m_peer_addr.addr[2], m_peer_addr.addr[1], m_peer_addr.addr[0]); + } else { //cyntecGetCommandTokenCnt() not equal to 2 or 3 + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + } + return; } -#ifdef S120_BLE_CENTRAL -/**@breif Function to start scanning. + +/**@brief Function to start scanning. */ static void scan_start(void) { - uint32_t err_code = sd_ble_gap_scan_start(&m_scan_param); - APP_ERROR_CHECK(err_code); + deltaBLE.gap().startScan(advertisementCallback); + //APP_ERROR_CHECK(err_code); } -/**@breif Function to start scanning. - */ static void scan_stop(void) { - uint32_t err_code = sd_ble_gap_scan_stop(); - APP_ERROR_CHECK(err_code); + deltaBLE.stopScan(); + //APP_ERROR_CHECK(err_code); } +// gill 20150916 modify static void cynBLEScanCommand(void) { - uint8_t *arg = cyntecGetCommandArgument(0,NULL); + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + uint16_t setInterval = DEFAULT_SCAN_INTERVAL; + uint16_t setWindow = DEFAULT_SCAN_WINDOW; + uint16_t setTimeout = DEFAULT_SCAN_TIMEOUT; + setInterval = cyntecAtoiUint16( arg, argLen ); + arg = cyntecGetCommandArgument(1,&argLen); + setWindow = cyntecAtoiUint16( arg, argLen ); + arg = cyntecGetCommandArgument(2,&argLen); + setTimeout = cyntecAtoiUint16( arg, argLen ); +#ifdef DELTA_DEBUG + console.printf("%i\r\n",setTimeout); +#endif + memset(saveAddr,0,sizeof(saveAddr)); // Clear saving address set - if ( arg != NULL ) { - if ( arg[0] == '1' ) { - console.printf("\r\nStart Scanning"); - scan_start(); - } - else if ( arg[0] == '0' ) { - console.printf("\r\nStop Scanning"); - scan_stop(); - } - else - console.printf("\r\nUsage: cynb scan <1|0>"); - console.printf("\r\n"); - } + deltaBLE.gap().setScanParams(setInterval,setWindow,setTimeout,1); + console.printf("Start Scanning\r\n"); + scan_start(); + +} + +static void cynBLEScanStopCommand(void) +{ + console.printf("\r\nStop Scanning"); + scan_stop(); } -static void cynBLEConnectCommand(void) -{ - if (cyntecGetCommandTokenCnt() == 3) - { - uint8_t devNameLen = 0; - uint8_t *argDevName = cyntecGetCommandArgument(0, &devNameLen); - - if ( argDevName != NULL ) { - uint8_t i; - for (i = 0; i < devNameLen; i++) { - targetDevName[i] = argDevName[i]; - } - if (i < devNameLen) - targetDevName[i] = '\0'; - } - - console.printf("\r\nSearch for device name:"); - console.printf(argDevName); - - scan_start(); - } else { - console.printf("\r\nUsage: cynb connect <Device Name>"); - console.printf("\r\n(Ex:cynb connect CYN_DEVICE"); - } -} -#endif +//static void cynBLEConnectCommand(void) +//{ +// if (cyntecGetCommandTokenCnt() == 3) +// { +// uint8_t devNameLen = 0; +// uint8_t *argDevName = cyntecGetCommandArgument(0, &devNameLen); +// uint8_t *targetDevName[devNameLen]; +// if ( argDevName != NULL ) { +// uint8_t i; +// for (i = 0; i < devNameLen; i++) { +// targetDevName[i] = argDevName[i]; +// } +// if (i < devNameLen) +// targetDevName[i] = '\0'; +// } +//#ifdef DELTA_DEBUG +// console.printf("\r\nSearch for device name:"); +// console.printf(argDevName); +//#endif +// scan_start(); +// } else { +// console.printf("\r\nUsage: cynb connect <Device Name>"); +// console.printf("\r\n(Ex:cynb connect CYN_DEVICE"); +// } +//} + static void cynBLEDisconnectCommand(void) { - uint32_t err_code; -#ifdef S110_BLE_PERIPHERAL - //marcus need to modify - err_code = sd_ble_gap_disconnect(test_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); -#endif - -#ifdef S120_BLE_CENTRAL - err_code = sd_ble_gap_connect_cancel(); // No function defined currently -#endif - if (err_code == NRF_SUCCESS) - { + uint32_t err_code; + + //marcus need to modify + err_code = sd_ble_gap_disconnect(test_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + + + + err_code = sd_ble_gap_connect_cancel(); // No function defined currently - cyntecPrintOk(); + if (err_code == NRF_SUCCESS) { + + cyntecPrintOk(); // APP_ERROR_CHECK(err_code); - } - else if (err_code ==NRF_ERROR_INVALID_STATE){ - cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); - } - else { - console.printf("ERROR;\r\n"); - } + } else if (err_code ==NRF_ERROR_INVALID_STATE) { + cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); + } else { + console.printf("ERROR;\r\n"); + } } -static uint8_t isValidGPIO(uint8_t num) +uint8_t isValidGPIO(uint8_t num) { - uint8_t cfgPin[] = {0,1,2,3,4,5,6,7,13,16,17,23,24,25,29}; - uint8_t i; - - for ( i = 0; i < sizeof(cfgPin) ; i++ ) - { - if ( num == cfgPin[i] ) - return 1; - } - - return 0; + uint8_t cfgPin[] = {0,1,2,3,4,5,6,7,13,16,17,23,24,25,29}; + uint8_t i; + + for ( i = 0; i < sizeof(cfgPin) ; i++ ) { + if ( num == cfgPin[i] ) + return 1; + } + + return 0; } static void cynBLESystemOffCommand(void) { - if (cyntecGetCommandTokenCnt() == 3) - { - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0,&argLen); - uint8_t gpioNum = cyntecAtoi( arg, argLen ); - // Can only use 0,1,2,3,4,5,6,7,13,16,17,23,24,25,29 - if (!isValidGPIO(gpioNum)) - { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); - return; - } - nrf_gpio_cfg_sense_input(gpioNum, - NRF_GPIO_PIN_PULLUP, - NRF_GPIO_PIN_SENSE_LOW); - cyntecPrintOk(); - } else if (cyntecGetCommandTokenCnt() == 2){ - /* default wake up pin is uart Rx pin */ - nrf_gpio_cfg_sense_input(RX_PIN_NUMBER, - NRF_GPIO_PIN_PULLUP, - NRF_GPIO_PIN_SENSE_LOW); - cyntecPrintOk(); - } else{ - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - } - sd_power_system_off(); + if (cyntecGetCommandTokenCnt() == 3) { + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + uint8_t gpioNum = cyntecAtoi( arg, argLen ); + // Can only use 0,1,2,3,4,5,6,7,13,16,17,23,24,25,29 + if (!isValidGPIO(gpioNum)) { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); + return; + } + nrf_gpio_cfg_sense_input(gpioNum, + NRF_GPIO_PIN_PULLUP, + NRF_GPIO_PIN_SENSE_LOW); + cyntecPrintOk(); + } else if (cyntecGetCommandTokenCnt() == 2) { + /* default wake up pin is uart Rx pin */ + nrf_gpio_cfg_sense_input(RX_PIN_NUMBER, + NRF_GPIO_PIN_PULLUP, + NRF_GPIO_PIN_SENSE_LOW); + cyntecPrintOk(); + } else { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + } + sd_power_system_off(); } static void cynBLEGPIOCommand(void) { - - if (cyntecGetCommandTokenCnt() == 4) - { - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0,&argLen); - uint8_t gpioNum = cyntecAtoi( arg, argLen ); - - if (!isValidGPIO(gpioNum)) - { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); - return; - } - - /* arg2 is set or clear */ - uint8_t *action = cyntecGetCommandArgument(1,&argLen); - - if ( cyntecStrCmp(action,(unsigned char *)"set",argLen) == 1 ) - { - nrf_gpio_cfg_output(gpioNum); - nrf_gpio_pin_set(gpioNum); - cyntecPrintOk(); - } else if ( cyntecStrCmp(action,(unsigned char *)"clear",argLen) == 1 ) { - nrf_gpio_cfg_output(gpioNum); - nrf_gpio_pin_clear(gpioNum); - cyntecPrintOk(); - } else { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - } - } else { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - } + + if (cyntecGetCommandTokenCnt() == 4) { + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + uint8_t gpioNum = cyntecAtoi( arg, argLen ); + + if (!isValidGPIO(gpioNum)) { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_OUT_OF_RANGE); + return; + } + + /* arg2 is set or clear */ + uint8_t *action = cyntecGetCommandArgument(1,&argLen); + + if ( cyntecStrCmp(action,(unsigned char *)"set",argLen) == 1 ) { + nrf_gpio_cfg_output(gpioNum); + nrf_gpio_pin_set(gpioNum); + cyntecPrintOk(); + } else if ( cyntecStrCmp(action,(unsigned char *)"clear",argLen) == 1 ) { + nrf_gpio_cfg_output(gpioNum); + nrf_gpio_pin_clear(gpioNum); + cyntecPrintOk(); + } else { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + } + } else { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + } } static void cynResetCommand(void) { - cyntecPrintOk(); - // On assert, the system can only recover with a reset. - NVIC_SystemReset(); + cyntecPrintOk(); + // On assert, the system can only recover with a reset. + NVIC_SystemReset(); } // gill modify for update value in non-connect state 20150904 -// Change set value connection handle +// Change set value connection handle static void cynBLEUpdateUUIDCommand(void) { - uint8_t i,j; - uint8_t value[MAX_VALUE_LENGTH]; - memset(value, 0, sizeof(value)); + uint8_t i,j; + uint8_t value[MAX_VALUE_LENGTH]; + memset(value, 0, sizeof(value)); // uint8_t buf_char_uuid_type; - ble_uuid_t buf_service_uuid; - ble_uuid_t buf_char_uuid; - uint8_t argLen = 0; - uint8_t *arg; - uint8_t valueLengthBuffer = 0; - uint8_t modeType; - bool updatematchFlag = false; // Check matched characteristic found - uint16_t len = MAX_VALUE_LENGTH; - uint32_t err_code; - // check if argument count is right - if (cyntecGetCommandTokenCnt() != 5) - { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } - else - { - arg = cyntecGetCommandArgument(0,&argLen); - if (arg[0] != '0' | arg[1] != 'x' | argLen%2 != 0) { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - return; - } - else { - // Handle input parameter - Service UUID - arg = cyntecGetCommandArgument(0,&argLen); - - if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - buf_service_uuid.type = BLE_UUID_TYPE_BLE; - } - if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') - { - buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); - buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - } - - // Handle input parameter - Characteristic UUID - argLen = 0; - arg = cyntecGetCommandArgument(1,&argLen); - - if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - buf_char_uuid.type = BLE_UUID_TYPE_BLE; - } - if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') - { - buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); - buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - } + ble_uuid_t buf_service_uuid; + ble_uuid_t buf_char_uuid; + uint8_t argLen = 0; + uint8_t *arg; + uint8_t valueLengthBuffer = 0; + uint8_t modeType; + bool updatematchFlag = false; // Check matched characteristic found + uint16_t len = MAX_VALUE_LENGTH; + uint32_t err_code; + // check if argument count is right + if (cyntecGetCommandTokenCnt() != 5) { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } else { + arg = cyntecGetCommandArgument(0,&argLen); + if (arg[0] != '0' | arg[1] != 'x' | argLen%2 != 0) { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + return; + } else { + // Handle input parameter - Service UUID + arg = cyntecGetCommandArgument(0,&argLen); + + if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + buf_service_uuid.type = BLE_UUID_TYPE_BLE; + } + if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') { + buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); + buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; + } + + // Handle input parameter - Characteristic UUID + argLen = 0; + arg = cyntecGetCommandArgument(1,&argLen); + + if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + buf_char_uuid.type = BLE_UUID_TYPE_BLE; + } + if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') { + buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); + buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; + } // sprintf((char *)&debugMess[0],"buf_service_uuid[%d,%4X]\r\n",buf_service_uuid.type,buf_service_uuid.uuid); // console.printf(debugMess); - - // Handle input parameter - value - arg = cyntecGetCommandArgument(2,&argLen); - valueLengthBuffer = (argLen-2)/2; - for (i=0 ; i < (argLen-2)/2; i++) - { - value[i] = cyntecArgToUint8(arg+2*(i+1), 2); - // debug - // sprintf((char *)&buf[0],"[%2X]",value[i]); - // console.printf(buf); - } - - } - // debug message + + // Handle input parameter - value + arg = cyntecGetCommandArgument(2,&argLen); + valueLengthBuffer = (argLen-2)/2; + for (i=0 ; i < (argLen-2)/2; i++) { + value[i] = cyntecArgToUint8(arg+2*(i+1), 2); + // debug + // sprintf((char *)&buf[0],"[%2X]",value[i]); + // console.printf(buf); + } + + } + // debug message // sprintf((char *)&buf[0],"value:[%02X]", value); // console.printf(buf); - - for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) - { - if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (updatematchFlag == false)) - { - //readmatchFlag = true; - for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) - { - 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)) - { - modeType = bufferService[i].bufferGattChar[j].mode; - //memset(bufferService[i].bufferGattChar[j].value, 0, sizeof(bufferService[i].bufferGattChar[j].value)); - // Identify characteristic property is notify or indicate - if (((modeType & (1 << CLI_CHAR_MODE_INDICATE)) | (modeType & (1 << CLI_CHAR_MODE_NOTIFY))) ) - { - if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_INDICATE)) - modeType = BLE_GATT_HVX_INDICATION ; - if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_NOTIFY)) - modeType = BLE_GATT_HVX_NOTIFICATION; - ble_gatts_hvx_params_t hvx_params; - memset(&hvx_params, 0, sizeof(hvx_params)); - hvx_params.handle = bufferService[i].bufferGattChar[j].char_value_handle; - hvx_params.type = modeType; - hvx_params.offset = 0; - hvx_params.p_len = &len; - hvx_params.p_data = value; - if (connState) // If connected, send notification/indication - { - err_code = sd_ble_gatts_hvx(test_conn_handle, &hvx_params); - - if (err_code == NRF_SUCCESS) - { - //do nothing - } - else if ((err_code != NRF_SUCCESS) && - (err_code != NRF_ERROR_INVALID_STATE) && - (err_code != BLE_ERROR_NO_TX_BUFFERS) && - (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) - ) - { - console.printf("HVX ERROR;%04X\r\n",err_code); - } - } - - } - - // Update database - bufferService[i].bufferGattChar[j].valueLength = valueLengthBuffer; - ble_gatts_value_t bufGattsValue; - memset(&bufGattsValue, 0, sizeof(bufGattsValue)); - bufGattsValue.len = len; - bufGattsValue.offset = 0; - bufGattsValue.p_value = value; - //err_code = sd_ble_gatts_value_set(bufferService[i].bufferGattChar[j].char_value_handle, -// 0, -// &len, + + for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) { + if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (updatematchFlag == false)) { + //readmatchFlag = true; + for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) { + 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)) { + modeType = bufferService[i].bufferGattChar[j].mode; + //memset(bufferService[i].bufferGattChar[j].value, 0, sizeof(bufferService[i].bufferGattChar[j].value)); + // Identify characteristic property is notify or indicate + if (((modeType & (1 << CLI_CHAR_MODE_INDICATE)) | (modeType & (1 << CLI_CHAR_MODE_NOTIFY))) ) { + if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_INDICATE)) + modeType = BLE_GATT_HVX_INDICATION ; + if (bufferService[i].bufferGattChar[j].mode & (1 << CLI_CHAR_MODE_NOTIFY)) + modeType = BLE_GATT_HVX_NOTIFICATION; + ble_gatts_hvx_params_t hvx_params; + memset(&hvx_params, 0, sizeof(hvx_params)); + hvx_params.handle = bufferService[i].bufferGattChar[j].char_value_handle; + hvx_params.type = modeType; + hvx_params.offset = 0; + hvx_params.p_len = &len; + hvx_params.p_data = value; + if (connState) { // If connected, send notification/indication + err_code = sd_ble_gatts_hvx(test_conn_handle, &hvx_params); + + if (err_code == NRF_SUCCESS) { + //do nothing + } else if ((err_code != NRF_SUCCESS) && + (err_code != NRF_ERROR_INVALID_STATE) && + (err_code != BLE_ERROR_NO_TX_BUFFERS) && + (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) + ) { + console.printf("HVX ERROR;%04X\r\n",err_code); + } + } + + } + + // Update database + bufferService[i].bufferGattChar[j].valueLength = valueLengthBuffer; + ble_gatts_value_t bufGattsValue; + memset(&bufGattsValue, 0, sizeof(bufGattsValue)); + bufGattsValue.len = len; + bufGattsValue.offset = 0; + bufGattsValue.p_value = value; + //err_code = sd_ble_gatts_value_set(bufferService[i].bufferGattChar[j].char_value_handle, +// 0, +// &len, // value); - err_code = sd_ble_gatts_value_set( - //test_conn_handle, - BLE_CONN_HANDLE_INVALID, // User can update in non-connected state - bufferService[i].bufferGattChar[j].char_value_handle, - &bufGattsValue - ); - - if (err_code == NRF_SUCCESS) - { - cyntecPrintOk(); - } - else - { - console.printf("Set ERROR;%04X\r\n",err_code); - } - updatematchFlag = true; - return; - } - } - } - } - if (updatematchFlag == false){ - cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT); - } - } + err_code = sd_ble_gatts_value_set( + //test_conn_handle, + BLE_CONN_HANDLE_INVALID, // User can update in non-connected state + bufferService[i].bufferGattChar[j].char_value_handle, + &bufGattsValue + ); + + if (err_code == NRF_SUCCESS) { + cyntecPrintOk(); + } else { + console.printf("Set ERROR;%04X\r\n",err_code); + } + updatematchFlag = true; + return; + } + } + } + } + if (updatematchFlag == false) { + cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT); + } + } } static void cynBLEReadDataCommand(void) -{ - - if (cyntecGetCommandTokenCnt() != 4) - { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - } - else - { - //uint16_t buf_char_uuid ; - uint8_t i,j; - uint8_t value[MAX_VALUE_LENGTH]; - //uint8_t buf[20]; +{ + + if (cyntecGetCommandTokenCnt() != 4) { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + } else { + //uint16_t buf_char_uuid ; + uint8_t i,j; + uint8_t value[MAX_VALUE_LENGTH]; + //uint8_t buf[20]; // uint8_t buf_char_uuid_type; - ble_uuid_t buf_service_uuid; - ble_uuid_t buf_char_uuid; - uint8_t valueLengthBuffer; - bool readmatchFlag = false; - // debug message + ble_uuid_t buf_service_uuid; + ble_uuid_t buf_char_uuid; + uint8_t valueLengthBuffer; + bool readmatchFlag = false; + // debug message // sprintf((char *)&debugMess[0],"buf_char_uuid:[%04X]", buf_char_uuid); // console.printf(debugMess); - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0,&argLen); - - // Print out the service & char uuids table + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + + // Print out the service & char uuids table // for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) // { // for ( j = 0 ; j < CLI_SERVICE_MAX_NUM ; j++ ) @@ -855,94 +890,85 @@ // } // } - // Handle input parameter - Service UUID - if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - buf_service_uuid.type = BLE_UUID_TYPE_BLE; - } - if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') - { - buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); - buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - } - - // Handle input parameter - Characteristic UUID - argLen = 0; - arg = cyntecGetCommandArgument(1,&argLen); - if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - buf_char_uuid.type = BLE_UUID_TYPE_BLE; - } - if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') - { - buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); - buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - } + // Handle input parameter - Service UUID + if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buf_service_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + buf_service_uuid.type = BLE_UUID_TYPE_BLE; + } + if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') { + buf_service_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); + buf_service_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; + } + + // Handle input parameter - Characteristic UUID + argLen = 0; + arg = cyntecGetCommandArgument(1,&argLen); + if (argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buf_char_uuid.uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + buf_char_uuid.type = BLE_UUID_TYPE_BLE; + } + if (argLen == 34 && arg[0] == '0' && arg[1] == 'x') { + buf_char_uuid.uuid = cyntecArgToUint16( (arg + 6), 4); + buf_char_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; + } // sprintf((char *)&debugMess[0],"buf_service_uuid[%d,%4X]\r\n",buf_service_uuid.type,buf_service_uuid.uuid); // console.printf(debugMess); - for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) - { - if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (readmatchFlag == false)) - { - //readmatchFlag = true; - for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) - { - 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)) - { - // uint8_t value[] = "88"; - uint16_t len = MAX_VALUE_LENGTH; - ble_gatts_value_t bufGattsValue; - memset(&bufGattsValue, 0, sizeof(bufGattsValue)); - bufGattsValue.len = len; - bufGattsValue.offset = 0; - bufGattsValue.p_value = value; - //sd_ble_gatts_value_get(bufferService[i].bufferGattChar[j].char_value_handle, + for ( i = 0 ; i < CLI_SERVICE_MAX_NUM ; i++ ) { + if ( (bufferService[i].service_uuid.uuid == buf_service_uuid.uuid) &(bufferService[i].service_uuid.type == buf_service_uuid.type)& (readmatchFlag == false)) { + //readmatchFlag = true; + for ( j = 0 ; j < CLI_CHAR_MAX_NUM ; j++ ) { + 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)) { + // uint8_t value[] = "88"; + uint16_t len = MAX_VALUE_LENGTH; + ble_gatts_value_t bufGattsValue; + memset(&bufGattsValue, 0, sizeof(bufGattsValue)); + bufGattsValue.len = len; + bufGattsValue.offset = 0; + bufGattsValue.p_value = value; + //sd_ble_gatts_value_get(bufferService[i].bufferGattChar[j].char_value_handle, // 0, // &len, // value); - sd_ble_gatts_value_get( test_conn_handle, - bufferService[i].bufferGattChar[j].char_value_handle, - &bufGattsValue - ); - console.printf("\r\nOK;0x"); - valueLengthBuffer = bufferService[i].bufferGattChar[j].valueLength; - // sprintf((char *)&debugMess[0],"[%i]",valueLengthBuffer); - // console.printf(debugMess); - - for (i=0 ; i < valueLengthBuffer; i++) - { - console.printf("%02X",value[i]); - } - console.printf(";\r\n"); - readmatchFlag = true; - return; - } - } - } - } - // no matched case, can not read - if (readmatchFlag == false){ - cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT); - } - } - - + sd_ble_gatts_value_get( test_conn_handle, + bufferService[i].bufferGattChar[j].char_value_handle, + &bufGattsValue + ); + console.printf("\r\nOK;0x"); + valueLengthBuffer = bufferService[i].bufferGattChar[j].valueLength; + // sprintf((char *)&debugMess[0],"[%i]",valueLengthBuffer); + // console.printf(debugMess); + + for (i=0 ; i < valueLengthBuffer; i++) { + console.printf("%02X",value[i]); + } + console.printf(";\r\n"); + readmatchFlag = true; + return; + } + } + } + } + // no matched case, can not read + if (readmatchFlag == false) { + cyntecPrintError(CYNTEC_CMD_ERR_NO_MATCHED_ARGUMENT); + } + } + + } /* Set characteristics */ static void cyntecInsertCharUUID(ble_uuid_t char_UUID, uint16_t charValueHandle,uint8_t valueLengthBuffer,uint8_t mode) { - uint8_t j; - j=char_count; + uint8_t j; + j=char_count; // sprintf((char *)&debugMess[0],"char_uuid:%4X\r\n",char_UUID.uuid); -// console.printf(debugMess); - bufferService[service_count-1].bufferGattChar[j].char_uuid.uuid = char_UUID.uuid; - bufferService[service_count-1].bufferGattChar[j].char_uuid.type = char_UUID.type; - bufferService[service_count-1].bufferGattChar[j].valueLength = valueLengthBuffer; - bufferService[service_count-1].bufferGattChar[j].mode = mode; - bufferService[service_count-1].bufferGattChar[j].char_value_handle = charValueHandle; - return; +// console.printf(debugMess); + bufferService[service_count-1].bufferGattChar[j].char_uuid.uuid = char_UUID.uuid; + bufferService[service_count-1].bufferGattChar[j].char_uuid.type = char_UUID.type; + bufferService[service_count-1].bufferGattChar[j].valueLength = valueLengthBuffer; + bufferService[service_count-1].bufferGattChar[j].mode = mode; + bufferService[service_count-1].bufferGattChar[j].char_value_handle = charValueHandle; + return; } static void cynGattCharCommand(void) @@ -950,158 +976,148 @@ // uint16_t service_uuid_ble; // uint8_t service_uuid_vs[16]; - uint8_t attrMode=0; - uint8_t attrValue[MAX_VALUE_LENGTH]; - memset(&attrValue, 0, sizeof(attrValue)); - - uint8_t i; + uint8_t attrMode=0; + uint8_t attrValue[MAX_VALUE_LENGTH]; + memset(&attrValue, 0, sizeof(attrValue)); + + uint8_t i; // uint8_t valueBuffer; - uint8_t err_code; - uint16_t buffer_char_uuid; + uint8_t err_code; + uint16_t buffer_char_uuid; // uint16_t buffer_char_uuid_ble; - uint16_t buffer_uuid_vs[8]; - ble_uuid_t char_uuid; - ble_uuid128_t char_uuid_vs; - - ble_gatts_char_md_t char_md; - ble_gatts_attr_t attr_char_value; - - ble_gatts_attr_md_t cccd_md; - ble_gatts_attr_md_t attr_md; -// uint8_t init_value_encoded[2] = "77"; + uint16_t buffer_uuid_vs[8]; + ble_uuid_t char_uuid; + ble_uuid128_t char_uuid_vs; + + ble_gatts_char_md_t char_md; + ble_gatts_attr_t attr_char_value; + + ble_gatts_attr_md_t cccd_md; + ble_gatts_attr_md_t attr_md; +// uint8_t init_value_encoded[2] = "77"; // uint8_t init_value_len; - uint8_t valueLengthBuffer; - extern uint8_t char_count; - - if (cyntecGetCommandTokenCnt() != 5) - { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } - else - { - -//#ifdef DELTA_DEBUG + uint8_t valueLengthBuffer; + extern uint8_t char_count; + + if (cyntecGetCommandTokenCnt() != 5) { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } else { + +//#ifdef DELTA_DEBUG //sprintf((char *)&debugMess[0],"[%04X]", service_uuid); //console.printf(debugMess); //#endif - - /* handle second parameter - UUID */ - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0,&argLen); - - /* len: 6 => 0xXXXX */ - if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buffer_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - BLE_UUID_BLE_ASSIGN(char_uuid, buffer_char_uuid); - char_uuid.type = BLE_UUID_TYPE_BLE; - } - - if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) - { - for ( i=0;i<8;i++) - { - buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4); - if (i==1) - { - char_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4); - } + + /* handle second parameter - UUID */ + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + + /* len: 6 => 0xXXXX */ + if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buffer_char_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + BLE_UUID_BLE_ASSIGN(char_uuid, buffer_char_uuid); + char_uuid.type = BLE_UUID_TYPE_BLE; + } + + if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) { + for ( i=0; i<8; i++) { + buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4); + if (i==1) { + char_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4); + } //#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"%2X/",buffer_uuid_vs[7-i]); // console.printf(debugMess); //#endif - } - memcpy(&char_uuid_vs,buffer_uuid_vs,16); - err_code = sd_ble_uuid_vs_add(&char_uuid_vs, &char_uuid.type); - } + } + memcpy(&char_uuid_vs,buffer_uuid_vs,16); + err_code = sd_ble_uuid_vs_add(&char_uuid_vs, &char_uuid.type); + } //#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"char_uuid_type:[%d]\r\n",char_uuid.type); // console.printf(debugMess); //#endif - - -//#ifdef DELTA_DEBUG + + +//#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"vs_add_Error:%d\r\n",err_code); // console.printf(debugMess); -//#endif - - /* handle 3rd parameter - attribute mode */ - argLen = 0; - arg = cyntecGetCommandArgument(1,&argLen); - - for ( i = 0 ; i < argLen ; i++ ) - { - switch(arg[i]) { - case 'r': - attrMode |= (1 << CLI_CHAR_MODE_READ); - break; - case 'w': - attrMode |= (1 << CLI_CHAR_MODE_WRITE); - break; - case 'i': - attrMode |= (1 << CLI_CHAR_MODE_INDICATE); - break; - case 'n': - attrMode |= (1 << CLI_CHAR_MODE_NOTIFY); - break; - default: - break; - } - } - - /* handle 4th parameter - attribute value */ - argLen = 0; - arg = cyntecGetCommandArgument(2,&argLen); - - if (arg[0] != '0' || arg[1] != 'x' | argLen%2 != 0) { - cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); - return; - } - else { - valueLengthBuffer = (argLen-2)/2; - for (i=0 ; i < (argLen-2)/2; i++) - { - attrValue[i] = cyntecArgToUint8(arg+2*(i+1), 2); - - } - //cyntecInsertCharUUID(service_uuid, char_uuid, attrMode, attrValue,valueLengthBuffer); - //cyntecPrintOk(); - } - } - - - //debug +//#endif + + /* handle 3rd parameter - attribute mode */ + argLen = 0; + arg = cyntecGetCommandArgument(1,&argLen); + + for ( i = 0 ; i < argLen ; i++ ) { + switch(arg[i]) { + case 'r': + attrMode |= (1 << CLI_CHAR_MODE_READ); + break; + case 'w': + attrMode |= (1 << CLI_CHAR_MODE_WRITE); + break; + case 'i': + attrMode |= (1 << CLI_CHAR_MODE_INDICATE); + break; + case 'n': + attrMode |= (1 << CLI_CHAR_MODE_NOTIFY); + break; + default: + break; + } + } + + /* handle 4th parameter - attribute value */ + argLen = 0; + arg = cyntecGetCommandArgument(2,&argLen); + + if (arg[0] != '0' || arg[1] != 'x' | argLen%2 != 0) { + cyntecPrintError(CYNTEC_CMD_ERR_ARGUMENT_SYNTAX_ERROR); + return; + } else { + valueLengthBuffer = (argLen-2)/2; + for (i=0 ; i < (argLen-2)/2; i++) { + attrValue[i] = cyntecArgToUint8(arg+2*(i+1), 2); + + } + //cyntecInsertCharUUID(service_uuid, char_uuid, attrMode, attrValue,valueLengthBuffer); + //cyntecPrintOk(); + } + } + + + //debug // sprintf((char *)&debugMess[0],"value:[%02X][%02X]", value[0],value[1]); // console.printf(debugMess); - - //write read permission - ble_gap_conn_sec_mode_t local_all_perm; - local_all_perm.lv = 1; - local_all_perm.sm = 1; - - memset(&cccd_md, 0, sizeof(cccd_md)); + + //write read permission + ble_gap_conn_sec_mode_t local_all_perm; + local_all_perm.lv = 1; + local_all_perm.sm = 1; + + memset(&cccd_md, 0, sizeof(cccd_md)); BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); cccd_md.write_perm = local_all_perm; cccd_md.vloc = BLE_GATTS_VLOC_STACK; - + memset(&char_md, 0, sizeof(char_md)); - - if ( attrMode & (1 << CLI_CHAR_MODE_READ)) - char_md.char_props.read = 1; - if (attrMode & (1 << CLI_CHAR_MODE_WRITE)) - char_md.char_props.write = 1; - if (attrMode & (1 << CLI_CHAR_MODE_NOTIFY)) - char_md.char_props.notify = 1; - if (attrMode & (1 << CLI_CHAR_MODE_INDICATE)) - char_md.char_props.indicate = 1; - + + if ( attrMode & (1 << CLI_CHAR_MODE_READ)) + char_md.char_props.read = 1; + if (attrMode & (1 << CLI_CHAR_MODE_WRITE)) + char_md.char_props.write = 1; + if (attrMode & (1 << CLI_CHAR_MODE_NOTIFY)) + char_md.char_props.notify = 1; + if (attrMode & (1 << CLI_CHAR_MODE_INDICATE)) + char_md.char_props.indicate = 1; + char_md.p_char_user_desc = NULL; char_md.p_char_pf = NULL; char_md.p_user_desc_md = NULL; char_md.p_cccd_md = &cccd_md; char_md.p_sccd_md = NULL; - + memset(&attr_md, 0, sizeof(attr_md)); attr_md.vloc = BLE_GATTS_VLOC_STACK; @@ -1110,9 +1126,9 @@ attr_md.rd_auth = 0; attr_md.wr_auth = 0; attr_md.vlen = 0; - + memset(&attr_char_value, 0, sizeof(attr_char_value)); - + // init_value_len = MAX_VALUE_LENGTH; attr_char_value.p_uuid = &char_uuid; @@ -1121,46 +1137,41 @@ attr_char_value.init_offs = 0; attr_char_value.max_len = MAX_VALUE_LENGTH; attr_char_value.p_value = attrValue; - //debug + //debug // sprintf((char *)&debugMess[0],"value:[%s]", attr_char_value.p_value); // console.printf(debugMess); ble_gatts_char_handles_t testHandle; - err_code = sd_ble_gatts_characteristic_add(bufferGattTest.service_handle, - &char_md, - &attr_char_value, - &testHandle); + err_code = sd_ble_gatts_characteristic_add(bufferGattTest.service_handle, + &char_md, + &attr_char_value, + &testHandle); //#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"char_uuid:%4X\r\n",char_uuid.uuid); -// console.printf(debugMess); +// console.printf(debugMess); //#endif - if (err_code == NRF_SUCCESS) - { - cyntecPrintOk(); - cyntecInsertCharUUID(char_uuid, testHandle.value_handle,valueLengthBuffer,attrMode); + if (err_code == NRF_SUCCESS) { + cyntecPrintOk(); + cyntecInsertCharUUID(char_uuid, testHandle.value_handle,valueLengthBuffer,attrMode); // sprintf((char *)&debugMess[0],"char_count:%d\r\n",char_count); -// console.printf(debugMess); - char_count++; - if (char_count>10) - char_count=0; - } - else if (err_code == NRF_ERROR_INVALID_STATE) - { - cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); - return; - } - else - { - console.printf("ERROR;\r\n"); - } +// console.printf(debugMess); + char_count++; + if (char_count>10) + char_count=0; + } else if (err_code == NRF_ERROR_INVALID_STATE) { + cyntecPrintError(CYNTEC_CMD_ERR_INVALID_STATE_TO_PERFORM_OPERATION); + return; + } else { + console.printf("ERROR;\r\n"); + } } static void cyntecInsertServiceUUID(ble_uuid_t service_UUID) -{ - /* find if the service uuid is exist */ - bufferService[service_count].service_uuid.uuid = service_UUID.uuid; - bufferService[service_count].service_uuid.type = service_UUID.type; - return; +{ + /* find if the service uuid is exist */ + bufferService[service_count].service_uuid.uuid = service_UUID.uuid; + bufferService[service_count].service_uuid.type = service_UUID.type; + return; } @@ -1171,127 +1182,118 @@ // memset(&attrValue, 0, sizeof(attrValue)); // uint8_t i; // uint8_t valueBuffer; - extern uint8_t service_count; - - uint32_t err_code; - ble_uuid_t ble_uuid; - ble_uuid128_t ble_uuid128; - uint16_t buffer_uuid; - uint16_t buffer_uuid_vs[8]; - int i; - - if (cyntecGetCommandTokenCnt() != 3) - { - cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); - return; - } - else - { - /* handle first parameter - Service UUID */ - uint8_t argLen = 0; - uint8_t *arg = cyntecGetCommandArgument(0,&argLen); + extern uint8_t service_count; + + uint32_t err_code; + ble_uuid_t ble_uuid; + ble_uuid128_t ble_uuid128; + uint16_t buffer_uuid; + uint16_t buffer_uuid_vs[8]; + int i; + + if (cyntecGetCommandTokenCnt() != 3) { + cyntecPrintError(CYNTEC_CMD_ERR_WRONG_NUMBER_OF_ARGUMENTS); + return; + } else { + /* handle first parameter - Service UUID */ + uint8_t argLen = 0; + uint8_t *arg = cyntecGetCommandArgument(0,&argLen); - /* Service uuid is 16 bits */ - if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') - { - buffer_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); - //ble_uuid.type = BLE_UUID_TYPE_BLE; //type assign in BLE_UUID_BLE_ASSIGN - BLE_UUID_BLE_ASSIGN(ble_uuid, buffer_uuid); - - err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle); - ble_uuid.type = BLE_UUID_TYPE_BLE; - - } - - /* Service uuid is 128 bits */ - if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) - { + /* Service uuid is 16 bits */ + if ( argLen == 6 && arg[0] == '0' && arg[1] == 'x') { + buffer_uuid = cyntecArgToUint16( (arg + 2), (argLen - 2)); + //ble_uuid.type = BLE_UUID_TYPE_BLE; //type assign in BLE_UUID_BLE_ASSIGN + BLE_UUID_BLE_ASSIGN(ble_uuid, buffer_uuid); + + err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle); + ble_uuid.type = BLE_UUID_TYPE_BLE; + + } + + /* Service uuid is 128 bits */ + if ( argLen == 34 && arg[0] == '0' && arg[1] == 'x' ) { // uint8_t uuid_type = custom_add_uuid_base(CFG_CUSTOM_UUID_BASE); - //ASSERT(uuid_type > 0, ERROR_NOT_FOUND); - for ( i=0;i<8;i++) - { - buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4); - if (i==1) - { - ble_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4); - } + //ASSERT(uuid_type > 0, ERROR_NOT_FOUND); + for ( i=0; i<8; i++) { + buffer_uuid_vs[7-i] = cyntecArgToUint16( (arg + 2+4*i), 4); + if (i==1) { + ble_uuid.uuid = cyntecArgToUint16( (arg + 2+4*i), 4); + } #ifdef DELTA_DEBUG - console.printf("%2X/",buffer_uuid_vs[7-i]); + console.printf("%2X/",buffer_uuid_vs[7-i]); #endif - } - memcpy(&ble_uuid128.uuid128,buffer_uuid_vs,16); + } + memcpy(&ble_uuid128.uuid128,buffer_uuid_vs,16); //#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"%32X\r\n",ble_uuid128.uuid128); // console.printf(debugMess); //#endif - err_code = sd_ble_uuid_vs_add(&ble_uuid128, &ble_uuid.type); -//#ifdef DELTA_DEBUG + err_code = sd_ble_uuid_vs_add(&ble_uuid128, &ble_uuid.type); +//#ifdef DELTA_DEBUG // sprintf((char *)&debugMess[0],"service_uuid_type:%d\r\n",ble_uuid.type); // console.printf(debugMess); -//#endif +//#endif + + err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle); + + ble_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &bufferGattTest.service_handle); - - ble_uuid.type = BLE_UUID_TYPE_VENDOR_BEGIN; - - } - if (err_code == NRF_SUCCESS) - { - cyntecPrintOk(); - cyntecInsertServiceUUID(ble_uuid); - service_count++; - char_count = 0; + } + if (err_code == NRF_SUCCESS) { + cyntecPrintOk(); + cyntecInsertServiceUUID(ble_uuid); + service_count++; + char_count = 0; // sprintf((char *)&debugMess[0],"service_count:%d\r\n",service_count); // console.printf(debugMess); - } - else - { - console.printf("ERROR;\r\n"); - - } - - } - } + } else { + console.printf("ERROR;\r\n"); + + } + + } +} static void cynBLEInitCommand(void) { - const char DEVICE_NAME[] = "DELTA_CLI"; - - deltaBLE.init(); - deltaBLE.onDisconnection(disconnectionCallback); - deltaBLE.onConnection(onConnectionCallback); - deltaBLE.onTimeout(onTimeoutCallback); - - /* Setup advertising. */ - deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); - deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); - deltaBLE.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); - deltaBLE.setAdvertisingInterval(1000); - - cyntecPrintOk(); + const char DEVICE_NAME[] = "DELTA_CLI"; + + deltaBLE.init(); + deltaBLE.onDisconnection(disconnectionCallback); + deltaBLE.onConnection(onConnectionCallback); + deltaBLE.onTimeout(onTimeoutCallback); + + /* Setup advertising. */ + deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + deltaBLE.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + deltaBLE.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + deltaBLE.setAdvertisingInterval(1000); + + cyntecPrintOk(); } CyntecCommandEntry bleCommandSets[] = { - {"init", cynBLEInitCommand, NULL, "Init BLE stack, Usage: cynb init"}, - {"gpio", cynBLEGPIOCommand, NULL, "Config gpio, Usage: cynb gpio <GPIO NO> <set|clear>"}, - {"sleep", cynBLESystemOffCommand, NULL, "System off mode, Usage: cynb sleep <GPIO NO>"}, - {"disconn", cynBLEDisconnectCommand, NULL, "Disconnection, Usage: cynb disconn"}, - {"reset", cynResetCommand, NULL, "Soft reset, Usage: cynb reset"}, - {"info", cynBLEInfoCommand, NULL, "Module information, Usage: cynb info"}, -#ifdef S110_BLE_PERIPHERAL - {"gattChar", cynGattCharCommand, NULL, "Set SIG defined characteristic or Create your own"}, - {"gattService", cynGattServiceCommand, NULL, "Set SIG defined service or Create your own"}, - {"name", cynBLENameCommand, NULL, "Set/Get friendly for BLE module"}, - {"advStart", cynAdvertiseStartCommand, NULL, "Start broadcast advertise packet"}, - {"advStop", cynAdvertiseStopCommand, NULL, "Stop broadcast advertise packet"}, -#endif -#ifdef S120_BLE_CENTRAL - {"scan", cynBLEScanCommand, NULL, "Start/Stop(1/0) to scan BLE device"}, - {"connect", cynBLEConnectCommand, NULL, "Connect to specific BLE device by Device Name"}, -#endif - {"txPow", cynBLESetTxPowerCommand, NULL, "Set BLE tx power"}, - {"bleAddr", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address"}, - {"update", cynBLEUpdateUUIDCommand, NULL, "Update value of specific characteristics"}, - {"readData", cynBLEReadDataCommand, NULL, "Read value of specific characteristics"}, - {NULL, NULL, NULL, NULL}, + {"init", cynBLEInitCommand, NULL, "Init BLE stack, Usage: cynb init"}, + {"gpio", cynBLEGPIOCommand, NULL, "Config gpio, Usage: cynb gpio <GPIO NO> <set|clear>"}, + {"sleep", cynBLESystemOffCommand, NULL, "System off mode, Usage: cynb sleep <GPIO NO>"}, + {"disconn", cynBLEDisconnectCommand, NULL, "Disconnection, Usage: cynb disconn"}, + {"reset", cynResetCommand, NULL, "Soft reset, Usage: cynb reset"}, + {"info", cynBLEInfoCommand, NULL, "Module information, Usage: cynb info"}, +// s110 + {"gattChar", cynGattCharCommand, NULL, "Set SIG defined characteristic or Create your own"}, + {"gattService", cynGattServiceCommand, NULL, "Set SIG defined service or Create your own"}, + {"name", cynBLENameCommand, NULL, "Set/Get friendly for BLE module"}, + {"advStart", cynAdvertiseStartCommand, NULL, "Start broadcast advertise packet"}, + {"advStop", cynAdvertiseStopCommand, NULL, "Stop broadcast advertise packet"}, + +//s120 + {"scanStart", cynBLEScanCommand, NULL, "Start to scan BLE device"}, + {"scanStop", cynBLEScanStopCommand, NULL, "Stop to scan BLE device"}, +// {"connect", cynBLEConnectCommand, NULL, "Connect to specific BLE device by Device Name"}, + + {"txPow", cynBLESetTxPowerCommand, NULL, "Set BLE tx power"}, + {"bleAddr", cynBLEAddressCommand, NULL, "Set/Get Bluetooth address"}, + {"update", cynBLEUpdateUUIDCommand, NULL, "Update value of specific characteristics"}, + {"readData", cynBLEReadDataCommand, NULL, "Read value of specific characteristics"}, + {NULL, NULL, NULL, NULL}, };