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
main.cpp@12:27e9c3db28b9, 2016-08-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |