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
main.cpp
- Committer:
- tylerjw
- Date:
- 2012-12-12
- Revision:
- 18:29b19a25a963
- Parent:
- 17:4927053e120f
- Child:
- 19:1cfe22ef30e2
File content as of revision 18:29b19a25a963:
#include "mbed.h" #include "rtos.h" #include "buffered_serial.h" #include "ff.h" #include "BMP085.h" #include "GPS_parser.h" I2C i2c(p9, p10); // sda, scl BMP085 alt_sensor(i2c); const float BAT_GPS_MUL = 15.51; const float BAT_MBED_MUL = 10.26; Serial pc(USBTX, USBRX); BufferedSerial gps(NC, p14); AnalogIn gps_battery(p20); AnalogIn mbed_battery(p19); GPS_Parser nmea_parser; Semaphore parachute_sem(0); typedef struct { char line[80]; } gps_line; MemoryPool<gps_line, 16> mpool_gps_line; Queue<gps_line, 16> queue_gps_line; typedef struct { char line[80]; } sensor_line; MemoryPool<sensor_line, 16> mpool_sensor_line; Queue<sensor_line, 16> queue_sensor_line; void gps_thread(void const *args) { char buffer[80]; float alt, alt_prev; alt = alt_prev = 0; DigitalOut gps_led(LED4); gps.baud(4800); while(true) { gps_led = !gps_led; gps.read_line(buffer); nmea_parser.sample(buffer); //pc.puts(buffer); // send to log... gps_line *message = mpool_gps_line.alloc(); strcpy(message->line, buffer); queue_gps_line.put(message); // test altitude direction if(nmea_parser.get_lock()) { if(alt != 0) { // first time alt = nmea_parser.get_msl_altitude(); } else { alt_prev = alt; alt = nmea_parser.get_msl_altitude(); if(alt < alt_prev) // going down parachute_sem.release(); // let the parachute code execute } } } } void log_thread(const void *args) { FATFS fs; FIL fp_gps, fp_sensor; DigitalOut log_led(LED3); f_mount(0, &fs); f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE); f_open(&fp_sensor, "0:sensors.csv", FA_CREATE_ALWAYS | FA_WRITE); while(1) { log_led = !log_led; osEvent evt1 = queue_gps_line.get(1); if (evt1.status == osEventMessage) { gps_line *message = (gps_line*)evt1.value.p; f_puts(message->line, &fp_gps); f_sync(&fp_gps); mpool_gps_line.free(message); } osEvent evt2 = queue_sensor_line.get(1); if(evt2.status == osEventMessage) { sensor_line *message = (sensor_line*)evt2.value.p; f_puts(message->line, &fp_sensor); f_sync(&fp_sensor); mpool_sensor_line.free(message); } } } void sensor_thread(const void* args) { DigitalOut sensor_led(LED2); Timer t; float time; float gps_battery_voltage, mbed_battery_voltage; float bmp_temperature, bmp_altitude; int bmp_pressure; //while(!nmea_parser.get_lock()) Thread::wait(100); // wait for lock t.start(); // start timer after lock sensor_line *message = mpool_sensor_line.alloc(); 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()); queue_sensor_line.put(message); while(true) { //get sensor line memory sensor_led = !sensor_led; sensor_line *message = mpool_sensor_line.alloc(); //timestamp time = t.read(); //gps battery gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL; //mbed battery mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL; //BMP085 bmp_temperature = (float)alt_sensor.get_temperature() / 10.0; bmp_pressure = alt_sensor.get_pressure(); bmp_altitude = alt_sensor.get_altitude_ft(); sprintf(message->line, "%f,%f,%f,%f,%d,%f\r\n", time,gps_battery_voltage,mbed_battery_voltage,bmp_temperature,bmp_pressure,bmp_altitude); queue_sensor_line.put(message); } } void parachute_thread(const void *args) { DigitalOut para_led(LED1); while(true) { parachute_sem.wait(); para_led = !para_led; } } int main() { pc.baud(9600); Thread thread(gps_thread, NULL, osPriorityHigh); Thread thread2(log_thread, NULL, osPriorityNormal); Thread thread3(sensor_thread, NULL, osPriorityNormal); Thread thread4(parachute_thread, NULL, osPriorityRealtime); while(true) ; }