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@17:4927053e120f, 2012-12-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |