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 16:12:42 2017 +0000
Revision:
42:b1f29874ab70
Parent:
41:d222c043c96d
Child:
43:3983059e0d91
Implemented 'list all' command

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 42:b1f29874ab70 103 int CompareCommands(char command[],char targetcommand[], int size)
FairyMental 42:b1f29874ab70 104 {
FairyMental 42:b1f29874ab70 105 int ret = -1, i = 0;
FairyMental 42:b1f29874ab70 106 for(i = 0; i< size; i ++)
FairyMental 42:b1f29874ab70 107 {
FairyMental 42:b1f29874ab70 108 if(command[i] != targetcommand[i])
FairyMental 42:b1f29874ab70 109 return -1;
FairyMental 42:b1f29874ab70 110
FairyMental 42:b1f29874ab70 111 }
FairyMental 42:b1f29874ab70 112 return 1;
FairyMental 42:b1f29874ab70 113 }
FairyMental 39:618ad21e2b34 114 void ConsumeThread()
FairyMental 39:618ad21e2b34 115 {
FairyMental 41:d222c043c96d 116 char charCmd;
FairyMental 41:d222c043c96d 117 char command[40];
FairyMental 41:d222c043c96d 118 int crtChar = 0;
FairyMental 41:d222c043c96d 119 printf("\r\nAwaiting command:\r\n");
FairyMental 39:618ad21e2b34 120 while(1)
FairyMental 39:618ad21e2b34 121 {
FairyMental 41:d222c043c96d 122
FairyMental 41:d222c043c96d 123 charCmd = NULL;
FairyMental 41:d222c043c96d 124 charCmd = getchar();
FairyMental 41:d222c043c96d 125 if(charCmd != NULL)
FairyMental 41:d222c043c96d 126 {
FairyMental 41:d222c043c96d 127 if(charCmd != 13)
FairyMental 41:d222c043c96d 128 {
FairyMental 41:d222c043c96d 129 command[crtChar++] = charCmd;
FairyMental 41:d222c043c96d 130 printf("%c",charCmd);
FairyMental 41:d222c043c96d 131 }
FairyMental 41:d222c043c96d 132 else
FairyMental 41:d222c043c96d 133 {
FairyMental 42:b1f29874ab70 134 printf("\r\n\r\nCommand entered: %s\r\n", command);
FairyMental 41:d222c043c96d 135
FairyMental 42:b1f29874ab70 136 if(CompareCommands(command,"list all",crtChar) == 1)
FairyMental 42:b1f29874ab70 137 {
FairyMental 42:b1f29874ab70 138 listBuffer->ListAll();
FairyMental 42:b1f29874ab70 139 }
FairyMental 42:b1f29874ab70 140
FairyMental 41:d222c043c96d 141 printf("Awaiting command: \r\n");
FairyMental 41:d222c043c96d 142 int i = 0;
FairyMental 41:d222c043c96d 143 for(i =0 ; i < crtChar; i++)
FairyMental 41:d222c043c96d 144 command[i] = ' ';
FairyMental 41:d222c043c96d 145 command[0] = 0;
FairyMental 41:d222c043c96d 146 crtChar = 0;
FairyMental 41:d222c043c96d 147 }
FairyMental 41:d222c043c96d 148 }
FairyMental 39:618ad21e2b34 149 }
FairyMental 39:618ad21e2b34 150 }
FairyMental 39:618ad21e2b34 151
FairyMental 42:b1f29874ab70 152
FairyMental 36:19d3f752f9c3 153 void SendSignalDoMeasure()
FairyMental 36:19d3f752f9c3 154 {
FairyMental 37:00775e368a71 155 measureThread->signal_set(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 156 }
FairyMental 34:09ed07f2acba 157
FairyMental 34:09ed07f2acba 158 // Main thread
FairyMental 34:09ed07f2acba 159 int main() {
FairyMental 34:09ed07f2acba 160
FairyMental 39:618ad21e2b34 161 //Initialize stuff
FairyMental 34:09ed07f2acba 162 measurer.init();
FairyMental 34:09ed07f2acba 163 measurer.calib();
FairyMental 39:618ad21e2b34 164 listBuffer = new LinkedList();
FairyMental 39:618ad21e2b34 165
FairyMental 34:09ed07f2acba 166 //Start message
FairyMental 37:00775e368a71 167 printf("Welcome\r\n");
FairyMental 34:09ed07f2acba 168
FairyMental 34:09ed07f2acba 169 //Hook up timer interrupt
FairyMental 36:19d3f752f9c3 170 Ticker timer;
FairyMental 36:19d3f752f9c3 171 timer.attach(&SendSignalDoMeasure, 5.0);
FairyMental 34:09ed07f2acba 172
FairyMental 34:09ed07f2acba 173 //Threads
FairyMental 37:00775e368a71 174 produceThread = new Thread();
FairyMental 37:00775e368a71 175 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 176 measureThread = new Thread();
FairyMental 37:00775e368a71 177 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 178 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 179 consumeThread->start(ConsumeThread);
FairyMental 34:09ed07f2acba 180
FairyMental 34:09ed07f2acba 181 printf("Main Thread\n");
FairyMental 34:09ed07f2acba 182 while(1)
martinsimpson 32:260a288be58f 183 {
FairyMental 35:484e384f9bf1 184 Thread::wait(3000);
FairyMental 37:00775e368a71 185 // float temp,humi;
FairyMental 37:00775e368a71 186 // measurer.ReadTempHumi(&temp, &humi);
FairyMental 37:00775e368a71 187 // barometer.get();
FairyMental 36:19d3f752f9c3 188 // t2->signal_set(SIGNAL_doMeasure);
FairyMental 37:00775e368a71 189 // printf("Main Thread Measures: %fC %f %f \r\n", temp, humi,barometer.pressure());
FairyMental 34:09ed07f2acba 190
martinsimpson 32:260a288be58f 191 }
Jonathan Austin 0:2757d7abb7d9 192 }
FairyMental 34:09ed07f2acba 193