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:16:08 2012 +0000
Revision:
16:653df0cfe6ee
Parent:
15:ceac642f6b75
Child:
17:4927053e120f
batteries, bmp085 logging;

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 15:ceac642f6b75 6
tylerjw 15:ceac642f6b75 7 I2C i2c(p9, p10); // sda, scl
tylerjw 15:ceac642f6b75 8 BMP085 alt_sensor(i2c);
tylerjw 15:ceac642f6b75 9
tylerjw 16:653df0cfe6ee 10 const float BAT_GPS_MUL = 15.51;
tylerjw 16:653df0cfe6ee 11 const float BAT_MBED_MUL = 10.26;
tylerjw 0:ce5f06c3895f 12
tylerjw 0:ce5f06c3895f 13 Serial pc(USBTX, USBRX);
tylerjw 10:b13416bbb4cd 14 BufferedSerial gps(NC, p14);
tylerjw 10:b13416bbb4cd 15 AnalogIn gps_battery(p20);
tylerjw 16:653df0cfe6ee 16 AnalogIn mbed_battery(p19);
tylerjw 7:d8ecabe16c9e 17
tylerjw 13:db6af0620264 18 typedef struct {
tylerjw 13:db6af0620264 19 char line[80];
tylerjw 13:db6af0620264 20 } gps_line;
tylerjw 13:db6af0620264 21 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 22 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 23
tylerjw 13:db6af0620264 24 typedef struct {
tylerjw 14:dce4d8c29b17 25 char line[80];
tylerjw 13:db6af0620264 26 } sensor_line;
tylerjw 13:db6af0620264 27 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 28 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 29
tylerjw 7:d8ecabe16c9e 30 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 31 {
tylerjw 10:b13416bbb4cd 32 char buffer[80];
tylerjw 9:4debfbc1fb3e 33
tylerjw 10:b13416bbb4cd 34 DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 35
tylerjw 7:d8ecabe16c9e 36 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 37
tylerjw 7:d8ecabe16c9e 38 while(true) {
tylerjw 14:dce4d8c29b17 39 gps_led = 1;
tylerjw 10:b13416bbb4cd 40 gps.read_line(buffer);
tylerjw 14:dce4d8c29b17 41 //pc.puts(buffer);
tylerjw 13:db6af0620264 42 // send to log...
tylerjw 14:dce4d8c29b17 43 gps_led = 0;
tylerjw 13:db6af0620264 44 gps_line *message = mpool_gps_line.alloc();
tylerjw 13:db6af0620264 45 strcpy(message->line, buffer);
tylerjw 13:db6af0620264 46 queue_gps_line.put(message);
tylerjw 13:db6af0620264 47 }
tylerjw 13:db6af0620264 48 }
tylerjw 13:db6af0620264 49
tylerjw 13:db6af0620264 50 void log_thread(const void *args)
tylerjw 13:db6af0620264 51 {
tylerjw 13:db6af0620264 52 FATFS fs;
tylerjw 13:db6af0620264 53 FIL fp_gps, fp_sensor;
tylerjw 13:db6af0620264 54
tylerjw 13:db6af0620264 55 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 56
tylerjw 13:db6af0620264 57 f_mount(0, &fs);
tylerjw 13:db6af0620264 58 f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 59 f_open(&fp_sensor, "0:sensor.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 60
tylerjw 13:db6af0620264 61 while(1) {
tylerjw 14:dce4d8c29b17 62 log_led = 1;
tylerjw 14:dce4d8c29b17 63 osEvent evt1 = queue_gps_line.get(1);
tylerjw 14:dce4d8c29b17 64 if (evt1.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 65 gps_line *message = (gps_line*)evt1.value.p;
tylerjw 13:db6af0620264 66
tylerjw 13:db6af0620264 67 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 68 f_sync(&fp_gps);
tylerjw 13:db6af0620264 69
tylerjw 13:db6af0620264 70 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 71 }
tylerjw 13:db6af0620264 72
tylerjw 14:dce4d8c29b17 73 osEvent evt2 = queue_sensor_line.get(1);
tylerjw 14:dce4d8c29b17 74 if(evt2.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 75 sensor_line *message = (sensor_line*)evt2.value.p;
tylerjw 13:db6af0620264 76
tylerjw 14:dce4d8c29b17 77 f_puts(message->line, &fp_sensor);
tylerjw 14:dce4d8c29b17 78 f_sync(&fp_sensor);
tylerjw 13:db6af0620264 79
tylerjw 13:db6af0620264 80 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 81 }
tylerjw 14:dce4d8c29b17 82 log_led = 0;
tylerjw 13:db6af0620264 83 }
tylerjw 13:db6af0620264 84 }
tylerjw 13:db6af0620264 85
tylerjw 13:db6af0620264 86 void sensor_thread(const void* args)
tylerjw 13:db6af0620264 87 {
tylerjw 14:dce4d8c29b17 88 DigitalOut sensor_led(LED2);
tylerjw 16:653df0cfe6ee 89 Timer t;
tylerjw 16:653df0cfe6ee 90 t.start();
tylerjw 14:dce4d8c29b17 91
tylerjw 14:dce4d8c29b17 92 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 16:653df0cfe6ee 93 strcpy(message->line, "Time(s),GPS Battery(V),mbed Battery(V),BMP085 Temperature(C),Pressure,Altitude(ft)\r\n");
tylerjw 14:dce4d8c29b17 94 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 95
tylerjw 13:db6af0620264 96 while(true)
tylerjw 13:db6af0620264 97 {
tylerjw 13:db6af0620264 98 //get sensor line memory
tylerjw 14:dce4d8c29b17 99 sensor_led = 1;
tylerjw 13:db6af0620264 100 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 13:db6af0620264 101
tylerjw 16:653df0cfe6ee 102 //timestamp
tylerjw 16:653df0cfe6ee 103 float time = t.read();
tylerjw 16:653df0cfe6ee 104
tylerjw 13:db6af0620264 105 //gps battery
tylerjw 16:653df0cfe6ee 106 float gps_battery_voltage = gps_battery.read()*BAT_GPS_MUL;
tylerjw 16:653df0cfe6ee 107
tylerjw 16:653df0cfe6ee 108 //mbed battery
tylerjw 16:653df0cfe6ee 109 float mbed_battery_voltage = mbed_battery.read()*BAT_MBED_MUL;
tylerjw 13:db6af0620264 110
tylerjw 15:ceac642f6b75 111 //BMP085
tylerjw 16:653df0cfe6ee 112 float bmp_temperature = (float)alt_sensor.get_temperature() / 10.0;
tylerjw 15:ceac642f6b75 113 int bmp_pressure = alt_sensor.get_pressure();
tylerjw 15:ceac642f6b75 114 float bmp_altitude = alt_sensor.get_altitude_ft();
tylerjw 16:653df0cfe6ee 115
tylerjw 16:653df0cfe6ee 116 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 117 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 118 sensor_led = 0;
tylerjw 0:ce5f06c3895f 119 }
tylerjw 7:d8ecabe16c9e 120 }
tylerjw 7:d8ecabe16c9e 121
tylerjw 7:d8ecabe16c9e 122 int main()
tylerjw 7:d8ecabe16c9e 123 {
tylerjw 10:b13416bbb4cd 124 pc.baud(9600);
tylerjw 9:4debfbc1fb3e 125 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 126 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 14:dce4d8c29b17 127 Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 13:db6af0620264 128
tylerjw 10:b13416bbb4cd 129 while(true) {
tylerjw 10:b13416bbb4cd 130 }
tylerjw 0:ce5f06c3895f 131 }