SAADC battery meter.
Dependencies: aconno_bsp adc52832_common
Diff: main.cpp
- Revision:
- 0:b5d49f70dcb3
- Child:
- 2:f25e171b8bc1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Aug 22 12:18:42 2017 +0000 @@ -0,0 +1,183 @@ +/* + * aconno.de + * Made by Jurica Resetar + * All right reserved + * + */ + +#include "stdio.h" +#include "mbed.h" +#include "ble/BLE.h" +#include "acd52832_bsp.h" +#include "GapAdvertisingData.h" +#include "nrf52_uart.h" + +#define SLEEP_TIME (2.0) /* Sleep time in seconds */ +#define WAKE_UP_TIME (2000) /* Awake time in ms */ +#define MSD_SIZE (1) /* Manufacturer Specific Data lenght (in B) */ +#define ADV_INTERVAL (1000) /* Advertising interval in ms */ +#define TX_POWER (4) /* TX power (in dB) */ +#define GO_TO_SLEEP (0) /* Sleep flag: 0 -> Device will not go to sleep, 1 -> Will go to sleep mode */ + +#define TX (p25) +#define RX (p26) + +bool SLEEP = true; + +BLE &ble = BLE::Instance(); +GapAdvertisingData adv_data = GapAdvertisingData(); +uint8_t MSD[MSD_SIZE] = {0x00}; + + +/** + * Restart Advertising on disconnection + */ +void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){ + BLE::Instance().gap().startAdvertising(); +} + +/** + * Function for waking the core up + */ +void wakeMeUp(void){ + SLEEP = false; + } + +/** + * This function is called when the ble initialization process has failed + */ +void onBleInitError(BLE &ble, ble_error_t error){ + /* Avoid compiler warnings */ + (void) ble; + (void) error; + /* Initialization error handling should go here */ +} + +/** + * Callback triggered when the ble initialization process has finished + */ +void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){ + BLE& ble = params->ble; + ble_error_t error = params->error; + + if (error != BLE_ERROR_NONE) { + /* In case of error, forward the error handling to onBleInitError */ + onBleInitError(ble, error); + return; + } + + /* Ensure that it is the default instance of BLE */ + if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { + return; + } + + ble.gap().onDisconnection(disconnectionCallback); + + /* setup advertising */ + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)MSD, MSD_SIZE); + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); + ble.gap().setAdvertisingInterval(ADV_INTERVAL); + ble.gap().startAdvertising(); +} + +void updateData(){ + static uint8_t simple_counter = 0; + + MSD[0] = simple_counter++; + adv_data = ble.getAdvertisingData(); + adv_data.updateData(adv_data.MANUFACTURER_SPECIFIC_DATA, MSD, MSD_SIZE); + ble.setAdvertisingData(adv_data); +} + + +int main(void){ + NRF52_UART serial = NRF52_UART(TX, RX, Baud9600); + char buffer[255] = {0}; + uint8_t buffer_s; + int printBufferLen; + int16_t SAADCDataPointer; + + Ticker ticker; + ticker.attach(wakeMeUp, SLEEP_TIME); // Wake the device up + + ble.init(bleInitComplete); + ble.gap().setTxPower(TX_POWER); // Set TX power to TX_POWER + + /* SpinWait for initialization to complete. This is necessary because the + * BLE object is used in the main loop below. */ + while (ble.hasInitialized() == false) { /* spin loop */ } + + while(1){ + buffer_s = 0x0C; + serial.send(&buffer_s, sizeof(buffer_s)); + + printBufferLen = sprintf(buffer, "ADC initialisation...\r\n"); + serial.send(buffer, printBufferLen); + + NRF_SAADC->ENABLE = 1; + NRF_SAADC->RESULT.MAXCNT = 1; + printBufferLen = sprintf(buffer, "SAADC enabled.\r\n"); + serial.send(buffer, printBufferLen); + + NRF_SAADC->RESULT.PTR =(uint32_t) &SAADCDataPointer; + NRF_SAADC->CH[0].PSELP = 9; // Input positive pin is VDD + + printBufferLen = sprintf(buffer, "ADC initialisation done!\r\n"); + serial.send(buffer, printBufferLen); + + NRF_SAADC->TASKS_START = 1; + while(!NRF_SAADC->EVENTS_STARTED); + printBufferLen = sprintf(buffer, "SAADC started.\r\n"); + serial.send(buffer, printBufferLen); + + NRF_SAADC->TASKS_SAMPLE = 1; + printBufferLen = sprintf(buffer, "SAADC sample started.\r\n"); + serial.send(buffer, printBufferLen); + + while(!NRF_SAADC->EVENTS_END); + printBufferLen = sprintf(buffer, "SAADC has filled up the Result buffer.\r\n"); + serial.send(buffer, printBufferLen); + + while(!NRF_SAADC->EVENTS_DONE); + printBufferLen = sprintf(buffer, "SAADC conversation task has been ended.\r\n"); + serial.send(buffer, printBufferLen); + + while(!NRF_SAADC->EVENTS_RESULTDONE); + printBufferLen = sprintf(buffer, "SAADC data is ready to get transfereed to RAM.\r\n"); + serial.send(buffer, printBufferLen); + + printBufferLen = sprintf(buffer, "SAADC Data transfereed: %d.\r\n", (int32_t) NRF_SAADC->RESULT.AMOUNT); + serial.send(buffer, printBufferLen); + + NRF_SAADC->TASKS_STOP = 1; + printBufferLen = sprintf(buffer, "SAADC stopping...\r\n"); + serial.send(buffer, printBufferLen); + + while(!NRF_SAADC->EVENTS_STOPPED); + printBufferLen = sprintf(buffer, "SAADC stopped.\r\n"); + serial.send(buffer, printBufferLen); + + printBufferLen = sprintf(buffer, "SAADC row: %d\r\n", SAADCDataPointer); + serial.send(buffer, printBufferLen); + + printBufferLen = sprintf(buffer, "SAADC voltage: %f\r\n", SAADCDataPointer*(1.0/1024)*3.6); + serial.send(buffer, printBufferLen); + wait_ms(3000); + } + + while (true){ + if (SLEEP && GO_TO_SLEEP){ + ble.gap().stopAdvertising(); + sleep(); + ble.waitForEvent(); + } + else{ + // I'm awake + updateData(); + ble.gap().startAdvertising(); + wait_ms(WAKE_UP_TIME); + SLEEP = true; + } + } +}