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