Nelson Santos / Mbed 2 deprecated trabalho

Dependencies:   X_NUCLEO_IKS01A1-f255a2c75ecb mbed-rtos mbed

Revision:
2:0b8065489409
Parent:
0:1eaebb55408a
Child:
3:1f17245afc88
--- a/sensor.cpp	Sat May 14 09:30:21 2016 +0000
+++ b/sensor.cpp	Sat May 14 13:58:57 2016 +0000
@@ -1,116 +1,84 @@
 #include "mbed.h"
 #include "x_nucleo_iks01a1.h"
+#include <vector>
 #include "sensor.h"
 #include "userMethods.h"
 
-using namespace std;
-
-static Ticker ticker;
+Mail<log_data, QUEUESIZE> ExpansionBoard::mail_box;
 
-/* Helper function for printing floats & doubles */
-static char *printDouble(char* str, double v, int decimalDigits=2)
-{
-    int i = 1;
-    int intPart, fractPart;
-    int len;
+//This is the producer
+void ExpansionBoard::sampleData() {
+    printf("about to alloc\n");
+    log_data* log_d = (log_data*)mail_box.alloc();
+        
+    if (log_d == NULL) {
+        mail_box.get();
+        printf("Out of memory, last sample deleted\n");
+        log_data* log_d = (log_data*)mail_box.alloc();
+        printf("allocated after out of memory");
+    }
+    
+    printf("Not null, reading values\n");
+    //Store read data in a sample
+    float value;
+    log_d->date = time(NULL);
+    temp_sensor->GetTemperature(&value);
+    log_d->tempCelsius = value;
+    humidity_sensor->GetHumidity(&value);
+    log_d->humidity = value;
+    pressure_sensor->GetPressure(&value);
+    log_d->pressure = value;
+    printf("All values STORED\n");
+    //Send pointer to sample to the queue
+    osStatus stat = mail_box.put(log_d);
+    printf("MAIL_BOX.PUT run\n");
+    // Check for resource error
+    if (stat == osErrorResource) {
+        printf("mail_box->put() Error %4Xh\n", stat);
+        //Error, free up memory block taken
+        mail_box.free(log_d);
+    }
+}
+
+void ExpansionBoard::getData(vector<log_data>& v){
+    while(true){
+        //Block on queue if no data is available
+        osEvent event = mail_box.get();
+        printf("MAIL_BOX.GET\n");
+        
+        if (event.status == osEventMail) {
+            // Successful, store log_data
+            log_data* temp = (log_data*) event.value.p;
+            v.push_back(*temp);
+            mail_box.free(temp);
+            printf("GET value stored and freed up mail_box\n");
+        }
+    }
+}
+
+// Helper function for printing floats & doubles
+char *ExpansionBoard::printDouble(char* str, double v, int decimalDigits) {
+    int intPart, fractPart, len, i=1;
     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()
+ExpansionBoard::ExpansionBoard(): T(15.0f)
 {
-    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;
+     /* Retrieve the composing elements of the expansion board */
+    uint8_t id;
+    printf("Initialising expansion board...\n\r");
     humidity_sensor->ReadID(&id);
     printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
     pressure_sensor->ReadID(&id);
@@ -118,16 +86,5 @@
     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();
-}
+    printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n\n", id);     
+}
\ No newline at end of file