![](/media/cache/profiles/ba5be68d3d541f2ca043d77fc54fe702.jpg.50x50_q85.jpg)
3rd Repo, trying to figure this out.
Fork of SOFT253_Template_Weather_OS_54 by
Diff: main.cpp
- Revision:
- 34:09ed07f2acba
- Parent:
- 33:cffe0ae69aa6
- Child:
- 35:484e384f9bf1
--- a/main.cpp Wed Mar 29 11:34:00 2017 +0000 +++ b/main.cpp Wed Apr 05 11:06:56 2017 +0000 @@ -1,62 +1,147 @@ #include "mbed.h" #include "rtos.h" -#include "hts221.h" +#include "string.h" +#include <stdio.h> +#include <ctype.h> + #include "hts221.h" #include "LPS25H.h" - +#define SWITCH1_RELEASE 1 + +void thread1(); + DigitalOut myled(LED1); I2C i2c2(I2C_SDA, I2C_SCL); - -float tempCelsius = 25.50; -float humi = 55; -int humiMax = 100; -char cmd=0; -uint32_t seconds = 0, minutes=0, hours=0; - LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR); -HTS221 humidity(I2C_SDA, I2C_SCL); - +HTS221 measurer(I2C_SDA, I2C_SCL); +DigitalIn onBoardSwitch(USER_BUTTON); + -int main() - { - humidity.init(); - humidity.calib(); - printf("SOFT253 simple Temperature Humidity and Pressure Sensor Monitor\n\r"); - printf("Using the X-NUCLEO-IKS01A1 shield and MBED Libraries\n\r"); - //printf("%#x\n\r",barometer.read_id()); +//Threads +Thread *t1; +Thread *t2; +int count= 0; +//Class type +class Measure { +public: + float temperature; + float humidity; + float pressure; + + //Constructor + Measure(float f, float h, float p) { + temperature = f; + humidity = h; + pressure = p; + } +}; + +//Mail queue +Mail<Measure, 16> mail_box; + + +// Call this on precise intervals +void adcISR() { + while(1) + { + //Read sample - make a copy + float temperature = 0 , humidity = 0,pressure = 0; + + + + //Allocate a block from the memory pool + Measure *measure = mail_box.alloc(); + if (measure == NULL) { + //Out of memory + printf("Out of memory\n\r"); + return; + } + + //Fill in the data + measurer.ReadTempHumi(&temperature,&humidity); + barometer.get(); + pressure = barometer.pressure(); + + // + // Initializing object with count variable and sending it through mail works perfectly fine, output si correct! + // But if I read the temperature / humidity / pressure using a ticker, I get 168 degrees :( . + // while I read from main thread, i get the correct values, which made me doubt the struct / mailbox, debugged it at my best practice but I couldn't get it sorted. + + measure->temperature = temperature; // you can test the mailbox by assigning the count variable to measure->temperature, and see the expected value. + count++; + measure->humidity = humidity; + count++; + measure->pressure = pressure; + count++; + // printf("%4.2fC %3.1f%% %6.1f \r\n", measure->temperature, measure->humidity,measure->pressure); + + //Write to queue + osStatus stat = mail_box.put(measure); //Note we are sending the "pointer" - while(1) + //Check if succesful + if (stat == osErrorResource) { + printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat); + mail_box.free(measure); + return; + } + Thread::wait(3000); + } + +} + +//Normal priority thread (consumer) +void thread1() +{ + while (true) { + //Block on the queue + osEvent evt = mail_box.get(); + + //Check status + if (evt.status == osEventMail) { + Measure *measure = (Measure*)evt.value.p; //This is the pointer (address) + //Make a copy + printf("Consumer: %fC | %f% % | %f \r\n", measure->temperature, measure->humidity,measure->pressure); + Measure msr(measure->temperature, measure->humidity,measure->pressure); + //We are done with this, so give back the memory to the pool + mail_box.free(measure); + + //Echo to the terminal + + } else { + printf("ERROR: %x\n\r", evt.status); + } + + } //end while +} + + +// Main thread +int main() { + + measurer.init(); + measurer.calib(); + //Start message + printf("Welcome\n"); + + //Hook up timer interrupt +// Ticker timer; +// timer.attach(&adcISR, 5); + + //Threads + t1 = new Thread(); + t1->start(thread1); + t2 = new Thread(); + t2->start(adcISR); + + printf("Main Thread\n"); + while(1) { - cmd=NULL; - while(cmd==NULL){cmd=getchar();} - if(cmd=='?'){ - printf("SOFT253 simple Temperature Humidity and Pressure Sensor Monitor\n\r"); - printf("Using the X-NUCLEO-IKS01A1 shield and MBED Libraries\n\r"); + Thread::wait(3000); + float temp,humi; + measurer.ReadTempHumi(&temp, &humi); + barometer.get(); + printf("Main ThreaD: %fC %f %f \r\n", temp, humi,barometer.pressure()); + } - if(cmd=='A'){ - humidity.ReadTempHumi(&tempCelsius, &humi); - printf("%4.2fC %3.1f%%", tempCelsius, humi); - barometer.get(); - printf(" %6.1f %4.1f\r\n", barometer.pressure(), barometer.temperature()); - myled = 1; // LED is ON - Thread::wait(200); // 200 ms NB 'Thread::wait(int d);' !!! d is in milliseconds! - myled = 0; // LED is OFF - Thread::wait(100); // 100 ms - } - } - } - - - -/*#include "mbed.h" - -DigitalOut led1(LED1); - -// main() runs in its own thread in the OS -int main() { - while (true) { - led1 = !led1; - wait(0.5); - } } -*/ + \ No newline at end of file