3rd Repo, trying to figure this out.

Dependencies:   LPS25H hts221

Fork of SOFT253_Template_Weather_OS_54 by Stage-1 Students SoCEM

Committer:
FairyMental
Date:
Wed Apr 05 14:48:21 2017 +0000
Revision:
40:ba083993b481
Parent:
39:618ad21e2b34
Child:
41:d222c043c96d
Splited classes into multiple .cpps / .h files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FairyMental 36:19d3f752f9c3 1
Jonathan Austin 0:2757d7abb7d9 2 #include "mbed.h"
martinsimpson 32:260a288be58f 3 #include "rtos.h"
FairyMental 34:09ed07f2acba 4 #include "string.h"
FairyMental 34:09ed07f2acba 5 #include <stdio.h>
FairyMental 34:09ed07f2acba 6 #include <ctype.h>
FairyMental 36:19d3f752f9c3 7 #include "hts221.h"
martinsimpson 32:260a288be58f 8 #include "LPS25H.h"
FairyMental 40:ba083993b481 9 #include "LinkedList.h"
martinsimpson 32:260a288be58f 10
FairyMental 36:19d3f752f9c3 11 #define SIGNAL_doMeasure 1
FairyMental 36:19d3f752f9c3 12 #define SWITCH1_RELEASE 90
FairyMental 34:09ed07f2acba 13
FairyMental 34:09ed07f2acba 14 void thread1();
FairyMental 34:09ed07f2acba 15
martinsimpson 32:260a288be58f 16 DigitalOut myled(LED1);
martinsimpson 32:260a288be58f 17 I2C i2c2(I2C_SDA, I2C_SCL);
martinsimpson 32:260a288be58f 18 LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR);
FairyMental 34:09ed07f2acba 19 HTS221 measurer(I2C_SDA, I2C_SCL);
FairyMental 34:09ed07f2acba 20 DigitalIn onBoardSwitch(USER_BUTTON);
FairyMental 34:09ed07f2acba 21
martinsimpson 32:260a288be58f 22
FairyMental 34:09ed07f2acba 23 //Threads
FairyMental 37:00775e368a71 24 Thread *produceThread;
FairyMental 37:00775e368a71 25 Thread *measureThread;
FairyMental 39:618ad21e2b34 26 Thread *consumeThread;
FairyMental 38:e626a358e5e3 27
FairyMental 34:09ed07f2acba 28 int count= 0;
FairyMental 38:e626a358e5e3 29
FairyMental 34:09ed07f2acba 30
FairyMental 34:09ed07f2acba 31 //Mail queue
FairyMental 34:09ed07f2acba 32 Mail<Measure, 16> mail_box;
FairyMental 34:09ed07f2acba 33
FairyMental 38:e626a358e5e3 34
FairyMental 39:618ad21e2b34 35 LinkedList *listBuffer;
FairyMental 34:09ed07f2acba 36
FairyMental 34:09ed07f2acba 37 // Call this on precise intervals
FairyMental 37:00775e368a71 38 void MeasureThread() {
FairyMental 35:484e384f9bf1 39
FairyMental 36:19d3f752f9c3 40 while(true)
FairyMental 36:19d3f752f9c3 41 {
FairyMental 36:19d3f752f9c3 42 Thread::signal_wait(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 43 //Read sample - make a copy
FairyMental 36:19d3f752f9c3 44 float temperature = 0 , humidity = 0,pressure = 0;
FairyMental 34:09ed07f2acba 45
FairyMental 34:09ed07f2acba 46
FairyMental 34:09ed07f2acba 47
FairyMental 36:19d3f752f9c3 48 //Allocate a block from the memory pool
FairyMental 36:19d3f752f9c3 49 Measure *measure = mail_box.alloc();
FairyMental 36:19d3f752f9c3 50 if (measure == NULL)
FairyMental 36:19d3f752f9c3 51 {
FairyMental 36:19d3f752f9c3 52 //Out of memory
FairyMental 36:19d3f752f9c3 53 printf("Out of memory\n\r");
FairyMental 36:19d3f752f9c3 54 return;
FairyMental 36:19d3f752f9c3 55 }
FairyMental 34:09ed07f2acba 56
FairyMental 36:19d3f752f9c3 57 //Fill in the data
FairyMental 36:19d3f752f9c3 58 measurer.ReadTempHumi(&temperature,&humidity);
FairyMental 36:19d3f752f9c3 59 barometer.get();
FairyMental 36:19d3f752f9c3 60 pressure = barometer.pressure();
FairyMental 36:19d3f752f9c3 61
FairyMental 34:09ed07f2acba 62
FairyMental 36:19d3f752f9c3 63 measure->temperature = temperature;
FairyMental 36:19d3f752f9c3 64 measure->humidity = humidity;
FairyMental 36:19d3f752f9c3 65 measure->pressure = pressure;
FairyMental 36:19d3f752f9c3 66
FairyMental 36:19d3f752f9c3 67 //Write to queue
FairyMental 36:19d3f752f9c3 68 osStatus stat = mail_box.put(measure); //Note we are sending the "pointer"
martinsimpson 32:260a288be58f 69
FairyMental 36:19d3f752f9c3 70 //Check if succesful
FairyMental 36:19d3f752f9c3 71 if (stat == osErrorResource) {
FairyMental 36:19d3f752f9c3 72 printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat);
FairyMental 36:19d3f752f9c3 73 mail_box.free(measure);
FairyMental 36:19d3f752f9c3 74 return;
FairyMental 36:19d3f752f9c3 75 }
FairyMental 34:09ed07f2acba 76 }
FairyMental 34:09ed07f2acba 77 }
FairyMental 34:09ed07f2acba 78
FairyMental 34:09ed07f2acba 79 //Normal priority thread (consumer)
FairyMental 37:00775e368a71 80 void ProducerThread()
FairyMental 34:09ed07f2acba 81 {
FairyMental 34:09ed07f2acba 82 while (true) {
FairyMental 34:09ed07f2acba 83 //Block on the queue
FairyMental 34:09ed07f2acba 84 osEvent evt = mail_box.get();
FairyMental 34:09ed07f2acba 85
FairyMental 34:09ed07f2acba 86 //Check status
FairyMental 34:09ed07f2acba 87 if (evt.status == osEventMail) {
FairyMental 34:09ed07f2acba 88 Measure *measure = (Measure*)evt.value.p; //This is the pointer (address)
FairyMental 34:09ed07f2acba 89 //Make a copy
FairyMental 34:09ed07f2acba 90 printf("Consumer: %fC | %f% % | %f \r\n", measure->temperature, measure->humidity,measure->pressure);
FairyMental 39:618ad21e2b34 91
FairyMental 34:09ed07f2acba 92 Measure msr(measure->temperature, measure->humidity,measure->pressure);
FairyMental 39:618ad21e2b34 93 listBuffer->addValueEnd(msr);
FairyMental 34:09ed07f2acba 94 //We are done with this, so give back the memory to the pool
FairyMental 34:09ed07f2acba 95 mail_box.free(measure);
FairyMental 34:09ed07f2acba 96
FairyMental 34:09ed07f2acba 97 //Echo to the terminal
FairyMental 34:09ed07f2acba 98
FairyMental 34:09ed07f2acba 99 } else {
FairyMental 34:09ed07f2acba 100 printf("ERROR: %x\n\r", evt.status);
FairyMental 34:09ed07f2acba 101 }
FairyMental 34:09ed07f2acba 102
FairyMental 34:09ed07f2acba 103 } //end while
FairyMental 34:09ed07f2acba 104 }
FairyMental 39:618ad21e2b34 105 void ConsumeThread()
FairyMental 39:618ad21e2b34 106 {
FairyMental 39:618ad21e2b34 107 while(1)
FairyMental 39:618ad21e2b34 108 {
FairyMental 39:618ad21e2b34 109 printf("Consumer Thread Active \r\n\r\n");
FairyMental 39:618ad21e2b34 110 Thread::wait(3000);
FairyMental 39:618ad21e2b34 111 }
FairyMental 39:618ad21e2b34 112 }
FairyMental 39:618ad21e2b34 113
FairyMental 36:19d3f752f9c3 114 void SendSignalDoMeasure()
FairyMental 36:19d3f752f9c3 115 {
FairyMental 37:00775e368a71 116 measureThread->signal_set(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 117 }
FairyMental 34:09ed07f2acba 118
FairyMental 34:09ed07f2acba 119 // Main thread
FairyMental 34:09ed07f2acba 120 int main() {
FairyMental 34:09ed07f2acba 121
FairyMental 39:618ad21e2b34 122 //Initialize stuff
FairyMental 34:09ed07f2acba 123 measurer.init();
FairyMental 34:09ed07f2acba 124 measurer.calib();
FairyMental 39:618ad21e2b34 125 listBuffer = new LinkedList();
FairyMental 39:618ad21e2b34 126
FairyMental 34:09ed07f2acba 127 //Start message
FairyMental 37:00775e368a71 128 printf("Welcome\r\n");
FairyMental 34:09ed07f2acba 129
FairyMental 34:09ed07f2acba 130 //Hook up timer interrupt
FairyMental 36:19d3f752f9c3 131 Ticker timer;
FairyMental 36:19d3f752f9c3 132 timer.attach(&SendSignalDoMeasure, 5.0);
FairyMental 34:09ed07f2acba 133
FairyMental 34:09ed07f2acba 134 //Threads
FairyMental 37:00775e368a71 135 produceThread = new Thread();
FairyMental 37:00775e368a71 136 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 137 measureThread = new Thread();
FairyMental 37:00775e368a71 138 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 139 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 140 consumeThread->start(ConsumeThread);
FairyMental 34:09ed07f2acba 141
FairyMental 34:09ed07f2acba 142 printf("Main Thread\n");
FairyMental 34:09ed07f2acba 143 while(1)
martinsimpson 32:260a288be58f 144 {
FairyMental 35:484e384f9bf1 145 Thread::wait(3000);
FairyMental 37:00775e368a71 146 // float temp,humi;
FairyMental 37:00775e368a71 147 // measurer.ReadTempHumi(&temp, &humi);
FairyMental 37:00775e368a71 148 // barometer.get();
FairyMental 36:19d3f752f9c3 149 // t2->signal_set(SIGNAL_doMeasure);
FairyMental 37:00775e368a71 150 // printf("Main Thread Measures: %fC %f %f \r\n", temp, humi,barometer.pressure());
FairyMental 34:09ed07f2acba 151
martinsimpson 32:260a288be58f 152 }
Jonathan Austin 0:2757d7abb7d9 153 }
FairyMental 34:09ed07f2acba 154