Nelson Santos / Mbed 2 deprecated trabalho

Dependencies:   X_NUCLEO_IKS01A1-f255a2c75ecb mbed-rtos mbed

sensor.cpp

Committer:
Jacinta
Date:
2016-05-13
Revision:
0:1eaebb55408a
Child:
2:0b8065489409

File content as of revision 0:1eaebb55408a:

#include "mbed.h"
#include "x_nucleo_iks01a1.h"
#include "sensor.h"
#include "userMethods.h"

using namespace std;

static Ticker ticker;

/* Helper function for printing floats & doubles */
static char *printDouble(char* str, double v, int decimalDigits=2)
{
    int i = 1;
    int intPart, fractPart;
    int len;
    char *ptr;
    /* prepare decimal digits multiplicator */
    for (; decimalDigits!=0; i*=10, decimalDigits--);
    /* calculate integer & fractinal parts */
    intPart = (int)v;
    fractPart = (int)((v-(double)(int)v)*i);
    /* fill in integer part */
    sprintf(str, "%i.", intPart);
    /* prepare fill in of fractional part */
    len = strlen(str);
    ptr = &str[len];
    /* fill in leading fractional zeros */
    for (i/=10; i>1; i/=10, ptr++) {
        if(fractPart >= i) break;
        *ptr = '0';
    }
    /* fill in (rest of) fractional part */
    sprintf(ptr, "%i", fractPart);
    return str;
}

//This is the producer
void ExpansionBoard::readData()
{
    float value1, value2;
    char buffer1[32], buffer2[32];
    int32_t axes[3];
    Log *log_data = mail_box.alloc();
    //TODO Too small!?
    if(isFull()) {
        UserMethods::deleteN(1);
    } else {
        if(isEmpty()) {
            front = 0;
            back = 0;
        } else {
            if(back == 119) {
                back = -1;
            }
            back = back + 1;
        }
    }

    log_data->id = rand() % 255;

    //TODO Out of memory, specs say to delete oldest sample

    temp_sensor1->GetTemperature(&value1);
    humidity_sensor->GetHumidity(&value2);
    printf("HTS221: [temp] %7s°C,   [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
    log_data->tempCelsius = value1;
    log_data->humidity = value2;

    temp_sensor2->GetFahrenheit(&value1);
    pressure_sensor->GetPressure(&value2);
    printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
    log_data->tempFarenheit = value1;
    log_data->pressure = value2;
    printf("---\r\n");

    magnetometer->Get_M_Axes(axes);
    printf("LIS3MDL [mag/mgauss]:  %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
    memcpy(&log_data->magnetometer, &axes, sizeof(axes));

    accelerometer->Get_X_Axes(axes);
    printf("LSM6DS0 [acc/mg]:      %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
    memcpy(&log_data->accelerometer, &axes, sizeof(axes));

    gyroscope->Get_G_Axes(axes);
    printf("LSM6DS0 [gyro/mdps]:   %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
    memcpy (&log_data->accelerometer, &axes, sizeof(axes));

    osStatus *stat = (osStatus*)mail_box.put(log_data);
}

bool ExpansionBoard::isEmpty()
{
    return  front == -1;
}

int ExpansionBoard::size()
{
    if(front == -1)
        return 0;
    else
        return (1 + (10 + back - front) % 10);
}

bool ExpansionBoard::isFull()
{
    return size() >= QUEUESIZE;
}

//public:
ExpansionBoard::ExpansionBoard()
{
    // Retrieve the composing elements of the expansion board //
    //uint8_t id;
    humidity_sensor->ReadID(&id);
    printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
    pressure_sensor->ReadID(&id);
    printf("LPS25H  pressure & temperature    = 0x%X\r\n", id);
    magnetometer->ReadID(&id);
    printf("LIS3MDL magnetometer              = 0x%X\r\n", id);
    gyroscope->ReadID(&id);
    printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
}

void ExpansionBoard::startSampling()
{
    //TODO For now it just spits out the data
    //but data must be passed to the FIFO
    ticker.attach(this, &ExpansionBoard::readData, T);
}
void ExpansionBoard::stopSampling()
{
    ticker.detach();
}