Degree Computation

Dependencies:   aconno_SEGGER_RTT LSM9DS1 Si7006A20 adc52832_common aconnoMPL115A1 aconno_bsp

aconnoHelpers/aconnoHelpers.cpp

Committer:
jurica238814
Date:
2018-12-12
Revision:
0:442d98af8cc7
Child:
3:b62a73dc76b7

File content as of revision 0:442d98af8cc7:

/**
 * Made by Jurica @ aconno
 * jurica@aconno.de
 * More info @ aconno.de
 */

#include "mbed.h"
#include "ble/BLE.h"
#include "acd52832_bsp.h"
#include "GapAdvertisingData.h"
#include "Si7006A20.h"
#include "LSM9DS1.h"
#include "math.h"
#include "adc52832_common/utilities.h"
#include "MPL115A1.h"
#include "acd_nrf52_saadc.h"
#include "aconnoConfig.h"

NRF52_SAADC analogIn;
extern DigitalOut lightPower;
extern DigitalOut temperaturePower;
extern DigitalOut shdn;
extern DigitalOut power;
Si7006   *si;
extern LSM9DS1  *mems;
vector3_s memsAccelerometerInit;
vector3_s memsGyroscopeInit;
vector3_s memsMagnetometerInit;
extern GapAdvertisingData adv_data;
extern advertising_packet advertisementPacket;
DigitalOut cs(p7);

float getLight(){
    return ((float)analogIn.getData()[1])/ADC_RESOLUTION * VALUE_TO_PERCENTAGE;
}

float voltage2temp(float vOut){
    return ((float)vOut - (float)V0)/((float)TC);
}

float getTemperature(){
    return voltage2temp(((float)analogIn.getData()[2])/ADC_RESOLUTION * (float)VCC);
}

uint8_t getBattery(){
    uint16_t batteryVoltage = analogIn.getData()[0];
    
    const uint16_t zero_percent_limit = 739;
    const uint16_t onehundred_percent_limit = 810;
    const uint16_t percentage_increments = 5;
    uint8_t percentage;
    
    if (batteryVoltage < zero_percent_limit)
    {
        percentage = 0;
    }
    else if(batteryVoltage > onehundred_percent_limit)
    {
        percentage = 100;
    }
    else
    {
        batteryVoltage -= zero_percent_limit;
        percentage = (batteryVoltage*100)/(onehundred_percent_limit - zero_percent_limit);
        percentage = percentage/percentage_increments*percentage_increments;
    }
    
    return percentage;
}

float getHumidity(){
    float result;
    si->getHumidity(&result);
    return result;
}

void readGyroscope(vector3_s *gyroscopeData){
    mems->readGyroscope((int16_t *)gyroscopeData);
    *gyroscopeData -= memsGyroscopeInit;
}

void readAccelerometer(vector3_s *accelerometerData){
    mems->readAccelerometer((int16_t *)accelerometerData);
    *accelerometerData -= memsAccelerometerInit;
}

void readMagnetometer(vector3_s *magnetometerData){
    mems->readMagnetometer((int16_t *)magnetometerData);
    *magnetometerData -= memsMagnetometerInit;
}

void calibrateAccelerometer(){
    vector3_s accelerometerData;
    for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter){
        readAccelerometer(&accelerometerData);
        memsAccelerometerInit += accelerometerData;
    }
    memsAccelerometerInit /= CALIBRATION_STEPS;
}

void calibrateGyroscope(){
    vector3_s gyroscopeData;
    for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter){
        readGyroscope(&gyroscopeData);
        memsGyroscopeInit += gyroscopeData;
    }
    memsGyroscopeInit /= CALIBRATION_STEPS;
}

void calibrateMag(){
    vector3_s magnetometerData;
    for(uint8_t counter = 0; counter < CALIBRATION_STEPS; ++counter){
        readMagnetometer(&magnetometerData);
        memsMagnetometerInit += magnetometerData;
    }
    memsMagnetometerInit /= CALIBRATION_STEPS;
}

void disableI2C()
{
    
    NRF_TWI0->ENABLE = 0;
    NRF_TWI0->PSELSCL = 0xFFFFFFFF;
    NRF_TWI1->ENABLE = 0;
    NRF_TWI1->PSELSCL = 0xFFFFFFFF;
    NRF_TWIM0->ENABLE = 0;
    NRF_TWIM0->PSEL.SCL = 0x80000000;
    NRF_TWIM0->PSEL.SDA = 0x80000000;
    NRF_TWIM1->ENABLE = 0;
    NRF_TWIM0->PSEL.SCL = 0x80000000;
    NRF_TWIM0->PSEL.SDA = 0x80000000;
    
    //foo = new DigitalOut(I2C_DATA);
    //bar = new DigitalOut(I2C_CLK);
    
    //foo = 1;
    //bar = 1;
   
}

void updateData()
{
    static uint8_t advertisementType = 0;
    int16_t temp_acc[3];
    BLE &ble = BLE::Instance();

    I2C i2c(I2C_DATA, I2C_CLK);   
    si = new Si7006(&i2c);
    SPI spi(SPI_MOSI, SPI_MISO, SPI_SCLK);
    MPL115A1 mpl115a1(spi, cs);
    
    float result;
    
    NRF_SAADC->ENABLE = 1;
    power = 1;
    temperaturePower = 1;
    lightPower = 1;
    shdn = 1;
    analogIn.addChannel(9); // Set VDD  as source to SAADC
    analogIn.addChannel(6); // Light
    analogIn.addChannel(7); // Temp
    analogIn.calibrate();
    wait_ms(WAKEUP_TIME_DELAY_MS);

    analogIn.updateData();

    advertisementPacket.type = 0x01;
    advertisementPacket.temperature = getTemperature();
    advertisementPacket.light       = getLight();
    advertisementPacket.humidity    = getHumidity();
    advertisementPacket.pressure    = mpl115a1.getPressure();

    //disableI2C();
    //I2C dummy(I2C_DATA, I2C_CLK);
    
    SPI dummySpi(SPI_MOSI, SPI_MISO, SPI_SCLK);
    power = 0;
    shdn = 0;
    temperaturePower = 0;
    lightPower = 0;
    NRF_SAADC->ENABLE = 0;

    
    //DigitalOut foo(I2C_DATA);
    //DigitalOut bar(I2C_CLK);
    //foo = 1;
    //bar = 1; 
    
    if(++advertisementType > 2) advertisementType = 0;    
    adv_data = ble.gap().getAdvertisingPayload();
    adv_data.updateData(adv_data.MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
    ble.gap().setAdvertisingPayload(adv_data);

    //printf("Data updated.\r\n");
}