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:37:25 2017 +0000
Revision:
39:618ad21e2b34
Parent:
38:e626a358e5e3
Child:
40:ba083993b481
Producer thread now adds values to the list.

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"
martinsimpson 32:260a288be58f 9
FairyMental 36:19d3f752f9c3 10 #define SIGNAL_doMeasure 1
FairyMental 36:19d3f752f9c3 11 #define SWITCH1_RELEASE 90
FairyMental 34:09ed07f2acba 12
FairyMental 34:09ed07f2acba 13 void thread1();
FairyMental 34:09ed07f2acba 14
martinsimpson 32:260a288be58f 15 DigitalOut myled(LED1);
martinsimpson 32:260a288be58f 16 I2C i2c2(I2C_SDA, I2C_SCL);
martinsimpson 32:260a288be58f 17 LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR);
FairyMental 34:09ed07f2acba 18 HTS221 measurer(I2C_SDA, I2C_SCL);
FairyMental 34:09ed07f2acba 19 DigitalIn onBoardSwitch(USER_BUTTON);
FairyMental 34:09ed07f2acba 20
martinsimpson 32:260a288be58f 21
FairyMental 34:09ed07f2acba 22 //Threads
FairyMental 37:00775e368a71 23 Thread *produceThread;
FairyMental 37:00775e368a71 24 Thread *measureThread;
FairyMental 39:618ad21e2b34 25 Thread *consumeThread;
FairyMental 38:e626a358e5e3 26
FairyMental 34:09ed07f2acba 27 int count= 0;
FairyMental 38:e626a358e5e3 28
FairyMental 38:e626a358e5e3 29 //
FairyMental 38:e626a358e5e3 30 // CLASSES
FairyMental 38:e626a358e5e3 31 //
FairyMental 34:09ed07f2acba 32 class Measure {
FairyMental 34:09ed07f2acba 33 public:
FairyMental 34:09ed07f2acba 34 float temperature;
FairyMental 34:09ed07f2acba 35 float humidity;
FairyMental 34:09ed07f2acba 36 float pressure;
FairyMental 34:09ed07f2acba 37
FairyMental 34:09ed07f2acba 38 //Constructor
FairyMental 34:09ed07f2acba 39 Measure(float f, float h, float p) {
FairyMental 34:09ed07f2acba 40 temperature = f;
FairyMental 34:09ed07f2acba 41 humidity = h;
FairyMental 34:09ed07f2acba 42 pressure = p;
FairyMental 34:09ed07f2acba 43 }
FairyMental 38:e626a358e5e3 44 Measure()
FairyMental 38:e626a358e5e3 45 {
FairyMental 38:e626a358e5e3 46 temperature = 0;
FairyMental 38:e626a358e5e3 47 humidity = 0;
FairyMental 38:e626a358e5e3 48 pressure = 0;
FairyMental 38:e626a358e5e3 49 }
FairyMental 34:09ed07f2acba 50 };
FairyMental 34:09ed07f2acba 51
FairyMental 34:09ed07f2acba 52 //Mail queue
FairyMental 34:09ed07f2acba 53 Mail<Measure, 16> mail_box;
FairyMental 34:09ed07f2acba 54
FairyMental 38:e626a358e5e3 55 class LinkedList{
FairyMental 38:e626a358e5e3 56
FairyMental 38:e626a358e5e3 57 struct Node {
FairyMental 38:e626a358e5e3 58 Measure measure;
FairyMental 38:e626a358e5e3 59 Node *next;
FairyMental 38:e626a358e5e3 60 };
FairyMental 38:e626a358e5e3 61
FairyMental 38:e626a358e5e3 62 public:
FairyMental 38:e626a358e5e3 63 // constructor
FairyMental 38:e626a358e5e3 64 LinkedList()
FairyMental 38:e626a358e5e3 65 {
FairyMental 38:e626a358e5e3 66
FairyMental 38:e626a358e5e3 67 head = NULL;
FairyMental 38:e626a358e5e3 68 }
FairyMental 38:e626a358e5e3 69
FairyMental 38:e626a358e5e3 70 void addValueFront(Measure _measure){
FairyMental 38:e626a358e5e3 71 Node *n = new Node();
FairyMental 38:e626a358e5e3 72 n->measure = _measure;
FairyMental 38:e626a358e5e3 73 n->next = head;
FairyMental 38:e626a358e5e3 74
FairyMental 38:e626a358e5e3 75 head = n;
FairyMental 38:e626a358e5e3 76 }
FairyMental 38:e626a358e5e3 77 void addValueEnd(Measure _measure){
FairyMental 39:618ad21e2b34 78 if(head == NULL)
FairyMental 38:e626a358e5e3 79 {
FairyMental 39:618ad21e2b34 80 Node *aux = new Node();
FairyMental 39:618ad21e2b34 81 aux->measure = _measure;
FairyMental 39:618ad21e2b34 82 aux->next = NULL;
FairyMental 39:618ad21e2b34 83 head = aux;
FairyMental 38:e626a358e5e3 84 }
FairyMental 39:618ad21e2b34 85 else
FairyMental 39:618ad21e2b34 86 {
FairyMental 39:618ad21e2b34 87 Node *n = head;
FairyMental 39:618ad21e2b34 88 while(n->next != NULL)
FairyMental 39:618ad21e2b34 89 {
FairyMental 39:618ad21e2b34 90 n = n->next;
FairyMental 39:618ad21e2b34 91 }
FairyMental 39:618ad21e2b34 92 Node *aux = new Node();
FairyMental 39:618ad21e2b34 93 aux->measure = _measure;
FairyMental 39:618ad21e2b34 94 aux->next = NULL;
FairyMental 39:618ad21e2b34 95 n->next = aux;
FairyMental 39:618ad21e2b34 96 }
FairyMental 38:e626a358e5e3 97 }
FairyMental 38:e626a358e5e3 98
FairyMental 38:e626a358e5e3 99 Measure popValueFRONT(){
FairyMental 38:e626a358e5e3 100 Node *n = head;
FairyMental 38:e626a358e5e3 101 Measure _measure = n->measure;
FairyMental 38:e626a358e5e3 102
FairyMental 38:e626a358e5e3 103 head = head->next;
FairyMental 38:e626a358e5e3 104 delete n;
FairyMental 38:e626a358e5e3 105 return _measure;
FairyMental 38:e626a358e5e3 106 }
FairyMental 38:e626a358e5e3 107
FairyMental 38:e626a358e5e3 108
FairyMental 38:e626a358e5e3 109 private:
FairyMental 38:e626a358e5e3 110 Node *head;
FairyMental 38:e626a358e5e3 111 };
FairyMental 39:618ad21e2b34 112 LinkedList *listBuffer;
FairyMental 34:09ed07f2acba 113
FairyMental 34:09ed07f2acba 114 // Call this on precise intervals
FairyMental 37:00775e368a71 115 void MeasureThread() {
FairyMental 35:484e384f9bf1 116
FairyMental 36:19d3f752f9c3 117 while(true)
FairyMental 36:19d3f752f9c3 118 {
FairyMental 36:19d3f752f9c3 119 Thread::signal_wait(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 120 //Read sample - make a copy
FairyMental 36:19d3f752f9c3 121 float temperature = 0 , humidity = 0,pressure = 0;
FairyMental 34:09ed07f2acba 122
FairyMental 34:09ed07f2acba 123
FairyMental 34:09ed07f2acba 124
FairyMental 36:19d3f752f9c3 125 //Allocate a block from the memory pool
FairyMental 36:19d3f752f9c3 126 Measure *measure = mail_box.alloc();
FairyMental 36:19d3f752f9c3 127 if (measure == NULL)
FairyMental 36:19d3f752f9c3 128 {
FairyMental 36:19d3f752f9c3 129 //Out of memory
FairyMental 36:19d3f752f9c3 130 printf("Out of memory\n\r");
FairyMental 36:19d3f752f9c3 131 return;
FairyMental 36:19d3f752f9c3 132 }
FairyMental 34:09ed07f2acba 133
FairyMental 36:19d3f752f9c3 134 //Fill in the data
FairyMental 36:19d3f752f9c3 135 measurer.ReadTempHumi(&temperature,&humidity);
FairyMental 36:19d3f752f9c3 136 barometer.get();
FairyMental 36:19d3f752f9c3 137 pressure = barometer.pressure();
FairyMental 36:19d3f752f9c3 138
FairyMental 34:09ed07f2acba 139
FairyMental 36:19d3f752f9c3 140 measure->temperature = temperature;
FairyMental 36:19d3f752f9c3 141 measure->humidity = humidity;
FairyMental 36:19d3f752f9c3 142 measure->pressure = pressure;
FairyMental 36:19d3f752f9c3 143
FairyMental 36:19d3f752f9c3 144 //Write to queue
FairyMental 36:19d3f752f9c3 145 osStatus stat = mail_box.put(measure); //Note we are sending the "pointer"
martinsimpson 32:260a288be58f 146
FairyMental 36:19d3f752f9c3 147 //Check if succesful
FairyMental 36:19d3f752f9c3 148 if (stat == osErrorResource) {
FairyMental 36:19d3f752f9c3 149 printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat);
FairyMental 36:19d3f752f9c3 150 mail_box.free(measure);
FairyMental 36:19d3f752f9c3 151 return;
FairyMental 36:19d3f752f9c3 152 }
FairyMental 34:09ed07f2acba 153 }
FairyMental 34:09ed07f2acba 154 }
FairyMental 34:09ed07f2acba 155
FairyMental 34:09ed07f2acba 156 //Normal priority thread (consumer)
FairyMental 37:00775e368a71 157 void ProducerThread()
FairyMental 34:09ed07f2acba 158 {
FairyMental 34:09ed07f2acba 159 while (true) {
FairyMental 34:09ed07f2acba 160 //Block on the queue
FairyMental 34:09ed07f2acba 161 osEvent evt = mail_box.get();
FairyMental 34:09ed07f2acba 162
FairyMental 34:09ed07f2acba 163 //Check status
FairyMental 34:09ed07f2acba 164 if (evt.status == osEventMail) {
FairyMental 34:09ed07f2acba 165 Measure *measure = (Measure*)evt.value.p; //This is the pointer (address)
FairyMental 34:09ed07f2acba 166 //Make a copy
FairyMental 34:09ed07f2acba 167 printf("Consumer: %fC | %f% % | %f \r\n", measure->temperature, measure->humidity,measure->pressure);
FairyMental 39:618ad21e2b34 168
FairyMental 34:09ed07f2acba 169 Measure msr(measure->temperature, measure->humidity,measure->pressure);
FairyMental 39:618ad21e2b34 170 listBuffer->addValueEnd(msr);
FairyMental 34:09ed07f2acba 171 //We are done with this, so give back the memory to the pool
FairyMental 34:09ed07f2acba 172 mail_box.free(measure);
FairyMental 34:09ed07f2acba 173
FairyMental 34:09ed07f2acba 174 //Echo to the terminal
FairyMental 34:09ed07f2acba 175
FairyMental 34:09ed07f2acba 176 } else {
FairyMental 34:09ed07f2acba 177 printf("ERROR: %x\n\r", evt.status);
FairyMental 34:09ed07f2acba 178 }
FairyMental 34:09ed07f2acba 179
FairyMental 34:09ed07f2acba 180 } //end while
FairyMental 34:09ed07f2acba 181 }
FairyMental 39:618ad21e2b34 182 void ConsumeThread()
FairyMental 39:618ad21e2b34 183 {
FairyMental 39:618ad21e2b34 184 while(1)
FairyMental 39:618ad21e2b34 185 {
FairyMental 39:618ad21e2b34 186 printf("Consumer Thread Active \r\n\r\n");
FairyMental 39:618ad21e2b34 187 Thread::wait(3000);
FairyMental 39:618ad21e2b34 188 }
FairyMental 39:618ad21e2b34 189 }
FairyMental 39:618ad21e2b34 190
FairyMental 36:19d3f752f9c3 191 void SendSignalDoMeasure()
FairyMental 36:19d3f752f9c3 192 {
FairyMental 37:00775e368a71 193 measureThread->signal_set(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 194 }
FairyMental 34:09ed07f2acba 195
FairyMental 34:09ed07f2acba 196 // Main thread
FairyMental 34:09ed07f2acba 197 int main() {
FairyMental 34:09ed07f2acba 198
FairyMental 39:618ad21e2b34 199 //Initialize stuff
FairyMental 34:09ed07f2acba 200 measurer.init();
FairyMental 34:09ed07f2acba 201 measurer.calib();
FairyMental 39:618ad21e2b34 202 listBuffer = new LinkedList();
FairyMental 39:618ad21e2b34 203
FairyMental 34:09ed07f2acba 204 //Start message
FairyMental 37:00775e368a71 205 printf("Welcome\r\n");
FairyMental 34:09ed07f2acba 206
FairyMental 34:09ed07f2acba 207 //Hook up timer interrupt
FairyMental 36:19d3f752f9c3 208 Ticker timer;
FairyMental 36:19d3f752f9c3 209 timer.attach(&SendSignalDoMeasure, 5.0);
FairyMental 34:09ed07f2acba 210
FairyMental 34:09ed07f2acba 211 //Threads
FairyMental 37:00775e368a71 212 produceThread = new Thread();
FairyMental 37:00775e368a71 213 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 214 measureThread = new Thread();
FairyMental 37:00775e368a71 215 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 216 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 217 consumeThread->start(ConsumeThread);
FairyMental 34:09ed07f2acba 218
FairyMental 34:09ed07f2acba 219 printf("Main Thread\n");
FairyMental 34:09ed07f2acba 220 while(1)
martinsimpson 32:260a288be58f 221 {
FairyMental 35:484e384f9bf1 222 Thread::wait(3000);
FairyMental 37:00775e368a71 223 // float temp,humi;
FairyMental 37:00775e368a71 224 // measurer.ReadTempHumi(&temp, &humi);
FairyMental 37:00775e368a71 225 // barometer.get();
FairyMental 36:19d3f752f9c3 226 // t2->signal_set(SIGNAL_doMeasure);
FairyMental 37:00775e368a71 227 // printf("Main Thread Measures: %fC %f %f \r\n", temp, humi,barometer.pressure());
FairyMental 34:09ed07f2acba 228
martinsimpson 32:260a288be58f 229 }
Jonathan Austin 0:2757d7abb7d9 230 }
FairyMental 34:09ed07f2acba 231