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:03:27 2017 +0000
Revision:
38:e626a358e5e3
Parent:
37:00775e368a71
Child:
39:618ad21e2b34
Added List class, compiles with no errors. Soon testing adding to it.

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