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:
Sat Apr 16 22:01:45 2016 +0000
Revision:
2:2322afea6ecf
Parent:
1:9b27a9710d94
Child:
3:fd5273a70b21
Show MAC address to modify Client main.cpp program

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