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 15:40:24 2017 +0000
Revision:
41:d222c043c96d
Parent:
40:ba083993b481
Child:
42:b1f29874ab70
Implemented command input.

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