3rd Repo, trying to figure this out.
Fork of SOFT253_Template_Weather_OS_54 by
main.cpp
- Committer:
- FairyMental
- Date:
- 2017-04-05
- Revision:
- 34:09ed07f2acba
- Parent:
- 33:cffe0ae69aa6
- Child:
- 35:484e384f9bf1
File content as of revision 34:09ed07f2acba:
#include "mbed.h" #include "rtos.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); LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR); HTS221 measurer(I2C_SDA, I2C_SCL); DigitalIn onBoardSwitch(USER_BUTTON); //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" //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) { Thread::wait(3000); float temp,humi; measurer.ReadTempHumi(&temp, &humi); barometer.get(); printf("Main ThreaD: %fC %f %f \r\n", temp, humi,barometer.pressure()); } }