this is a new program based on BLE_Uart_Peripheral. Change program name due to relation Client&Peripheral to Client&Server

Dependencies:   RingBuffer nRF51_Vdd nRF51_WakeUp

This is a BLE Server (Device) program for nRF51.
You can communicate with mbed BLE using "BLE_Uart_Client" program as follows.
/users/kenjiArai/code/BLE_Uart_Client/
Please refer following my notebook.
/users/kenjiArai/notebook/ble-client-and-peripheral-using-switch-sience-ty51/#

Committer:
kenjiArai
Date:
Mon Jun 13 09:54:32 2016 +0000
Revision:
5:394920d6a82f
Parent:
4:a1b642566003
Child:
6:16e1f9d065a3
added nRF51_LowPwr library and updated other libraries.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:9b27a9710d94 1 /* mbed Microcontroller Library
kenjiArai 1:9b27a9710d94 2 * Copyright (c) 2006-2013 ARM Limited
kenjiArai 1:9b27a9710d94 3 *
kenjiArai 1:9b27a9710d94 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 1:9b27a9710d94 5 * you may not use this file except in compliance with the License.
kenjiArai 1:9b27a9710d94 6 * You may obtain a copy of the License at
kenjiArai 1:9b27a9710d94 7 *
kenjiArai 1:9b27a9710d94 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 1:9b27a9710d94 9 *
kenjiArai 1:9b27a9710d94 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 1:9b27a9710d94 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 1:9b27a9710d94 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 1:9b27a9710d94 13 * See the License for the specific language governing permissions and
kenjiArai 1:9b27a9710d94 14 * limitations under the License.
kenjiArai 1:9b27a9710d94 15 */
kenjiArai 1:9b27a9710d94 16
kenjiArai 1:9b27a9710d94 17 /*
kenjiArai 4:a1b642566003 18 * ------- BLE Server UART function ------------------------------------------
kenjiArai 1:9b27a9710d94 19 * --- Tested on Switch Science mbed TY51822r3 ---
kenjiArai 1:9b27a9710d94 20 *
kenjiArai 1:9b27a9710d94 21 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 1:9b27a9710d94 22 * http://mbed.org/users/kenjiArai/
kenjiArai 1:9b27a9710d94 23 *
kenjiArai 1:9b27a9710d94 24 * Started: March 7th, 2016
kenjiArai 5:394920d6a82f 25 * Revised: June 13th, 2016
kenjiArai 1:9b27a9710d94 26 *
kenjiArai 1:9b27a9710d94 27 * Original program:
kenjiArai 1:9b27a9710d94 28 * BLE_LoopbackUART
kenjiArai 1:9b27a9710d94 29 * https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LoopbackUART/
kenjiArai 1:9b27a9710d94 30 * Tested Controller Device:
kenjiArai 1:9b27a9710d94 31 * BLE_Uart_Client
kenjiArai 1:9b27a9710d94 32 * https://developer.mbed.org/users/kenjiArai/code/BLE_Uart_Client/
kenjiArai 1:9b27a9710d94 33 *
kenjiArai 1:9b27a9710d94 34 */
kenjiArai 0:6b0eca2bcb7a 35
kenjiArai 1:9b27a9710d94 36 // Include ---------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 37 #include "mbed.h"
kenjiArai 1:9b27a9710d94 38 #include "BLE.h"
kenjiArai 1:9b27a9710d94 39 #include "UARTService.h"
kenjiArai 1:9b27a9710d94 40 #include "nRF51_Vdd.h"
kenjiArai 1:9b27a9710d94 41 #include "nRF51_WakeUp.h"
kenjiArai 5:394920d6a82f 42 #include "nRF51_lowpwr.h"
kenjiArai 1:9b27a9710d94 43
kenjiArai 1:9b27a9710d94 44 // Definition ------------------------------------------------------------------------------------
kenjiArai 5:394920d6a82f 45 // Before using this function, please specify your program are used following functions or not.
kenjiArai 5:394920d6a82f 46 #define USE_DEVICE_STDIO_MESSAGES 0 // printf
kenjiArai 5:394920d6a82f 47 #define USE_DEVICE_SERIAL 1 // Serial or DEBUG & etc.
kenjiArai 5:394920d6a82f 48 #define USE_DEVICE_I2C 0 // Sensors with I2C, LCD, EEPROM, Driver chips & etc.
kenjiArai 5:394920d6a82f 49 #define USE_DEVICE_SPI 0 // Sensors with SPI, LCD, EEPROM, Driver chips & etc.
kenjiArai 5:394920d6a82f 50 #define USE_DEVICE_SPISLAVE 0 // Communication with master vis SPI
kenjiArai 5:394920d6a82f 51 #define USE_DEVICE_PWMOUT 0 // PWM duty output, Serve & etc.
kenjiArai 5:394920d6a82f 52 #define USE_DEVICE_ANALOGIN 0 // Analog adc
kenjiArai 1:9b27a9710d94 53
kenjiArai 5:394920d6a82f 54 #define GOTO_SLEEP_MODE 0 // If you set 1, you need to connected LED1 and P0_0
kenjiArai 5:394920d6a82f 55 // Please refer nRF51_WakeUP library
kenjiArai 5:394920d6a82f 56
kenjiArai 5:394920d6a82f 57 #if USE_DEVICE_STDIO_MESSAGES
kenjiArai 1:9b27a9710d94 58 #define DEBUG(...) { printf(__VA_ARGS__); }
kenjiArai 1:9b27a9710d94 59 #else
kenjiArai 1:9b27a9710d94 60 #define DEBUG(...)
kenjiArai 1:9b27a9710d94 61 #endif
kenjiArai 1:9b27a9710d94 62
kenjiArai 1:9b27a9710d94 63 // Object ----------------------------------------------------------------------------------------
kenjiArai 3:fd5273a70b21 64 BLE ble;
kenjiArai 1:9b27a9710d94 65 DigitalOut connectedLED(LED2);
kenjiArai 1:9b27a9710d94 66 InterruptIn wake_up_sw(P0_1);
kenjiArai 1:9b27a9710d94 67 nRF51_WakeUp wakeup(LED1, P0_0);
kenjiArai 1:9b27a9710d94 68 nRF51_Vdd vdd(3.0f, 2.2f);
kenjiArai 1:9b27a9710d94 69 Serial pc(USBTX, USBRX);
kenjiArai 1:9b27a9710d94 70 UARTService *uartServicePtr;
kenjiArai 1:9b27a9710d94 71 Ticker ticker;
kenjiArai 1:9b27a9710d94 72
kenjiArai 1:9b27a9710d94 73 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 74 #warning "You need to confirm your device name."
kenjiArai 3:fd5273a70b21 75 const static char DEVICE_NAME[] = "UART_S";
kenjiArai 5:394920d6a82f 76 const nRF51_LOWPWR_TypeDef lowpwr_table =
kenjiArai 5:394920d6a82f 77 {
kenjiArai 5:394920d6a82f 78 #if USE_DEVICE_STDIO_MESSAGES
kenjiArai 5:394920d6a82f 79 true,
kenjiArai 5:394920d6a82f 80 #else
kenjiArai 5:394920d6a82f 81 false,
kenjiArai 5:394920d6a82f 82 #endif
kenjiArai 5:394920d6a82f 83 #if USE_DEVICE_SERIAL
kenjiArai 5:394920d6a82f 84 true,
kenjiArai 5:394920d6a82f 85 #else
kenjiArai 5:394920d6a82f 86 false,
kenjiArai 5:394920d6a82f 87 #endif
kenjiArai 5:394920d6a82f 88 #if USE_DEVICE_I2C
kenjiArai 5:394920d6a82f 89 true,
kenjiArai 5:394920d6a82f 90 #else
kenjiArai 5:394920d6a82f 91 false,
kenjiArai 5:394920d6a82f 92 #endif
kenjiArai 5:394920d6a82f 93 #if USE_DEVICE_SPI
kenjiArai 5:394920d6a82f 94 true,
kenjiArai 5:394920d6a82f 95 #else
kenjiArai 5:394920d6a82f 96 false,
kenjiArai 5:394920d6a82f 97 #endif
kenjiArai 5:394920d6a82f 98 #if USE_DEVICE_SPISLAVE
kenjiArai 5:394920d6a82f 99 true,
kenjiArai 5:394920d6a82f 100 #else
kenjiArai 5:394920d6a82f 101 false,
kenjiArai 5:394920d6a82f 102 #endif
kenjiArai 5:394920d6a82f 103 #if USE_DEVICE_PWMOUT
kenjiArai 5:394920d6a82f 104 true,
kenjiArai 5:394920d6a82f 105 #else
kenjiArai 5:394920d6a82f 106 false,
kenjiArai 5:394920d6a82f 107 #endif
kenjiArai 5:394920d6a82f 108 #if USE_DEVICE_ANALOGIN
kenjiArai 5:394920d6a82f 109 true
kenjiArai 5:394920d6a82f 110 #else
kenjiArai 5:394920d6a82f 111 false
kenjiArai 5:394920d6a82f 112 #endif
kenjiArai 5:394920d6a82f 113 };
kenjiArai 1:9b27a9710d94 114
kenjiArai 1:9b27a9710d94 115 // RAM -------------------------------------------------------------------------------------------
kenjiArai 3:fd5273a70b21 116 Gap::Address_t my_mac;
kenjiArai 3:fd5273a70b21 117 uint8_t tx_buf[24];
kenjiArai 3:fd5273a70b21 118 uint8_t tx_len = 0;
kenjiArai 3:fd5273a70b21 119 uint8_t rx_buf[24];
kenjiArai 3:fd5273a70b21 120 uint8_t rx_len = 0;
kenjiArai 1:9b27a9710d94 121 volatile bool trigger_transmit = false;
kenjiArai 1:9b27a9710d94 122 volatile bool trigger_receive = false;
kenjiArai 1:9b27a9710d94 123 volatile uint8_t command_continue = 0;
kenjiArai 3:fd5273a70b21 124 uint16_t time_out_cntr = 3600;
kenjiArai 3:fd5273a70b21 125 volatile bool time_out = false;
kenjiArai 3:fd5273a70b21 126 bool line_input = false;
kenjiArai 3:fd5273a70b21 127 uint8_t linebuf_irq[24];
kenjiArai 3:fd5273a70b21 128 int linebf_irq_len = 0;
kenjiArai 3:fd5273a70b21 129 uint8_t linebuf[24];
kenjiArai 3:fd5273a70b21 130 int linebf_len = 0;
kenjiArai 5:394920d6a82f 131 uint32_t sleep_time = 30; // unit:second
kenjiArai 0:6b0eca2bcb7a 132
kenjiArai 1:9b27a9710d94 133 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 134 // BLE
kenjiArai 1:9b27a9710d94 135 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params);
kenjiArai 1:9b27a9710d94 136 void onDataWritten(const GattWriteCallbackParams *params);
kenjiArai 1:9b27a9710d94 137 void periodicCallback(void);
kenjiArai 1:9b27a9710d94 138 // Application related
kenjiArai 1:9b27a9710d94 139 void adjust_line(uint8_t *bf);
kenjiArai 1:9b27a9710d94 140 void action_tx_help(void);
kenjiArai 1:9b27a9710d94 141 void action_tx_vdd(void);
kenjiArai 1:9b27a9710d94 142 void action_tx_temperature(void);
kenjiArai 5:394920d6a82f 143 void action_tx_wait_time(void);
kenjiArai 1:9b27a9710d94 144 void fill_space_n(uint8_t *bf, uint8_t n);
kenjiArai 1:9b27a9710d94 145 void Update_Values(void);
kenjiArai 5:394920d6a82f 146 int xatoi (char **str, int32_t *res);
kenjiArai 1:9b27a9710d94 147 // Interrupt related
kenjiArai 1:9b27a9710d94 148 void action_tx_quit(void);
kenjiArai 1:9b27a9710d94 149 void interrupt_by_sw(void);
kenjiArai 1:9b27a9710d94 150 void serialRxCallback(void);
kenjiArai 1:9b27a9710d94 151
kenjiArai 1:9b27a9710d94 152 //-------------------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 153 // Control Program
kenjiArai 1:9b27a9710d94 154 //-------------------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 155 int main(void){
kenjiArai 5:394920d6a82f 156 LowPwr set_lowpwr(&lowpwr_table);
kenjiArai 1:9b27a9710d94 157 connectedLED = 0;
kenjiArai 1:9b27a9710d94 158 pc.attach(&serialRxCallback, Serial::RxIrq);
kenjiArai 1:9b27a9710d94 159 ticker.attach(periodicCallback, 1);
kenjiArai 1:9b27a9710d94 160 for (int k = 0; k < 20; k++) { pc.printf("\r\n");} // clear terminal output
kenjiArai 3:fd5273a70b21 161 pc.printf("UART Communication / Server side\r\n"); // opening message
kenjiArai 3:fd5273a70b21 162 pc.printf(" Client(Central) and Server(Peripheral)\r\n"); // opening message
kenjiArai 1:9b27a9710d94 163 // Interrupt by switch
kenjiArai 1:9b27a9710d94 164 wake_up_sw.fall(&interrupt_by_sw);
kenjiArai 1:9b27a9710d94 165 ble.init();
kenjiArai 2:2322afea6ecf 166 Gap::AddressType_t my_mac_type;
kenjiArai 2:2322afea6ecf 167 ble.gap().getAddress(&my_mac_type, my_mac);
kenjiArai 2:2322afea6ecf 168 pc.printf(
kenjiArai 2:2322afea6ecf 169 " my_MAC %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n",
kenjiArai 2:2322afea6ecf 170 my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0],
kenjiArai 2:2322afea6ecf 171 (my_mac_type == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"
kenjiArai 2:2322afea6ecf 172 );
kenjiArai 2:2322afea6ecf 173 pc.printf(
kenjiArai 2:2322afea6ecf 174 " mac_board_? = {0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x};\r\n",
kenjiArai 2:2322afea6ecf 175 my_mac[0], my_mac[1], my_mac[2], my_mac[3], my_mac[4], my_mac[5]
kenjiArai 2:2322afea6ecf 176 );
kenjiArai 2:2322afea6ecf 177 pc.printf(" Please write above mac_board_?(?=1,2,...) data into Client main.cpp\r\n");
kenjiArai 1:9b27a9710d94 178 ble.onDisconnection(disconnectionCallback);
kenjiArai 1:9b27a9710d94 179 ble.onDataWritten(onDataWritten);
kenjiArai 1:9b27a9710d94 180 /* setup advertising */
kenjiArai 1:9b27a9710d94 181 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
kenjiArai 1:9b27a9710d94 182 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
kenjiArai 3:fd5273a70b21 183 ble.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 184 GapAdvertisingData::COMPLETE_LOCAL_NAME,
kenjiArai 3:fd5273a70b21 185 (const uint8_t *)DEVICE_NAME,
kenjiArai 3:fd5273a70b21 186 sizeof(DEVICE_NAME)
kenjiArai 3:fd5273a70b21 187 );
kenjiArai 3:fd5273a70b21 188 ble.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 189 GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
kenjiArai 3:fd5273a70b21 190 (const uint8_t *)UARTServiceUUID_reversed,
kenjiArai 3:fd5273a70b21 191 sizeof(UARTServiceUUID_reversed)
kenjiArai 3:fd5273a70b21 192 );
kenjiArai 1:9b27a9710d94 193 // Advertize Interval
kenjiArai 1:9b27a9710d94 194 ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */
kenjiArai 1:9b27a9710d94 195 // Start
kenjiArai 1:9b27a9710d94 196 ble.startAdvertising();
kenjiArai 1:9b27a9710d94 197 UARTService uartService(ble);
kenjiArai 1:9b27a9710d94 198 uartServicePtr = &uartService;
kenjiArai 1:9b27a9710d94 199 while(true){
kenjiArai 1:9b27a9710d94 200 if (time_out){
kenjiArai 1:9b27a9710d94 201 #if GOTO_SLEEP_MODE
kenjiArai 5:394920d6a82f 202 wakeup.set_and_wait(sleep_time);
kenjiArai 1:9b27a9710d94 203 while(true){ // never come here but just in case
kenjiArai 1:9b27a9710d94 204 deepsleep();
kenjiArai 1:9b27a9710d94 205 }
kenjiArai 1:9b27a9710d94 206 #endif
kenjiArai 1:9b27a9710d94 207 }
kenjiArai 1:9b27a9710d94 208 if (line_input){
kenjiArai 1:9b27a9710d94 209 line_input = false;
kenjiArai 1:9b27a9710d94 210 adjust_line(linebuf);
kenjiArai 1:9b27a9710d94 211 ble.updateCharacteristicValue(
kenjiArai 1:9b27a9710d94 212 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 1:9b27a9710d94 213 linebuf,
kenjiArai 1:9b27a9710d94 214 20
kenjiArai 1:9b27a9710d94 215 );
kenjiArai 1:9b27a9710d94 216 }
kenjiArai 1:9b27a9710d94 217 if (trigger_transmit){
kenjiArai 1:9b27a9710d94 218 trigger_transmit = false;
kenjiArai 1:9b27a9710d94 219 pc.printf("%s\r\n", rx_buf);
kenjiArai 3:fd5273a70b21 220 if ((rx_buf[0] == '*') || (rx_buf[0] == '&')){
kenjiArai 1:9b27a9710d94 221 switch (rx_buf[1]){
kenjiArai 1:9b27a9710d94 222 case 'v':
kenjiArai 1:9b27a9710d94 223 action_tx_vdd();
kenjiArai 1:9b27a9710d94 224 break;
kenjiArai 1:9b27a9710d94 225 case 't':
kenjiArai 1:9b27a9710d94 226 action_tx_temperature();
kenjiArai 1:9b27a9710d94 227 break;
kenjiArai 1:9b27a9710d94 228 case 'q':
kenjiArai 1:9b27a9710d94 229 action_tx_quit();
kenjiArai 1:9b27a9710d94 230 break;
kenjiArai 5:394920d6a82f 231 case 'w':
kenjiArai 5:394920d6a82f 232 action_tx_wait_time();
kenjiArai 5:394920d6a82f 233 break;
kenjiArai 1:9b27a9710d94 234 case 'h':
kenjiArai 1:9b27a9710d94 235 case '?':
kenjiArai 1:9b27a9710d94 236 action_tx_help();
kenjiArai 1:9b27a9710d94 237 break;
kenjiArai 1:9b27a9710d94 238 default:
kenjiArai 1:9b27a9710d94 239 break;
kenjiArai 1:9b27a9710d94 240 }
kenjiArai 1:9b27a9710d94 241 }
kenjiArai 1:9b27a9710d94 242 }
kenjiArai 1:9b27a9710d94 243 ble.waitForEvent();
kenjiArai 0:6b0eca2bcb7a 244 }
kenjiArai 0:6b0eca2bcb7a 245 }
kenjiArai 1:9b27a9710d94 246
kenjiArai 1:9b27a9710d94 247 void serialRxCallback(){
kenjiArai 1:9b27a9710d94 248 char c = pc.getc();
kenjiArai 1:9b27a9710d94 249 if (c == '\r') {
kenjiArai 1:9b27a9710d94 250 linebuf_irq[linebf_irq_len++] = c;
kenjiArai 1:9b27a9710d94 251 pc.printf("\r\n");
kenjiArai 1:9b27a9710d94 252 linebf_len = linebf_irq_len;
kenjiArai 1:9b27a9710d94 253 strcpy((char *)linebuf, (char *)linebuf_irq);
kenjiArai 1:9b27a9710d94 254 linebf_irq_len = 0;
kenjiArai 1:9b27a9710d94 255 line_input = true;
kenjiArai 1:9b27a9710d94 256 } else if ((c == '\b') && linebf_irq_len) {
kenjiArai 1:9b27a9710d94 257 linebf_irq_len--;
kenjiArai 1:9b27a9710d94 258 pc.putc(c);
kenjiArai 1:9b27a9710d94 259 pc.putc(' ');
kenjiArai 1:9b27a9710d94 260 pc.putc(c);
kenjiArai 1:9b27a9710d94 261 } else if (((uint8_t)c >= ' ') && (linebf_irq_len < 20)) {
kenjiArai 1:9b27a9710d94 262 linebuf_irq[linebf_irq_len++] = c;
kenjiArai 1:9b27a9710d94 263 pc.putc(c);
kenjiArai 1:9b27a9710d94 264 } else if ( c == 0x1f ){ // Control+?
kenjiArai 1:9b27a9710d94 265 SCB->AIRCR = 0x05fa0004; // System RESET!!
kenjiArai 1:9b27a9710d94 266 }
kenjiArai 1:9b27a9710d94 267 linebuf_irq[linebf_irq_len] = 0;
kenjiArai 1:9b27a9710d94 268 }
kenjiArai 1:9b27a9710d94 269
kenjiArai 1:9b27a9710d94 270 void adjust_line(uint8_t *bf){
kenjiArai 2:2322afea6ecf 271 uint8_t i, c;
kenjiArai 1:9b27a9710d94 272
kenjiArai 1:9b27a9710d94 273 for (i = 0; i <20; bf++, i++){
kenjiArai 1:9b27a9710d94 274 c = *bf;
kenjiArai 1:9b27a9710d94 275 if ( (c == '\r') || (c == '\n') || (c == 0)){
kenjiArai 1:9b27a9710d94 276 break;
kenjiArai 1:9b27a9710d94 277 }
kenjiArai 1:9b27a9710d94 278 }
kenjiArai 1:9b27a9710d94 279 for (; i < 20; bf++, i++){
kenjiArai 1:9b27a9710d94 280 *bf = ' ';
kenjiArai 1:9b27a9710d94 281 }
kenjiArai 1:9b27a9710d94 282 *(bf + 1) = 0;
kenjiArai 1:9b27a9710d94 283 }
kenjiArai 1:9b27a9710d94 284
kenjiArai 1:9b27a9710d94 285 void onDataWritten(const GattWriteCallbackParams *params){
kenjiArai 1:9b27a9710d94 286 if ((uartServicePtr != NULL) &&
kenjiArai 1:9b27a9710d94 287 (params->handle == uartServicePtr->getTXCharacteristicHandle()))
kenjiArai 1:9b27a9710d94 288 {
kenjiArai 1:9b27a9710d94 289 strcpy((char *)rx_buf, (const char *)params->data);
kenjiArai 1:9b27a9710d94 290 rx_len = params->len;
kenjiArai 1:9b27a9710d94 291 trigger_transmit = true;
kenjiArai 1:9b27a9710d94 292 DEBUG("RX_data\r\n");
kenjiArai 1:9b27a9710d94 293 DEBUG("Length: %d\r\n", rx_len);
kenjiArai 1:9b27a9710d94 294 DEBUG("Data: ");
kenjiArai 1:9b27a9710d94 295 DEBUG("%s", rx_buf);
kenjiArai 1:9b27a9710d94 296 DEBUG("\r\n");
kenjiArai 1:9b27a9710d94 297 }
kenjiArai 1:9b27a9710d94 298 }
kenjiArai 1:9b27a9710d94 299
kenjiArai 1:9b27a9710d94 300 void action_tx_help(){
kenjiArai 1:9b27a9710d94 301 // 12345678901234567890
kenjiArai 3:fd5273a70b21 302 sprintf((char *)tx_buf,"*? or &?:help");
kenjiArai 1:9b27a9710d94 303 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 304 Update_Values();
kenjiArai 1:9b27a9710d94 305 wait(0.2);
kenjiArai 1:9b27a9710d94 306 // 12345678901234567890
kenjiArai 3:fd5273a70b21 307 sprintf((char *)tx_buf,"*v:vdd");
kenjiArai 1:9b27a9710d94 308 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 309 Update_Values();
kenjiArai 1:9b27a9710d94 310 wait(0.2);
kenjiArai 1:9b27a9710d94 311 // 12345678901234567890
kenjiArai 3:fd5273a70b21 312 sprintf((char *)tx_buf,"*t:temperature");
kenjiArai 1:9b27a9710d94 313 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 314 Update_Values();
kenjiArai 1:9b27a9710d94 315 wait(0.2);
kenjiArai 1:9b27a9710d94 316 // 12345678901234567890
kenjiArai 5:394920d6a82f 317 sprintf((char *)tx_buf,"*w:wait time/ w 120");
kenjiArai 5:394920d6a82f 318 tx_len = strlen((const char *)tx_buf);
kenjiArai 5:394920d6a82f 319 Update_Values();
kenjiArai 5:394920d6a82f 320 wait(0.2);
kenjiArai 5:394920d6a82f 321 // 12345678901234567890
kenjiArai 3:fd5273a70b21 322 sprintf((char *)tx_buf,"*q:quit/sleep");
kenjiArai 1:9b27a9710d94 323 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 324 Update_Values();
kenjiArai 1:9b27a9710d94 325 wait(0.2);
kenjiArai 1:9b27a9710d94 326 }
kenjiArai 1:9b27a9710d94 327
kenjiArai 1:9b27a9710d94 328 void action_tx_vdd(){
kenjiArai 1:9b27a9710d94 329 sprintf((char *)tx_buf,"Vdd:%3.2fV", vdd.read_real_value());
kenjiArai 1:9b27a9710d94 330 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 331 Update_Values();
kenjiArai 1:9b27a9710d94 332 }
kenjiArai 1:9b27a9710d94 333
kenjiArai 1:9b27a9710d94 334 void action_tx_temperature(){
kenjiArai 1:9b27a9710d94 335 int32_t p_temp;
kenjiArai 1:9b27a9710d94 336 float temperature;
kenjiArai 1:9b27a9710d94 337
kenjiArai 1:9b27a9710d94 338 // Update a temperature (inside nRF51822 chip)
kenjiArai 1:9b27a9710d94 339 sd_temp_get(&p_temp);
kenjiArai 1:9b27a9710d94 340 // -16.0f is offset vale for chip die temp to ambient temp (depend on your board)
kenjiArai 1:9b27a9710d94 341 temperature = float(p_temp) / 4; // Original = float(p_temp)/4.0f - 16.0f;
kenjiArai 1:9b27a9710d94 342 sprintf((char *)tx_buf,"T:%+4.1fdC", temperature);
kenjiArai 1:9b27a9710d94 343 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 344 Update_Values();
kenjiArai 1:9b27a9710d94 345 }
kenjiArai 1:9b27a9710d94 346
kenjiArai 5:394920d6a82f 347
kenjiArai 5:394920d6a82f 348 // Change string -> integer
kenjiArai 5:394920d6a82f 349 int xatoi (char **str, int32_t *res){
kenjiArai 5:394920d6a82f 350 unsigned long val;
kenjiArai 5:394920d6a82f 351 unsigned char c, radix, s = 0;
kenjiArai 5:394920d6a82f 352
kenjiArai 5:394920d6a82f 353 for (;;){
kenjiArai 5:394920d6a82f 354 c = **str;
kenjiArai 5:394920d6a82f 355 if (c == 0){ return 0;}
kenjiArai 5:394920d6a82f 356 if (c == '-'){ break;}
kenjiArai 5:394920d6a82f 357 if (c == '+'){
kenjiArai 5:394920d6a82f 358 (*str)++;
kenjiArai 5:394920d6a82f 359 c = **str;
kenjiArai 5:394920d6a82f 360 }
kenjiArai 5:394920d6a82f 361 if (c>='0'&& c<='9'){
kenjiArai 5:394920d6a82f 362 break;
kenjiArai 5:394920d6a82f 363 } else {
kenjiArai 5:394920d6a82f 364 (*str)++;
kenjiArai 5:394920d6a82f 365 c = **str;
kenjiArai 5:394920d6a82f 366 }
kenjiArai 5:394920d6a82f 367 }
kenjiArai 5:394920d6a82f 368 if (c == '-') {
kenjiArai 5:394920d6a82f 369 s = 1;
kenjiArai 5:394920d6a82f 370 c = *(++(*str));
kenjiArai 5:394920d6a82f 371 }
kenjiArai 5:394920d6a82f 372 if (c == '0') {
kenjiArai 5:394920d6a82f 373 c = *(++(*str));
kenjiArai 5:394920d6a82f 374 if (c <= ' ') {
kenjiArai 5:394920d6a82f 375 *res = 0;
kenjiArai 5:394920d6a82f 376 return 1;
kenjiArai 5:394920d6a82f 377 }
kenjiArai 5:394920d6a82f 378 if (c == 'x') {
kenjiArai 5:394920d6a82f 379 radix = 16;
kenjiArai 5:394920d6a82f 380 c = *(++(*str));
kenjiArai 5:394920d6a82f 381 } else {
kenjiArai 5:394920d6a82f 382 if (c == 'b') {
kenjiArai 5:394920d6a82f 383 radix = 2;
kenjiArai 5:394920d6a82f 384 c = *(++(*str));
kenjiArai 5:394920d6a82f 385 } else {
kenjiArai 5:394920d6a82f 386 if ((c >= '0')&&(c <= '9')) {
kenjiArai 5:394920d6a82f 387 radix = 8;
kenjiArai 5:394920d6a82f 388 } else {
kenjiArai 5:394920d6a82f 389 return 0;
kenjiArai 5:394920d6a82f 390 }
kenjiArai 5:394920d6a82f 391 }
kenjiArai 5:394920d6a82f 392 }
kenjiArai 5:394920d6a82f 393 } else {
kenjiArai 5:394920d6a82f 394 if ((c < '1')||(c > '9')) {
kenjiArai 5:394920d6a82f 395 return 0;
kenjiArai 5:394920d6a82f 396 }
kenjiArai 5:394920d6a82f 397 radix = 10;
kenjiArai 5:394920d6a82f 398 }
kenjiArai 5:394920d6a82f 399 val = 0;
kenjiArai 5:394920d6a82f 400 while (c > ' ') {
kenjiArai 5:394920d6a82f 401 if (c >= 'a') c -= 0x20;
kenjiArai 5:394920d6a82f 402 c -= '0';
kenjiArai 5:394920d6a82f 403 if (c >= 17) {
kenjiArai 5:394920d6a82f 404 c -= 7;
kenjiArai 5:394920d6a82f 405 if (c <= 9) return 0;
kenjiArai 5:394920d6a82f 406 }
kenjiArai 5:394920d6a82f 407 if (c >= radix) return 0;
kenjiArai 5:394920d6a82f 408 val = val * radix + c;
kenjiArai 5:394920d6a82f 409 c = *(++(*str));
kenjiArai 5:394920d6a82f 410 }
kenjiArai 5:394920d6a82f 411 if (s) val = -val;
kenjiArai 5:394920d6a82f 412 *res = val;
kenjiArai 5:394920d6a82f 413 return 1;
kenjiArai 5:394920d6a82f 414 }
kenjiArai 5:394920d6a82f 415
kenjiArai 5:394920d6a82f 416 void action_tx_wait_time(){
kenjiArai 5:394920d6a82f 417 int32_t dt;
kenjiArai 5:394920d6a82f 418 char *p;
kenjiArai 5:394920d6a82f 419
kenjiArai 5:394920d6a82f 420 p = (char *)(rx_buf);
kenjiArai 5:394920d6a82f 421 p += 2; // point to rx_buf[2]
kenjiArai 5:394920d6a82f 422 if (xatoi(&p, &dt)){
kenjiArai 5:394920d6a82f 423 sleep_time = dt; // set next wake-up period
kenjiArai 5:394920d6a82f 424 } else {
kenjiArai 5:394920d6a82f 425 DEBUG("data is unknown!\r\n");
kenjiArai 5:394920d6a82f 426 }
kenjiArai 5:394920d6a82f 427 DEBUG("slp_t:%d\r\n", sleep_time);
kenjiArai 5:394920d6a82f 428 // 12345678901234567890
kenjiArai 5:394920d6a82f 429 sprintf((char *)tx_buf, "W=%d", sleep_time);
kenjiArai 5:394920d6a82f 430 tx_len = strlen((const char *)tx_buf);
kenjiArai 5:394920d6a82f 431 Update_Values();
kenjiArai 5:394920d6a82f 432 }
kenjiArai 5:394920d6a82f 433
kenjiArai 1:9b27a9710d94 434 void action_tx_quit(){
kenjiArai 1:9b27a9710d94 435 #if GOTO_SLEEP_MODE
kenjiArai 1:9b27a9710d94 436 ticker.detach();
kenjiArai 1:9b27a9710d94 437 // 12345678901234567890
kenjiArai 1:9b27a9710d94 438 sprintf((char *)tx_buf,"Terminated the BLE");
kenjiArai 1:9b27a9710d94 439 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 440 Update_Values();
kenjiArai 1:9b27a9710d94 441 wait(1.0);
kenjiArai 5:394920d6a82f 442 wakeup.set_and_wait(sleep_time);
kenjiArai 1:9b27a9710d94 443 while(true){ // never come here but just in case
kenjiArai 1:9b27a9710d94 444 deepsleep();
kenjiArai 1:9b27a9710d94 445 }
kenjiArai 1:9b27a9710d94 446 #else
kenjiArai 1:9b27a9710d94 447 SCB->AIRCR = 0x05fa0004; // System RESET!!
kenjiArai 1:9b27a9710d94 448 #endif
kenjiArai 1:9b27a9710d94 449 }
kenjiArai 1:9b27a9710d94 450
kenjiArai 1:9b27a9710d94 451 void interrupt_by_sw(){ // Go to sleep
kenjiArai 1:9b27a9710d94 452 NVIC_SystemReset();
kenjiArai 1:9b27a9710d94 453 // Not come here (Just in case)
kenjiArai 1:9b27a9710d94 454 deepsleep();
kenjiArai 1:9b27a9710d94 455 }
kenjiArai 1:9b27a9710d94 456
kenjiArai 1:9b27a9710d94 457 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
kenjiArai 1:9b27a9710d94 458 DEBUG("Disconnected!\r\n");
kenjiArai 1:9b27a9710d94 459 DEBUG("Restarting the advertising process\r\n");
kenjiArai 1:9b27a9710d94 460 ble.startAdvertising();
kenjiArai 1:9b27a9710d94 461 }
kenjiArai 1:9b27a9710d94 462
kenjiArai 1:9b27a9710d94 463 void periodicCallback(void){
kenjiArai 1:9b27a9710d94 464 #if GOTO_SLEEP_MODE
kenjiArai 1:9b27a9710d94 465 if (--time_out_cntr == 0){
kenjiArai 1:9b27a9710d94 466 time_out = true;
kenjiArai 1:9b27a9710d94 467 }
kenjiArai 1:9b27a9710d94 468 #endif
kenjiArai 1:9b27a9710d94 469 }
kenjiArai 1:9b27a9710d94 470
kenjiArai 1:9b27a9710d94 471 void Update_Values(void){
kenjiArai 1:9b27a9710d94 472 ble.updateCharacteristicValue(
kenjiArai 1:9b27a9710d94 473 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 1:9b27a9710d94 474 tx_buf,
kenjiArai 1:9b27a9710d94 475 tx_len
kenjiArai 1:9b27a9710d94 476 );
kenjiArai 1:9b27a9710d94 477 DEBUG("TX_data: %s\r\n", tx_buf);
kenjiArai 1:9b27a9710d94 478 DEBUG("Length: %d\r\n", tx_len);
kenjiArai 1:9b27a9710d94 479 tx_len = 0;
kenjiArai 1:9b27a9710d94 480 }