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@9:4debfbc1fb3e, 2012-12-09 (annotated)
- Committer:
- tylerjw
- Date:
- Sun Dec 09 08:48:30 2012 +0000
- Revision:
- 9:4debfbc1fb3e
- Parent:
- 8:13360ec824a7
- Child:
- 10:b13416bbb4cd
not tested... standard SD card implementation, not working
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 | 9:4debfbc1fb3e | 3 | #include "SDFileSystem.h" |
tylerjw | 9:4debfbc1fb3e | 4 | //#include "MODSERIAL.h" |
tylerjw | 0:ce5f06c3895f | 5 | |
tylerjw | 0:ce5f06c3895f | 6 | Serial pc(USBTX, USBRX); |
tylerjw | 7:d8ecabe16c9e | 7 | |
tylerjw | 7:d8ecabe16c9e | 8 | float test_lat = 39.943039; |
tylerjw | 7:d8ecabe16c9e | 9 | float test_long = -104.978226; |
tylerjw | 7:d8ecabe16c9e | 10 | |
tylerjw | 7:d8ecabe16c9e | 11 | // Connect the TX of the GPS module to p10 RX input |
tylerjw | 9:4debfbc1fb3e | 12 | Serial gps(NC, p14); |
tylerjw | 9:4debfbc1fb3e | 13 | |
tylerjw | 9:4debfbc1fb3e | 14 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
tylerjw | 7:d8ecabe16c9e | 15 | |
tylerjw | 7:d8ecabe16c9e | 16 | DigitalOut irq_led(LED1); |
tylerjw | 7:d8ecabe16c9e | 17 | |
tylerjw | 8:13360ec824a7 | 18 | Semaphore newlines(0); |
tylerjw | 0:ce5f06c3895f | 19 | |
tylerjw | 7:d8ecabe16c9e | 20 | // Called everytime a new character goes into |
tylerjw | 7:d8ecabe16c9e | 21 | // the RX buffer. Test that character for \n |
tylerjw | 7:d8ecabe16c9e | 22 | // Note, rxGetLastChar() gets the last char that |
tylerjw | 7:d8ecabe16c9e | 23 | // we received but it does NOT remove it from |
tylerjw | 7:d8ecabe16c9e | 24 | // the RX buffer. |
tylerjw | 9:4debfbc1fb3e | 25 | char gps_buffer[1024]; |
tylerjw | 9:4debfbc1fb3e | 26 | int buffer_counter = 0; |
tylerjw | 9:4debfbc1fb3e | 27 | int newline_pos = 0; |
tylerjw | 9:4debfbc1fb3e | 28 | |
tylerjw | 9:4debfbc1fb3e | 29 | void rxCallback() |
tylerjw | 7:d8ecabe16c9e | 30 | { |
tylerjw | 9:4debfbc1fb3e | 31 | char c; |
tylerjw | 9:4debfbc1fb3e | 32 | while(gps.readable()) { |
tylerjw | 9:4debfbc1fb3e | 33 | c = gps.getc(); |
tylerjw | 9:4debfbc1fb3e | 34 | gps_buffer[buffer_counter++] = c; |
tylerjw | 9:4debfbc1fb3e | 35 | if(buffer_counter == 1024) |
tylerjw | 9:4debfbc1fb3e | 36 | { |
tylerjw | 9:4debfbc1fb3e | 37 | error("Buffer Overflow"); |
tylerjw | 9:4debfbc1fb3e | 38 | buffer_counter = 1023; |
tylerjw | 9:4debfbc1fb3e | 39 | } |
tylerjw | 9:4debfbc1fb3e | 40 | if(c == '\n') { |
tylerjw | 9:4debfbc1fb3e | 41 | newlines.release(); |
tylerjw | 9:4debfbc1fb3e | 42 | newline_pos = buffer_counter - 1; |
tylerjw | 9:4debfbc1fb3e | 43 | irq_led = !irq_led; |
tylerjw | 9:4debfbc1fb3e | 44 | } |
tylerjw | 9:4debfbc1fb3e | 45 | } |
tylerjw | 9:4debfbc1fb3e | 46 | } |
tylerjw | 9:4debfbc1fb3e | 47 | |
tylerjw | 9:4debfbc1fb3e | 48 | void gps_getline(char *buffer, int size) |
tylerjw | 9:4debfbc1fb3e | 49 | { |
tylerjw | 9:4debfbc1fb3e | 50 | __disable_irq(); |
tylerjw | 9:4debfbc1fb3e | 51 | strncpy(buffer, gps_buffer, newline_pos+1); |
tylerjw | 9:4debfbc1fb3e | 52 | memmove(gps_buffer,gps_buffer+(newline_pos+1), (buffer_counter - newline_pos - 1)); |
tylerjw | 9:4debfbc1fb3e | 53 | buffer_counter = (buffer_counter - newline_pos - 1); |
tylerjw | 9:4debfbc1fb3e | 54 | newline_pos = 0; |
tylerjw | 9:4debfbc1fb3e | 55 | __enable_irq(); |
tylerjw | 7:d8ecabe16c9e | 56 | } |
tylerjw | 7:d8ecabe16c9e | 57 | |
tylerjw | 7:d8ecabe16c9e | 58 | void gps_thread(void const *args) |
tylerjw | 7:d8ecabe16c9e | 59 | { |
tylerjw | 7:d8ecabe16c9e | 60 | char buffer[512]; |
tylerjw | 9:4debfbc1fb3e | 61 | int counter = 0; |
tylerjw | 9:4debfbc1fb3e | 62 | int file_counter = 0; |
tylerjw | 9:4debfbc1fb3e | 63 | char filename[21]; |
tylerjw | 9:4debfbc1fb3e | 64 | |
tylerjw | 9:4debfbc1fb3e | 65 | DigitalOut gps_led(LED2); |
tylerjw | 7:d8ecabe16c9e | 66 | |
tylerjw | 7:d8ecabe16c9e | 67 | gps.baud(4800); |
tylerjw | 6:204487243310 | 68 | pc.baud(9600); |
tylerjw | 9:4debfbc1fb3e | 69 | |
tylerjw | 9:4debfbc1fb3e | 70 | //gps.autoDetectChar('\n'); |
tylerjw | 9:4debfbc1fb3e | 71 | gps.attach(&rxCallback, Serial::RxIrq); |
tylerjw | 9:4debfbc1fb3e | 72 | |
tylerjw | 9:4debfbc1fb3e | 73 | gps_led = 1; |
tylerjw | 9:4debfbc1fb3e | 74 | |
tylerjw | 9:4debfbc1fb3e | 75 | sprintf(filename, "/sd/hab/gps%03d.log", file_counter++); |
tylerjw | 9:4debfbc1fb3e | 76 | pc.printf("Opening: %s\r\n", filename); |
tylerjw | 9:4debfbc1fb3e | 77 | |
tylerjw | 9:4debfbc1fb3e | 78 | mkdir("/sd/hab", 0777); |
tylerjw | 9:4debfbc1fb3e | 79 | |
tylerjw | 9:4debfbc1fb3e | 80 | FILE *gps_file = fopen(filename, "w"); |
tylerjw | 9:4debfbc1fb3e | 81 | if(gps_file == NULL) { |
tylerjw | 9:4debfbc1fb3e | 82 | error("Could not open file for write\n"); |
tylerjw | 9:4debfbc1fb3e | 83 | } |
tylerjw | 9:4debfbc1fb3e | 84 | pc.puts("File Open!\r\n"); |
tylerjw | 9:4debfbc1fb3e | 85 | gps_led = 0; |
tylerjw | 9:4debfbc1fb3e | 86 | |
tylerjw | 7:d8ecabe16c9e | 87 | |
tylerjw | 7:d8ecabe16c9e | 88 | while(true) { |
tylerjw | 8:13360ec824a7 | 89 | newlines.wait(); // wait for next line |
tylerjw | 7:d8ecabe16c9e | 90 | memset(buffer, 0, 512); |
tylerjw | 9:4debfbc1fb3e | 91 | gps_getline(buffer, 512); |
tylerjw | 7:d8ecabe16c9e | 92 | pc.puts(buffer); |
tylerjw | 9:4debfbc1fb3e | 93 | fputs(buffer, gps_file); |
tylerjw | 9:4debfbc1fb3e | 94 | |
tylerjw | 9:4debfbc1fb3e | 95 | counter++; |
tylerjw | 9:4debfbc1fb3e | 96 | if(counter >= 20) { |
tylerjw | 9:4debfbc1fb3e | 97 | sprintf(filename, "/sd/hab/gps%03d.log", file_counter++); |
tylerjw | 9:4debfbc1fb3e | 98 | pc.printf("Opening: %s\r\n", filename); |
tylerjw | 9:4debfbc1fb3e | 99 | freopen(filename, "w", gps_file); |
tylerjw | 9:4debfbc1fb3e | 100 | counter = 0; |
tylerjw | 9:4debfbc1fb3e | 101 | } |
tylerjw | 0:ce5f06c3895f | 102 | } |
tylerjw | 7:d8ecabe16c9e | 103 | } |
tylerjw | 7:d8ecabe16c9e | 104 | |
tylerjw | 7:d8ecabe16c9e | 105 | int main() |
tylerjw | 7:d8ecabe16c9e | 106 | { |
tylerjw | 9:4debfbc1fb3e | 107 | Thread thread(gps_thread, NULL, osPriorityHigh); |
tylerjw | 9:4debfbc1fb3e | 108 | |
tylerjw | 7:d8ecabe16c9e | 109 | while(true); |
tylerjw | 0:ce5f06c3895f | 110 | } |