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 16:45:23 2012 +0000
Revision:
15:ceac642f6b75
Parent:
14:dce4d8c29b17
Child:
16:653df0cfe6ee
working BMP085 sampling

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 #include "ITG3200.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 15:ceac642f6b75 11 I2C i2c_2(p28,p27);
tylerjw 15:ceac642f6b75 12
tylerjw 10:b13416bbb4cd 13
tylerjw 10:b13416bbb4cd 14 #define CELLS 3.0
tylerjw 10:b13416bbb4cd 15 #define LIPO_EMPTY 3.4
tylerjw 10:b13416bbb4cd 16 #define LIPO_FULL 4.2
tylerjw 10:b13416bbb4cd 17
tylerjw 10:b13416bbb4cd 18 const float BAT_MUL = 4.7;
tylerjw 10:b13416bbb4cd 19 const float BAT_FULL = (CELLS * LIPO_FULL);
tylerjw 10:b13416bbb4cd 20 const float BAT_EMPTY = (CELLS * LIPO_EMPTY);
tylerjw 10:b13416bbb4cd 21 const float BAT_RANGE = BAT_FULL - BAT_EMPTY;
tylerjw 0:ce5f06c3895f 22
tylerjw 0:ce5f06c3895f 23 Serial pc(USBTX, USBRX);
tylerjw 10:b13416bbb4cd 24 BufferedSerial gps(NC, p14);
tylerjw 10:b13416bbb4cd 25 AnalogIn gps_battery(p20);
tylerjw 7:d8ecabe16c9e 26
tylerjw 13:db6af0620264 27 typedef struct {
tylerjw 13:db6af0620264 28 char line[80];
tylerjw 13:db6af0620264 29 } gps_line;
tylerjw 13:db6af0620264 30 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 31 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 32
tylerjw 13:db6af0620264 33 typedef struct {
tylerjw 14:dce4d8c29b17 34 char line[80];
tylerjw 13:db6af0620264 35 } sensor_line;
tylerjw 13:db6af0620264 36 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 37 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 38
tylerjw 7:d8ecabe16c9e 39 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 40 {
tylerjw 10:b13416bbb4cd 41 char buffer[80];
tylerjw 9:4debfbc1fb3e 42
tylerjw 10:b13416bbb4cd 43 DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 44
tylerjw 7:d8ecabe16c9e 45 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 46
tylerjw 7:d8ecabe16c9e 47 while(true) {
tylerjw 14:dce4d8c29b17 48 gps_led = 1;
tylerjw 10:b13416bbb4cd 49 gps.read_line(buffer);
tylerjw 14:dce4d8c29b17 50 //pc.puts(buffer);
tylerjw 13:db6af0620264 51 // send to log...
tylerjw 14:dce4d8c29b17 52 gps_led = 0;
tylerjw 13:db6af0620264 53 gps_line *message = mpool_gps_line.alloc();
tylerjw 13:db6af0620264 54 strcpy(message->line, buffer);
tylerjw 13:db6af0620264 55 queue_gps_line.put(message);
tylerjw 13:db6af0620264 56 }
tylerjw 13:db6af0620264 57 }
tylerjw 13:db6af0620264 58
tylerjw 13:db6af0620264 59 void log_thread(const void *args)
tylerjw 13:db6af0620264 60 {
tylerjw 13:db6af0620264 61 FATFS fs;
tylerjw 13:db6af0620264 62 FIL fp_gps, fp_sensor;
tylerjw 13:db6af0620264 63
tylerjw 13:db6af0620264 64 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 65
tylerjw 13:db6af0620264 66 f_mount(0, &fs);
tylerjw 13:db6af0620264 67 f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 68 f_open(&fp_sensor, "0:sensor.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 69
tylerjw 13:db6af0620264 70 while(1) {
tylerjw 14:dce4d8c29b17 71 log_led = 1;
tylerjw 14:dce4d8c29b17 72 osEvent evt1 = queue_gps_line.get(1);
tylerjw 14:dce4d8c29b17 73 if (evt1.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 74 gps_line *message = (gps_line*)evt1.value.p;
tylerjw 13:db6af0620264 75
tylerjw 13:db6af0620264 76 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 77 f_sync(&fp_gps);
tylerjw 13:db6af0620264 78
tylerjw 13:db6af0620264 79 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 80 }
tylerjw 13:db6af0620264 81
tylerjw 14:dce4d8c29b17 82 osEvent evt2 = queue_sensor_line.get(1);
tylerjw 14:dce4d8c29b17 83 if(evt2.status == osEventMessage) {
tylerjw 14:dce4d8c29b17 84 sensor_line *message = (sensor_line*)evt2.value.p;
tylerjw 13:db6af0620264 85
tylerjw 14:dce4d8c29b17 86 f_puts(message->line, &fp_sensor);
tylerjw 14:dce4d8c29b17 87 f_sync(&fp_sensor);
tylerjw 13:db6af0620264 88
tylerjw 13:db6af0620264 89 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 90 }
tylerjw 14:dce4d8c29b17 91 log_led = 0;
tylerjw 13:db6af0620264 92 }
tylerjw 13:db6af0620264 93 }
tylerjw 13:db6af0620264 94
tylerjw 13:db6af0620264 95 void sensor_thread(const void* args)
tylerjw 13:db6af0620264 96 {
tylerjw 14:dce4d8c29b17 97 DigitalOut sensor_led(LED2);
tylerjw 14:dce4d8c29b17 98
tylerjw 14:dce4d8c29b17 99 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 15:ceac642f6b75 100 strcpy(message->line, "GPS Battery,BMP085 Temperature,BMP085 Pressure,BMP085 Altitude(ft)\r\n");
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 13:db6af0620264 109 //gps battery
tylerjw 13:db6af0620264 110 float sample = gps_battery.read();
tylerjw 14:dce4d8c29b17 111 float gps_battery_voltage = sample*BAT_MUL*3.3;
tylerjw 13:db6af0620264 112
tylerjw 15:ceac642f6b75 113 //BMP085
tylerjw 15:ceac642f6b75 114 int bmp_temperature = alt_sensor.get_temperature();
tylerjw 15:ceac642f6b75 115 int bmp_pressure = alt_sensor.get_pressure();
tylerjw 15:ceac642f6b75 116 float bmp_altitude = alt_sensor.get_altitude_ft();
tylerjw 15:ceac642f6b75 117
tylerjw 13:db6af0620264 118 // more sensors
tylerjw 13:db6af0620264 119
tylerjw 15:ceac642f6b75 120 sprintf(message->line, "%f,%d,%d,%f\r\n", gps_battery_voltage,bmp_temperature,bmp_pressure,bmp_altitude);
tylerjw 14:dce4d8c29b17 121 queue_sensor_line.put(message);
tylerjw 14:dce4d8c29b17 122 sensor_led = 0;
tylerjw 15:ceac642f6b75 123 Thread::wait(100);
tylerjw 0:ce5f06c3895f 124 }
tylerjw 7:d8ecabe16c9e 125 }
tylerjw 7:d8ecabe16c9e 126
tylerjw 7:d8ecabe16c9e 127 int main()
tylerjw 7:d8ecabe16c9e 128 {
tylerjw 10:b13416bbb4cd 129 pc.baud(9600);
tylerjw 9:4debfbc1fb3e 130 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 131 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 14:dce4d8c29b17 132 Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 13:db6af0620264 133
tylerjw 10:b13416bbb4cd 134 while(true) {
tylerjw 10:b13416bbb4cd 135 }
tylerjw 0:ce5f06c3895f 136 }