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

Revision:
18:29b19a25a963
Parent:
17:4927053e120f
Child:
19:1cfe22ef30e2
--- a/main.cpp	Wed Dec 12 17:54:04 2012 +0000
+++ b/main.cpp	Wed Dec 12 18:13:11 2012 +0000
@@ -18,6 +18,8 @@
 
 GPS_Parser nmea_parser;
 
+Semaphore parachute_sem(0);
+
 typedef struct {
     char    line[80];
 } gps_line;
@@ -33,21 +35,35 @@
 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 = 1;
+        gps_led = !gps_led;
         gps.read_line(buffer);
         nmea_parser.sample(buffer);
         //pc.puts(buffer);
         // send to log...
-        gps_led = 0;
         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
+            }
+        }
     }
 }
 
@@ -63,7 +79,7 @@
     f_open(&fp_sensor, "0:sensors.csv", FA_CREATE_ALWAYS | FA_WRITE);
 
     while(1) {
-        log_led = 1;
+        log_led = !log_led;
         osEvent evt1 = queue_gps_line.get(1);
         if (evt1.status == osEventMessage) {
             gps_line *message = (gps_line*)evt1.value.p;
@@ -83,7 +99,6 @@
             
             mpool_sensor_line.free(message);
         }
-        log_led = 0;
     }
 }
 
@@ -91,6 +106,10 @@
 {
     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
     
@@ -103,33 +122,37 @@
     while(true)
     {
         //get sensor line memory
-        sensor_led = 1;
+        sensor_led = !sensor_led;
         sensor_line *message = mpool_sensor_line.alloc();
         
         //timestamp
-        float time = t.read();
+        time = t.read();
         
         //gps battery
-        float gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
+        gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
         
         //mbed battery
-        float mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
+        mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
         
         //BMP085
-        float bmp_temperature = (float)alt_sensor.get_temperature() / 10.0;
-        int bmp_pressure = alt_sensor.get_pressure();
-        float bmp_altitude = alt_sensor.get_altitude_ft();
+        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);
-        sensor_led = 0;        
     }
 }
 
 void parachute_thread(const void *args)
 {
+    DigitalOut para_led(LED1);
     
-    while(true) Thread::wait(1000);
+    while(true) 
+    {
+        parachute_sem.wait();
+        para_led = !para_led;
+    }
 }
 
 int main()
@@ -140,6 +163,5 @@
     Thread thread3(sensor_thread, NULL, osPriorityNormal);
     Thread thread4(parachute_thread, NULL, osPriorityRealtime);
 
-    while(true) {
-    }
+    while(true) ;
 }
\ No newline at end of file