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@13:db6af0620264, 2012-12-12 (annotated)
- 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?
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 | 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 | } |