Nelson Santos / Mbed 2 deprecated trabalho

Dependencies:   X_NUCLEO_IKS01A1-f255a2c75ecb mbed-rtos mbed

Revision:
0:1eaebb55408a
Child:
2:0b8065489409
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sensor.cpp	Fri May 13 18:03:08 2016 +0000
@@ -0,0 +1,133 @@
+#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();
+}