Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: X_NUCLEO_IKS01A1-f255a2c75ecb mbed-rtos mbed
Diff: sensor.cpp
- 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