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