to cai

Dependencies:   BLE_API nRF51822

Fork of BLE_NODE_TEST by Yihui Xiong

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?

UserRevisionLine numberNew 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