Generation 3 of the Harp project

Dependencies:   Servo TMP36 GZ buffered-serial1 chan_fatfs_sd nmea_parser watchdog mbed-rtos mbed

Fork of HARP2 by Tyler Weaver

Committer:
tylerjw
Date:
Wed Dec 12 18:13:11 2012 +0000
Revision:
18:29b19a25a963
Parent:
17:4927053e120f
Child:
19:1cfe22ef30e2
gps altitude detection

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tylerjw 0:ce5f06c3895f 1 #include "mbed.h"
tylerjw 7:d8ecabe16c9e 2 #include "rtos.h"
tylerjw 10:b13416bbb4cd 3 #include "buffered_serial.h"
tylerjw 12:0d943d69d3ec 4 #include "ff.h"
tylerjw 15:ceac642f6b75 5 #include "BMP085.h"
tylerjw 17:4927053e120f 6 #include "GPS_parser.h"
tylerjw 15:ceac642f6b75 7
tylerjw 15:ceac642f6b75 8 I2C i2c(p9, p10); // sda, scl
tylerjw 15:ceac642f6b75 9 BMP085 alt_sensor(i2c);
tylerjw 15:ceac642f6b75 10
tylerjw 16:653df0cfe6ee 11 const float BAT_GPS_MUL = 15.51;
tylerjw 16:653df0cfe6ee 12 const float BAT_MBED_MUL = 10.26;
tylerjw 0:ce5f06c3895f 13
tylerjw 0:ce5f06c3895f 14 Serial pc(USBTX, USBRX);
tylerjw 10:b13416bbb4cd 15 BufferedSerial gps(NC, p14);
tylerjw 10:b13416bbb4cd 16 AnalogIn gps_battery(p20);
tylerjw 16:653df0cfe6ee 17 AnalogIn mbed_battery(p19);
tylerjw 7:d8ecabe16c9e 18
tylerjw 17:4927053e120f 19 GPS_Parser nmea_parser;
tylerjw 17:4927053e120f 20
tylerjw 18:29b19a25a963 21 Semaphore parachute_sem(0);
tylerjw 18:29b19a25a963 22
tylerjw 13:db6af0620264 23 typedef struct {
tylerjw 13:db6af0620264 24 char line[80];
tylerjw 13:db6af0620264 25 } gps_line;
tylerjw 13:db6af0620264 26 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 27 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 28
tylerjw 13:db6af0620264 29 typedef struct {
tylerjw 14:dce4d8c29b17 30 char line[80];
tylerjw 13:db6af0620264 31 } sensor_line;
tylerjw 13:db6af0620264 32 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 33 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 34
tylerjw 7:d8ecabe16c9e 35 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 36 {
tylerjw 10:b13416bbb4cd 37 char buffer[80];
tylerjw 18:29b19a25a963 38 float alt, alt_prev;
tylerjw 18:29b19a25a963 39 alt = alt_prev = 0;
tylerjw 9:4debfbc1fb3e 40
tylerjw 10:b13416bbb4cd 41 DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 42
tylerjw 7:d8ecabe16c9e 43 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 44
tylerjw 7:d8ecabe16c9e 45 while(true) {
tylerjw 18:29b19a25a963 46 gps_led = !gps_led;
tylerjw 10:b13416bbb4cd 47 gps.read_line(buffer);
tylerjw 17:4927053e120f 48 nmea_parser.sample(buffer);
tylerjw 14:dce4d8c29b17 49 //pc.puts(buffer);
tylerjw 13:db6af0620264 50 // send to log...
tylerjw 13:db6af0620264 51 gps_line *message = mpool_gps_line.alloc();
tylerjw 13:db6af0620264 52 strcpy(message->line, buffer);
tylerjw 13:db6af0620264 53 queue_gps_line.put(message);
tylerjw 18:29b19a25a963 54
tylerjw 18:29b19a25a963 55 // test altitude direction
tylerjw 18:29b19a25a963 56 if(nmea_parser.get_lock())
tylerjw 18:29b19a25a963 57 {
tylerjw 18:29b19a25a963 58 if(alt != 0) { // first time
tylerjw 18:29b19a25a963 59 alt = nmea_parser.get_msl_altitude();
tylerjw 18:29b19a25a963 60 } else {
tylerjw 18:29b19a25a963 61 alt_prev = alt;
tylerjw 18:29b19a25a963 62 alt = nmea_parser.get_msl_altitude();
tylerjw 18:29b19a25a963 63 if(alt < alt_prev) // going down
tylerjw 18:29b19a25a963 64 parachute_sem.release(); // let the parachute code execute
tylerjw 18:29b19a25a963 65 }
tylerjw 18:29b19a25a963 66 }
tylerjw 13:db6af0620264 67 }
tylerjw 13:db6af0620264 68 }
tylerjw 13:db6af0620264 69
tylerjw 13:db6af0620264 70 void log_thread(const void *args)
tylerjw 13:db6af0620264 71 {
tylerjw 13:db6af0620264 72 FATFS fs;
tylerjw 13:db6af0620264 73 FIL fp_gps, fp_sensor;
tylerjw 13:db6af0620264 74
tylerjw 13:db6af0620264 75 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 76
tylerjw 13:db6af0620264 77 f_mount(0, &fs);
tylerjw 13:db6af0620264 78 f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 17:4927053e120f 79 f_open(&fp_sensor, "0:sensors.csv", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 80
tylerjw 13:db6af0620264 81 while(1) {
tylerjw 18:29b19a25a963 82 log_led = !log_led;
tylerjw 14:dce4d8c29b17 83 osEvent evt1 = queue_gps_line.get(1);
tylerjw 14:dce4d8c29b17 84 if (evt1.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 85 gps_line *message = (gps_line*)evt1.value.p;
tylerjw 13:db6af0620264 86
tylerjw 13:db6af0620264 87 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 88 f_sync(&fp_gps);
tylerjw 13:db6af0620264 89
tylerjw 13:db6af0620264 90 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 91 }
tylerjw 13:db6af0620264 92
tylerjw 14:dce4d8c29b17 93 osEvent evt2 = queue_sensor_line.get(1);
tylerjw 14:dce4d8c29b17 94 if(evt2.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 95 sensor_line *message = (sensor_line*)evt2.value.p;
tylerjw 13:db6af0620264 96
tylerjw 14:dce4d8c29b17 97 f_puts(message->line, &fp_sensor);
tylerjw 14:dce4d8c29b17 98 f_sync(&fp_sensor);
tylerjw 13:db6af0620264 99
tylerjw 13:db6af0620264 100 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 101 }
tylerjw 13:db6af0620264 102 }
tylerjw 13:db6af0620264 103 }
tylerjw 13:db6af0620264 104
tylerjw 13:db6af0620264 105 void sensor_thread(const void* args)
tylerjw 13:db6af0620264 106 {
tylerjw 14:dce4d8c29b17 107 DigitalOut sensor_led(LED2);
tylerjw 16:653df0cfe6ee 108 Timer t;
tylerjw 18:29b19a25a963 109 float time;
tylerjw 18:29b19a25a963 110 float gps_battery_voltage, mbed_battery_voltage;
tylerjw 18:29b19a25a963 111 float bmp_temperature, bmp_altitude;
tylerjw 18:29b19a25a963 112 int bmp_pressure;
tylerjw 17:4927053e120f 113
tylerjw 17:4927053e120f 114 //while(!nmea_parser.get_lock()) Thread::wait(100); // wait for lock
tylerjw 17:4927053e120f 115
tylerjw 17:4927053e120f 116 t.start(); // start timer after lock
tylerjw 14:dce4d8c29b17 117
tylerjw 14:dce4d8c29b17 118 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 17:4927053e120f 119 sprintf(message->line, "Date: %d, Time: %f\r\nTime(s),GPS Battery(V),mbed Battery(V),BMP085 Temperature(C),Pressure,Altitude(ft)\r\n", nmea_parser.get_date(), nmea_parser.get_time());
tylerjw 14:dce4d8c29b17 120 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 121
tylerjw 13:db6af0620264 122 while(true)
tylerjw 13:db6af0620264 123 {
tylerjw 13:db6af0620264 124 //get sensor line memory
tylerjw 18:29b19a25a963 125 sensor_led = !sensor_led;
tylerjw 13:db6af0620264 126 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 13:db6af0620264 127
tylerjw 16:653df0cfe6ee 128 //timestamp
tylerjw 18:29b19a25a963 129 time = t.read();
tylerjw 16:653df0cfe6ee 130
tylerjw 13:db6af0620264 131 //gps battery
tylerjw 18:29b19a25a963 132 gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
tylerjw 16:653df0cfe6ee 133
tylerjw 16:653df0cfe6ee 134 //mbed battery
tylerjw 18:29b19a25a963 135 mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
tylerjw 13:db6af0620264 136
tylerjw 15:ceac642f6b75 137 //BMP085
tylerjw 18:29b19a25a963 138 bmp_temperature = (float)alt_sensor.get_temperature() / 10.0;
tylerjw 18:29b19a25a963 139 bmp_pressure = alt_sensor.get_pressure();
tylerjw 18:29b19a25a963 140 bmp_altitude = alt_sensor.get_altitude_ft();
tylerjw 16:653df0cfe6ee 141
tylerjw 16:653df0cfe6ee 142 sprintf(message->line, "%f,%f,%f,%f,%d,%f\r\n", time,gps_battery_voltage,mbed_battery_voltage,bmp_temperature,bmp_pressure,bmp_altitude);
tylerjw 14:dce4d8c29b17 143 queue_sensor_line.put(message);
tylerjw 0:ce5f06c3895f 144 }
tylerjw 7:d8ecabe16c9e 145 }
tylerjw 7:d8ecabe16c9e 146
tylerjw 17:4927053e120f 147 void parachute_thread(const void *args)
tylerjw 17:4927053e120f 148 {
tylerjw 18:29b19a25a963 149 DigitalOut para_led(LED1);
tylerjw 17:4927053e120f 150
tylerjw 18:29b19a25a963 151 while(true)
tylerjw 18:29b19a25a963 152 {
tylerjw 18:29b19a25a963 153 parachute_sem.wait();
tylerjw 18:29b19a25a963 154 para_led = !para_led;
tylerjw 18:29b19a25a963 155 }
tylerjw 17:4927053e120f 156 }
tylerjw 17:4927053e120f 157
tylerjw 7:d8ecabe16c9e 158 int main()
tylerjw 7:d8ecabe16c9e 159 {
tylerjw 10:b13416bbb4cd 160 pc.baud(9600);
tylerjw 9:4debfbc1fb3e 161 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 162 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 14:dce4d8c29b17 163 Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 17:4927053e120f 164 Thread thread4(parachute_thread, NULL, osPriorityRealtime);
tylerjw 13:db6af0620264 165
tylerjw 18:29b19a25a963 166 while(true) ;
tylerjw 0:ce5f06c3895f 167 }