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:01:30 2012 +0000
Revision:
13:db6af0620264
Parent:
12:0d943d69d3ec
Child:
14:dce4d8c29b17
working gps and log thread, sensor thread broken

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 10:b13416bbb4cd 5
tylerjw 10:b13416bbb4cd 6 #define CELLS 3.0
tylerjw 10:b13416bbb4cd 7 #define LIPO_EMPTY 3.4
tylerjw 10:b13416bbb4cd 8 #define LIPO_FULL 4.2
tylerjw 10:b13416bbb4cd 9
tylerjw 10:b13416bbb4cd 10 const float BAT_MUL = 4.7;
tylerjw 10:b13416bbb4cd 11 const float BAT_FULL = (CELLS * LIPO_FULL);
tylerjw 10:b13416bbb4cd 12 const float BAT_EMPTY = (CELLS * LIPO_EMPTY);
tylerjw 10:b13416bbb4cd 13 const float BAT_RANGE = BAT_FULL - BAT_EMPTY;
tylerjw 0:ce5f06c3895f 14
tylerjw 0:ce5f06c3895f 15 Serial pc(USBTX, USBRX);
tylerjw 10:b13416bbb4cd 16 BufferedSerial gps(NC, p14);
tylerjw 10:b13416bbb4cd 17 AnalogIn gps_battery(p20);
tylerjw 7:d8ecabe16c9e 18
tylerjw 13:db6af0620264 19 typedef struct {
tylerjw 13:db6af0620264 20 char line[80];
tylerjw 13:db6af0620264 21 } gps_line;
tylerjw 13:db6af0620264 22 MemoryPool<gps_line, 16> mpool_gps_line;
tylerjw 13:db6af0620264 23 Queue<gps_line, 16> queue_gps_line;
tylerjw 13:db6af0620264 24
tylerjw 13:db6af0620264 25 typedef struct {
tylerjw 13:db6af0620264 26 float gps_battery; // gps battery voltage
tylerjw 13:db6af0620264 27 } sensor_line;
tylerjw 13:db6af0620264 28 MemoryPool<sensor_line, 16> mpool_sensor_line;
tylerjw 13:db6af0620264 29 Queue<sensor_line, 16> queue_sensor_line;
tylerjw 12:0d943d69d3ec 30
tylerjw 7:d8ecabe16c9e 31 void gps_thread(void const *args)
tylerjw 7:d8ecabe16c9e 32 {
tylerjw 10:b13416bbb4cd 33 char buffer[80];
tylerjw 9:4debfbc1fb3e 34
tylerjw 10:b13416bbb4cd 35 DigitalOut gps_led(LED4);
tylerjw 7:d8ecabe16c9e 36
tylerjw 7:d8ecabe16c9e 37 gps.baud(4800);
tylerjw 7:d8ecabe16c9e 38
tylerjw 7:d8ecabe16c9e 39 while(true) {
tylerjw 10:b13416bbb4cd 40 gps.read_line(buffer);
tylerjw 10:b13416bbb4cd 41 gps_led = !gps_led;
tylerjw 12:0d943d69d3ec 42 pc.puts(buffer);
tylerjw 13:db6af0620264 43 // send to log...
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 char buffer[80];
tylerjw 13:db6af0620264 55
tylerjw 13:db6af0620264 56 DigitalOut log_led(LED3);
tylerjw 13:db6af0620264 57
tylerjw 13:db6af0620264 58 f_mount(0, &fs);
tylerjw 13:db6af0620264 59 f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 60 f_open(&fp_sensor, "0:sensor.txt", FA_CREATE_ALWAYS | FA_WRITE);
tylerjw 13:db6af0620264 61 log_led = 1;
tylerjw 13:db6af0620264 62
tylerjw 13:db6af0620264 63 while(1) {
tylerjw 13:db6af0620264 64 osEvent evt = queue_gps_line.get(1);
tylerjw 13:db6af0620264 65 if (evt.status == osEventMessage) {
tylerjw 13:db6af0620264 66 gps_line *message = (gps_line*)evt.value.p;
tylerjw 13:db6af0620264 67
tylerjw 13:db6af0620264 68 log_led = !log_led;
tylerjw 13:db6af0620264 69 f_puts(message->line, &fp_gps);
tylerjw 13:db6af0620264 70 f_sync(&fp_gps);
tylerjw 13:db6af0620264 71
tylerjw 13:db6af0620264 72 mpool_gps_line.free(message);
tylerjw 13:db6af0620264 73 }
tylerjw 13:db6af0620264 74
tylerjw 13:db6af0620264 75 evt = queue_sensor_line.get(1);
tylerjw 13:db6af0620264 76 if(evt.status == osEventMessage) {
tylerjw 13:db6af0620264 77 sensor_line *message = (sensor_line*)evt.value.p;
tylerjw 13:db6af0620264 78
tylerjw 13:db6af0620264 79 sprintf(buffer, "%f\r\n", message->gps_battery);
tylerjw 13:db6af0620264 80
tylerjw 13:db6af0620264 81 mpool_sensor_line.free(message);
tylerjw 13:db6af0620264 82 }
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 13:db6af0620264 88 while(true)
tylerjw 13:db6af0620264 89 {
tylerjw 13:db6af0620264 90 //get sensor line memory
tylerjw 13:db6af0620264 91 sensor_line *message = mpool_sensor_line.alloc();
tylerjw 13:db6af0620264 92
tylerjw 13:db6af0620264 93 //gps battery
tylerjw 13:db6af0620264 94 float sample = gps_battery.read();
tylerjw 13:db6af0620264 95 float voltage = sample*BAT_MUL*3.3;
tylerjw 13:db6af0620264 96 message->gps_battery = voltage;
tylerjw 13:db6af0620264 97
tylerjw 13:db6af0620264 98 // more sensors
tylerjw 13:db6af0620264 99
tylerjw 13:db6af0620264 100 queue_sensor_line.put(message);
tylerjw 13:db6af0620264 101 Thread::wait(1000);
tylerjw 0:ce5f06c3895f 102 }
tylerjw 7:d8ecabe16c9e 103 }
tylerjw 7:d8ecabe16c9e 104
tylerjw 7:d8ecabe16c9e 105 int main()
tylerjw 7:d8ecabe16c9e 106 {
tylerjw 10:b13416bbb4cd 107 pc.baud(9600);
tylerjw 9:4debfbc1fb3e 108 Thread thread(gps_thread, NULL, osPriorityHigh);
tylerjw 13:db6af0620264 109 Thread thread2(log_thread, NULL, osPriorityNormal);
tylerjw 13:db6af0620264 110 //Thread thread3(sensor_thread, NULL, osPriorityNormal);
tylerjw 13:db6af0620264 111
tylerjw 10:b13416bbb4cd 112 while(true) {
tylerjw 10:b13416bbb4cd 113 }
tylerjw 0:ce5f06c3895f 114 }