TYBLE16 on os5 sample programs

Dependencies:   BME280 TextLCD nRF51_Vdd

Fork of TYBLE16_mbedlized_os5_BASE by Kenji Arai

Please refer following notebook.
/users/kenjiArai/notebook/tyble16-module-as-mbed-os-5-board-mbedlization/

Committer:
kenjiArai
Date:
Sat Apr 14 12:57:53 2018 +0000
Revision:
2:47ad8c48224e
Parent:
1:9011c83e4178
updated  library (I2C pin assign)

Who changed what in which revision?

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