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:
Thu Apr 06 10:48:12 2017 +0000
Revision:
43:3983059e0d91
Parent:
42:b1f29874ab70
Child:
44:b523c9a9dd97
Commands may now take parameters! Yay! Implemented List all / list x

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 43:3983059e0d91 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 43:3983059e0d91 105 int i;
FairyMental 43:3983059e0d91 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 43:3983059e0d91 127 if (charCmd == 127 && crtChar > 0 )
FairyMental 43:3983059e0d91 128 {
FairyMental 43:3983059e0d91 129 printf("%c",charCmd);
FairyMental 43:3983059e0d91 130 command[--crtChar] = '\0';
FairyMental 43:3983059e0d91 131 }
FairyMental 43:3983059e0d91 132 else if(charCmd != 13 && charCmd != 127)
FairyMental 41:d222c043c96d 133 {
FairyMental 41:d222c043c96d 134 command[crtChar++] = charCmd;
FairyMental 41:d222c043c96d 135 printf("%c",charCmd);
FairyMental 41:d222c043c96d 136 }
FairyMental 43:3983059e0d91 137 else if(charCmd == 13)
FairyMental 41:d222c043c96d 138 {
FairyMental 42:b1f29874ab70 139 printf("\r\n\r\nCommand entered: %s\r\n", command);
FairyMental 41:d222c043c96d 140
FairyMental 43:3983059e0d91 141 // this thing that follows splits a string into multiple strings, just like String.Split(char[] delimiters)
FairyMental 43:3983059e0d91 142 // here we will check for commands and parameters :)
FairyMental 43:3983059e0d91 143 char *charPos;
FairyMental 43:3983059e0d91 144 charPos = strtok(command," -,");
FairyMental 43:3983059e0d91 145 if(CompareCommands(charPos, "list",4) == 1)
FairyMental 42:b1f29874ab70 146 {
FairyMental 43:3983059e0d91 147 charPos = strtok(NULL," -,");
FairyMental 43:3983059e0d91 148 if(CompareCommands(charPos, "all",3) == 1)
FairyMental 43:3983059e0d91 149 {
FairyMental 43:3983059e0d91 150 listBuffer->ListAll();
FairyMental 43:3983059e0d91 151 }
FairyMental 43:3983059e0d91 152 else if(strtol(charPos,NULL,10) != 0)
FairyMental 43:3983059e0d91 153 {
FairyMental 43:3983059e0d91 154 listBuffer->ListX(atoi(charPos));
FairyMental 43:3983059e0d91 155 }
FairyMental 42:b1f29874ab70 156 }
FairyMental 43:3983059e0d91 157 // printf("%s \r\n", charPos);
FairyMental 43:3983059e0d91 158 // charPos = strtok(NULL," -,");
FairyMental 43:3983059e0d91 159
FairyMental 42:b1f29874ab70 160
FairyMental 41:d222c043c96d 161 printf("Awaiting command: \r\n");
FairyMental 41:d222c043c96d 162 int i = 0;
FairyMental 41:d222c043c96d 163 for(i =0 ; i < crtChar; i++)
FairyMental 41:d222c043c96d 164 command[i] = ' ';
FairyMental 41:d222c043c96d 165 command[0] = 0;
FairyMental 41:d222c043c96d 166 crtChar = 0;
FairyMental 41:d222c043c96d 167 }
FairyMental 41:d222c043c96d 168 }
FairyMental 39:618ad21e2b34 169 }
FairyMental 39:618ad21e2b34 170 }
FairyMental 39:618ad21e2b34 171
FairyMental 42:b1f29874ab70 172
FairyMental 36:19d3f752f9c3 173 void SendSignalDoMeasure()
FairyMental 36:19d3f752f9c3 174 {
FairyMental 37:00775e368a71 175 measureThread->signal_set(SIGNAL_doMeasure);
FairyMental 36:19d3f752f9c3 176 }
FairyMental 34:09ed07f2acba 177
FairyMental 34:09ed07f2acba 178 // Main thread
FairyMental 34:09ed07f2acba 179 int main() {
FairyMental 34:09ed07f2acba 180
FairyMental 39:618ad21e2b34 181 //Initialize stuff
FairyMental 34:09ed07f2acba 182 measurer.init();
FairyMental 34:09ed07f2acba 183 measurer.calib();
FairyMental 39:618ad21e2b34 184 listBuffer = new LinkedList();
FairyMental 39:618ad21e2b34 185
FairyMental 34:09ed07f2acba 186 //Start message
FairyMental 37:00775e368a71 187 printf("Welcome\r\n");
FairyMental 34:09ed07f2acba 188
FairyMental 34:09ed07f2acba 189 //Hook up timer interrupt
FairyMental 36:19d3f752f9c3 190 Ticker timer;
FairyMental 36:19d3f752f9c3 191 timer.attach(&SendSignalDoMeasure, 5.0);
FairyMental 34:09ed07f2acba 192
FairyMental 34:09ed07f2acba 193 //Threads
FairyMental 37:00775e368a71 194 produceThread = new Thread();
FairyMental 37:00775e368a71 195 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 196 measureThread = new Thread();
FairyMental 37:00775e368a71 197 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 198 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 199 consumeThread->start(ConsumeThread);
FairyMental 34:09ed07f2acba 200
FairyMental 34:09ed07f2acba 201 printf("Main Thread\n");
FairyMental 34:09ed07f2acba 202 while(1)
martinsimpson 32:260a288be58f 203 {
FairyMental 35:484e384f9bf1 204 Thread::wait(3000);
FairyMental 37:00775e368a71 205 // float temp,humi;
FairyMental 37:00775e368a71 206 // measurer.ReadTempHumi(&temp, &humi);
FairyMental 37:00775e368a71 207 // barometer.get();
FairyMental 36:19d3f752f9c3 208 // t2->signal_set(SIGNAL_doMeasure);
FairyMental 37:00775e368a71 209 // printf("Main Thread Measures: %fC %f %f \r\n", temp, humi,barometer.pressure());
FairyMental 34:09ed07f2acba 210
martinsimpson 32:260a288be58f 211 }
Jonathan Austin 0:2757d7abb7d9 212 }
FairyMental 34:09ed07f2acba 213