App for BLE Nano to monitor the power consumption for a specific location, by intercepting the led flashes of a standard power meter. It counts and log the flashes for each second. It works with RedBear App for smart phone (Simple Chat App).

Dependencies:   BLE_API lib_mma8451q mbed nRF51822

Fork of nRF51822_DataLogger_with_Chat by Valentin Tanasa

Committer:
tanasaro10
Date:
Sun Aug 14 14:57:09 2016 +0000
Revision:
12:27e9c3db28b9
Parent:
11:baafa4f7a15e
First release for counting and logging power impulses of a power meter. Useful to track the power consumption for a specific location.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RedBearLab 1:1c058e553423 1 /*
RedBearLab 0:cffe8ac1bdf0 2
RedBearLab 1:1c058e553423 3 Copyright (c) 2012-2014 RedBearLab
RedBearLab 1:1c058e553423 4
tanasaro10 9:303d3628986a 5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tanasaro10 9:303d3628986a 6 and associated documentation files (the "Software"), to deal in the Software without restriction,
tanasaro10 9:303d3628986a 7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
tanasaro10 9:303d3628986a 8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
RedBearLab 1:1c058e553423 9 subject to the following conditions:
RedBearLab 1:1c058e553423 10 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
RedBearLab 1:1c058e553423 11
tanasaro10 9:303d3628986a 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
tanasaro10 9:303d3628986a 13 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
tanasaro10 9:303d3628986a 14 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
tanasaro10 9:303d3628986a 15 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
RedBearLab 1:1c058e553423 16 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
RedBearLab 1:1c058e553423 17
RedBearLab 1:1c058e553423 18 */
RedBearLab 1:1c058e553423 19
RedBearLab 1:1c058e553423 20 /*
RedBearLab 1:1c058e553423 21 * The application works with the BLEController iOS/Android App.
RedBearLab 1:1c058e553423 22 * Type something from the Terminal to send
RedBearLab 1:1c058e553423 23 * to the BLEController App or vice verse.
RedBearLab 1:1c058e553423 24 * Characteristics received from App will print on Terminal.
tanasaro10 9:303d3628986a 25 * Read read_me.md file for more informations about the extended feature
RedBearLab 1:1c058e553423 26 */
tanasaro10 9:303d3628986a 27
tanasaro10 9:303d3628986a 28
RedBearLab 2:4b66b69c7ecb 29 #include "ble/BLE.h"
tanasaro10 11:baafa4f7a15e 30 //#include "LowPowerTicker.h"
tanasaro10 8:f28ad4600b0f 31 #include <myData.h>
tanasaro10 9:303d3628986a 32 #include <Gap.h>
tanasaro10 11:baafa4f7a15e 33 //#include "ble_flash.h"
tanasaro10 9:303d3628986a 34 #include "ble_flash.c"
tanasaro10 12:27e9c3db28b9 35 #include "BatteryService.h"
tanasaro10 12:27e9c3db28b9 36 //#include "DFUService.h"
tanasaro10 12:27e9c3db28b9 37
tanasaro10 12:27e9c3db28b9 38 BLE ble;
tanasaro10 12:27e9c3db28b9 39 //DFUService dfu(ble);
RedBearLab 0:cffe8ac1bdf0 40
RedBearLab 0:cffe8ac1bdf0 41 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
RedBearLab 0:cffe8ac1bdf0 42 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
RedBearLab 0:cffe8ac1bdf0 43 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
RedBearLab 0:cffe8ac1bdf0 44
tanasaro10 9:303d3628986a 45 #define TXRX_BUF_LEN 20 /** For radio message transmission*/
tanasaro10 9:303d3628986a 46
tanasaro10 9:303d3628986a 47 #define MyASSERT(cond , serialpc, errVal) assert_error_app((bool)cond, serialpc, (uint16_t)errVal, __LINE__, __FILE__)
RedBearLab 0:cffe8ac1bdf0 48
RedBearLab 0:cffe8ac1bdf0 49
RedBearLab 0:cffe8ac1bdf0 50 Serial pc(USBTX, USBRX);
RedBearLab 0:cffe8ac1bdf0 51
tanasaro10 12:27e9c3db28b9 52 //uint8_t batteryLevel=100;
tanasaro10 12:27e9c3db28b9 53 uint16_t nr_of_hits = 0;
tanasaro10 12:27e9c3db28b9 54 uint32_t g_nrOfHits=0;
tanasaro10 12:27e9c3db28b9 55 float gmaxV=0,gminV=3,gmedianV=0.18; // Voltage of the PhotoResistorstatic float measure: max, min, median;
tanasaro10 12:27e9c3db28b9 56
tanasaro10 12:27e9c3db28b9 57 bool bTimeReady = false;
RedBearLab 0:cffe8ac1bdf0 58 // The Nordic UART Service
RedBearLab 0:cffe8ac1bdf0 59 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
RedBearLab 0:cffe8ac1bdf0 60 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
RedBearLab 0:cffe8ac1bdf0 61 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
RedBearLab 0:cffe8ac1bdf0 62 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
RedBearLab 0:cffe8ac1bdf0 63
tanasaro10 8:f28ad4600b0f 64 static const int8_t txPower = 0xCD;
tanasaro10 12:27e9c3db28b9 65 //BatteryService *batteryService = NULL;
RedBearLab 0:cffe8ac1bdf0 66
tanasaro10 12:27e9c3db28b9 67 //uint8_t txPayload[TXRX_BUF_LEN] = {0, p28};
tanasaro10 12:27e9c3db28b9 68 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
RedBearLab 0:cffe8ac1bdf0 69 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
RedBearLab 0:cffe8ac1bdf0 70
RedBearLab 0:cffe8ac1bdf0 71 static uint8_t rx_buf[TXRX_BUF_LEN];
RedBearLab 0:cffe8ac1bdf0 72 static uint8_t rx_len=0;
RedBearLab 0:cffe8ac1bdf0 73
tanasaro10 9:303d3628986a 74 static uint32_t gTimeInstant = 1; // TimerTick Resolution, in seconds
tanasaro10 8:f28ad4600b0f 75
tanasaro10 12:27e9c3db28b9 76
tanasaro10 10:c7d53e4e0602 77 bool g_bIsConnected = false;
tanasaro10 9:303d3628986a 78 bool g_bIsAdvertising = false;
tanasaro10 10:c7d53e4e0602 79 bool g_bConnDisabled = false;
tanasaro10 12:27e9c3db28b9 80 bool g_LogActive = false;// g_bAccEnabled=false, g_bCalib = false;
tanasaro10 9:303d3628986a 81 static myDataLog_t g_MyData;
tanasaro10 9:303d3628986a 82 uint8_t g_MyDataIdx=0;
tanasaro10 8:f28ad4600b0f 83
tanasaro10 12:27e9c3db28b9 84
tanasaro10 9:303d3628986a 85 // pins connected for measuring
tanasaro10 12:27e9c3db28b9 86 DigitalOut led(LED1), //redLed(D4);//, accBuzzAlarm(D3), accLEDAlarm(D5);
tanasaro10 12:27e9c3db28b9 87
tanasaro10 12:27e9c3db28b9 88 //uint8_t tempAlarm, accAlarm;
tanasaro10 12:27e9c3db28b9 89
tanasaro10 12:27e9c3db28b9 90 //PwmOut buzzer(D1); // changed from P15
tanasaro10 12:27e9c3db28b9 91 AnalogIn photoVoltage(A5); // photo voltaga measurement
tanasaro10 8:f28ad4600b0f 92
tanasaro10 12:27e9c3db28b9 93 myPayload_t g_currMeasures2; // last measurements
tanasaro10 8:f28ad4600b0f 94
tanasaro10 12:27e9c3db28b9 95 //Timeout timeout_err; // timeout for buzz on error
tanasaro10 12:27e9c3db28b9 96 Ticker periodicActions, doMeasures;
tanasaro10 11:baafa4f7a15e 97 mdatetime_manager_t g_myDateTimeVar;
tanasaro10 12:27e9c3db28b9 98 //uint8_t gBatteryValue=0;
tanasaro10 9:303d3628986a 99 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
RedBearLab 0:cffe8ac1bdf0 100
RedBearLab 0:cffe8ac1bdf0 101 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
tanasaro10 9:303d3628986a 102
RedBearLab 0:cffe8ac1bdf0 103 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
RedBearLab 0:cffe8ac1bdf0 104
RedBearLab 0:cffe8ac1bdf0 105 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
RedBearLab 0:cffe8ac1bdf0 106
tanasaro10 12:27e9c3db28b9 107 void decode(uint8_t * buffer, uint16_t length);
tanasaro10 12:27e9c3db28b9 108
tanasaro10 12:27e9c3db28b9 109 void alarm(){
tanasaro10 12:27e9c3db28b9 110
tanasaro10 12:27e9c3db28b9 111 //accBuzzAlarm = 1;
tanasaro10 12:27e9c3db28b9 112 //accLEDAlarm = 0;
tanasaro10 12:27e9c3db28b9 113 //timeout_err.attach(&at_timeout_err, 2);
tanasaro10 12:27e9c3db28b9 114 }
tanasaro10 12:27e9c3db28b9 115
tanasaro10 9:303d3628986a 116 void sendRadioMsg(const uint8_t* buf, uint16_t length)
tanasaro10 9:303d3628986a 117 {
tanasaro10 9:303d3628986a 118 uint8_t retVal;
tanasaro10 9:303d3628986a 119 retVal = ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, length);
tanasaro10 9:303d3628986a 120 //pc.printf("Err=%d\r\n",retVal);
tanasaro10 9:303d3628986a 121 MyASSERT((retVal!=0),&pc, retVal);
tanasaro10 8:f28ad4600b0f 122 }
tanasaro10 8:f28ad4600b0f 123
RedBearLab 0:cffe8ac1bdf0 124 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
RedBearLab 0:cffe8ac1bdf0 125 {
RedBearLab 0:cffe8ac1bdf0 126 pc.printf("Disconnected \r\n");
tanasaro10 9:303d3628986a 127 g_bIsConnected = false;
tanasaro10 9:303d3628986a 128 g_bIsAdvertising = false;
tanasaro10 10:c7d53e4e0602 129 pc.printf("R: %d\r",reason);
tanasaro10 10:c7d53e4e0602 130 if (reason != 0x16) {
tanasaro10 10:c7d53e4e0602 131 ble.startAdvertising();
tanasaro10 10:c7d53e4e0602 132 g_bIsAdvertising = true;
tanasaro10 10:c7d53e4e0602 133 }
RedBearLab 0:cffe8ac1bdf0 134 }
RedBearLab 0:cffe8ac1bdf0 135
tanasaro10 9:303d3628986a 136 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
tanasaro10 9:303d3628986a 137 {
tanasaro10 9:303d3628986a 138 pc.printf("Connected \r\n");
tanasaro10 9:303d3628986a 139 g_bIsConnected = true;
tanasaro10 9:303d3628986a 140 g_bIsAdvertising = false;
tanasaro10 8:f28ad4600b0f 141 }
tanasaro10 8:f28ad4600b0f 142
tanasaro10 10:c7d53e4e0602 143 void connectionUpdate(connection_update_t option)
tanasaro10 10:c7d53e4e0602 144 {
tanasaro10 10:c7d53e4e0602 145 if (g_bConnDisabled == false) {
tanasaro10 10:c7d53e4e0602 146 switch (option) {
tanasaro10 10:c7d53e4e0602 147 case eStartAdvertising: {
tanasaro10 10:c7d53e4e0602 148 if ((g_bIsConnected == false)&&(g_bIsAdvertising == false)) {
tanasaro10 10:c7d53e4e0602 149 pc.printf("Start Advertising\r");
tanasaro10 10:c7d53e4e0602 150 ble.startAdvertising();
tanasaro10 10:c7d53e4e0602 151 g_bIsAdvertising = true;
tanasaro10 10:c7d53e4e0602 152 }
tanasaro10 10:c7d53e4e0602 153 break;
tanasaro10 9:303d3628986a 154 }
tanasaro10 10:c7d53e4e0602 155 case eStopAdvertising: {
tanasaro10 10:c7d53e4e0602 156 if (g_bIsAdvertising == true) {
tanasaro10 10:c7d53e4e0602 157 pc.printf("Stop Advertising\r");
tanasaro10 10:c7d53e4e0602 158 ble.stopAdvertising();
tanasaro10 10:c7d53e4e0602 159 g_bIsAdvertising = false;
tanasaro10 10:c7d53e4e0602 160 }
tanasaro10 10:c7d53e4e0602 161 break;
tanasaro10 9:303d3628986a 162 }
tanasaro10 10:c7d53e4e0602 163 case eDisconnect: {
tanasaro10 10:c7d53e4e0602 164 if (g_bIsConnected == true) {
tanasaro10 10:c7d53e4e0602 165 pc.printf("Close connection\r");
tanasaro10 10:c7d53e4e0602 166 ble.disconnect((Gap::DisconnectionReason_t)0x12);
tanasaro10 10:c7d53e4e0602 167 } else if (g_bIsAdvertising == true) {
tanasaro10 10:c7d53e4e0602 168 pc.printf("Stop Advertising\r");
tanasaro10 10:c7d53e4e0602 169 ble.stopAdvertising();
tanasaro10 10:c7d53e4e0602 170 g_bIsAdvertising = false;
tanasaro10 10:c7d53e4e0602 171 }
tanasaro10 10:c7d53e4e0602 172 break;
tanasaro10 9:303d3628986a 173 }
tanasaro10 9:303d3628986a 174 }
tanasaro10 8:f28ad4600b0f 175 }
tanasaro10 9:303d3628986a 176 }
tanasaro10 12:27e9c3db28b9 177 void write_data_to_flash(uint32_t *tick, myPayload_t * currMeasures)
tanasaro10 10:c7d53e4e0602 178 {
tanasaro10 9:303d3628986a 179 uint8_t page_num=0;
tanasaro10 10:c7d53e4e0602 180
tanasaro10 9:303d3628986a 181 if (g_MyDataIdx==0) {
tanasaro10 9:303d3628986a 182 //initiate connection
tanasaro10 9:303d3628986a 183 connectionUpdate(eStartAdvertising);
tanasaro10 9:303d3628986a 184 // time and date used to initialize the g_MyData variable
tanasaro10 11:baafa4f7a15e 185 memcpy(&g_MyData.startData.datetime,&g_myDateTimeVar.currentDateTime, sizeof(mdate_time_t));
tanasaro10 12:27e9c3db28b9 186 memcpy(&g_MyData.startData.data,currMeasures, sizeof(myPayload_t));
tanasaro10 9:303d3628986a 187 } else {
tanasaro10 9:303d3628986a 188 // it should be logged here the time difference from last record...
tanasaro10 11:baafa4f7a15e 189 g_MyData.myData[g_MyDataIdx-1].minutes = (uint16_t)(*tick*gTimeInstant / 60);
tanasaro10 11:baafa4f7a15e 190 g_MyData.myData[g_MyDataIdx-1].seconds = (*tick*gTimeInstant% 60);
tanasaro10 12:27e9c3db28b9 191 memcpy(&g_MyData.myData[g_MyDataIdx-1].data,currMeasures, sizeof(myPayload_t));
tanasaro10 9:303d3628986a 192 }
tanasaro10 9:303d3628986a 193 *tick = 0;
tanasaro10 9:303d3628986a 194
tanasaro10 12:27e9c3db28b9 195 if (g_MyDataIdx==(MAXBUFFER-3)) {
tanasaro10 9:303d3628986a 196 //initiate disconnection
tanasaro10 10:c7d53e4e0602 197 connectionUpdate(eDisconnect);
tanasaro10 9:303d3628986a 198 }
tanasaro10 9:303d3628986a 199
tanasaro10 10:c7d53e4e0602 200 if (g_MyDataIdx == MAXBUFFER) {
tanasaro10 9:303d3628986a 201 // write2Flash the current page num
tanasaro10 12:27e9c3db28b9 202 //connectionUpdate(eDisconnect);
tanasaro10 12:27e9c3db28b9 203
tanasaro10 9:303d3628986a 204 page_num=flash_currPage();
tanasaro10 9:303d3628986a 205 // write2Flash the current page data
tanasaro10 12:27e9c3db28b9 206 ble_flash_page_write(page_num, (uint32_t*)&(g_MyData), 253);
tanasaro10 12:27e9c3db28b9 207 memset(&g_MyData,0,sizeof(myDataLog_t));
tanasaro10 12:27e9c3db28b9 208 //pc.printf("retValWr: %d, Pg:%d, Min: %d \r\n",retVal, page_num,g_myDateTimeVar.currentDateTime.minutes);
tanasaro10 9:303d3628986a 209 flash_go_nextPage();
tanasaro10 9:303d3628986a 210 }
tanasaro10 10:c7d53e4e0602 211 g_MyDataIdx = (g_MyDataIdx+1)%(MAXBUFFER+1);
tanasaro10 8:f28ad4600b0f 212 }
tanasaro10 8:f28ad4600b0f 213
tanasaro10 9:303d3628986a 214
tanasaro10 9:303d3628986a 215 void on_error_radioMsg()
tanasaro10 9:303d3628986a 216 {
tanasaro10 9:303d3628986a 217 char myBuf[TXRX_BUF_LEN];
tanasaro10 9:303d3628986a 218 sprintf(myBuf,"%s","WrongSyntax");
tanasaro10 12:27e9c3db28b9 219 //buzz_int(&buzzer,5,3);
tanasaro10 12:27e9c3db28b9 220 //timeout_err.attach(&at_timeout_err, 2);
tanasaro10 9:303d3628986a 221 sendRadioMsg((uint8_t*)&myBuf[0], 12);
tanasaro10 8:f28ad4600b0f 222 }
tanasaro10 8:f28ad4600b0f 223
tanasaro10 9:303d3628986a 224 void flash_page_serial_dump(uint32_t* p_curr_addr)
tanasaro10 10:c7d53e4e0602 225 {
tanasaro10 10:c7d53e4e0602 226 myDataLogShort_t initialData;
tanasaro10 11:baafa4f7a15e 227 mdate_time_t * pdate;
tanasaro10 10:c7d53e4e0602 228 myDataL_t dataOut[2];
tanasaro10 10:c7d53e4e0602 229 uint8_t i;
tanasaro10 9:303d3628986a 230
tanasaro10 10:c7d53e4e0602 231 p_curr_addr += 2; // skip the magic number and the word count
tanasaro10 12:27e9c3db28b9 232 memcpy((uint32_t*)&initialData, p_curr_addr, 3*sizeof(uint32_t));
tanasaro10 11:baafa4f7a15e 233 pdate = &initialData.startData.datetime;
tanasaro10 11:baafa4f7a15e 234 pc.printf("20%2d_%2d_%2d H:%2d P:%4x\r",pdate->year, pdate->month, pdate->day, pdate->hours, p_curr_addr);
tanasaro10 12:27e9c3db28b9 235 pc.printf("%2d:%2d;%3d;%2d:%2d;%3d;\r",pdate->minutes, pdate->seconds, initialData.startData.data.hits,initialData.myData.minutes, initialData.myData.seconds, initialData.myData.data.hits);
tanasaro10 12:27e9c3db28b9 236 p_curr_addr += 3;
tanasaro10 10:c7d53e4e0602 237
tanasaro10 12:27e9c3db28b9 238 for (i=0; i<125; i++) {
tanasaro10 12:27e9c3db28b9 239 memcpy((uint32_t*)&dataOut, p_curr_addr, 2*sizeof(uint32_t));
tanasaro10 12:27e9c3db28b9 240 pc.printf("%2d:%2d;%3d;%2d:%2d;%3d;\r",dataOut[0].minutes, dataOut[0].seconds, dataOut[0].data.hits,dataOut[1].minutes, dataOut[1].seconds, dataOut[1].data.hits);
tanasaro10 12:27e9c3db28b9 241 p_curr_addr += 2;
tanasaro10 10:c7d53e4e0602 242 }
tanasaro10 9:303d3628986a 243 }
tanasaro10 9:303d3628986a 244
tanasaro10 12:27e9c3db28b9 245 int sign(int nr){
tanasaro10 12:27e9c3db28b9 246 int retVal=0;
tanasaro10 12:27e9c3db28b9 247 if (nr>0) retVal=1;
tanasaro10 12:27e9c3db28b9 248 else if (nr<0) retVal=-1;
tanasaro10 12:27e9c3db28b9 249
tanasaro10 12:27e9c3db28b9 250 return retVal;
tanasaro10 12:27e9c3db28b9 251 }
tanasaro10 9:303d3628986a 252
tanasaro10 12:27e9c3db28b9 253 float read_real_value(void){
tanasaro10 12:27e9c3db28b9 254 uint32_t wrk,reg0,reg1,reg2;
tanasaro10 12:27e9c3db28b9 255 reg0 = NRF_ADC->ENABLE; // save register value
tanasaro10 12:27e9c3db28b9 256 reg1 = NRF_ADC->CONFIG; // save register value
tanasaro10 12:27e9c3db28b9 257 reg2 = NRF_ADC->RESULT; // save register value
tanasaro10 12:27e9c3db28b9 258 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
tanasaro10 12:27e9c3db28b9 259 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
tanasaro10 12:27e9c3db28b9 260 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
tanasaro10 12:27e9c3db28b9 261 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
tanasaro10 12:27e9c3db28b9 262 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
tanasaro10 12:27e9c3db28b9 263 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
tanasaro10 12:27e9c3db28b9 264 NRF_ADC->EVENTS_END = 0;
tanasaro10 12:27e9c3db28b9 265 NRF_ADC->TASKS_START = 1;
tanasaro10 12:27e9c3db28b9 266 while (!NRF_ADC->EVENTS_END) {;}
tanasaro10 12:27e9c3db28b9 267 wrk = NRF_ADC->RESULT; // 10 bit result
tanasaro10 12:27e9c3db28b9 268 NRF_ADC->ENABLE = reg0; // recover register value
tanasaro10 12:27e9c3db28b9 269 NRF_ADC->CONFIG = reg1; // recover register value
tanasaro10 12:27e9c3db28b9 270 NRF_ADC->RESULT = reg2; // recover register value
tanasaro10 12:27e9c3db28b9 271 NRF_ADC->EVENTS_END = 0;
tanasaro10 12:27e9c3db28b9 272 return ((float)wrk / 1024 * 1.2 * 3.0);
tanasaro10 10:c7d53e4e0602 273 }
tanasaro10 10:c7d53e4e0602 274
tanasaro10 12:27e9c3db28b9 275 uint8_t read100(void)
tanasaro10 12:27e9c3db28b9 276 {
tanasaro10 12:27e9c3db28b9 277 float wrk_vdd, v0p= 2.7 ,v100p= 3.3;
tanasaro10 12:27e9c3db28b9 278 wrk_vdd = read_real_value();
tanasaro10 12:27e9c3db28b9 279 if (wrk_vdd <= v0p){
tanasaro10 12:27e9c3db28b9 280 return 0;
tanasaro10 12:27e9c3db28b9 281 } else if (wrk_vdd >= v100p){
tanasaro10 12:27e9c3db28b9 282 led = 0;
tanasaro10 12:27e9c3db28b9 283 return 100;
tanasaro10 12:27e9c3db28b9 284
tanasaro10 12:27e9c3db28b9 285 }
tanasaro10 12:27e9c3db28b9 286 led = 1;
tanasaro10 12:27e9c3db28b9 287 wrk_vdd = (wrk_vdd - v0p) / (v100p - v0p);
tanasaro10 12:27e9c3db28b9 288 return (uint8_t)(wrk_vdd * 100);
tanasaro10 12:27e9c3db28b9 289 }
tanasaro10 12:27e9c3db28b9 290
tanasaro10 12:27e9c3db28b9 291
tanasaro10 9:303d3628986a 292 void at_eachInstant()
tanasaro10 10:c7d53e4e0602 293 {
tanasaro10 9:303d3628986a 294 static uint32_t tick=0;
tanasaro10 12:27e9c3db28b9 295 static uint8_t ltick=0;
tanasaro10 12:27e9c3db28b9 296 uint8_t rcBuff[2]={'r','0'};
tanasaro10 12:27e9c3db28b9 297 //static myPayload_t prevMeasures2=(myPayload_t) { 0, 0, 0, 0};
tanasaro10 10:c7d53e4e0602 298
tanasaro10 8:f28ad4600b0f 299 // update time
tanasaro10 11:baafa4f7a15e 300 update_time(&g_myDateTimeVar, gTimeInstant);
tanasaro10 12:27e9c3db28b9 301
tanasaro10 12:27e9c3db28b9 302 //batteryService->updateBatteryLevel(gBatteryValue );
tanasaro10 9:303d3628986a 303 //update measurements
tanasaro10 12:27e9c3db28b9 304 if (g_LogActive==true){
tanasaro10 9:303d3628986a 305 // if there are changes in data save
tanasaro10 12:27e9c3db28b9 306 if (0!=g_currMeasures2.hits){
tanasaro10 12:27e9c3db28b9 307 write_data_to_flash(&tick, &g_currMeasures2);
tanasaro10 12:27e9c3db28b9 308 }
tanasaro10 12:27e9c3db28b9 309 if (g_bIsConnected == true){
tanasaro10 12:27e9c3db28b9 310 // print info
tanasaro10 12:27e9c3db28b9 311 rcBuff[1]='0'+ltick;
tanasaro10 12:27e9c3db28b9 312 decode(rcBuff,2);
tanasaro10 12:27e9c3db28b9 313 ltick =(ltick+1)%4;
tanasaro10 9:303d3628986a 314 }
tanasaro10 9:303d3628986a 315 tick++;
tanasaro10 12:27e9c3db28b9 316
tanasaro10 12:27e9c3db28b9 317 }
tanasaro10 12:27e9c3db28b9 318 }
tanasaro10 12:27e9c3db28b9 319
tanasaro10 12:27e9c3db28b9 320 void update_measurements()
tanasaro10 12:27e9c3db28b9 321 {
tanasaro10 12:27e9c3db28b9 322 nr_of_hits ++;
tanasaro10 12:27e9c3db28b9 323 g_nrOfHits ++;
tanasaro10 12:27e9c3db28b9 324 /*if (bNewSample==false){
tanasaro10 12:27e9c3db28b9 325 //g_currMeasures2.hits =nr_of_hits;
tanasaro10 12:27e9c3db28b9 326 nr_of_hits = 1;
tanasaro10 12:27e9c3db28b9 327 bNewSample = true;
tanasaro10 12:27e9c3db28b9 328 } */
tanasaro10 12:27e9c3db28b9 329
tanasaro10 12:27e9c3db28b9 330 //gBatteryValue = read100();
tanasaro10 12:27e9c3db28b9 331
tanasaro10 12:27e9c3db28b9 332 }
tanasaro10 12:27e9c3db28b9 333
tanasaro10 12:27e9c3db28b9 334 void at_eachADC(){
tanasaro10 12:27e9c3db28b9 335 static bool isLow = false;
tanasaro10 12:27e9c3db28b9 336 static bool bPrevState=isLow;
tanasaro10 12:27e9c3db28b9 337 static uint8_t counter = 0;
tanasaro10 12:27e9c3db28b9 338 static float measure;
tanasaro10 12:27e9c3db28b9 339
tanasaro10 12:27e9c3db28b9 340
tanasaro10 12:27e9c3db28b9 341 measure = photoVoltage.read();
tanasaro10 12:27e9c3db28b9 342 if (g_LogActive==false){
tanasaro10 12:27e9c3db28b9 343 if (measure > gmaxV) {
tanasaro10 12:27e9c3db28b9 344 maxV=measure;
tanasaro10 12:27e9c3db28b9 345 }
tanasaro10 12:27e9c3db28b9 346 if (measure < minV) {
tanasaro10 12:27e9c3db28b9 347 gminV=measure;
tanasaro10 12:27e9c3db28b9 348 }
tanasaro10 12:27e9c3db28b9 349 //gmedian = gminV + (gminV + gmaxV)*10/4; % 25%
tanasaro10 12:27e9c3db28b9 350 }
tanasaro10 12:27e9c3db28b9 351
tanasaro10 12:27e9c3db28b9 352 isLow = (measure < gmedianV);
tanasaro10 12:27e9c3db28b9 353 if ((bPrevState != isLow)&&(isLow == true)){
tanasaro10 12:27e9c3db28b9 354 nr_of_hits ++;
tanasaro10 12:27e9c3db28b9 355 g_nrOfHits ++;
tanasaro10 12:27e9c3db28b9 356 }
tanasaro10 12:27e9c3db28b9 357 bPrevState = isLow;
tanasaro10 12:27e9c3db28b9 358
tanasaro10 12:27e9c3db28b9 359 counter = (counter + 1)%100;
tanasaro10 12:27e9c3db28b9 360 if (counter==0){
tanasaro10 12:27e9c3db28b9 361 // 1 second is passed
tanasaro10 12:27e9c3db28b9 362 bTimeReady=true;
tanasaro10 12:27e9c3db28b9 363 g_currMeasures2.hits =nr_of_hits;
tanasaro10 12:27e9c3db28b9 364 nr_of_hits = 0;
tanasaro10 12:27e9c3db28b9 365 }
tanasaro10 9:303d3628986a 366 }
tanasaro10 9:303d3628986a 367
tanasaro10 9:303d3628986a 368 // Radio commands decode
tanasaro10 9:303d3628986a 369 void decode(uint8_t * buffer, uint16_t length)
tanasaro10 9:303d3628986a 370 {
tanasaro10 12:27e9c3db28b9 371 char myBuf[TXRX_BUF_LEN];
tanasaro10 9:303d3628986a 372 uint16_t len;
tanasaro10 9:303d3628986a 373 switch (buffer[0]) {
tanasaro10 12:27e9c3db28b9 374 case 'r': {// Read Operations
tanasaro10 9:303d3628986a 375 switch (buffer[1]) {
tanasaro10 12:27e9c3db28b9 376 case '0':{
tanasaro10 12:27e9c3db28b9 377 sprintf(myBuf,"NH:%2d,TNH:%8d\r\n", g_currMeasures2.hits,g_nrOfHits);
tanasaro10 12:27e9c3db28b9 378 len = 19;
tanasaro10 12:27e9c3db28b9 379 break;
tanasaro10 12:27e9c3db28b9 380 }
tanasaro10 12:27e9c3db28b9 381 case '1':{
tanasaro10 12:27e9c3db28b9 382 sprintf(myBuf,"P:%1.2f_%1.2f_%1.2f\r\n", gmaxV,photoVoltage.read(),gminV);
tanasaro10 9:303d3628986a 383 len = 18;
tanasaro10 9:303d3628986a 384 break;
tanasaro10 9:303d3628986a 385 }
tanasaro10 12:27e9c3db28b9 386 case '2':{
tanasaro10 12:27e9c3db28b9 387 sprintf(myBuf,"g_idx=%2d Page=%3d",g_MyDataIdx, flash_currPage());
tanasaro10 12:27e9c3db28b9 388 len = 18;
tanasaro10 12:27e9c3db28b9 389 break;
tanasaro10 9:303d3628986a 390 }
tanasaro10 9:303d3628986a 391 case '3': {
tanasaro10 12:27e9c3db28b9 392 sprintf(myBuf,"V:%2.3f\r\n", read_real_value());
tanasaro10 12:27e9c3db28b9 393 len = 11;
tanasaro10 9:303d3628986a 394 break;
tanasaro10 9:303d3628986a 395 }
tanasaro10 9:303d3628986a 396 case '4': {
tanasaro10 12:27e9c3db28b9 397 sprintf(myBuf,"PhVol:%2.2f,Av:%2.2f\r\n",photoVoltage.read(),gmedian);
tanasaro10 12:27e9c3db28b9 398 len = 20;
tanasaro10 9:303d3628986a 399 break;
tanasaro10 9:303d3628986a 400 }
tanasaro10 12:27e9c3db28b9 401 case '5': {
tanasaro10 12:27e9c3db28b9 402 //sprintf(myBuf,"Vmx_mn:%1.2f_%1.2f\r\n",maxV,minV);
tanasaro10 12:27e9c3db28b9 403 //len = 18;
tanasaro10 12:27e9c3db28b9 404 break;
tanasaro10 12:27e9c3db28b9 405 }
tanasaro10 12:27e9c3db28b9 406
tanasaro10 12:27e9c3db28b9 407 default:{
tanasaro10 12:27e9c3db28b9 408 sprintf(myBuf,"Nothing \r\n");
tanasaro10 12:27e9c3db28b9 409 len = 10;
tanasaro10 9:303d3628986a 410 break;
tanasaro10 8:f28ad4600b0f 411 }
tanasaro10 8:f28ad4600b0f 412 }
tanasaro10 9:303d3628986a 413 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 414 break;
tanasaro10 9:303d3628986a 415 }
tanasaro10 9:303d3628986a 416 case 'l': {// toogle led
tanasaro10 9:303d3628986a 417 led = ! led;
tanasaro10 9:303d3628986a 418 if (led==0) {
tanasaro10 12:27e9c3db28b9 419 sprintf(myBuf,"%s","OFF");
tanasaro10 9:303d3628986a 420 len = 2;
tanasaro10 9:303d3628986a 421 } else {
tanasaro10 12:27e9c3db28b9 422 sprintf(myBuf,"%s","ON");
tanasaro10 9:303d3628986a 423 len = 3;
tanasaro10 9:303d3628986a 424 }
tanasaro10 9:303d3628986a 425 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 426 break;
tanasaro10 12:27e9c3db28b9 427 }
tanasaro10 12:27e9c3db28b9 428 case 'i':{ // Insert data values
tanasaro10 12:27e9c3db28b9 429 switch (buffer[1]){
tanasaro10 12:27e9c3db28b9 430 case 'm':{ // median change
tanasaro10 12:27e9c3db28b9 431 memcpy(myBuf,&buffer[2],2);
tanasaro10 12:27e9c3db28b9 432 gmedian=(float)atoi(myBuf)/10; // TODO check if it is a number
tanasaro10 12:27e9c3db28b9 433 break;
tanasaro10 12:27e9c3db28b9 434 }
tanasaro10 12:27e9c3db28b9 435
tanasaro10 12:27e9c3db28b9 436 default: {
tanasaro10 12:27e9c3db28b9 437 // on_error_radioMsg(); // notify on radio
tanasaro10 12:27e9c3db28b9 438 }
tanasaro10 9:303d3628986a 439 }
tanasaro10 9:303d3628986a 440 break;
tanasaro10 9:303d3628986a 441 }
tanasaro10 11:baafa4f7a15e 442 case 'd':
tanasaro10 11:baafa4f7a15e 443 case 't': {// date /time operations
tanasaro10 9:303d3628986a 444 switch (buffer[1]) {
tanasaro10 11:baafa4f7a15e 445 case 'i': { // date insert
tanasaro10 11:baafa4f7a15e 446 uint8_t i;
tanasaro10 11:baafa4f7a15e 447 uint8_t * pdata = &g_myDateTimeVar.newDateTime.year; // to insert data
tanasaro10 11:baafa4f7a15e 448
tanasaro10 11:baafa4f7a15e 449 if (buffer[0]=='t') {
tanasaro10 11:baafa4f7a15e 450 sprintf(myBuf," TimeInserted");
tanasaro10 11:baafa4f7a15e 451 pdata +=3;
tanasaro10 11:baafa4f7a15e 452 } else {sprintf(myBuf," DateInserted");}
tanasaro10 11:baafa4f7a15e 453 len= 14;
tanasaro10 11:baafa4f7a15e 454
tanasaro10 11:baafa4f7a15e 455 for (i=0;i<3;i++){
tanasaro10 11:baafa4f7a15e 456 memcpy(myBuf,&buffer[2+2*i],2);
tanasaro10 11:baafa4f7a15e 457 *pdata=atoi(myBuf); // TODO check if it is a number
tanasaro10 11:baafa4f7a15e 458 pdata= pdata+1;
tanasaro10 11:baafa4f7a15e 459 }
tanasaro10 11:baafa4f7a15e 460 g_myDateTimeVar.updateDateTime = true;
tanasaro10 11:baafa4f7a15e 461
tanasaro10 9:303d3628986a 462 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 463 break;
tanasaro10 9:303d3628986a 464 }
tanasaro10 11:baafa4f7a15e 465 case 'g': { // time/date get
tanasaro10 11:baafa4f7a15e 466 uint8_t * pdata1 = &g_myDateTimeVar.currentDateTime.year; // to get data
tanasaro10 11:baafa4f7a15e 467 if (buffer[0]=='t') {
tanasaro10 11:baafa4f7a15e 468 pdata1 +=3;
tanasaro10 11:baafa4f7a15e 469 sprintf(myBuf,"H:%2d:%2d:%2d",*pdata1,*(pdata1+1),*(pdata1+2));
tanasaro10 11:baafa4f7a15e 470 len = 11;
tanasaro10 11:baafa4f7a15e 471 }else {
tanasaro10 11:baafa4f7a15e 472 sprintf(myBuf,"D:20%2d:%2d:%2d",*pdata1,*(pdata1+1),*(pdata1+2));
tanasaro10 11:baafa4f7a15e 473 len = 13;
tanasaro10 11:baafa4f7a15e 474 }
tanasaro10 9:303d3628986a 475 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 476 break;
tanasaro10 9:303d3628986a 477 }
tanasaro10 9:303d3628986a 478 default:
tanasaro10 9:303d3628986a 479 MyASSERT(true,&pc, buffer[1]); // notify on serial interface
tanasaro10 9:303d3628986a 480 on_error_radioMsg(); // notify on radio
tanasaro10 9:303d3628986a 481 }
tanasaro10 9:303d3628986a 482 break;
tanasaro10 9:303d3628986a 483 }
tanasaro10 9:303d3628986a 484
tanasaro10 9:303d3628986a 485 case 'f': {// file operations
tanasaro10 9:303d3628986a 486 switch (buffer[1]) {
tanasaro10 11:baafa4f7a15e 487 case '1': {
tanasaro10 9:303d3628986a 488 sprintf(myBuf,"g_idx=%2d Page=%3d",g_MyDataIdx, flash_currPage());
tanasaro10 9:303d3628986a 489 len = 18;
tanasaro10 9:303d3628986a 490 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 491 break;
tanasaro10 9:303d3628986a 492 }
tanasaro10 10:c7d53e4e0602 493 case '2': { // start measuring
tanasaro10 9:303d3628986a 494 sprintf(myBuf,"Start Meas");
tanasaro10 9:303d3628986a 495 len = 12;
tanasaro10 9:303d3628986a 496 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 497 g_LogActive = true;
tanasaro10 12:27e9c3db28b9 498
tanasaro10 9:303d3628986a 499 break;
tanasaro10 9:303d3628986a 500 }
tanasaro10 10:c7d53e4e0602 501 case '3': { // stop measuring
tanasaro10 12:27e9c3db28b9 502 doMeasures.detach();
tanasaro10 9:303d3628986a 503 sprintf(myBuf,"Stop Meas");
tanasaro10 9:303d3628986a 504 len = 11;
tanasaro10 9:303d3628986a 505 sendRadioMsg((uint8_t *)myBuf, len);
tanasaro10 9:303d3628986a 506 g_LogActive = false;
tanasaro10 12:27e9c3db28b9 507 ble_flash_page_write(flash_currPage(), (uint32_t*)&(g_MyData), 253);
tanasaro10 12:27e9c3db28b9 508 memset(&g_MyData,0,sizeof(myDataLog_t));
tanasaro10 12:27e9c3db28b9 509 flash_go_nextPage();
tanasaro10 12:27e9c3db28b9 510 break;
tanasaro10 12:27e9c3db28b9 511 }
tanasaro10 12:27e9c3db28b9 512 case '4':{
tanasaro10 12:27e9c3db28b9 513 break;
tanasaro10 12:27e9c3db28b9 514 }
tanasaro10 12:27e9c3db28b9 515 case '5':{ // read one measure
tanasaro10 12:27e9c3db28b9 516
tanasaro10 9:303d3628986a 517 break;
tanasaro10 9:303d3628986a 518 }
tanasaro10 9:303d3628986a 519 default: {
tanasaro10 9:303d3628986a 520 // error
tanasaro10 9:303d3628986a 521 }
tanasaro10 9:303d3628986a 522 }
tanasaro10 9:303d3628986a 523 break;
tanasaro10 9:303d3628986a 524 }
tanasaro10 9:303d3628986a 525 default: {
tanasaro10 9:303d3628986a 526 MyASSERT(true,&pc, buffer[1]); // notify on serial interface
tanasaro10 9:303d3628986a 527 on_error_radioMsg(); // notify on radio;
tanasaro10 9:303d3628986a 528 }
tanasaro10 8:f28ad4600b0f 529 }
tanasaro10 8:f28ad4600b0f 530 }
tanasaro10 8:f28ad4600b0f 531
tanasaro10 9:303d3628986a 532 // decode serial command that starts with x
tanasaro10 9:303d3628986a 533 static void decode_s(uint8_t * buffer, uint16_t length)
tanasaro10 9:303d3628986a 534 {
tanasaro10 9:303d3628986a 535 uint8_t page_nr;
tanasaro10 9:303d3628986a 536 char myBuf[5];
tanasaro10 9:303d3628986a 537 uint32_t * p_curr_addr;
tanasaro10 10:c7d53e4e0602 538
tanasaro10 9:303d3628986a 539 switch (buffer[0]) {
tanasaro10 9:303d3628986a 540 case 'f': { // info about selected flash page
tanasaro10 9:303d3628986a 541 if ((buffer[1]<='9')&&(buffer[1]>='0')) {
tanasaro10 9:303d3628986a 542 memcpy(myBuf,&buffer[1],3);
tanasaro10 10:c7d53e4e0602 543 page_nr= atoi(myBuf);
tanasaro10 10:c7d53e4e0602 544 uint8_t p_word_count;
tanasaro10 9:303d3628986a 545
tanasaro10 9:303d3628986a 546 pc.printf("buffer[1]: %c \r\n",buffer[1]);
tanasaro10 9:303d3628986a 547
tanasaro10 9:303d3628986a 548 p_curr_addr= (uint32_t *)((uint16_t)BLE_FLASH_PAGE_SIZE * (flash_currPage() - page_nr));
tanasaro10 9:303d3628986a 549 pc.printf("page_addr: %x, pgNr = %d \r\n",p_curr_addr,(flash_currPage() - page_nr));
tanasaro10 9:303d3628986a 550 p_curr_addr += 1;
tanasaro10 9:303d3628986a 551 pc.printf("page_addr: %x \r\n",p_curr_addr);
tanasaro10 9:303d3628986a 552 p_word_count = (uint8_t)(*(p_curr_addr));
tanasaro10 10:c7d53e4e0602 553 pc.printf("nr_of_words: %d \r\n",p_word_count);
tanasaro10 9:303d3628986a 554 flash_page_serial_dump((p_curr_addr-1));
tanasaro10 9:303d3628986a 555 }
tanasaro10 9:303d3628986a 556 break;
tanasaro10 9:303d3628986a 557 }
tanasaro10 9:303d3628986a 558 case 'd': { // full dump
tanasaro10 10:c7d53e4e0602 559 uint16_t page0;
tanasaro10 10:c7d53e4e0602 560 pc.printf("Full dump \r\n");
tanasaro10 10:c7d53e4e0602 561
tanasaro10 9:303d3628986a 562 page0 = flash_currPage();
tanasaro10 11:baafa4f7a15e 563 for (page_nr=0; page_nr<=(MAX_PAGE_NUM-MIN_PAGE_NUM); page_nr++) {
tanasaro10 10:c7d53e4e0602 564 if ((page0-page_nr)< MIN_PAGE_NUM) {
tanasaro10 9:303d3628986a 565 page0 = MAX_PAGE_NUM + page_nr;
tanasaro10 8:f28ad4600b0f 566 }
tanasaro10 9:303d3628986a 567 p_curr_addr= (uint32_t *)((uint16_t)BLE_FLASH_PAGE_SIZE * (page0-page_nr));
tanasaro10 10:c7d53e4e0602 568 flash_page_serial_dump(p_curr_addr);
tanasaro10 9:303d3628986a 569 }
tanasaro10 9:303d3628986a 570 break;
tanasaro10 9:303d3628986a 571 }
tanasaro10 10:c7d53e4e0602 572 case 'g': {
tanasaro10 10:c7d53e4e0602 573 pc.printf("g_MyDataIdx= %d\r", g_MyDataIdx);
tanasaro10 9:303d3628986a 574 break;
tanasaro10 9:303d3628986a 575 }
tanasaro10 9:303d3628986a 576 case 'c': {
tanasaro10 10:c7d53e4e0602 577 switch (buffer[1]) {
tanasaro10 9:303d3628986a 578 case 'a': {
tanasaro10 9:303d3628986a 579 connectionUpdate(eStartAdvertising);
tanasaro10 9:303d3628986a 580 break;
tanasaro10 9:303d3628986a 581 }
tanasaro10 9:303d3628986a 582 case 'c' : {
tanasaro10 9:303d3628986a 583 connectionUpdate(eDisconnect);
tanasaro10 9:303d3628986a 584 break;
tanasaro10 8:f28ad4600b0f 585 }
tanasaro10 9:303d3628986a 586 case 's' : {
tanasaro10 9:303d3628986a 587 connectionUpdate(eStopAdvertising);
tanasaro10 9:303d3628986a 588 break;
tanasaro10 8:f28ad4600b0f 589 }
tanasaro10 10:c7d53e4e0602 590 default:
tanasaro10 10:c7d53e4e0602 591 pc.printf("Not recognized cmd !\r");
tanasaro10 10:c7d53e4e0602 592 }
tanasaro10 9:303d3628986a 593 break;
tanasaro10 9:303d3628986a 594 }
tanasaro10 9:303d3628986a 595 default: {
tanasaro10 9:303d3628986a 596 // nothing
tanasaro10 8:f28ad4600b0f 597 }
tanasaro10 9:303d3628986a 598 }
tanasaro10 8:f28ad4600b0f 599 }
tanasaro10 9:303d3628986a 600
RedBearLab 2:4b66b69c7ecb 601 void WrittenHandler(const GattWriteCallbackParams *Handler)
tanasaro10 9:303d3628986a 602 {
tanasaro10 9:303d3628986a 603 uint8_t buf[TXRX_BUF_LEN+1]= {'R',':',0};
tanasaro10 9:303d3628986a 604 uint16_t bytesRead;
tanasaro10 9:303d3628986a 605
tanasaro10 9:303d3628986a 606 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle()) {
tanasaro10 6:a574229993b8 607 ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), &buf[2], &bytesRead);
RedBearLab 0:cffe8ac1bdf0 608 memset(txPayload, 0, TXRX_BUF_LEN);
tanasaro10 9:303d3628986a 609 memcpy(txPayload, &buf[2], bytesRead);
tanasaro10 9:303d3628986a 610 if (txPayload[0] == 'x') {
tanasaro10 9:303d3628986a 611 decode(&txPayload[1],bytesRead);
tanasaro10 9:303d3628986a 612 }
tanasaro10 9:303d3628986a 613 //echo back
tanasaro10 9:303d3628986a 614 bytesRead+=2;
tanasaro10 9:303d3628986a 615 sendRadioMsg(buf, bytesRead);
tanasaro10 9:303d3628986a 616
tanasaro10 6:a574229993b8 617 // print on PC monitor
tanasaro10 11:baafa4f7a15e 618 buf[bytesRead]='\r';
tanasaro10 9:303d3628986a 619 pc.printf("%s",buf);
RedBearLab 0:cffe8ac1bdf0 620 }
RedBearLab 0:cffe8ac1bdf0 621 }
RedBearLab 0:cffe8ac1bdf0 622
RedBearLab 0:cffe8ac1bdf0 623 void uartCB(void)
tanasaro10 9:303d3628986a 624 {
tanasaro10 9:303d3628986a 625 while(pc.readable()) {
tanasaro10 9:303d3628986a 626 rx_buf[rx_len++] = pc.getc();
tanasaro10 9:303d3628986a 627 if(rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n') {
tanasaro10 9:303d3628986a 628 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len);
tanasaro10 9:303d3628986a 629 if ((rx_buf[0]=='x')) {
tanasaro10 10:c7d53e4e0602 630 decode_s(&rx_buf[1],(rx_len-1)); // serial decode
tanasaro10 9:303d3628986a 631 }
tanasaro10 9:303d3628986a 632 rx_len= 0;
RedBearLab 0:cffe8ac1bdf0 633 break;
RedBearLab 0:cffe8ac1bdf0 634 }
RedBearLab 0:cffe8ac1bdf0 635 }
RedBearLab 0:cffe8ac1bdf0 636 }
RedBearLab 0:cffe8ac1bdf0 637
tanasaro10 8:f28ad4600b0f 638
tanasaro10 9:303d3628986a 639 void g_varInit()
tanasaro10 9:303d3628986a 640 {
tanasaro10 11:baafa4f7a15e 641 g_myDateTimeVar.updateDateTime = true;
tanasaro10 9:303d3628986a 642 /* retreive latest date, time and page flash available */
tanasaro10 11:baafa4f7a15e 643 search_latest_in_flash(&g_myDateTimeVar.newDateTime);
tanasaro10 8:f28ad4600b0f 644 }
tanasaro10 8:f28ad4600b0f 645
RedBearLab 0:cffe8ac1bdf0 646 int main(void)
RedBearLab 0:cffe8ac1bdf0 647 {
RedBearLab 0:cffe8ac1bdf0 648 ble.init();
tanasaro10 9:303d3628986a 649 g_varInit();
tanasaro10 12:27e9c3db28b9 650 led= 1;
tanasaro10 12:27e9c3db28b9 651
RedBearLab 0:cffe8ac1bdf0 652 ble.onDisconnection(disconnectionCallback);
tanasaro10 9:303d3628986a 653 ble.onConnection(connectionCallback);
tanasaro10 9:303d3628986a 654 ble.onDataWritten(WrittenHandler);
tanasaro10 12:27e9c3db28b9 655 //event.rise(&button);
tanasaro10 12:27e9c3db28b9 656
tanasaro10 12:27e9c3db28b9 657
tanasaro10 12:27e9c3db28b9 658 //event.rise(&accInt1);
tanasaro10 6:a574229993b8 659 pc.baud(19200);
RedBearLab 0:cffe8ac1bdf0 660 pc.printf("SimpleChat Init \r\n");
tanasaro10 12:27e9c3db28b9 661
RedBearLab 0:cffe8ac1bdf0 662 pc.attach( uartCB , pc.RxIrq);
tanasaro10 9:303d3628986a 663 // setup advertising
RedBearLab 0:cffe8ac1bdf0 664 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
RedBearLab 0:cffe8ac1bdf0 665 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
RedBearLab 0:cffe8ac1bdf0 666 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
tanasaro10 12:27e9c3db28b9 667 (const uint8_t *)"CntBle3", sizeof("CntBle3") - 1);
RedBearLab 0:cffe8ac1bdf0 668 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
tanasaro10 9:303d3628986a 669 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
tanasaro10 9:303d3628986a 670 //ble.accumulateAdvertisingPayload(GapAdvertisingData::TX_POWER_LEVEL,(const uint8_t *)txPower, sizeof(txPower));
tanasaro10 9:303d3628986a 671 ble.setTxPower(txPower);
tanasaro10 9:303d3628986a 672 // 100ms; in multiples of 0.625ms.
RedBearLab 0:cffe8ac1bdf0 673 ble.setAdvertisingInterval(160);
tanasaro10 9:303d3628986a 674 /*
tanasaro10 9:303d3628986a 675 // activate radio notifications - usefull for flashwrite
tanasaro10 9:303d3628986a 676 void (*ptrFunc)(bool);
tanasaro10 9:303d3628986a 677 ptrFunc = ble_flash_on_radio_active_evt;
tanasaro10 9:303d3628986a 678 //needed for flash write
tanasaro10 9:303d3628986a 679 //ble.onRadioNotification(ptrFunc);
tanasaro10 10:c7d53e4e0602 680 */
RedBearLab 0:cffe8ac1bdf0 681 ble.addService(uartService);
tanasaro10 12:27e9c3db28b9 682 //batteryService = new BatteryService(ble, batteryLevel);
tanasaro10 9:303d3628986a 683 ble.startAdvertising();
tanasaro10 12:27e9c3db28b9 684 pc.printf("Advertising Start \r\n");
tanasaro10 12:27e9c3db28b9 685 //periodicActions.attach(&at_eachInstant,gTimeInstant);
tanasaro10 12:27e9c3db28b9 686 doMeasures.attach_us(&at_eachADC,10000);
tanasaro10 12:27e9c3db28b9 687 //gBatteryValue = read100();
tanasaro10 9:303d3628986a 688 while(1) {
tanasaro10 9:303d3628986a 689 ble.waitForEvent();
tanasaro10 12:27e9c3db28b9 690 if (bTimeReady==true){
tanasaro10 12:27e9c3db28b9 691 bTimeReady=false;
tanasaro10 12:27e9c3db28b9 692 at_eachInstant();
tanasaro10 12:27e9c3db28b9 693 }
RedBearLab 0:cffe8ac1bdf0 694 }
RedBearLab 0:cffe8ac1bdf0 695 }