You can control from iPhone and put some command. h=show commands help, v=show TY51822r3 VDD data, t=show chip temperature, q=you can make deep sleep condition.
Dependencies: BLE_API mbed nRF51822 nRF51_Vdd nRF51_WakeUp nRF51_LowPwr
Fork of BLE_LoopbackUART by
Please refer follows.
/users/kenjiArai/notebook/ty51822r3-current-consumption-using-nrf51_wakeup-l/#
main.cpp@15:d7764da3f37c, 2016-06-11 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Jun 11 00:56:56 2016 +0000
- Revision:
- 15:d7764da3f37c
- Parent:
- 14:f9b4d659d717
- Child:
- 16:c8f4e56fa239
added low-power library (nRF51_LowPwr) for reduce Idle current at opertationg condition
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 0:e910d9bb040f | 1 | /* mbed Microcontroller Library |
yihui | 0:e910d9bb040f | 2 | * Copyright (c) 2006-2013 ARM Limited |
yihui | 0:e910d9bb040f | 3 | * |
yihui | 0:e910d9bb040f | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
yihui | 0:e910d9bb040f | 5 | * you may not use this file except in compliance with the License. |
yihui | 0:e910d9bb040f | 6 | * You may obtain a copy of the License at |
yihui | 0:e910d9bb040f | 7 | * |
yihui | 0:e910d9bb040f | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
yihui | 0:e910d9bb040f | 9 | * |
yihui | 0:e910d9bb040f | 10 | * Unless required by applicable law or agreed to in writing, software |
yihui | 0:e910d9bb040f | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
yihui | 0:e910d9bb040f | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
yihui | 0:e910d9bb040f | 13 | * See the License for the specific language governing permissions and |
yihui | 0:e910d9bb040f | 14 | * limitations under the License. |
yihui | 0:e910d9bb040f | 15 | */ |
yihui | 0:e910d9bb040f | 16 | |
kenjiArai | 14:f9b4d659d717 | 17 | /* |
kenjiArai | 14:f9b4d659d717 | 18 | * /////// Tested on Switch Science mbed TY51822r3 /////// |
kenjiArai | 14:f9b4d659d717 | 19 | * Modified by Kenji Arai |
kenjiArai | 14:f9b4d659d717 | 20 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 14:f9b4d659d717 | 21 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 14:f9b4d659d717 | 22 | * |
kenjiArai | 15:d7764da3f37c | 23 | * Started: March 7th, 2016 |
kenjiArai | 15:d7764da3f37c | 24 | * Revised: June 11th, 2016 |
kenjiArai | 14:f9b4d659d717 | 25 | * |
kenjiArai | 14:f9b4d659d717 | 26 | * Original program: |
kenjiArai | 14:f9b4d659d717 | 27 | * BLE_LoopbackUART |
kenjiArai | 14:f9b4d659d717 | 28 | * https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LoopbackUART/ |
kenjiArai | 14:f9b4d659d717 | 29 | * Tested Controller Device: |
kenjiArai | 14:f9b4d659d717 | 30 | * iPhone6 nRF UART by Nordic |
kenjiArai | 14:f9b4d659d717 | 31 | * https://itunes.apple.com/us/app/nrf-uart/id614594903?mt=8 |
kenjiArai | 14:f9b4d659d717 | 32 | * |
kenjiArai | 14:f9b4d659d717 | 33 | */ |
yihui | 0:e910d9bb040f | 34 | |
kenjiArai | 14:f9b4d659d717 | 35 | // Include --------------------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 36 | #include <string.h> |
kenjiArai | 14:f9b4d659d717 | 37 | #include "mbed.h" |
kenjiArai | 14:f9b4d659d717 | 38 | #include "BLE.h" |
kenjiArai | 14:f9b4d659d717 | 39 | #include "UARTService.h" |
kenjiArai | 14:f9b4d659d717 | 40 | #include "nRF51_Vdd.h" |
kenjiArai | 14:f9b4d659d717 | 41 | #include "nRF51_WakeUp.h" |
kenjiArai | 15:d7764da3f37c | 42 | #include "nRF51_lowpwr.h" |
yihui | 0:e910d9bb040f | 43 | |
kenjiArai | 14:f9b4d659d717 | 44 | // Definition ------------------------------------------------------------------------------------ |
kenjiArai | 15:d7764da3f37c | 45 | #if USE_DEVICE_STDIO_MESSAGES // See disable_cpu_functions.h |
rgrover1 | 6:e0fc9072e853 | 46 | #define DEBUG(...) { printf(__VA_ARGS__); } |
yihui | 0:e910d9bb040f | 47 | #else |
kenjiArai | 15:d7764da3f37c | 48 | #define DEBUG(...) |
kenjiArai | 15:d7764da3f37c | 49 | #endif |
yihui | 0:e910d9bb040f | 50 | |
kenjiArai | 14:f9b4d659d717 | 51 | #define HIGH_PWR 1 |
kenjiArai | 14:f9b4d659d717 | 52 | #define TXRX_BUF_LEN 22 // send & receive number = 20 |
kenjiArai | 14:f9b4d659d717 | 53 | #define PWR_RANG_NO 8 |
yihui | 0:e910d9bb040f | 54 | |
kenjiArai | 14:f9b4d659d717 | 55 | enum TX_Content { |
kenjiArai | 14:f9b4d659d717 | 56 | TX_VDD = 1, |
kenjiArai | 14:f9b4d659d717 | 57 | TX_TEMP, |
kenjiArai | 14:f9b4d659d717 | 58 | TX_PWR_UP, |
kenjiArai | 14:f9b4d659d717 | 59 | TX_PWR_DWN, |
kenjiArai | 14:f9b4d659d717 | 60 | TX_QUIT, |
kenjiArai | 14:f9b4d659d717 | 61 | TX_HELP |
kenjiArai | 14:f9b4d659d717 | 62 | }; |
yihui | 0:e910d9bb040f | 63 | |
kenjiArai | 14:f9b4d659d717 | 64 | // Object ---------------------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 65 | BLEDevice ble; |
kenjiArai | 14:f9b4d659d717 | 66 | DigitalOut myled(LED2); |
kenjiArai | 14:f9b4d659d717 | 67 | InterruptIn wake_up_sw(P0_1); // If you change P0_1, you also need to change PORT_OUTPUT. |
kenjiArai | 14:f9b4d659d717 | 68 | nRF51_WakeUp wakeup(LED1, P0_0); |
kenjiArai | 15:d7764da3f37c | 69 | nRF51_Vdd vdd(3.0f, 2.2f, ONLY4VDD); |
kenjiArai | 14:f9b4d659d717 | 70 | UARTService *uartServicePtr; |
kenjiArai | 14:f9b4d659d717 | 71 | Ticker ticker; |
kenjiArai | 15:d7764da3f37c | 72 | #if USE_DEVICE_STDIO_MESSAGES |
kenjiArai | 14:f9b4d659d717 | 73 | Serial pc(P0_4,P0_0); |
kenjiArai | 14:f9b4d659d717 | 74 | #endif |
kenjiArai | 14:f9b4d659d717 | 75 | |
kenjiArai | 14:f9b4d659d717 | 76 | // ROM / Constant data --------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 77 | const char *deviceName = "JH1PJL"; |
kenjiArai | 14:f9b4d659d717 | 78 | const uint8_t pwr_range[PWR_RANG_NO] = |
kenjiArai | 14:f9b4d659d717 | 79 | { |
kenjiArai | 14:f9b4d659d717 | 80 | RADIO_TXPOWER_TXPOWER_Neg30dBm,/*!< -30dBm. */ |
kenjiArai | 14:f9b4d659d717 | 81 | RADIO_TXPOWER_TXPOWER_Neg20dBm,/*!< -20dBm. */ |
kenjiArai | 14:f9b4d659d717 | 82 | RADIO_TXPOWER_TXPOWER_Neg16dBm,/*!< -16dBm. */ |
kenjiArai | 14:f9b4d659d717 | 83 | RADIO_TXPOWER_TXPOWER_Neg12dBm,/*!< -12dBm. */ |
kenjiArai | 14:f9b4d659d717 | 84 | RADIO_TXPOWER_TXPOWER_Neg8dBm, /*!< -8dBm. */ |
kenjiArai | 14:f9b4d659d717 | 85 | RADIO_TXPOWER_TXPOWER_Neg4dBm, /*!< -4dBm. */ |
kenjiArai | 14:f9b4d659d717 | 86 | RADIO_TXPOWER_TXPOWER_0dBm, /*!< 0dBm. */ |
kenjiArai | 14:f9b4d659d717 | 87 | RADIO_TXPOWER_TXPOWER_Pos4dBm, /*!< +4dBm. */ |
kenjiArai | 14:f9b4d659d717 | 88 | }; |
yihui | 0:e910d9bb040f | 89 | |
kenjiArai | 14:f9b4d659d717 | 90 | // RAM ------------------------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 91 | uint8_t tx_buf[TXRX_BUF_LEN]; |
kenjiArai | 14:f9b4d659d717 | 92 | uint8_t tx_len=0; |
kenjiArai | 14:f9b4d659d717 | 93 | uint8_t time_data[TXRX_BUF_LEN]; |
kenjiArai | 14:f9b4d659d717 | 94 | uint8_t pwr_selection; |
kenjiArai | 14:f9b4d659d717 | 95 | volatile bool trigger_transmit = false; |
kenjiArai | 14:f9b4d659d717 | 96 | volatile bool trigger_receive = false; |
kenjiArai | 14:f9b4d659d717 | 97 | volatile uint8_t command_continue = 0; |
kenjiArai | 14:f9b4d659d717 | 98 | TX_Content transmit_contents; |
kenjiArai | 15:d7764da3f37c | 99 | uint8_t time_out_cntr = 30; |
kenjiArai | 14:f9b4d659d717 | 100 | volatile bool time_out = false; |
yihui | 0:e910d9bb040f | 101 | |
kenjiArai | 14:f9b4d659d717 | 102 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 103 | // BLE |
kenjiArai | 14:f9b4d659d717 | 104 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params); |
kenjiArai | 14:f9b4d659d717 | 105 | void onDataWritten(const GattWriteCallbackParams *params); |
kenjiArai | 14:f9b4d659d717 | 106 | void periodicCallback(void); |
kenjiArai | 14:f9b4d659d717 | 107 | // Application related |
kenjiArai | 14:f9b4d659d717 | 108 | void action_tx_help(void); |
kenjiArai | 14:f9b4d659d717 | 109 | void action_tx_vdd(void); |
kenjiArai | 14:f9b4d659d717 | 110 | void action_tx_temperature(void); |
kenjiArai | 14:f9b4d659d717 | 111 | void action_tx_pwrup(void); |
kenjiArai | 14:f9b4d659d717 | 112 | void action_tx_pwrdwn(void); |
kenjiArai | 14:f9b4d659d717 | 113 | void fill_space_n(uint8_t *bf, uint8_t n); |
kenjiArai | 14:f9b4d659d717 | 114 | void Update_Values(void); |
kenjiArai | 14:f9b4d659d717 | 115 | // Interrupt related |
kenjiArai | 14:f9b4d659d717 | 116 | void action_tx_quit(void); |
kenjiArai | 14:f9b4d659d717 | 117 | void interrupt_by_sw(void); |
yihui | 0:e910d9bb040f | 118 | |
kenjiArai | 14:f9b4d659d717 | 119 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 120 | // Control Program |
kenjiArai | 14:f9b4d659d717 | 121 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 14:f9b4d659d717 | 122 | int main(void){ |
kenjiArai | 15:d7764da3f37c | 123 | // disable_cpu_functions(); // Disable unneeded CPU functions |
kenjiArai | 14:f9b4d659d717 | 124 | myled = 1; |
Rohit Grover |
2:e060367b9024 | 125 | ticker.attach(periodicCallback, 1); |
kenjiArai | 14:f9b4d659d717 | 126 | // Interrupt by switch |
kenjiArai | 14:f9b4d659d717 | 127 | wake_up_sw.fall(&interrupt_by_sw); |
kenjiArai | 14:f9b4d659d717 | 128 | DEBUG("Initialising the nRF51822\r\n"); |
Rohit Grover |
2:e060367b9024 | 129 | ble.init(); |
kenjiArai | 14:f9b4d659d717 | 130 | //ble.setDeviceName((const uint8_t *)deviceName); |
Rohit Grover |
2:e060367b9024 | 131 | ble.onDisconnection(disconnectionCallback); |
Rohit Grover |
2:e060367b9024 | 132 | ble.onDataWritten(onDataWritten); |
Rohit Grover |
2:e060367b9024 | 133 | /* setup advertising */ |
Rohit Grover |
2:e060367b9024 | 134 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
Rohit Grover |
2:e060367b9024 | 135 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
Rohit Grover |
2:e060367b9024 | 136 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
kenjiArai | 14:f9b4d659d717 | 137 | (const uint8_t *)deviceName, |
kenjiArai | 14:f9b4d659d717 | 138 | strlen(deviceName) |
kenjiArai | 14:f9b4d659d717 | 139 | ); |
Rohit Grover |
2:e060367b9024 | 140 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
kenjiArai | 14:f9b4d659d717 | 141 | (const uint8_t *)UARTServiceUUID_reversed, |
kenjiArai | 14:f9b4d659d717 | 142 | sizeof(UARTServiceUUID_reversed) |
kenjiArai | 14:f9b4d659d717 | 143 | ); |
kenjiArai | 14:f9b4d659d717 | 144 | // Power |
kenjiArai | 14:f9b4d659d717 | 145 | #if HIGH_PWR |
kenjiArai | 14:f9b4d659d717 | 146 | pwr_selection = 7; |
kenjiArai | 14:f9b4d659d717 | 147 | #else |
kenjiArai | 14:f9b4d659d717 | 148 | pwr_selection = 0; |
kenjiArai | 14:f9b4d659d717 | 149 | #endif |
kenjiArai | 14:f9b4d659d717 | 150 | ble.gap().setTxPower(pwr_range[pwr_selection]); |
kenjiArai | 14:f9b4d659d717 | 151 | // Advertize Interval |
rgrover1 | 12:33153cf38631 | 152 | ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */ |
kenjiArai | 14:f9b4d659d717 | 153 | // Start |
Rohit Grover |
2:e060367b9024 | 154 | ble.startAdvertising(); |
rgrover1 | 6:e0fc9072e853 | 155 | UARTService uartService(ble); |
rgrover1 | 6:e0fc9072e853 | 156 | uartServicePtr = &uartService; |
kenjiArai | 14:f9b4d659d717 | 157 | while(true){ |
kenjiArai | 14:f9b4d659d717 | 158 | if (time_out){ |
kenjiArai | 14:f9b4d659d717 | 159 | myled = 0; |
kenjiArai | 15:d7764da3f37c | 160 | wakeup.set_and_wait(30); |
kenjiArai | 14:f9b4d659d717 | 161 | while(true){ // never come here but just in case |
kenjiArai | 14:f9b4d659d717 | 162 | deepsleep(); |
kenjiArai | 14:f9b4d659d717 | 163 | } |
kenjiArai | 14:f9b4d659d717 | 164 | } |
kenjiArai | 14:f9b4d659d717 | 165 | if (trigger_transmit){ |
kenjiArai | 14:f9b4d659d717 | 166 | trigger_transmit = false; |
kenjiArai | 14:f9b4d659d717 | 167 | switch(transmit_contents){ |
kenjiArai | 14:f9b4d659d717 | 168 | case TX_VDD: |
kenjiArai | 14:f9b4d659d717 | 169 | action_tx_vdd(); |
kenjiArai | 14:f9b4d659d717 | 170 | break; |
kenjiArai | 14:f9b4d659d717 | 171 | case TX_TEMP: |
kenjiArai | 14:f9b4d659d717 | 172 | action_tx_temperature(); |
kenjiArai | 14:f9b4d659d717 | 173 | break; |
kenjiArai | 14:f9b4d659d717 | 174 | case TX_QUIT: |
kenjiArai | 14:f9b4d659d717 | 175 | action_tx_quit(); |
kenjiArai | 14:f9b4d659d717 | 176 | break; |
kenjiArai | 14:f9b4d659d717 | 177 | case TX_PWR_UP: |
kenjiArai | 14:f9b4d659d717 | 178 | action_tx_pwrup(); |
kenjiArai | 14:f9b4d659d717 | 179 | break; |
kenjiArai | 14:f9b4d659d717 | 180 | case TX_PWR_DWN: |
kenjiArai | 14:f9b4d659d717 | 181 | action_tx_pwrdwn(); |
kenjiArai | 14:f9b4d659d717 | 182 | break; |
kenjiArai | 14:f9b4d659d717 | 183 | case TX_HELP: |
kenjiArai | 14:f9b4d659d717 | 184 | action_tx_help(); |
kenjiArai | 14:f9b4d659d717 | 185 | break; |
kenjiArai | 14:f9b4d659d717 | 186 | default: |
kenjiArai | 14:f9b4d659d717 | 187 | break; |
kenjiArai | 14:f9b4d659d717 | 188 | } |
kenjiArai | 14:f9b4d659d717 | 189 | } else { |
kenjiArai | 14:f9b4d659d717 | 190 | myled = !myled; |
kenjiArai | 14:f9b4d659d717 | 191 | ble.waitForEvent(); |
kenjiArai | 14:f9b4d659d717 | 192 | } |
kenjiArai | 14:f9b4d659d717 | 193 | } |
kenjiArai | 14:f9b4d659d717 | 194 | } |
yihui | 0:e910d9bb040f | 195 | |
kenjiArai | 15:d7764da3f37c | 196 | void led_control(float t){ |
kenjiArai | 15:d7764da3f37c | 197 | myled = !myled; |
kenjiArai | 15:d7764da3f37c | 198 | wait(t); |
kenjiArai | 15:d7764da3f37c | 199 | } |
kenjiArai | 15:d7764da3f37c | 200 | |
kenjiArai | 14:f9b4d659d717 | 201 | void onDataWritten(const GattWriteCallbackParams *params){ |
kenjiArai | 14:f9b4d659d717 | 202 | uint8_t buf[TXRX_BUF_LEN]; |
kenjiArai | 14:f9b4d659d717 | 203 | uint16_t bytesRead; |
kenjiArai | 14:f9b4d659d717 | 204 | |
kenjiArai | 14:f9b4d659d717 | 205 | if ((uartServicePtr != NULL) && |
kenjiArai | 14:f9b4d659d717 | 206 | (params->handle == uartServicePtr->getTXCharacteristicHandle())) |
kenjiArai | 14:f9b4d659d717 | 207 | { |
kenjiArai | 14:f9b4d659d717 | 208 | strcpy((char *)buf, (const char *)params->data); |
kenjiArai | 14:f9b4d659d717 | 209 | bytesRead = params->len; |
kenjiArai | 14:f9b4d659d717 | 210 | switch (buf[0]){ |
kenjiArai | 14:f9b4d659d717 | 211 | case 'v': |
kenjiArai | 14:f9b4d659d717 | 212 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 213 | transmit_contents = TX_VDD; |
kenjiArai | 14:f9b4d659d717 | 214 | break; |
kenjiArai | 14:f9b4d659d717 | 215 | case 't': |
kenjiArai | 14:f9b4d659d717 | 216 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 217 | transmit_contents = TX_TEMP; |
kenjiArai | 14:f9b4d659d717 | 218 | break; |
kenjiArai | 14:f9b4d659d717 | 219 | case 'u': |
kenjiArai | 14:f9b4d659d717 | 220 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 221 | transmit_contents = TX_PWR_UP; |
kenjiArai | 14:f9b4d659d717 | 222 | break; |
kenjiArai | 14:f9b4d659d717 | 223 | case 'd': |
kenjiArai | 14:f9b4d659d717 | 224 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 225 | transmit_contents = TX_PWR_DWN; |
kenjiArai | 14:f9b4d659d717 | 226 | break; |
kenjiArai | 14:f9b4d659d717 | 227 | case 'q': |
kenjiArai | 14:f9b4d659d717 | 228 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 229 | transmit_contents = TX_QUIT; |
kenjiArai | 14:f9b4d659d717 | 230 | break; |
kenjiArai | 14:f9b4d659d717 | 231 | case 'h': |
kenjiArai | 14:f9b4d659d717 | 232 | case '?': |
kenjiArai | 14:f9b4d659d717 | 233 | trigger_transmit = true; |
kenjiArai | 14:f9b4d659d717 | 234 | transmit_contents = TX_HELP; |
kenjiArai | 14:f9b4d659d717 | 235 | break; |
kenjiArai | 14:f9b4d659d717 | 236 | default: |
kenjiArai | 14:f9b4d659d717 | 237 | break; |
kenjiArai | 14:f9b4d659d717 | 238 | } |
kenjiArai | 14:f9b4d659d717 | 239 | fill_space_n(buf, bytesRead); |
kenjiArai | 14:f9b4d659d717 | 240 | DEBUG("RX_data\r\n"); |
kenjiArai | 14:f9b4d659d717 | 241 | DEBUG("Length: %d\r\n", bytesRead); |
kenjiArai | 14:f9b4d659d717 | 242 | DEBUG("Data: "); |
kenjiArai | 14:f9b4d659d717 | 243 | DEBUG("%s", buf); |
kenjiArai | 14:f9b4d659d717 | 244 | DEBUG("\r\n"); |
yihui | 0:e910d9bb040f | 245 | } |
yihui | 0:e910d9bb040f | 246 | } |
kenjiArai | 14:f9b4d659d717 | 247 | |
kenjiArai | 14:f9b4d659d717 | 248 | void action_tx_help(){ |
kenjiArai | 14:f9b4d659d717 | 249 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 250 | sprintf((char *)tx_buf,"?:help by JH1PJL"); |
kenjiArai | 14:f9b4d659d717 | 251 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 252 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 253 | wait(0.1); |
kenjiArai | 14:f9b4d659d717 | 254 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 255 | sprintf((char *)tx_buf,"v:vdd"); |
kenjiArai | 14:f9b4d659d717 | 256 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 257 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 258 | wait(0.1); |
kenjiArai | 14:f9b4d659d717 | 259 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 260 | sprintf((char *)tx_buf,"t:temperature"); |
kenjiArai | 14:f9b4d659d717 | 261 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 262 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 263 | wait(0.1); |
kenjiArai | 14:f9b4d659d717 | 264 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 265 | sprintf((char *)tx_buf,"u:power up"); |
kenjiArai | 14:f9b4d659d717 | 266 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 267 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 268 | wait(0.1); |
kenjiArai | 14:f9b4d659d717 | 269 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 270 | sprintf((char *)tx_buf,"d:power down"); |
kenjiArai | 14:f9b4d659d717 | 271 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 272 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 273 | wait(0.1); |
kenjiArai | 14:f9b4d659d717 | 274 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 275 | sprintf((char *)tx_buf,"q(0x71):quit/sleep"); |
kenjiArai | 14:f9b4d659d717 | 276 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 277 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 278 | } |
kenjiArai | 14:f9b4d659d717 | 279 | |
kenjiArai | 14:f9b4d659d717 | 280 | void action_tx_pwrup(){ |
kenjiArai | 14:f9b4d659d717 | 281 | if (pwr_selection != 0){ |
kenjiArai | 14:f9b4d659d717 | 282 | --pwr_selection; |
kenjiArai | 14:f9b4d659d717 | 283 | } |
kenjiArai | 14:f9b4d659d717 | 284 | ble.gap().setTxPower(pwr_range[pwr_selection]); |
kenjiArai | 14:f9b4d659d717 | 285 | sprintf((char *)tx_buf,"Pwr:%+ddBm", (4 - (pwr_selection * 4))); |
kenjiArai | 14:f9b4d659d717 | 286 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 287 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 288 | } |
kenjiArai | 14:f9b4d659d717 | 289 | |
kenjiArai | 14:f9b4d659d717 | 290 | void action_tx_pwrdwn(){ |
kenjiArai | 14:f9b4d659d717 | 291 | if (pwr_selection != (PWR_RANG_NO - 1)){ |
kenjiArai | 14:f9b4d659d717 | 292 | ++pwr_selection; |
kenjiArai | 14:f9b4d659d717 | 293 | } |
kenjiArai | 14:f9b4d659d717 | 294 | ble.gap().setTxPower(pwr_range[pwr_selection]); |
kenjiArai | 14:f9b4d659d717 | 295 | sprintf((char *)tx_buf,"Pwr:%+ddBm", (4 - (pwr_selection * 4))); |
kenjiArai | 14:f9b4d659d717 | 296 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 297 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 298 | } |
kenjiArai | 14:f9b4d659d717 | 299 | |
kenjiArai | 14:f9b4d659d717 | 300 | void action_tx_vdd(){ |
kenjiArai | 14:f9b4d659d717 | 301 | sprintf((char *)tx_buf,"Vdd:%3.2fV", vdd.read_real_value()); |
kenjiArai | 14:f9b4d659d717 | 302 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 303 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 304 | } |
kenjiArai | 14:f9b4d659d717 | 305 | |
kenjiArai | 14:f9b4d659d717 | 306 | void action_tx_temperature(){ |
kenjiArai | 14:f9b4d659d717 | 307 | int32_t p_temp; |
kenjiArai | 14:f9b4d659d717 | 308 | float temperature; |
kenjiArai | 14:f9b4d659d717 | 309 | |
kenjiArai | 14:f9b4d659d717 | 310 | // Update a temperature (inside nRF51822 chip) |
kenjiArai | 14:f9b4d659d717 | 311 | sd_temp_get(&p_temp); |
kenjiArai | 14:f9b4d659d717 | 312 | // -16.0f is offset vale for chip die temp to ambient temp (depend on your board) |
kenjiArai | 14:f9b4d659d717 | 313 | temperature = float(p_temp) / 4; // Original = float(p_temp)/4.0f - 16.0f; |
kenjiArai | 14:f9b4d659d717 | 314 | sprintf((char *)tx_buf,"T:%+4.1fdC", temperature); |
kenjiArai | 14:f9b4d659d717 | 315 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 316 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 317 | } |
kenjiArai | 14:f9b4d659d717 | 318 | |
kenjiArai | 14:f9b4d659d717 | 319 | void action_tx_quit(){ |
kenjiArai | 14:f9b4d659d717 | 320 | ticker.detach(); |
kenjiArai | 14:f9b4d659d717 | 321 | // 12345678901234567890 |
kenjiArai | 14:f9b4d659d717 | 322 | sprintf((char *)tx_buf,"Terminated the BLE"); |
kenjiArai | 14:f9b4d659d717 | 323 | tx_len = strlen((const char *)tx_buf); |
kenjiArai | 14:f9b4d659d717 | 324 | Update_Values(); |
kenjiArai | 14:f9b4d659d717 | 325 | myled = 0; |
kenjiArai | 14:f9b4d659d717 | 326 | wait(1.0); |
kenjiArai | 15:d7764da3f37c | 327 | wakeup.set_and_wait(30); |
kenjiArai | 14:f9b4d659d717 | 328 | while(true){ // never come here but just in case |
kenjiArai | 14:f9b4d659d717 | 329 | deepsleep(); |
kenjiArai | 14:f9b4d659d717 | 330 | } |
kenjiArai | 14:f9b4d659d717 | 331 | } |
kenjiArai | 14:f9b4d659d717 | 332 | |
kenjiArai | 14:f9b4d659d717 | 333 | void interrupt_by_sw(){ // Go to sleep |
kenjiArai | 14:f9b4d659d717 | 334 | NVIC_SystemReset(); |
kenjiArai | 14:f9b4d659d717 | 335 | // Not come here (Just in case) |
kenjiArai | 14:f9b4d659d717 | 336 | deepsleep(); |
kenjiArai | 14:f9b4d659d717 | 337 | } |
kenjiArai | 14:f9b4d659d717 | 338 | |
kenjiArai | 14:f9b4d659d717 | 339 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){ |
kenjiArai | 14:f9b4d659d717 | 340 | DEBUG("Disconnected!\r\n"); |
kenjiArai | 14:f9b4d659d717 | 341 | DEBUG("Restarting the advertising process\r\n"); |
kenjiArai | 14:f9b4d659d717 | 342 | ble.startAdvertising(); |
kenjiArai | 14:f9b4d659d717 | 343 | } |
kenjiArai | 14:f9b4d659d717 | 344 | |
kenjiArai | 14:f9b4d659d717 | 345 | void periodicCallback(void){ |
kenjiArai | 14:f9b4d659d717 | 346 | if (--time_out_cntr == 0){ |
kenjiArai | 14:f9b4d659d717 | 347 | time_out = true; |
kenjiArai | 14:f9b4d659d717 | 348 | } |
kenjiArai | 14:f9b4d659d717 | 349 | } |
kenjiArai | 14:f9b4d659d717 | 350 | |
kenjiArai | 14:f9b4d659d717 | 351 | void fill_space_n(uint8_t *bf, uint8_t n){ |
kenjiArai | 14:f9b4d659d717 | 352 | bf += n; |
kenjiArai | 14:f9b4d659d717 | 353 | for (uint8_t i = n; i <= 20; bf++, i++){ |
kenjiArai | 14:f9b4d659d717 | 354 | *bf = ' '; |
kenjiArai | 14:f9b4d659d717 | 355 | } |
kenjiArai | 14:f9b4d659d717 | 356 | *bf = '.'; |
kenjiArai | 14:f9b4d659d717 | 357 | *(bf + 1) = 0; |
kenjiArai | 14:f9b4d659d717 | 358 | } |
kenjiArai | 14:f9b4d659d717 | 359 | |
kenjiArai | 14:f9b4d659d717 | 360 | void Update_Values(void){ |
kenjiArai | 15:d7764da3f37c | 361 | ble.updateCharacteristicValue( |
kenjiArai | 15:d7764da3f37c | 362 | uartServicePtr->getRXCharacteristicHandle(), |
kenjiArai | 15:d7764da3f37c | 363 | tx_buf, |
kenjiArai | 15:d7764da3f37c | 364 | tx_len |
kenjiArai | 15:d7764da3f37c | 365 | ); |
kenjiArai | 14:f9b4d659d717 | 366 | DEBUG("TX_data: %s\r\n", tx_buf); |
kenjiArai | 14:f9b4d659d717 | 367 | DEBUG("Length: %d\r\n", tx_len); |
kenjiArai | 14:f9b4d659d717 | 368 | tx_len = 0; |
kenjiArai | 14:f9b4d659d717 | 369 | } |