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