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 17:54:04 2012 +0000
Revision:
17:4927053e120f
Parent:
16:653df0cfe6ee
Child:
18:29b19a25a963
parachute_thread initial

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 13:db6af0620264 21 typedef struct {
tylerjw 13:db6af0620264 22 char line[80];
tylerjw 13:db6af0620264 23 } gps_line;
tylerjw 13:db6af0620264 24 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 25 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 26
tylerjw 13:db6af0620264 27 typedef struct {
tylerjw 14:dce4d8c29b17 28 char line[80];
tylerjw 13:db6af0620264 29 } sensor_line;
tylerjw 13:db6af0620264 30 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 31 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 32
tylerjw 7:d8ecabe16c9e 33 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 34 {
tylerjw 10:b13416bbb4cd 35 char buffer[80];
tylerjw 9:4debfbc1fb3e 36
tylerjw 10:b13416bbb4cd 37 DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 38
tylerjw 7:d8ecabe16c9e 39 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 40
tylerjw 7:d8ecabe16c9e 41 while(true) {
tylerjw 14:dce4d8c29b17 42 gps_led = 1;
tylerjw 10:b13416bbb4cd 43 gps.read_line(buffer);
tylerjw 17:4927053e120f 44 nmea_parser.sample(buffer);
tylerjw 14:dce4d8c29b17 45 //pc.puts(buffer);
tylerjw 13:db6af0620264 46 // send to log...
tylerjw 14:dce4d8c29b17 47 gps_led = 0;
tylerjw 13:db6af0620264 48 gps_line *message = mpool_gps_line.alloc();
tylerjw 13:db6af0620264 49 strcpy(message->line, buffer);
tylerjw 13:db6af0620264 50 queue_gps_line.put(message);
tylerjw 13:db6af0620264 51 }
tylerjw 13:db6af0620264 52 }
tylerjw 13:db6af0620264 53
tylerjw 13:db6af0620264 54 void log_thread(const void *args)
tylerjw 13:db6af0620264 55 {
tylerjw 13:db6af0620264 56 FATFS fs;
tylerjw 13:db6af0620264 57 FIL fp_gps, fp_sensor;
tylerjw 13:db6af0620264 58
tylerjw 13:db6af0620264 59 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 60
tylerjw 13:db6af0620264 61 f_mount(0, &fs);
tylerjw 13:db6af0620264 62 f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 17:4927053e120f 63 f_open(&fp_sensor, "0:sensors.csv", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 64
tylerjw 13:db6af0620264 65 while(1) {
tylerjw 14:dce4d8c29b17 66 log_led = 1;
tylerjw 14:dce4d8c29b17 67 osEvent evt1 = queue_gps_line.get(1);
tylerjw 14:dce4d8c29b17 68 if (evt1.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 69 gps_line *message = (gps_line*)evt1.value.p;
tylerjw 13:db6af0620264 70
tylerjw 13:db6af0620264 71 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 72 f_sync(&fp_gps);
tylerjw 13:db6af0620264 73
tylerjw 13:db6af0620264 74 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 75 }
tylerjw 13:db6af0620264 76
tylerjw 14:dce4d8c29b17 77 osEvent evt2 = queue_sensor_line.get(1);
tylerjw 14:dce4d8c29b17 78 if(evt2.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 79 sensor_line *message = (sensor_line*)evt2.value.p;
tylerjw 13:db6af0620264 80
tylerjw 14:dce4d8c29b17 81 f_puts(message->line, &fp_sensor);
tylerjw 14:dce4d8c29b17 82 f_sync(&fp_sensor);
tylerjw 13:db6af0620264 83
tylerjw 13:db6af0620264 84 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 85 }
tylerjw 14:dce4d8c29b17 86 log_led = 0;
tylerjw 13:db6af0620264 87 }
tylerjw 13:db6af0620264 88 }
tylerjw 13:db6af0620264 89
tylerjw 13:db6af0620264 90 void sensor_thread(const void* args)
tylerjw 13:db6af0620264 91 {
tylerjw 14:dce4d8c29b17 92 DigitalOut sensor_led(LED2);
tylerjw 16:653df0cfe6ee 93 Timer t;
tylerjw 17:4927053e120f 94
tylerjw 17:4927053e120f 95 //while(!nmea_parser.get_lock()) Thread::wait(100); // wait for lock
tylerjw 17:4927053e120f 96
tylerjw 17:4927053e120f 97 t.start(); // start timer after lock
tylerjw 14:dce4d8c29b17 98
tylerjw 14:dce4d8c29b17 99 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 17:4927053e120f 100 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 101 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 102
tylerjw 13:db6af0620264 103 while(true)
tylerjw 13:db6af0620264 104 {
tylerjw 13:db6af0620264 105 //get sensor line memory
tylerjw 14:dce4d8c29b17 106 sensor_led = 1;
tylerjw 13:db6af0620264 107 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 13:db6af0620264 108
tylerjw 16:653df0cfe6ee 109 //timestamp
tylerjw 16:653df0cfe6ee 110 float time = t.read();
tylerjw 16:653df0cfe6ee 111
tylerjw 13:db6af0620264 112 //gps battery
tylerjw 16:653df0cfe6ee 113 float gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
tylerjw 16:653df0cfe6ee 114
tylerjw 16:653df0cfe6ee 115 //mbed battery
tylerjw 16:653df0cfe6ee 116 float mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
tylerjw 13:db6af0620264 117
tylerjw 15:ceac642f6b75 118 //BMP085
tylerjw 16:653df0cfe6ee 119 float bmp_temperature = (float)alt_sensor.get_temperature() / 10.0;
tylerjw 15:ceac642f6b75 120 int bmp_pressure = alt_sensor.get_pressure();
tylerjw 15:ceac642f6b75 121 float bmp_altitude = alt_sensor.get_altitude_ft();
tylerjw 16:653df0cfe6ee 122
tylerjw 16:653df0cfe6ee 123 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 124 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 125 sensor_led = 0;
tylerjw 0:ce5f06c3895f 126 }
tylerjw 7:d8ecabe16c9e 127 }
tylerjw 7:d8ecabe16c9e 128
tylerjw 17:4927053e120f 129 void parachute_thread(const void *args)
tylerjw 17:4927053e120f 130 {
tylerjw 17:4927053e120f 131
tylerjw 17:4927053e120f 132 while(true) Thread::wait(1000);
tylerjw 17:4927053e120f 133 }
tylerjw 17:4927053e120f 134
tylerjw 7:d8ecabe16c9e 135 int main()
tylerjw 7:d8ecabe16c9e 136 {
tylerjw 10:b13416bbb4cd 137 pc.baud(9600);
tylerjw 9:4debfbc1fb3e 138 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 139 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 14:dce4d8c29b17 140 Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 17:4927053e120f 141 Thread thread4(parachute_thread, NULL, osPriorityRealtime);
tylerjw 13:db6af0620264 142
tylerjw 10:b13416bbb4cd 143 while(true) {
tylerjw 10:b13416bbb4cd 144 }
tylerjw 0:ce5f06c3895f 145 }