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:
Thu Apr 21 11:29:38 2016 +0000
Revision:
4:a1b642566003
Parent:
3:fd5273a70b21
Child:
5:394920d6a82f
change program name

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 3:fd5273a70b21 25 * Revised: April 21st, 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 1:9b27a9710d94 42
kenjiArai 1:9b27a9710d94 43 // Definition ------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 44 #define GOTO_SLEEP_MODE 0
kenjiArai 1:9b27a9710d94 45 #define NEED_CONSOLE_OUTPUT 0
kenjiArai 1:9b27a9710d94 46
kenjiArai 1:9b27a9710d94 47 #if NEED_CONSOLE_OUTPUT
kenjiArai 1:9b27a9710d94 48 #define DEBUG(...) { printf(__VA_ARGS__); }
kenjiArai 1:9b27a9710d94 49 #else
kenjiArai 1:9b27a9710d94 50 #define DEBUG(...)
kenjiArai 1:9b27a9710d94 51 #endif
kenjiArai 1:9b27a9710d94 52
kenjiArai 1:9b27a9710d94 53 // Object ----------------------------------------------------------------------------------------
kenjiArai 3:fd5273a70b21 54 BLE ble;
kenjiArai 1:9b27a9710d94 55 DigitalOut connectedLED(LED2);
kenjiArai 1:9b27a9710d94 56 InterruptIn wake_up_sw(P0_1);
kenjiArai 1:9b27a9710d94 57 nRF51_WakeUp wakeup(LED1, P0_0);
kenjiArai 1:9b27a9710d94 58 nRF51_Vdd vdd(3.0f, 2.2f);
kenjiArai 1:9b27a9710d94 59 Serial pc(USBTX, USBRX);
kenjiArai 1:9b27a9710d94 60 UARTService *uartServicePtr;
kenjiArai 1:9b27a9710d94 61 Ticker ticker;
kenjiArai 1:9b27a9710d94 62
kenjiArai 1:9b27a9710d94 63 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 64 #warning "You need to confirm your device name."
kenjiArai 3:fd5273a70b21 65 const static char DEVICE_NAME[] = "UART_S";
kenjiArai 3:fd5273a70b21 66
kenjiArai 1:9b27a9710d94 67
kenjiArai 1:9b27a9710d94 68 // RAM -------------------------------------------------------------------------------------------
kenjiArai 3:fd5273a70b21 69 Gap::Address_t my_mac;
kenjiArai 3:fd5273a70b21 70 uint8_t tx_buf[24];
kenjiArai 3:fd5273a70b21 71 uint8_t tx_len = 0;
kenjiArai 3:fd5273a70b21 72 uint8_t rx_buf[24];
kenjiArai 3:fd5273a70b21 73 uint8_t rx_len = 0;
kenjiArai 1:9b27a9710d94 74 volatile bool trigger_transmit = false;
kenjiArai 1:9b27a9710d94 75 volatile bool trigger_receive = false;
kenjiArai 1:9b27a9710d94 76 volatile uint8_t command_continue = 0;
kenjiArai 3:fd5273a70b21 77 uint16_t time_out_cntr = 3600;
kenjiArai 3:fd5273a70b21 78 volatile bool time_out = false;
kenjiArai 3:fd5273a70b21 79 bool line_input = false;
kenjiArai 3:fd5273a70b21 80 uint8_t linebuf_irq[24];
kenjiArai 3:fd5273a70b21 81 int linebf_irq_len = 0;
kenjiArai 3:fd5273a70b21 82 uint8_t linebuf[24];
kenjiArai 3:fd5273a70b21 83 int linebf_len = 0;
kenjiArai 0:6b0eca2bcb7a 84
kenjiArai 1:9b27a9710d94 85 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 86 // BLE
kenjiArai 1:9b27a9710d94 87 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params);
kenjiArai 1:9b27a9710d94 88 void onDataWritten(const GattWriteCallbackParams *params);
kenjiArai 1:9b27a9710d94 89 void periodicCallback(void);
kenjiArai 1:9b27a9710d94 90 // Application related
kenjiArai 1:9b27a9710d94 91 void adjust_line(uint8_t *bf);
kenjiArai 1:9b27a9710d94 92 void action_tx_help(void);
kenjiArai 1:9b27a9710d94 93 void action_tx_vdd(void);
kenjiArai 1:9b27a9710d94 94 void action_tx_temperature(void);
kenjiArai 1:9b27a9710d94 95 void action_tx_pwrup(void);
kenjiArai 1:9b27a9710d94 96 void action_tx_pwrdwn(void);
kenjiArai 1:9b27a9710d94 97 void fill_space_n(uint8_t *bf, uint8_t n);
kenjiArai 1:9b27a9710d94 98 void Update_Values(void);
kenjiArai 1:9b27a9710d94 99 // Interrupt related
kenjiArai 1:9b27a9710d94 100 void action_tx_quit(void);
kenjiArai 1:9b27a9710d94 101 void interrupt_by_sw(void);
kenjiArai 1:9b27a9710d94 102 void serialRxCallback(void);
kenjiArai 1:9b27a9710d94 103
kenjiArai 1:9b27a9710d94 104 //-------------------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 105 // Control Program
kenjiArai 1:9b27a9710d94 106 //-------------------------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 107 int main(void){
kenjiArai 1:9b27a9710d94 108 connectedLED = 0;
kenjiArai 1:9b27a9710d94 109 pc.attach(&serialRxCallback, Serial::RxIrq);
kenjiArai 1:9b27a9710d94 110 ticker.attach(periodicCallback, 1);
kenjiArai 1:9b27a9710d94 111 for (int k = 0; k < 20; k++) { pc.printf("\r\n");} // clear terminal output
kenjiArai 3:fd5273a70b21 112 pc.printf("UART Communication / Server side\r\n"); // opening message
kenjiArai 3:fd5273a70b21 113 pc.printf(" Client(Central) and Server(Peripheral)\r\n"); // opening message
kenjiArai 1:9b27a9710d94 114 // Interrupt by switch
kenjiArai 1:9b27a9710d94 115 wake_up_sw.fall(&interrupt_by_sw);
kenjiArai 1:9b27a9710d94 116 ble.init();
kenjiArai 2:2322afea6ecf 117 Gap::AddressType_t my_mac_type;
kenjiArai 2:2322afea6ecf 118 ble.gap().getAddress(&my_mac_type, my_mac);
kenjiArai 2:2322afea6ecf 119 pc.printf(
kenjiArai 2:2322afea6ecf 120 " my_MAC %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n",
kenjiArai 2:2322afea6ecf 121 my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0],
kenjiArai 2:2322afea6ecf 122 (my_mac_type == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"
kenjiArai 2:2322afea6ecf 123 );
kenjiArai 2:2322afea6ecf 124 pc.printf(
kenjiArai 2:2322afea6ecf 125 " mac_board_? = {0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x};\r\n",
kenjiArai 2:2322afea6ecf 126 my_mac[0], my_mac[1], my_mac[2], my_mac[3], my_mac[4], my_mac[5]
kenjiArai 2:2322afea6ecf 127 );
kenjiArai 2:2322afea6ecf 128 pc.printf(" Please write above mac_board_?(?=1,2,...) data into Client main.cpp\r\n");
kenjiArai 1:9b27a9710d94 129 ble.onDisconnection(disconnectionCallback);
kenjiArai 1:9b27a9710d94 130 ble.onDataWritten(onDataWritten);
kenjiArai 1:9b27a9710d94 131 /* setup advertising */
kenjiArai 1:9b27a9710d94 132 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
kenjiArai 1:9b27a9710d94 133 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
kenjiArai 3:fd5273a70b21 134 ble.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 135 GapAdvertisingData::COMPLETE_LOCAL_NAME,
kenjiArai 3:fd5273a70b21 136 (const uint8_t *)DEVICE_NAME,
kenjiArai 3:fd5273a70b21 137 sizeof(DEVICE_NAME)
kenjiArai 3:fd5273a70b21 138 );
kenjiArai 3:fd5273a70b21 139 ble.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 140 GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
kenjiArai 3:fd5273a70b21 141 (const uint8_t *)UARTServiceUUID_reversed,
kenjiArai 3:fd5273a70b21 142 sizeof(UARTServiceUUID_reversed)
kenjiArai 3:fd5273a70b21 143 );
kenjiArai 1:9b27a9710d94 144 // Advertize Interval
kenjiArai 1:9b27a9710d94 145 ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */
kenjiArai 1:9b27a9710d94 146 // Start
kenjiArai 1:9b27a9710d94 147 ble.startAdvertising();
kenjiArai 1:9b27a9710d94 148 UARTService uartService(ble);
kenjiArai 1:9b27a9710d94 149 uartServicePtr = &uartService;
kenjiArai 1:9b27a9710d94 150 while(true){
kenjiArai 1:9b27a9710d94 151 if (time_out){
kenjiArai 1:9b27a9710d94 152 #if GOTO_SLEEP_MODE
kenjiArai 2:2322afea6ecf 153 wakeup.set_and_wait(120);
kenjiArai 1:9b27a9710d94 154 while(true){ // never come here but just in case
kenjiArai 1:9b27a9710d94 155 deepsleep();
kenjiArai 1:9b27a9710d94 156 }
kenjiArai 1:9b27a9710d94 157 #endif
kenjiArai 1:9b27a9710d94 158 }
kenjiArai 1:9b27a9710d94 159 if (line_input){
kenjiArai 1:9b27a9710d94 160 line_input = false;
kenjiArai 1:9b27a9710d94 161 adjust_line(linebuf);
kenjiArai 1:9b27a9710d94 162 ble.updateCharacteristicValue(
kenjiArai 1:9b27a9710d94 163 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 1:9b27a9710d94 164 linebuf,
kenjiArai 1:9b27a9710d94 165 20
kenjiArai 1:9b27a9710d94 166 );
kenjiArai 1:9b27a9710d94 167 }
kenjiArai 1:9b27a9710d94 168 if (trigger_transmit){
kenjiArai 1:9b27a9710d94 169 trigger_transmit = false;
kenjiArai 1:9b27a9710d94 170 pc.printf("%s\r\n", rx_buf);
kenjiArai 3:fd5273a70b21 171 if ((rx_buf[0] == '*') || (rx_buf[0] == '&')){
kenjiArai 1:9b27a9710d94 172 switch (rx_buf[1]){
kenjiArai 1:9b27a9710d94 173 case 'v':
kenjiArai 1:9b27a9710d94 174 action_tx_vdd();
kenjiArai 1:9b27a9710d94 175 break;
kenjiArai 1:9b27a9710d94 176 case 't':
kenjiArai 1:9b27a9710d94 177 action_tx_temperature();
kenjiArai 1:9b27a9710d94 178 break;
kenjiArai 1:9b27a9710d94 179 case 'q':
kenjiArai 1:9b27a9710d94 180 action_tx_quit();
kenjiArai 1:9b27a9710d94 181 break;
kenjiArai 1:9b27a9710d94 182 case 'h':
kenjiArai 1:9b27a9710d94 183 case '?':
kenjiArai 1:9b27a9710d94 184 action_tx_help();
kenjiArai 1:9b27a9710d94 185 break;
kenjiArai 1:9b27a9710d94 186 default:
kenjiArai 1:9b27a9710d94 187 break;
kenjiArai 1:9b27a9710d94 188 }
kenjiArai 1:9b27a9710d94 189 }
kenjiArai 1:9b27a9710d94 190 }
kenjiArai 1:9b27a9710d94 191 ble.waitForEvent();
kenjiArai 0:6b0eca2bcb7a 192 }
kenjiArai 0:6b0eca2bcb7a 193 }
kenjiArai 1:9b27a9710d94 194
kenjiArai 1:9b27a9710d94 195 void serialRxCallback(){
kenjiArai 1:9b27a9710d94 196 char c = pc.getc();
kenjiArai 1:9b27a9710d94 197 if (c == '\r') {
kenjiArai 1:9b27a9710d94 198 linebuf_irq[linebf_irq_len++] = c;
kenjiArai 1:9b27a9710d94 199 pc.printf("\r\n");
kenjiArai 1:9b27a9710d94 200 linebf_len = linebf_irq_len;
kenjiArai 1:9b27a9710d94 201 strcpy((char *)linebuf, (char *)linebuf_irq);
kenjiArai 1:9b27a9710d94 202 linebf_irq_len = 0;
kenjiArai 1:9b27a9710d94 203 line_input = true;
kenjiArai 1:9b27a9710d94 204 } else if ((c == '\b') && linebf_irq_len) {
kenjiArai 1:9b27a9710d94 205 linebf_irq_len--;
kenjiArai 1:9b27a9710d94 206 pc.putc(c);
kenjiArai 1:9b27a9710d94 207 pc.putc(' ');
kenjiArai 1:9b27a9710d94 208 pc.putc(c);
kenjiArai 1:9b27a9710d94 209 } else if (((uint8_t)c >= ' ') && (linebf_irq_len < 20)) {
kenjiArai 1:9b27a9710d94 210 linebuf_irq[linebf_irq_len++] = c;
kenjiArai 1:9b27a9710d94 211 pc.putc(c);
kenjiArai 1:9b27a9710d94 212 } else if ( c == 0x1f ){ // Control+?
kenjiArai 1:9b27a9710d94 213 SCB->AIRCR = 0x05fa0004; // System RESET!!
kenjiArai 1:9b27a9710d94 214 }
kenjiArai 1:9b27a9710d94 215 linebuf_irq[linebf_irq_len] = 0;
kenjiArai 1:9b27a9710d94 216 }
kenjiArai 1:9b27a9710d94 217
kenjiArai 1:9b27a9710d94 218 void adjust_line(uint8_t *bf){
kenjiArai 2:2322afea6ecf 219 uint8_t i, c;
kenjiArai 1:9b27a9710d94 220
kenjiArai 1:9b27a9710d94 221 for (i = 0; i <20; bf++, i++){
kenjiArai 1:9b27a9710d94 222 c = *bf;
kenjiArai 1:9b27a9710d94 223 if ( (c == '\r') || (c == '\n') || (c == 0)){
kenjiArai 1:9b27a9710d94 224 break;
kenjiArai 1:9b27a9710d94 225 }
kenjiArai 1:9b27a9710d94 226 }
kenjiArai 1:9b27a9710d94 227 for (; i < 20; bf++, i++){
kenjiArai 1:9b27a9710d94 228 *bf = ' ';
kenjiArai 1:9b27a9710d94 229 }
kenjiArai 1:9b27a9710d94 230 *(bf + 1) = 0;
kenjiArai 1:9b27a9710d94 231 }
kenjiArai 1:9b27a9710d94 232
kenjiArai 1:9b27a9710d94 233 void onDataWritten(const GattWriteCallbackParams *params){
kenjiArai 1:9b27a9710d94 234 if ((uartServicePtr != NULL) &&
kenjiArai 1:9b27a9710d94 235 (params->handle == uartServicePtr->getTXCharacteristicHandle()))
kenjiArai 1:9b27a9710d94 236 {
kenjiArai 1:9b27a9710d94 237 strcpy((char *)rx_buf, (const char *)params->data);
kenjiArai 1:9b27a9710d94 238 rx_len = params->len;
kenjiArai 1:9b27a9710d94 239 trigger_transmit = true;
kenjiArai 1:9b27a9710d94 240 DEBUG("RX_data\r\n");
kenjiArai 1:9b27a9710d94 241 DEBUG("Length: %d\r\n", rx_len);
kenjiArai 1:9b27a9710d94 242 DEBUG("Data: ");
kenjiArai 1:9b27a9710d94 243 DEBUG("%s", rx_buf);
kenjiArai 1:9b27a9710d94 244 DEBUG("\r\n");
kenjiArai 1:9b27a9710d94 245 }
kenjiArai 1:9b27a9710d94 246 }
kenjiArai 1:9b27a9710d94 247
kenjiArai 1:9b27a9710d94 248 void action_tx_help(){
kenjiArai 1:9b27a9710d94 249 // 12345678901234567890
kenjiArai 3:fd5273a70b21 250 sprintf((char *)tx_buf,"*? or &?:help");
kenjiArai 1:9b27a9710d94 251 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 252 Update_Values();
kenjiArai 1:9b27a9710d94 253 wait(0.2);
kenjiArai 1:9b27a9710d94 254 // 12345678901234567890
kenjiArai 3:fd5273a70b21 255 sprintf((char *)tx_buf,"*v:vdd");
kenjiArai 1:9b27a9710d94 256 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 257 Update_Values();
kenjiArai 1:9b27a9710d94 258 wait(0.2);
kenjiArai 1:9b27a9710d94 259 // 12345678901234567890
kenjiArai 3:fd5273a70b21 260 sprintf((char *)tx_buf,"*t:temperature");
kenjiArai 1:9b27a9710d94 261 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 262 Update_Values();
kenjiArai 1:9b27a9710d94 263 wait(0.2);
kenjiArai 1:9b27a9710d94 264 // 12345678901234567890
kenjiArai 3:fd5273a70b21 265 sprintf((char *)tx_buf,"*q:quit/sleep");
kenjiArai 1:9b27a9710d94 266 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 267 Update_Values();
kenjiArai 1:9b27a9710d94 268 wait(0.2);
kenjiArai 1:9b27a9710d94 269 }
kenjiArai 1:9b27a9710d94 270
kenjiArai 1:9b27a9710d94 271 void action_tx_vdd(){
kenjiArai 1:9b27a9710d94 272 sprintf((char *)tx_buf,"Vdd:%3.2fV", vdd.read_real_value());
kenjiArai 1:9b27a9710d94 273 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 274 Update_Values();
kenjiArai 1:9b27a9710d94 275 }
kenjiArai 1:9b27a9710d94 276
kenjiArai 1:9b27a9710d94 277 void action_tx_temperature(){
kenjiArai 1:9b27a9710d94 278 int32_t p_temp;
kenjiArai 1:9b27a9710d94 279 float temperature;
kenjiArai 1:9b27a9710d94 280
kenjiArai 1:9b27a9710d94 281 // Update a temperature (inside nRF51822 chip)
kenjiArai 1:9b27a9710d94 282 sd_temp_get(&p_temp);
kenjiArai 1:9b27a9710d94 283 // -16.0f is offset vale for chip die temp to ambient temp (depend on your board)
kenjiArai 1:9b27a9710d94 284 temperature = float(p_temp) / 4; // Original = float(p_temp)/4.0f - 16.0f;
kenjiArai 1:9b27a9710d94 285 sprintf((char *)tx_buf,"T:%+4.1fdC", temperature);
kenjiArai 1:9b27a9710d94 286 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 287 Update_Values();
kenjiArai 1:9b27a9710d94 288 }
kenjiArai 1:9b27a9710d94 289
kenjiArai 1:9b27a9710d94 290 void action_tx_quit(){
kenjiArai 1:9b27a9710d94 291 #if GOTO_SLEEP_MODE
kenjiArai 1:9b27a9710d94 292 ticker.detach();
kenjiArai 1:9b27a9710d94 293 // 12345678901234567890
kenjiArai 1:9b27a9710d94 294 sprintf((char *)tx_buf,"Terminated the BLE");
kenjiArai 1:9b27a9710d94 295 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 296 Update_Values();
kenjiArai 1:9b27a9710d94 297 wait(1.0);
kenjiArai 1:9b27a9710d94 298 wakeup.set_and_wait(120);
kenjiArai 1:9b27a9710d94 299 while(true){ // never come here but just in case
kenjiArai 1:9b27a9710d94 300 deepsleep();
kenjiArai 1:9b27a9710d94 301 }
kenjiArai 1:9b27a9710d94 302 #else
kenjiArai 1:9b27a9710d94 303 SCB->AIRCR = 0x05fa0004; // System RESET!!
kenjiArai 1:9b27a9710d94 304 #endif
kenjiArai 1:9b27a9710d94 305 }
kenjiArai 1:9b27a9710d94 306
kenjiArai 1:9b27a9710d94 307 void interrupt_by_sw(){ // Go to sleep
kenjiArai 1:9b27a9710d94 308 NVIC_SystemReset();
kenjiArai 1:9b27a9710d94 309 // Not come here (Just in case)
kenjiArai 1:9b27a9710d94 310 deepsleep();
kenjiArai 1:9b27a9710d94 311 }
kenjiArai 1:9b27a9710d94 312
kenjiArai 1:9b27a9710d94 313 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
kenjiArai 1:9b27a9710d94 314 DEBUG("Disconnected!\r\n");
kenjiArai 1:9b27a9710d94 315 DEBUG("Restarting the advertising process\r\n");
kenjiArai 1:9b27a9710d94 316 ble.startAdvertising();
kenjiArai 1:9b27a9710d94 317 }
kenjiArai 1:9b27a9710d94 318
kenjiArai 1:9b27a9710d94 319 void periodicCallback(void){
kenjiArai 1:9b27a9710d94 320 #if GOTO_SLEEP_MODE
kenjiArai 1:9b27a9710d94 321 if (--time_out_cntr == 0){
kenjiArai 1:9b27a9710d94 322 time_out = true;
kenjiArai 1:9b27a9710d94 323 }
kenjiArai 1:9b27a9710d94 324 #endif
kenjiArai 1:9b27a9710d94 325 }
kenjiArai 1:9b27a9710d94 326
kenjiArai 1:9b27a9710d94 327 void Update_Values(void){
kenjiArai 1:9b27a9710d94 328 ble.updateCharacteristicValue(
kenjiArai 1:9b27a9710d94 329 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 1:9b27a9710d94 330 tx_buf,
kenjiArai 1:9b27a9710d94 331 tx_len
kenjiArai 1:9b27a9710d94 332 );
kenjiArai 1:9b27a9710d94 333 DEBUG("TX_data: %s\r\n", tx_buf);
kenjiArai 1:9b27a9710d94 334 DEBUG("Length: %d\r\n", tx_len);
kenjiArai 1:9b27a9710d94 335 tx_len = 0;
kenjiArai 1:9b27a9710d94 336 }