to cai
Dependencies: BLE_API nRF51822
Fork of BLE_NODE_TEST by
main.cpp@10:808a025c9b4f, 2016-08-24 (annotated)
- Committer:
- wodenageshen
- Date:
- Wed Aug 24 07:01:59 2016 +0000
- Revision:
- 10:808a025c9b4f
- Parent:
- 9:05f0b5a3a70a
to cai
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 0:e910d9bb040f | 1 | /* mbed Microcontroller Library |
wodenageshen | 10:808a025c9b4f | 2 | Copyright (c) 2006-2013 ARM Limited |
wodenageshen | 10:808a025c9b4f | 3 | |
wodenageshen | 10:808a025c9b4f | 4 | Licensed under the Apache License, Version 2.0 (the "License"); |
wodenageshen | 10:808a025c9b4f | 5 | you may not use this file except in compliance with the License. |
wodenageshen | 10:808a025c9b4f | 6 | You may obtain a copy of the License at |
wodenageshen | 10:808a025c9b4f | 7 | |
wodenageshen | 10:808a025c9b4f | 8 | http://www.apache.org/licenses/LICENSE-2.0 |
wodenageshen | 10:808a025c9b4f | 9 | |
wodenageshen | 10:808a025c9b4f | 10 | Unless required by applicable law or agreed to in writing, software |
wodenageshen | 10:808a025c9b4f | 11 | distributed under the License is distributed on an "AS IS" BASIS, |
wodenageshen | 10:808a025c9b4f | 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
wodenageshen | 10:808a025c9b4f | 13 | See the License for the specific language governing permissions and |
wodenageshen | 10:808a025c9b4f | 14 | limitations under the License. |
wodenageshen | 10:808a025c9b4f | 15 | */ |
yihui | 0:e910d9bb040f | 16 | |
yihui | 0:e910d9bb040f | 17 | #include "mbed.h" |
Rohit Grover |
2:e060367b9024 | 18 | #include "BLEDevice.h" |
yihui | 9:05f0b5a3a70a | 19 | #include "DFUService.h" |
rgrover1 | 6:e0fc9072e853 | 20 | #include "UARTService.h" |
yihui | 9:05f0b5a3a70a | 21 | #include "nrf_delay.h" |
wodenageshen | 10:808a025c9b4f | 22 | //#include "battery.h" |
yihui | 9:05f0b5a3a70a | 23 | #define DEBUG 0 |
yihui | 9:05f0b5a3a70a | 24 | #define LOG(...) |
yihui | 9:05f0b5a3a70a | 25 | |
wodenageshen | 10:808a025c9b4f | 26 | DigitalOut charge(p9); |
wodenageshen | 10:808a025c9b4f | 27 | DigitalOut charge_led(p28); |
wodenageshen | 10:808a025c9b4f | 28 | DigitalOut v3v3_led(p29); |
wodenageshen | 10:808a025c9b4f | 29 | DigitalOut sleep_led(p30); |
wodenageshen | 10:808a025c9b4f | 30 | AnalogIn vol_3v3(p2); |
wodenageshen | 10:808a025c9b4f | 31 | //AnalogIn vol_5v(p0); |
wodenageshen | 10:808a025c9b4f | 32 | AnalogIn vol_bat(p1); |
wodenageshen | 10:808a025c9b4f | 33 | AnalogIn sense_current_5v(p4); |
wodenageshen | 10:808a025c9b4f | 34 | AnalogIn sense_current_bat(p3); |
wodenageshen | 10:808a025c9b4f | 35 | |
yihui | 0:e910d9bb040f | 36 | |
Rohit Grover |
2:e060367b9024 | 37 | BLEDevice ble; |
yihui | 9:05f0b5a3a70a | 38 | UARTService *uartServicePtr; |
yihui | 9:05f0b5a3a70a | 39 | Ticker ticker; |
yihui | 9:05f0b5a3a70a | 40 | |
yihui | 9:05f0b5a3a70a | 41 | static const uint8_t SIZEOF_TX_RX_BUFFER = 32; |
yihui | 9:05f0b5a3a70a | 42 | uint8_t rxPayload[SIZEOF_TX_RX_BUFFER] = {0,}; |
yihui | 9:05f0b5a3a70a | 43 | |
rgrover1 | 5:4bc41267a03a | 44 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
yihui | 0:e910d9bb040f | 45 | { |
wodenageshen | 10:808a025c9b4f | 46 | LOG("Disconnected!\n"); |
wodenageshen | 10:808a025c9b4f | 47 | LOG("Restarting the advertising process\n"); |
wodenageshen | 10:808a025c9b4f | 48 | ble.startAdvertising(); |
Rohit Grover |
2:e060367b9024 | 49 | } |
yihui | 0:e910d9bb040f | 50 | |
rgrover1 | 6:e0fc9072e853 | 51 | void onDataWritten(const GattCharacteristicWriteCBParams *params) |
yihui | 0:e910d9bb040f | 52 | { |
wodenageshen | 10:808a025c9b4f | 53 | if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { |
wodenageshen | 10:808a025c9b4f | 54 | uint16_t bytesRead = params->len; |
wodenageshen | 10:808a025c9b4f | 55 | LOG("received %u bytes\n\r", bytesRead); |
wodenageshen | 10:808a025c9b4f | 56 | if (bytesRead < sizeof(rxPayload)) { |
wodenageshen | 10:808a025c9b4f | 57 | memcpy(rxPayload, params->data, bytesRead); |
wodenageshen | 10:808a025c9b4f | 58 | rxPayload[bytesRead] = '\0'; |
yihui | 0:e910d9bb040f | 59 | } |
wodenageshen | 10:808a025c9b4f | 60 | |
wodenageshen | 10:808a025c9b4f | 61 | LOG("%s\n", (char *)rxPayload); |
wodenageshen | 10:808a025c9b4f | 62 | |
wodenageshen | 10:808a025c9b4f | 63 | } |
Rohit Grover |
2:e060367b9024 | 64 | } |
yihui | 0:e910d9bb040f | 65 | |
yihui | 9:05f0b5a3a70a | 66 | void tick(void) |
Rohit Grover |
2:e060367b9024 | 67 | { |
wodenageshen | 10:808a025c9b4f | 68 | float v3v3; |
wodenageshen | 10:808a025c9b4f | 69 | float vbat; |
wodenageshen | 10:808a025c9b4f | 70 | float bat_current = 0; |
wodenageshen | 10:808a025c9b4f | 71 | float current_5v = 0; |
wodenageshen | 10:808a025c9b4f | 72 | /////////////bat read///////////// |
wodenageshen | 10:808a025c9b4f | 73 | |
wodenageshen | 10:808a025c9b4f | 74 | //vbat = vol_bat.read() * 19.8 * 1.13; //for wristBand/////////// |
wodenageshen | 10:808a025c9b4f | 75 | vbat = vol_bat.read() * 19.8*0.978 ; // for smartball////////// |
wodenageshen | 10:808a025c9b4f | 76 | uartServicePtr->printf("bat voltage is :%f\n", vbat); |
wodenageshen | 10:808a025c9b4f | 77 | //////////test 3v3////////////// |
wodenageshen | 10:808a025c9b4f | 78 | v3v3 = vol_3v3.read() * 19.8; |
wodenageshen | 10:808a025c9b4f | 79 | if (v3v3 > 3.14 && v3v3 < 3.47) |
wodenageshen | 10:808a025c9b4f | 80 | { |
wodenageshen | 10:808a025c9b4f | 81 | v3v3_led = 1; |
wodenageshen | 10:808a025c9b4f | 82 | uartServicePtr->printf("3v3 test ok:%f\n", v3v3); |
wodenageshen | 10:808a025c9b4f | 83 | } |
wodenageshen | 10:808a025c9b4f | 84 | else |
wodenageshen | 10:808a025c9b4f | 85 | { |
wodenageshen | 10:808a025c9b4f | 86 | v3v3_led = 0; |
wodenageshen | 10:808a025c9b4f | 87 | uartServicePtr->printf("3v3 test fail:%f\n", v3v3); |
wodenageshen | 10:808a025c9b4f | 88 | } |
wodenageshen | 10:808a025c9b4f | 89 | ///////////sleep test/////////// |
wodenageshen | 10:808a025c9b4f | 90 | |
wodenageshen | 10:808a025c9b4f | 91 | for(int n=0;n<50;n++) |
wodenageshen | 10:808a025c9b4f | 92 | { |
wodenageshen | 10:808a025c9b4f | 93 | |
wodenageshen | 10:808a025c9b4f | 94 | bat_current = bat_current+sense_current_bat.read() * 0.1534; |
wodenageshen | 10:808a025c9b4f | 95 | wait(0.01); |
wodenageshen | 10:808a025c9b4f | 96 | } |
wodenageshen | 10:808a025c9b4f | 97 | bat_current/=50; |
wodenageshen | 10:808a025c9b4f | 98 | bat_current*=0.977; //////////Correction value for smartball////////// |
wodenageshen | 10:808a025c9b4f | 99 | //bat_current*=0.955; //////////Correction value for wristband////////// |
wodenageshen | 10:808a025c9b4f | 100 | if (bat_current > 0.05 && bat_current < 0.15) |
wodenageshen | 10:808a025c9b4f | 101 | { |
wodenageshen | 10:808a025c9b4f | 102 | sleep_led = 1; |
wodenageshen | 10:808a025c9b4f | 103 | } |
wodenageshen | 10:808a025c9b4f | 104 | uartServicePtr->printf("bat pwred current:%f\n", bat_current); |
wodenageshen | 10:808a025c9b4f | 105 | //////////5v curren test////////////////// |
wodenageshen | 10:808a025c9b4f | 106 | |
wodenageshen | 10:808a025c9b4f | 107 | current_5v = sense_current_5v.read() * 337.5; |
wodenageshen | 10:808a025c9b4f | 108 | // current_5v*=0.91; //////////Correction value for wristband////////// |
wodenageshen | 10:808a025c9b4f | 109 | current_5v*=0.89; //////////Correction value for smartball////////// |
wodenageshen | 10:808a025c9b4f | 110 | if (current_5v > 50 && current_5v < 230) |
wodenageshen | 10:808a025c9b4f | 111 | { |
wodenageshen | 10:808a025c9b4f | 112 | charge_led = 1; |
wodenageshen | 10:808a025c9b4f | 113 | uartServicePtr->printf("charge test ok \n"); |
wodenageshen | 10:808a025c9b4f | 114 | } |
wodenageshen | 10:808a025c9b4f | 115 | uartServicePtr->printf("5v charge current:%f\n", current_5v); |
wodenageshen | 10:808a025c9b4f | 116 | //////////push check/////////// |
wodenageshen | 10:808a025c9b4f | 117 | if (bat_current < 0.03 && current_5v < 1) |
wodenageshen | 10:808a025c9b4f | 118 | { |
wodenageshen | 10:808a025c9b4f | 119 | charge_led = 0; |
wodenageshen | 10:808a025c9b4f | 120 | v3v3_led = 0; |
wodenageshen | 10:808a025c9b4f | 121 | sleep_led = 0; |
wodenageshen | 10:808a025c9b4f | 122 | } |
wodenageshen | 10:808a025c9b4f | 123 | |
yihui | 9:05f0b5a3a70a | 124 | } |
yihui | 9:05f0b5a3a70a | 125 | |
wodenageshen | 10:808a025c9b4f | 126 | |
yihui | 0:e910d9bb040f | 127 | |
yihui | 0:e910d9bb040f | 128 | int main(void) |
yihui | 0:e910d9bb040f | 129 | { |
wodenageshen | 10:808a025c9b4f | 130 | Serial pc(p8, p7); |
wodenageshen | 10:808a025c9b4f | 131 | pc.baud(115200); |
wodenageshen | 10:808a025c9b4f | 132 | char line_buffer[32] = {0}; |
wodenageshen | 10:808a025c9b4f | 133 | const char *line_expected1 = "charge_1"; |
wodenageshen | 10:808a025c9b4f | 134 | const char *line_expected2 = "charge_0"; |
wodenageshen | 10:808a025c9b4f | 135 | charge = 0; |
wodenageshen | 10:808a025c9b4f | 136 | charge_led = 0; |
wodenageshen | 10:808a025c9b4f | 137 | v3v3_led = 0; |
wodenageshen | 10:808a025c9b4f | 138 | sleep_led = 0; |
wodenageshen | 10:808a025c9b4f | 139 | LOG("Initialising the nRF51822\n"); |
wodenageshen | 10:808a025c9b4f | 140 | ble.init(); |
wodenageshen | 10:808a025c9b4f | 141 | ble.onDisconnection(disconnectionCallback); |
wodenageshen | 10:808a025c9b4f | 142 | ble.onDataWritten(onDataWritten); |
yihui | 0:e910d9bb040f | 143 | |
wodenageshen | 10:808a025c9b4f | 144 | /* setup advertising */ |
wodenageshen | 10:808a025c9b4f | 145 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
wodenageshen | 10:808a025c9b4f | 146 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
wodenageshen | 10:808a025c9b4f | 147 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
wodenageshen | 10:808a025c9b4f | 148 | //(const uint8_t *)"WristBand Test", sizeof("WristBand Test")); |
wodenageshen | 10:808a025c9b4f | 149 | (const uint8_t *)"SmartBall Test", sizeof("SmartBall Test")); |
wodenageshen | 10:808a025c9b4f | 150 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
wodenageshen | 10:808a025c9b4f | 151 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
yihui | 0:e910d9bb040f | 152 | |
wodenageshen | 10:808a025c9b4f | 153 | //DFUService dfu(ble); |
yihui | 0:e910d9bb040f | 154 | |
wodenageshen | 10:808a025c9b4f | 155 | UARTService uartService(ble); |
wodenageshen | 10:808a025c9b4f | 156 | uartService.retargetStdout(); |
wodenageshen | 10:808a025c9b4f | 157 | uartServicePtr = &uartService; |
wodenageshen | 10:808a025c9b4f | 158 | |
wodenageshen | 10:808a025c9b4f | 159 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
wodenageshen | 10:808a025c9b4f | 160 | ble.startAdvertising(); |
wodenageshen | 10:808a025c9b4f | 161 | ticker.attach(tick, 3); |
yihui | 0:e910d9bb040f | 162 | |
wodenageshen | 10:808a025c9b4f | 163 | while (1) { |
wodenageshen | 10:808a025c9b4f | 164 | // pc.puts("TESTING\r\n"); |
wodenageshen | 10:808a025c9b4f | 165 | pc.scanf("%s", line_buffer); |
wodenageshen | 10:808a025c9b4f | 166 | if (0 == strcmp(line_buffer, line_expected1)) { |
wodenageshen | 10:808a025c9b4f | 167 | // line_matched = true; |
wodenageshen | 10:808a025c9b4f | 168 | charge = 1; |
wodenageshen | 10:808a025c9b4f | 169 | memset(line_buffer, 32, 0); //line_buffer[32] = {0}; |
wodenageshen | 10:808a025c9b4f | 170 | // break; |
yihui | 9:05f0b5a3a70a | 171 | |
yihui | 0:e910d9bb040f | 172 | } |
wodenageshen | 10:808a025c9b4f | 173 | |
wodenageshen | 10:808a025c9b4f | 174 | if (0 == strcmp(line_buffer, line_expected2)) { |
wodenageshen | 10:808a025c9b4f | 175 | // line_matched = true; |
wodenageshen | 10:808a025c9b4f | 176 | charge = 0; |
wodenageshen | 10:808a025c9b4f | 177 | memset(line_buffer, 32, 0); |
wodenageshen | 10:808a025c9b4f | 178 | // break; |
wodenageshen | 10:808a025c9b4f | 179 | } |
wodenageshen | 10:808a025c9b4f | 180 | |
wodenageshen | 10:808a025c9b4f | 181 | } |
wodenageshen | 10:808a025c9b4f | 182 | |
yihui | 0:e910d9bb040f | 183 | } |
yihui | 9:05f0b5a3a70a | 184 |