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:
Fri Feb 09 22:31:30 2018 +0000
Revision:
7:0d94f4cf2a69
Parent:
6:16e1f9d065a3
Child:
8:dd23c6d67b58
Not set mac addr but use device 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 6:16e1f9d065a3 18 * ------- BLE Peripheral/Server UART function --------------------------------
kenjiArai 6:16e1f9d065a3 19 * communicate with BLE_UART_Client program
kenjiArai 1:9b27a9710d94 20 * --- Tested on Switch Science mbed TY51822r3 ---
kenjiArai 1:9b27a9710d94 21 *
kenjiArai 1:9b27a9710d94 22 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 7:0d94f4cf2a69 23 * https://os.mbed.com/users/kenjiArai/
kenjiArai 1:9b27a9710d94 24 *
kenjiArai 1:9b27a9710d94 25 * Started: March 7th, 2016
kenjiArai 5:394920d6a82f 26 * Revised: June 13th, 2016
kenjiArai 6:16e1f9d065a3 27 * Revised: October 22nd, 2017 Run on mbed-OS-5.6.2
kenjiArai 7:0d94f4cf2a69 28 * Revised: Feburary 10th, 2018 Not set mac addr but use device name
kenjiArai 1:9b27a9710d94 29 *
kenjiArai 1:9b27a9710d94 30 * Original program:
kenjiArai 1:9b27a9710d94 31 * BLE_LoopbackUART
kenjiArai 6:16e1f9d065a3 32 * https://developer.mbed.org/teams/Bluetooth-Low-Energy/
kenjiArai 6:16e1f9d065a3 33 * code/BLE_LoopbackUART/
kenjiArai 7:0d94f4cf2a69 34 * Reference program:
kenjiArai 7:0d94f4cf2a69 35 * BLE_Peripheral_test by noboru koshinaka
kenjiArai 7:0d94f4cf2a69 36 * https://os.mbed.com/users/noboruk/code/BLE_Peripheral_test/
kenjiArai 7:0d94f4cf2a69 37 * Tested Client Device:
kenjiArai 1:9b27a9710d94 38 * BLE_Uart_Client
kenjiArai 7:0d94f4cf2a69 39 * https://os.mbed.com/users/kenjiArai/code/BLE_Uart_Client/
kenjiArai 1:9b27a9710d94 40 */
kenjiArai 0:6b0eca2bcb7a 41
kenjiArai 6:16e1f9d065a3 42 // Include --------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 43 #include "mbed.h"
kenjiArai 1:9b27a9710d94 44 #include "BLE.h"
kenjiArai 1:9b27a9710d94 45 #include "UARTService.h"
kenjiArai 1:9b27a9710d94 46 #include "nRF51_Vdd.h"
kenjiArai 1:9b27a9710d94 47 #include "nRF51_WakeUp.h"
kenjiArai 6:16e1f9d065a3 48 #include "RingBuffer.h"
kenjiArai 6:16e1f9d065a3 49
kenjiArai 6:16e1f9d065a3 50 // Definition -----------------------------------------------------------------
kenjiArai 7:0d94f4cf2a69 51 //#define USE_MAC // if you use mac address, please define it
kenjiArai 7:0d94f4cf2a69 52
kenjiArai 6:16e1f9d065a3 53 #define NUM_ONCE 20
kenjiArai 6:16e1f9d065a3 54 #define BFSIZE (NUM_ONCE+4)
kenjiArai 1:9b27a9710d94 55
kenjiArai 6:16e1f9d065a3 56 // If you set 1, you need to connected LED1 and P_0
kenjiArai 6:16e1f9d065a3 57 // Please refer nRF51_WakeUP library
kenjiArai 7:0d94f4cf2a69 58 #define GOTO_SLEEP_MODE 0
kenjiArai 7:0d94f4cf2a69 59
kenjiArai 6:16e1f9d065a3 60 //#define USE_DEBUG_MODE
kenjiArai 6:16e1f9d065a3 61 #ifdef USE_DEBUG_MODE
kenjiArai 1:9b27a9710d94 62 #define DEBUG(...) { printf(__VA_ARGS__); }
kenjiArai 1:9b27a9710d94 63 #else
kenjiArai 1:9b27a9710d94 64 #define DEBUG(...)
kenjiArai 1:9b27a9710d94 65 #endif
kenjiArai 1:9b27a9710d94 66
kenjiArai 6:16e1f9d065a3 67 // Object ---------------------------------------------------------------------
kenjiArai 7:0d94f4cf2a69 68 BLE& ble_uart = BLE::Instance();
kenjiArai 1:9b27a9710d94 69 DigitalOut connectedLED(LED2);
kenjiArai 1:9b27a9710d94 70 InterruptIn wake_up_sw(P0_1);
kenjiArai 1:9b27a9710d94 71 nRF51_WakeUp wakeup(LED1, P0_0);
kenjiArai 1:9b27a9710d94 72 nRF51_Vdd vdd(3.0f, 2.2f);
kenjiArai 6:16e1f9d065a3 73 Serial pc(USBTX, USBRX, 115200);
kenjiArai 7:0d94f4cf2a69 74 //Serial pc(P0_3, P0_1, 115200); // for another board
kenjiArai 1:9b27a9710d94 75 UARTService *uartServicePtr;
kenjiArai 1:9b27a9710d94 76 Ticker ticker;
kenjiArai 6:16e1f9d065a3 77 RingBuffer ser_bf(1024);
kenjiArai 6:16e1f9d065a3 78 Thread tsk;
kenjiArai 6:16e1f9d065a3 79 Mutex bletx_mutex;
kenjiArai 1:9b27a9710d94 80
kenjiArai 6:16e1f9d065a3 81 // ROM / Constant data --------------------------------------------------------
kenjiArai 1:9b27a9710d94 82 #warning "You need to confirm your device name."
kenjiArai 7:0d94f4cf2a69 83 const static char DEVICE_NAME[] = "UART_PJL";
kenjiArai 1:9b27a9710d94 84
kenjiArai 6:16e1f9d065a3 85 // RAM ------------------------------------------------------------------------
kenjiArai 6:16e1f9d065a3 86 Gap::Address_t my_mac;
kenjiArai 6:16e1f9d065a3 87 uint8_t tx_buf[BFSIZE];
kenjiArai 6:16e1f9d065a3 88 uint8_t tx_len = 0;
kenjiArai 6:16e1f9d065a3 89 uint8_t rx_buf[BFSIZE];
kenjiArai 6:16e1f9d065a3 90 volatile bool trigger_transmit = false;
kenjiArai 6:16e1f9d065a3 91 volatile bool trigger_receive = false;
kenjiArai 6:16e1f9d065a3 92 volatile uint8_t command_continue = 0;
kenjiArai 6:16e1f9d065a3 93 uint16_t time_out_cntr = 3600;
kenjiArai 6:16e1f9d065a3 94 volatile bool time_out = false;
kenjiArai 6:16e1f9d065a3 95 uint32_t sleep_time = 30; // unit:second
kenjiArai 6:16e1f9d065a3 96 volatile bool rx_isr_busy = false;
kenjiArai 0:6b0eca2bcb7a 97
kenjiArai 6:16e1f9d065a3 98 // Function prototypes --------------------------------------------------------
kenjiArai 1:9b27a9710d94 99 // BLE
kenjiArai 6:16e1f9d065a3 100 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *);
kenjiArai 6:16e1f9d065a3 101 void onDataWritten_action(const GattWriteCallbackParams *);
kenjiArai 6:16e1f9d065a3 102 // Tasks
kenjiArai 6:16e1f9d065a3 103 void pc_ser_rx(void);
kenjiArai 6:16e1f9d065a3 104 void data_from_ble(void);
kenjiArai 6:16e1f9d065a3 105 void Update_Values(void);
kenjiArai 1:9b27a9710d94 106 // Application related
kenjiArai 6:16e1f9d065a3 107 void command(uint8_t *cmd);
kenjiArai 1:9b27a9710d94 108 void action_tx_help(void);
kenjiArai 1:9b27a9710d94 109 void action_tx_vdd(void);
kenjiArai 1:9b27a9710d94 110 void action_tx_temperature(void);
kenjiArai 6:16e1f9d065a3 111 void action_tx_wait_time(uint8_t *);
kenjiArai 6:16e1f9d065a3 112 void action_tx_quit(void);
kenjiArai 6:16e1f9d065a3 113 int xatoi (char **, int32_t *);
kenjiArai 6:16e1f9d065a3 114 void adjust_line(uint8_t *);
kenjiArai 1:9b27a9710d94 115 // Interrupt related
kenjiArai 1:9b27a9710d94 116 void interrupt_by_sw(void);
kenjiArai 1:9b27a9710d94 117 void serialRxCallback(void);
kenjiArai 6:16e1f9d065a3 118 void periodicCallback(void);
kenjiArai 1:9b27a9710d94 119
kenjiArai 6:16e1f9d065a3 120 //------------------------------------------------------------------------------
kenjiArai 1:9b27a9710d94 121 // Control Program
kenjiArai 6:16e1f9d065a3 122 //------------------------------------------------------------------------------
kenjiArai 6:16e1f9d065a3 123 int main(void)
kenjiArai 6:16e1f9d065a3 124 {
kenjiArai 1:9b27a9710d94 125 connectedLED = 0;
kenjiArai 1:9b27a9710d94 126 pc.attach(&serialRxCallback, Serial::RxIrq);
kenjiArai 1:9b27a9710d94 127 ticker.attach(periodicCallback, 1);
kenjiArai 6:16e1f9d065a3 128 tsk.start(pc_ser_rx);
kenjiArai 6:16e1f9d065a3 129 // clear terminal output
kenjiArai 7:0d94f4cf2a69 130 for (int k = 0; k < 3; k++) {
kenjiArai 7:0d94f4cf2a69 131 pc.printf("\r\n");
kenjiArai 7:0d94f4cf2a69 132 }
kenjiArai 7:0d94f4cf2a69 133 // opening message
kenjiArai 6:16e1f9d065a3 134 pc.printf("UART Communication / Server(Peripheral) side\r\n");
kenjiArai 6:16e1f9d065a3 135 pc.printf(" need Client module (run BLE_Uart_Client program)\r\n");
kenjiArai 1:9b27a9710d94 136 // Interrupt by switch
kenjiArai 1:9b27a9710d94 137 wake_up_sw.fall(&interrupt_by_sw);
kenjiArai 7:0d94f4cf2a69 138 ble_uart.init();
kenjiArai 2:2322afea6ecf 139 Gap::AddressType_t my_mac_type;
kenjiArai 7:0d94f4cf2a69 140 ble_uart.gap().getAddress(&my_mac_type, my_mac);
kenjiArai 6:16e1f9d065a3 141 DEBUG(
kenjiArai 2:2322afea6ecf 142 " my_MAC %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n",
kenjiArai 2:2322afea6ecf 143 my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0],
kenjiArai 2:2322afea6ecf 144 (my_mac_type == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"
kenjiArai 2:2322afea6ecf 145 );
kenjiArai 2:2322afea6ecf 146 pc.printf(
kenjiArai 7:0d94f4cf2a69 147 " My device name : %s\r\n", DEVICE_NAME);
kenjiArai 7:0d94f4cf2a69 148 pc.printf(
kenjiArai 7:0d94f4cf2a69 149 " My mac data %02x:%02x:%02x:%02x:%02x:%02x\r\n",
kenjiArai 7:0d94f4cf2a69 150 my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0]
kenjiArai 7:0d94f4cf2a69 151 );
kenjiArai 7:0d94f4cf2a69 152 #ifdef USE_MAC
kenjiArai 7:0d94f4cf2a69 153 pc.printf(
kenjiArai 7:0d94f4cf2a69 154 " mac_board_x = {0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x};\r\n",
kenjiArai 2:2322afea6ecf 155 my_mac[0], my_mac[1], my_mac[2], my_mac[3], my_mac[4], my_mac[5]
kenjiArai 2:2322afea6ecf 156 );
kenjiArai 6:16e1f9d065a3 157 pc.printf(
kenjiArai 7:0d94f4cf2a69 158 " Please write above data(mac_board_x line (x=0,1,2,...))\r\n");
kenjiArai 6:16e1f9d065a3 159 pc.printf(
kenjiArai 7:0d94f4cf2a69 160 " into Client/main.cpp [ROM / Constant data] area\r\n");
kenjiArai 7:0d94f4cf2a69 161 #endif
kenjiArai 7:0d94f4cf2a69 162 ble_uart.onDisconnection(disconnectionCallback);
kenjiArai 7:0d94f4cf2a69 163 ble_uart.onDataWritten(onDataWritten_action);
kenjiArai 1:9b27a9710d94 164 /* setup advertising */
kenjiArai 7:0d94f4cf2a69 165 ble_uart.accumulateAdvertisingPayload(
kenjiArai 7:0d94f4cf2a69 166 GapAdvertisingData::BREDR_NOT_SUPPORTED);
kenjiArai 7:0d94f4cf2a69 167 ble_uart.setAdvertisingType(
kenjiArai 7:0d94f4cf2a69 168 GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
kenjiArai 7:0d94f4cf2a69 169 ble_uart.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 170 GapAdvertisingData::COMPLETE_LOCAL_NAME,
kenjiArai 3:fd5273a70b21 171 (const uint8_t *)DEVICE_NAME,
kenjiArai 3:fd5273a70b21 172 sizeof(DEVICE_NAME)
kenjiArai 3:fd5273a70b21 173 );
kenjiArai 7:0d94f4cf2a69 174 ble_uart.accumulateAdvertisingPayload(
kenjiArai 3:fd5273a70b21 175 GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
kenjiArai 3:fd5273a70b21 176 (const uint8_t *)UARTServiceUUID_reversed,
kenjiArai 7:0d94f4cf2a69 177 sizeof(UARTServiceUUID_reversed)
kenjiArai 3:fd5273a70b21 178 );
kenjiArai 1:9b27a9710d94 179 // Advertize Interval
kenjiArai 7:0d94f4cf2a69 180 ble_uart.setAdvertisingInterval(1000); /* 1000ms;in multiples of 0.625ms.*/
kenjiArai 1:9b27a9710d94 181 // Start
kenjiArai 7:0d94f4cf2a69 182 ble_uart.startAdvertising();
kenjiArai 7:0d94f4cf2a69 183 UARTService uartService(ble_uart);
kenjiArai 1:9b27a9710d94 184 uartServicePtr = &uartService;
kenjiArai 7:0d94f4cf2a69 185 while(true) {
kenjiArai 7:0d94f4cf2a69 186 if (time_out) {
kenjiArai 1:9b27a9710d94 187 #if GOTO_SLEEP_MODE
kenjiArai 5:394920d6a82f 188 wakeup.set_and_wait(sleep_time);
kenjiArai 7:0d94f4cf2a69 189 while(true) { // never come here but just in case
kenjiArai 1:9b27a9710d94 190 deepsleep();
kenjiArai 1:9b27a9710d94 191 }
kenjiArai 1:9b27a9710d94 192 #endif
kenjiArai 1:9b27a9710d94 193 }
kenjiArai 7:0d94f4cf2a69 194 if (trigger_transmit) {
kenjiArai 6:16e1f9d065a3 195 static uint8_t cmd_buf[BFSIZE];
kenjiArai 6:16e1f9d065a3 196 static volatile bool flag_continue = 0;
kenjiArai 1:9b27a9710d94 197 trigger_transmit = false;
kenjiArai 6:16e1f9d065a3 198 pc.printf((const char*)rx_buf);
kenjiArai 7:0d94f4cf2a69 199 if (flag_continue == true) {
kenjiArai 6:16e1f9d065a3 200 strcat((char *)cmd_buf, (char *)rx_buf);
kenjiArai 7:0d94f4cf2a69 201 if (strchr((const char*)cmd_buf,(int)'\r') == 0) {
kenjiArai 6:16e1f9d065a3 202 flag_continue = true;
kenjiArai 6:16e1f9d065a3 203 } else {
kenjiArai 6:16e1f9d065a3 204 command(cmd_buf);
kenjiArai 7:0d94f4cf2a69 205 for(uint8_t i = 0; i < BFSIZE; i++) {
kenjiArai 7:0d94f4cf2a69 206 cmd_buf[i] = 0;
kenjiArai 7:0d94f4cf2a69 207 }
kenjiArai 6:16e1f9d065a3 208 flag_continue = false;
kenjiArai 6:16e1f9d065a3 209 }
kenjiArai 6:16e1f9d065a3 210 }
kenjiArai 7:0d94f4cf2a69 211 if ((rx_buf[0] == '~')) {
kenjiArai 6:16e1f9d065a3 212 strcpy((char *)cmd_buf, (char *)rx_buf);
kenjiArai 7:0d94f4cf2a69 213 if (strchr((const char*)cmd_buf,(int)'\r') == 0) {
kenjiArai 6:16e1f9d065a3 214 flag_continue = true;
kenjiArai 6:16e1f9d065a3 215 } else {
kenjiArai 6:16e1f9d065a3 216 command(cmd_buf);
kenjiArai 7:0d94f4cf2a69 217 for(uint8_t i = 0; i < BFSIZE; i++) {
kenjiArai 7:0d94f4cf2a69 218 cmd_buf[i] = 0;
kenjiArai 7:0d94f4cf2a69 219 }
kenjiArai 7:0d94f4cf2a69 220 flag_continue = false;
kenjiArai 1:9b27a9710d94 221 }
kenjiArai 1:9b27a9710d94 222 }
kenjiArai 1:9b27a9710d94 223 }
kenjiArai 7:0d94f4cf2a69 224 ble_uart.waitForEvent();
kenjiArai 0:6b0eca2bcb7a 225 }
kenjiArai 0:6b0eca2bcb7a 226 }
kenjiArai 1:9b27a9710d94 227
kenjiArai 6:16e1f9d065a3 228 void command(uint8_t *cmd)
kenjiArai 6:16e1f9d065a3 229 {
kenjiArai 6:16e1f9d065a3 230 uint8_t *p = cmd;
kenjiArai 6:16e1f9d065a3 231
kenjiArai 7:0d94f4cf2a69 232 while(*p == ' ') {
kenjiArai 7:0d94f4cf2a69 233 ++p; // skip space
kenjiArai 7:0d94f4cf2a69 234 }
kenjiArai 7:0d94f4cf2a69 235 if (*p++ == '~') {
kenjiArai 7:0d94f4cf2a69 236 while(*p < '!') {
kenjiArai 7:0d94f4cf2a69 237 ++p; // skip space
kenjiArai 7:0d94f4cf2a69 238 }
kenjiArai 6:16e1f9d065a3 239 uint8_t c = *p;
kenjiArai 6:16e1f9d065a3 240 //pc.printf("c=%c\r\n", c);
kenjiArai 7:0d94f4cf2a69 241 switch (c) {
kenjiArai 6:16e1f9d065a3 242 case 'v':
kenjiArai 6:16e1f9d065a3 243 action_tx_vdd();
kenjiArai 6:16e1f9d065a3 244 break;
kenjiArai 6:16e1f9d065a3 245 case 't':
kenjiArai 6:16e1f9d065a3 246 action_tx_temperature();
kenjiArai 6:16e1f9d065a3 247 break;
kenjiArai 6:16e1f9d065a3 248 case 'q':
kenjiArai 6:16e1f9d065a3 249 action_tx_quit();
kenjiArai 6:16e1f9d065a3 250 break;
kenjiArai 6:16e1f9d065a3 251 case 'w':
kenjiArai 6:16e1f9d065a3 252 action_tx_wait_time(cmd);
kenjiArai 6:16e1f9d065a3 253 break;
kenjiArai 6:16e1f9d065a3 254 case 'h':
kenjiArai 6:16e1f9d065a3 255 case '?':
kenjiArai 6:16e1f9d065a3 256 action_tx_help();
kenjiArai 6:16e1f9d065a3 257 break;
kenjiArai 6:16e1f9d065a3 258 default:
kenjiArai 6:16e1f9d065a3 259 //pc.printf("\r\nStep(%u)\r\n", __LINE__);
kenjiArai 6:16e1f9d065a3 260 break;
kenjiArai 6:16e1f9d065a3 261 }
kenjiArai 1:9b27a9710d94 262 }
kenjiArai 6:16e1f9d065a3 263 }
kenjiArai 6:16e1f9d065a3 264
kenjiArai 6:16e1f9d065a3 265 void periodicCallback(void)
kenjiArai 6:16e1f9d065a3 266 {
kenjiArai 6:16e1f9d065a3 267 #if GOTO_SLEEP_MODE
kenjiArai 7:0d94f4cf2a69 268 if (--time_out_cntr == 0) {
kenjiArai 6:16e1f9d065a3 269 time_out = true;
kenjiArai 6:16e1f9d065a3 270 }
kenjiArai 6:16e1f9d065a3 271 #endif
kenjiArai 7:0d94f4cf2a69 272 if (rx_isr_busy == true) {
kenjiArai 6:16e1f9d065a3 273 rx_isr_busy = false;
kenjiArai 6:16e1f9d065a3 274 } else {
kenjiArai 6:16e1f9d065a3 275 tsk.signal_set(0x01);
kenjiArai 6:16e1f9d065a3 276 }
kenjiArai 6:16e1f9d065a3 277 }
kenjiArai 6:16e1f9d065a3 278
kenjiArai 6:16e1f9d065a3 279 void serialRxCallback()
kenjiArai 6:16e1f9d065a3 280 {
kenjiArai 6:16e1f9d065a3 281 ser_bf.save(pc.getc());
kenjiArai 6:16e1f9d065a3 282 rx_isr_busy = true;
kenjiArai 6:16e1f9d065a3 283 tsk.signal_set(0x01);
kenjiArai 1:9b27a9710d94 284 }
kenjiArai 1:9b27a9710d94 285
kenjiArai 6:16e1f9d065a3 286 void pc_ser_rx()
kenjiArai 6:16e1f9d065a3 287 {
kenjiArai 6:16e1f9d065a3 288 static uint8_t linebf_irq[BFSIZE];
kenjiArai 6:16e1f9d065a3 289 static volatile uint8_t linebf_irq_len = 0;
kenjiArai 6:16e1f9d065a3 290
kenjiArai 7:0d94f4cf2a69 291 while(true) {
kenjiArai 6:16e1f9d065a3 292 Thread::signal_wait(0x01);
kenjiArai 7:0d94f4cf2a69 293 if (ser_bf.check() == 0) {
kenjiArai 7:0d94f4cf2a69 294 if (linebf_irq_len != 0) {
kenjiArai 6:16e1f9d065a3 295 linebf_irq[linebf_irq_len] = 0;
kenjiArai 6:16e1f9d065a3 296 adjust_line(linebf_irq);
kenjiArai 6:16e1f9d065a3 297 linebf_irq_len = 0;
kenjiArai 6:16e1f9d065a3 298 bletx_mutex.lock();
kenjiArai 7:0d94f4cf2a69 299 ble_uart.updateCharacteristicValue(
kenjiArai 6:16e1f9d065a3 300 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 6:16e1f9d065a3 301 linebf_irq,
kenjiArai 6:16e1f9d065a3 302 NUM_ONCE
kenjiArai 6:16e1f9d065a3 303 );
kenjiArai 6:16e1f9d065a3 304 bletx_mutex.unlock();
kenjiArai 6:16e1f9d065a3 305 }
kenjiArai 6:16e1f9d065a3 306 }
kenjiArai 7:0d94f4cf2a69 307 while(ser_bf.check() != 0) {
kenjiArai 6:16e1f9d065a3 308 char c = ser_bf.read();
kenjiArai 7:0d94f4cf2a69 309 if (c == '\b') {
kenjiArai 6:16e1f9d065a3 310 linebf_irq_len--;
kenjiArai 6:16e1f9d065a3 311 pc.putc(c);
kenjiArai 6:16e1f9d065a3 312 pc.putc(' ');
kenjiArai 6:16e1f9d065a3 313 pc.putc(c);
kenjiArai 7:0d94f4cf2a69 314 } else if ((c >= ' ') || (c == '\r') || (c == '\n')) {
kenjiArai 6:16e1f9d065a3 315 bool overflow = false;
kenjiArai 6:16e1f9d065a3 316 if ((c == '\r') || (c == '\n')) {
kenjiArai 7:0d94f4cf2a69 317 if (linebf_irq_len == NUM_ONCE - 1) { // remain only 1 buffer
kenjiArai 6:16e1f9d065a3 318 overflow = true;
kenjiArai 6:16e1f9d065a3 319 linebf_irq[linebf_irq_len++] = '\r';
kenjiArai 6:16e1f9d065a3 320 pc.putc('\r');
kenjiArai 6:16e1f9d065a3 321 } else {
kenjiArai 6:16e1f9d065a3 322 overflow = false;
kenjiArai 6:16e1f9d065a3 323 linebf_irq[linebf_irq_len++] = '\r';
kenjiArai 6:16e1f9d065a3 324 linebf_irq[linebf_irq_len++] = '\n';
kenjiArai 6:16e1f9d065a3 325 pc.printf("\r\n");
kenjiArai 6:16e1f9d065a3 326 }
kenjiArai 6:16e1f9d065a3 327 } else {
kenjiArai 6:16e1f9d065a3 328 linebf_irq[linebf_irq_len++] = c;
kenjiArai 6:16e1f9d065a3 329 pc.putc(c);
kenjiArai 6:16e1f9d065a3 330 }
kenjiArai 7:0d94f4cf2a69 331 if (linebf_irq_len >= NUM_ONCE ) {
kenjiArai 6:16e1f9d065a3 332 linebf_irq[linebf_irq_len] = 0;
kenjiArai 6:16e1f9d065a3 333 adjust_line(linebf_irq);
kenjiArai 6:16e1f9d065a3 334 linebf_irq_len = 0;
kenjiArai 6:16e1f9d065a3 335 bletx_mutex.lock();
kenjiArai 7:0d94f4cf2a69 336 ble_uart.updateCharacteristicValue(
kenjiArai 6:16e1f9d065a3 337 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 6:16e1f9d065a3 338 linebf_irq,
kenjiArai 6:16e1f9d065a3 339 NUM_ONCE
kenjiArai 6:16e1f9d065a3 340 );
kenjiArai 6:16e1f9d065a3 341 bletx_mutex.unlock();
kenjiArai 7:0d94f4cf2a69 342 if (overflow == true) {
kenjiArai 6:16e1f9d065a3 343 overflow = false;
kenjiArai 6:16e1f9d065a3 344 linebf_irq[linebf_irq_len++] = '\n';
kenjiArai 6:16e1f9d065a3 345 pc.putc('\n');
kenjiArai 6:16e1f9d065a3 346 }
kenjiArai 6:16e1f9d065a3 347 }
kenjiArai 6:16e1f9d065a3 348 }
kenjiArai 6:16e1f9d065a3 349 }
kenjiArai 6:16e1f9d065a3 350 }
kenjiArai 6:16e1f9d065a3 351 }
kenjiArai 6:16e1f9d065a3 352
kenjiArai 6:16e1f9d065a3 353 void adjust_line(uint8_t *bf)
kenjiArai 6:16e1f9d065a3 354 {
kenjiArai 2:2322afea6ecf 355 uint8_t i, c;
kenjiArai 1:9b27a9710d94 356
kenjiArai 7:0d94f4cf2a69 357 for (i = 0; i <NUM_ONCE; bf++, i++) {
kenjiArai 1:9b27a9710d94 358 c = *bf;
kenjiArai 7:0d94f4cf2a69 359 if (c == 0) {
kenjiArai 7:0d94f4cf2a69 360 break;
kenjiArai 7:0d94f4cf2a69 361 }
kenjiArai 1:9b27a9710d94 362 }
kenjiArai 7:0d94f4cf2a69 363 for (; i < NUM_ONCE; bf++, i++) {
kenjiArai 7:0d94f4cf2a69 364 *bf = 0x11;
kenjiArai 7:0d94f4cf2a69 365 }
kenjiArai 1:9b27a9710d94 366 *(bf + 1) = 0;
kenjiArai 1:9b27a9710d94 367 }
kenjiArai 1:9b27a9710d94 368
kenjiArai 6:16e1f9d065a3 369 void onDataWritten_action(const GattWriteCallbackParams *params)
kenjiArai 6:16e1f9d065a3 370 {
kenjiArai 7:0d94f4cf2a69 371 if ((uartServicePtr != NULL) &&
kenjiArai 7:0d94f4cf2a69 372 (params->handle == uartServicePtr->getTXCharacteristicHandle())) {
kenjiArai 1:9b27a9710d94 373 strcpy((char *)rx_buf, (const char *)params->data);
kenjiArai 1:9b27a9710d94 374 trigger_transmit = true;
kenjiArai 1:9b27a9710d94 375 }
kenjiArai 1:9b27a9710d94 376 }
kenjiArai 1:9b27a9710d94 377
kenjiArai 6:16e1f9d065a3 378 void action_tx_help()
kenjiArai 6:16e1f9d065a3 379 {
kenjiArai 7:0d94f4cf2a69 380 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 381 sprintf((char *)tx_buf," ~?:help\r\n");
kenjiArai 7:0d94f4cf2a69 382 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 383 Update_Values();
kenjiArai 1:9b27a9710d94 384 wait(0.2);
kenjiArai 7:0d94f4cf2a69 385 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 386 sprintf((char *)tx_buf," ~v:vdd\r\n");
kenjiArai 7:0d94f4cf2a69 387 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 388 Update_Values();
kenjiArai 1:9b27a9710d94 389 wait(0.2);
kenjiArai 7:0d94f4cf2a69 390 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 391 sprintf((char *)tx_buf," ~t:temperature\r\n");
kenjiArai 7:0d94f4cf2a69 392 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 393 Update_Values();
kenjiArai 1:9b27a9710d94 394 wait(0.2);
kenjiArai 7:0d94f4cf2a69 395 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 396 sprintf((char *)tx_buf," ~w:wait, w 120\r\n");
kenjiArai 7:0d94f4cf2a69 397 tx_len = strlen((const char *)tx_buf);
kenjiArai 5:394920d6a82f 398 Update_Values();
kenjiArai 5:394920d6a82f 399 wait(0.2);
kenjiArai 7:0d94f4cf2a69 400 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 401 sprintf((char *)tx_buf," ~q:quit/sleep\r\n");
kenjiArai 7:0d94f4cf2a69 402 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 403 Update_Values();
kenjiArai 1:9b27a9710d94 404 wait(0.2);
kenjiArai 1:9b27a9710d94 405 }
kenjiArai 1:9b27a9710d94 406
kenjiArai 6:16e1f9d065a3 407 void action_tx_vdd()
kenjiArai 6:16e1f9d065a3 408 {
kenjiArai 6:16e1f9d065a3 409 sprintf((char *)tx_buf,"Vdd: %3.2f V\r\n", vdd.read_real_value());
kenjiArai 6:16e1f9d065a3 410 tx_len = strlen((const char *)tx_buf);
kenjiArai 6:16e1f9d065a3 411 Update_Values();
kenjiArai 6:16e1f9d065a3 412 }
kenjiArai 6:16e1f9d065a3 413
kenjiArai 6:16e1f9d065a3 414 void action_tx_temperature()
kenjiArai 6:16e1f9d065a3 415 {
kenjiArai 6:16e1f9d065a3 416 int32_t p_temp;
kenjiArai 6:16e1f9d065a3 417 float temperature;
kenjiArai 6:16e1f9d065a3 418
kenjiArai 6:16e1f9d065a3 419 // Update a temperature (inside nRF51822 chip)
kenjiArai 6:16e1f9d065a3 420 sd_temp_get(&p_temp);
kenjiArai 6:16e1f9d065a3 421 // -16.0f is offset vale for chip die temp
kenjiArai 6:16e1f9d065a3 422 // to ambient temp (depend on your board)
kenjiArai 6:16e1f9d065a3 423 temperature = float(p_temp) / 4; // Original = float(p_temp)/4.0f - 16.0f;
kenjiArai 6:16e1f9d065a3 424 sprintf((char *)tx_buf,"T: %+4.1f dC\r\n", temperature);
kenjiArai 1:9b27a9710d94 425 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 426 Update_Values();
kenjiArai 1:9b27a9710d94 427 }
kenjiArai 1:9b27a9710d94 428
kenjiArai 6:16e1f9d065a3 429 void action_tx_wait_time(uint8_t *cmd)
kenjiArai 6:16e1f9d065a3 430 {
kenjiArai 6:16e1f9d065a3 431 int32_t dt;
kenjiArai 6:16e1f9d065a3 432 char *p;
kenjiArai 6:16e1f9d065a3 433
kenjiArai 6:16e1f9d065a3 434 p = (char *)(cmd);
kenjiArai 6:16e1f9d065a3 435 p += 2; // point to time value
kenjiArai 7:0d94f4cf2a69 436 if (xatoi(&p, &dt)) {
kenjiArai 7:0d94f4cf2a69 437 if (dt <= 5) {
kenjiArai 7:0d94f4cf2a69 438 dt = 5;
kenjiArai 7:0d94f4cf2a69 439 }
kenjiArai 6:16e1f9d065a3 440 sleep_time = dt; // set next wake-up period
kenjiArai 6:16e1f9d065a3 441 } else {
kenjiArai 6:16e1f9d065a3 442 DEBUG("data is unknown!\r\n");
kenjiArai 6:16e1f9d065a3 443 sleep_time = 30;
kenjiArai 6:16e1f9d065a3 444 }
kenjiArai 6:16e1f9d065a3 445 DEBUG("slp_t:%d\r\n", sleep_time);
kenjiArai 6:16e1f9d065a3 446 //pc.printf("slp_t:%d\r\n", sleep_time);
kenjiArai 7:0d94f4cf2a69 447 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 448 sprintf((char *)tx_buf, "W: %d sec\r\n", sleep_time);
kenjiArai 1:9b27a9710d94 449 tx_len = strlen((const char *)tx_buf);
kenjiArai 1:9b27a9710d94 450 Update_Values();
kenjiArai 1:9b27a9710d94 451 }
kenjiArai 1:9b27a9710d94 452
kenjiArai 6:16e1f9d065a3 453 void action_tx_quit()
kenjiArai 6:16e1f9d065a3 454 {
kenjiArai 7:0d94f4cf2a69 455 #if GOTO_SLEEP_MODE
kenjiArai 6:16e1f9d065a3 456 ticker.detach();
kenjiArai 7:0d94f4cf2a69 457 // 12345678901234567890
kenjiArai 6:16e1f9d065a3 458 sprintf((char *)tx_buf,"Terminated the BLE");
kenjiArai 7:0d94f4cf2a69 459 tx_len = strlen((const char *)tx_buf);
kenjiArai 6:16e1f9d065a3 460 Update_Values();
kenjiArai 6:16e1f9d065a3 461 wait(1.0);
kenjiArai 6:16e1f9d065a3 462 wakeup.set_and_wait(sleep_time);
kenjiArai 7:0d94f4cf2a69 463 while(true) { // never come here but just in case
kenjiArai 6:16e1f9d065a3 464 deepsleep();
kenjiArai 6:16e1f9d065a3 465 }
kenjiArai 6:16e1f9d065a3 466 #else
kenjiArai 6:16e1f9d065a3 467 SCB->AIRCR = 0x05fa0004; // System RESET!!
kenjiArai 6:16e1f9d065a3 468 #endif
kenjiArai 6:16e1f9d065a3 469 }
kenjiArai 5:394920d6a82f 470
kenjiArai 5:394920d6a82f 471 // Change string -> integer
kenjiArai 6:16e1f9d065a3 472 int xatoi (char **str, int32_t *res)
kenjiArai 6:16e1f9d065a3 473 {
kenjiArai 5:394920d6a82f 474 unsigned long val;
kenjiArai 5:394920d6a82f 475 unsigned char c, radix, s = 0;
kenjiArai 5:394920d6a82f 476
kenjiArai 7:0d94f4cf2a69 477 for (;;) {
kenjiArai 5:394920d6a82f 478 c = **str;
kenjiArai 7:0d94f4cf2a69 479 if (c == 0) {
kenjiArai 7:0d94f4cf2a69 480 return 0;
kenjiArai 7:0d94f4cf2a69 481 }
kenjiArai 7:0d94f4cf2a69 482 if (c == '-') {
kenjiArai 7:0d94f4cf2a69 483 break;
kenjiArai 7:0d94f4cf2a69 484 }
kenjiArai 7:0d94f4cf2a69 485 if (c == '+') {
kenjiArai 5:394920d6a82f 486 (*str)++;
kenjiArai 5:394920d6a82f 487 c = **str;
kenjiArai 5:394920d6a82f 488 }
kenjiArai 7:0d94f4cf2a69 489 if (c>='0'&& c<='9') {
kenjiArai 5:394920d6a82f 490 break;
kenjiArai 5:394920d6a82f 491 } else {
kenjiArai 5:394920d6a82f 492 (*str)++;
kenjiArai 5:394920d6a82f 493 c = **str;
kenjiArai 5:394920d6a82f 494 }
kenjiArai 5:394920d6a82f 495 }
kenjiArai 5:394920d6a82f 496 if (c == '-') {
kenjiArai 5:394920d6a82f 497 s = 1;
kenjiArai 5:394920d6a82f 498 c = *(++(*str));
kenjiArai 5:394920d6a82f 499 }
kenjiArai 5:394920d6a82f 500 if (c == '0') {
kenjiArai 5:394920d6a82f 501 c = *(++(*str));
kenjiArai 5:394920d6a82f 502 if (c <= ' ') {
kenjiArai 5:394920d6a82f 503 *res = 0;
kenjiArai 5:394920d6a82f 504 return 1;
kenjiArai 5:394920d6a82f 505 }
kenjiArai 5:394920d6a82f 506 if (c == 'x') {
kenjiArai 5:394920d6a82f 507 radix = 16;
kenjiArai 5:394920d6a82f 508 c = *(++(*str));
kenjiArai 5:394920d6a82f 509 } else {
kenjiArai 5:394920d6a82f 510 if (c == 'b') {
kenjiArai 5:394920d6a82f 511 radix = 2;
kenjiArai 5:394920d6a82f 512 c = *(++(*str));
kenjiArai 5:394920d6a82f 513 } else {
kenjiArai 5:394920d6a82f 514 if ((c >= '0')&&(c <= '9')) {
kenjiArai 5:394920d6a82f 515 radix = 8;
kenjiArai 5:394920d6a82f 516 } else {
kenjiArai 5:394920d6a82f 517 return 0;
kenjiArai 5:394920d6a82f 518 }
kenjiArai 5:394920d6a82f 519 }
kenjiArai 5:394920d6a82f 520 }
kenjiArai 5:394920d6a82f 521 } else {
kenjiArai 5:394920d6a82f 522 if ((c < '1')||(c > '9')) {
kenjiArai 5:394920d6a82f 523 return 0;
kenjiArai 5:394920d6a82f 524 }
kenjiArai 5:394920d6a82f 525 radix = 10;
kenjiArai 5:394920d6a82f 526 }
kenjiArai 5:394920d6a82f 527 val = 0;
kenjiArai 5:394920d6a82f 528 while (c > ' ') {
kenjiArai 5:394920d6a82f 529 if (c >= 'a') c -= 0x20;
kenjiArai 5:394920d6a82f 530 c -= '0';
kenjiArai 5:394920d6a82f 531 if (c >= 17) {
kenjiArai 5:394920d6a82f 532 c -= 7;
kenjiArai 5:394920d6a82f 533 if (c <= 9) return 0;
kenjiArai 5:394920d6a82f 534 }
kenjiArai 5:394920d6a82f 535 if (c >= radix) return 0;
kenjiArai 5:394920d6a82f 536 val = val * radix + c;
kenjiArai 5:394920d6a82f 537 c = *(++(*str));
kenjiArai 5:394920d6a82f 538 }
kenjiArai 5:394920d6a82f 539 if (s) val = -val;
kenjiArai 5:394920d6a82f 540 *res = val;
kenjiArai 5:394920d6a82f 541 return 1;
kenjiArai 5:394920d6a82f 542 }
kenjiArai 5:394920d6a82f 543
kenjiArai 6:16e1f9d065a3 544 void interrupt_by_sw() // Go to sleep
kenjiArai 6:16e1f9d065a3 545 {
kenjiArai 6:16e1f9d065a3 546 NVIC_SystemReset();
kenjiArai 6:16e1f9d065a3 547 // Not come here (Just in case)
kenjiArai 6:16e1f9d065a3 548 sleep();
kenjiArai 5:394920d6a82f 549 }
kenjiArai 5:394920d6a82f 550
kenjiArai 6:16e1f9d065a3 551 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
kenjiArai 6:16e1f9d065a3 552 {
kenjiArai 1:9b27a9710d94 553 DEBUG("Disconnected!\r\n");
kenjiArai 1:9b27a9710d94 554 DEBUG("Restarting the advertising process\r\n");
kenjiArai 7:0d94f4cf2a69 555 ble_uart.startAdvertising();
kenjiArai 1:9b27a9710d94 556 }
kenjiArai 1:9b27a9710d94 557
kenjiArai 6:16e1f9d065a3 558 void Update_Values(void)
kenjiArai 6:16e1f9d065a3 559 {
kenjiArai 6:16e1f9d065a3 560 bletx_mutex.lock();
kenjiArai 7:0d94f4cf2a69 561 ble_uart.updateCharacteristicValue(
kenjiArai 1:9b27a9710d94 562 uartServicePtr->getRXCharacteristicHandle(),
kenjiArai 1:9b27a9710d94 563 tx_buf,
kenjiArai 1:9b27a9710d94 564 tx_len
kenjiArai 1:9b27a9710d94 565 );
kenjiArai 6:16e1f9d065a3 566 bletx_mutex.unlock();
kenjiArai 1:9b27a9710d94 567 tx_len = 0;
kenjiArai 1:9b27a9710d94 568 }