Final project for ECE 4180.

Dependencies:   GPS SDFileSystem mbed-rtos mbed MPL3115A2

Fork of GPS_HelloWorld by kris gjika

Committer:
cmiller86
Date:
Tue Nov 17 07:16:58 2015 +0000
Revision:
3:b490294520d5
Parent:
2:21e4b9092bb2
Child:
4:ebf8c354c758
Multithreaded

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:6b7345059afe 1 #include "mbed.h"
cmiller86 2:21e4b9092bb2 2 #include "rtos.h"
cmiller86 2:21e4b9092bb2 3
simon 0:6b7345059afe 4 #include "GPS.h"
cmiller86 2:21e4b9092bb2 5 #include "SDFileSystem.h"
simon 0:6b7345059afe 6
cmiller86 3:b490294520d5 7 #define PC_DEBUG
cmiller86 3:b490294520d5 8
simon 0:6b7345059afe 9 Serial pc(USBTX, USBRX);
cmiller86 2:21e4b9092bb2 10 SDFileSystem sd(p5, p6, p7, p8, "sd");
simon 0:6b7345059afe 11 GPS gps(p9, p10);
cmiller86 2:21e4b9092bb2 12
cmiller86 2:21e4b9092bb2 13 AnalogIn temp1(p18);
cmiller86 2:21e4b9092bb2 14 AnalogIn temp2(p19);
cmiller86 2:21e4b9092bb2 15 AnalogIn temp3(p20);
cmiller86 2:21e4b9092bb2 16
cmiller86 2:21e4b9092bb2 17 DigitalIn dtmf(p11);
cmiller86 2:21e4b9092bb2 18
Gjika 1:2c4f640a8104 19 DigitalOut led1(LED1);
Gjika 1:2c4f640a8104 20 DigitalOut relay(p8);
cmiller86 2:21e4b9092bb2 21
cmiller86 3:b490294520d5 22 bool attempted = false, cutdown = false;
cmiller86 3:b490294520d5 23 float tempF1, tempF2, tempF3;
cmiller86 2:21e4b9092bb2 24
cmiller86 2:21e4b9092bb2 25 FILE *sdout;
cmiller86 3:b490294520d5 26 Timer t;
cmiller86 3:b490294520d5 27 Mutex log_mutex;
simon 0:6b7345059afe 28
cmiller86 2:21e4b9092bb2 29 void init()
cmiller86 2:21e4b9092bb2 30 {
cmiller86 2:21e4b9092bb2 31 t.start();
cmiller86 3:b490294520d5 32
cmiller86 3:b490294520d5 33 led1 = 0;
cmiller86 2:21e4b9092bb2 34 relay = 0;
cmiller86 2:21e4b9092bb2 35
cmiller86 2:21e4b9092bb2 36 mkdir("/sd/weather_balloon", 0777);
cmiller86 2:21e4b9092bb2 37 sdout = fopen("/sd/weather_balloon/log.txt", "w");
cmiller86 2:21e4b9092bb2 38 }
cmiller86 2:21e4b9092bb2 39
cmiller86 3:b490294520d5 40 void update_gps()
cmiller86 2:21e4b9092bb2 41 {
cmiller86 3:b490294520d5 42 while(true)
cmiller86 2:21e4b9092bb2 43 {
Gjika 1:2c4f640a8104 44 gps.sample();
cmiller86 2:21e4b9092bb2 45
cmiller86 2:21e4b9092bb2 46 if(!gps.longitude)
cmiller86 2:21e4b9092bb2 47 led1 = 1;
Gjika 1:2c4f640a8104 48
cmiller86 3:b490294520d5 49 Thread::wait(250);
cmiller86 3:b490294520d5 50 }
cmiller86 3:b490294520d5 51 }
cmiller86 3:b490294520d5 52
cmiller86 3:b490294520d5 53 void update_temperature()
cmiller86 3:b490294520d5 54 {
cmiller86 3:b490294520d5 55 float tempC1, tempC2, tempC3;
cmiller86 3:b490294520d5 56
cmiller86 3:b490294520d5 57 while(true)
cmiller86 3:b490294520d5 58 {
cmiller86 2:21e4b9092bb2 59 tempC1 = ((temp1 * 3.3) - 0.600) * 100.0;
cmiller86 2:21e4b9092bb2 60 tempC2 = ((temp2 * 3.3) - 0.600) * 100.0;
cmiller86 2:21e4b9092bb2 61 tempC3 = ((temp3 * 3.3) - 0.600) * 100.0;
cmiller86 2:21e4b9092bb2 62 tempF1 = (9.0 * tempC1) / 5.0 + 32;
cmiller86 2:21e4b9092bb2 63 tempF2 = (9.0 * tempC2) / 5.0 + 32;
cmiller86 2:21e4b9092bb2 64 tempF3 = (9.0 * tempC3) / 5.0 + 32;
Gjika 1:2c4f640a8104 65
cmiller86 3:b490294520d5 66 Thread::wait(250);
cmiller86 3:b490294520d5 67 }
cmiller86 3:b490294520d5 68 }
cmiller86 3:b490294520d5 69
cmiller86 3:b490294520d5 70 void write_to_log()
cmiller86 3:b490294520d5 71 {
cmiller86 3:b490294520d5 72 while(true)
cmiller86 3:b490294520d5 73 {
cmiller86 3:b490294520d5 74 log_mutex.lock();
cmiller86 3:b490294520d5 75
cmiller86 3:b490294520d5 76 fprintf(sdout, "----- %f -----\n\r", t.read());
cmiller86 3:b490294520d5 77 fprintf(sdout, "Long = %f\n\rLati = %f\n\r", gps.longitude, gps.latitude);
cmiller86 2:21e4b9092bb2 78 fprintf(sdout, "Temp1 = %f\n\rTemp2 = %f\n\rTemp3 = %f\n\r", tempF1, tempF2, tempF3);
cmiller86 3:b490294520d5 79 fprintf(sdout, dtmf ? "DTMF = True\n\r" : "DTMF = False\n\r");
cmiller86 2:21e4b9092bb2 80
cmiller86 3:b490294520d5 81 #ifdef PC_DEBUG
cmiller86 3:b490294520d5 82 pc.printf("----- %f -----\n\r", t.read());
cmiller86 3:b490294520d5 83 pc.printf("Long = %f\n\rLati = %f\n\r", gps.longitude, gps.latitude);
cmiller86 3:b490294520d5 84 pc.printf("Temp1 = %f\n\rTemp2 = %f\n\rTemp3 = %f\n\r", tempF1, tempF2, tempF3);
cmiller86 3:b490294520d5 85 pc.printf(dtmf ? "DTMF = True\n\r" : "DTMF = False\n\r");
cmiller86 3:b490294520d5 86 #endif
cmiller86 3:b490294520d5 87
cmiller86 3:b490294520d5 88 log_mutex.unlock();
cmiller86 3:b490294520d5 89
cmiller86 3:b490294520d5 90 Thread::wait(1000);
cmiller86 3:b490294520d5 91 }
cmiller86 3:b490294520d5 92 }
cmiller86 3:b490294520d5 93
cmiller86 3:b490294520d5 94 void check_cutdown()
cmiller86 3:b490294520d5 95 {
cmiller86 3:b490294520d5 96 while(true)
cmiller86 3:b490294520d5 97 {
cmiller86 3:b490294520d5 98 if(t.read() >= 20 || dtmf)
cmiller86 2:21e4b9092bb2 99 cutdown = true;
Gjika 1:2c4f640a8104 100
cmiller86 2:21e4b9092bb2 101 if(cutdown && !attempted)
cmiller86 2:21e4b9092bb2 102 {
cmiller86 3:b490294520d5 103 log_mutex.lock();
cmiller86 2:21e4b9092bb2 104 pc.printf("Cutdown Started = %f\n\r", t.read());
cmiller86 2:21e4b9092bb2 105 fprintf(sdout, "Cutdown Started = %f\n\r", t.read());
cmiller86 3:b490294520d5 106 log_mutex.unlock();
cmiller86 2:21e4b9092bb2 107
cmiller86 2:21e4b9092bb2 108 relay = 1;
cmiller86 3:b490294520d5 109 Thread::wait(200000);
cmiller86 2:21e4b9092bb2 110 relay = 0;
cmiller86 2:21e4b9092bb2 111
cmiller86 3:b490294520d5 112 log_mutex.lock();
cmiller86 2:21e4b9092bb2 113 pc.printf("Cutdown Ended = %f\n\r", t.read());
cmiller86 2:21e4b9092bb2 114 fprintf(sdout, "Cutdown Ended = %f\n\r", t.read());
cmiller86 3:b490294520d5 115 log_mutex.unlock();
cmiller86 2:21e4b9092bb2 116
cmiller86 2:21e4b9092bb2 117 attempted = true;
simon 0:6b7345059afe 118 }
cmiller86 3:b490294520d5 119
cmiller86 3:b490294520d5 120 Thread::wait(100);
simon 0:6b7345059afe 121 }
cmiller86 2:21e4b9092bb2 122 }
cmiller86 3:b490294520d5 123
cmiller86 3:b490294520d5 124 int main()
cmiller86 3:b490294520d5 125 {
cmiller86 3:b490294520d5 126 Thread gps_thread(update_gps);
cmiller86 3:b490294520d5 127 Thread temperature_thread(update_temperature);
cmiller86 3:b490294520d5 128 Thread log_thread(write_to_log);
cmiller86 3:b490294520d5 129 Thread cutdown_thread(check_cutdown);
cmiller86 3:b490294520d5 130 }