Generation 2 of the Harp project
Dependencies: Servo TMP36 GZ chan_fatfs_sd buffered-serial1 nmea_parser watchdog mbed-rtos mbed
Diff: main.cpp
- Revision:
- 9:4debfbc1fb3e
- Parent:
- 8:13360ec824a7
- Child:
- 10:b13416bbb4cd
diff -r 13360ec824a7 -r 4debfbc1fb3e main.cpp --- a/main.cpp Fri Dec 07 20:42:48 2012 +0000 +++ b/main.cpp Sun Dec 09 08:48:30 2012 +0000 @@ -1,7 +1,7 @@ #include "mbed.h" #include "rtos.h" - -#include "MODSERIAL.h" +#include "SDFileSystem.h" +//#include "MODSERIAL.h" Serial pc(USBTX, USBRX); @@ -9,11 +9,12 @@ float test_long = -104.978226; // Connect the TX of the GPS module to p10 RX input -MODSERIAL gps(NC, p14); +Serial gps(NC, p14); + +SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board DigitalOut irq_led(LED1); -bool newline_detected = false; Semaphore newlines(0); // Called everytime a new character goes into @@ -21,52 +22,89 @@ // Note, rxGetLastChar() gets the last char that // we received but it does NOT remove it from // the RX buffer. -void rxCallback(MODSERIAL_IRQ_INFO *q) +char gps_buffer[1024]; +int buffer_counter = 0; +int newline_pos = 0; + +void rxCallback() { - newline_detected = true; - //newlines++; - newlines.release(); - irq_led = !irq_led; + char c; + while(gps.readable()) { + c = gps.getc(); + gps_buffer[buffer_counter++] = c; + if(buffer_counter == 1024) + { + error("Buffer Overflow"); + buffer_counter = 1023; + } + if(c == '\n') { + newlines.release(); + newline_pos = buffer_counter - 1; + irq_led = !irq_led; + } + } +} + +void gps_getline(char *buffer, int size) +{ + __disable_irq(); + strncpy(buffer, gps_buffer, newline_pos+1); + memmove(gps_buffer,gps_buffer+(newline_pos+1), (buffer_counter - newline_pos - 1)); + buffer_counter = (buffer_counter - newline_pos - 1); + newline_pos = 0; + __enable_irq(); } void gps_thread(void const *args) { char buffer[512]; - Timer t; - t.start(); - float start; - int number_lines = 0; - float average_wait = 0.0; - float wait[10]; + int counter = 0; + int file_counter = 0; + char filename[21]; + + DigitalOut gps_led(LED2); gps.baud(4800); pc.baud(9600); - gps.autoDetectChar('\n'); - gps.attach(&rxCallback, MODSERIAL::RxAutoDetect); + + //gps.autoDetectChar('\n'); + gps.attach(&rxCallback, Serial::RxIrq); + + gps_led = 1; + + sprintf(filename, "/sd/hab/gps%03d.log", file_counter++); + pc.printf("Opening: %s\r\n", filename); + + mkdir("/sd/hab", 0777); + + FILE *gps_file = fopen(filename, "w"); + if(gps_file == NULL) { + error("Could not open file for write\n"); + } + pc.puts("File Open!\r\n"); + gps_led = 0; + while(true) { - // Wait here until we detect the \n going into the buffer. - //if(newlines == 0) - //pc.puts("Waiting... \r\n"); - //while (!newline_detected) ; // 100ms wait newlines.wait(); // wait for next line - //pc.printf("%f\r\n",t.read()); - //if(newlines > 1) - //pc.printf("Lines in buffer: %d\r\n",newlines); - // When we get here the RX buffer now contains a NMEA sentence. - // ... memset(buffer, 0, 512); - gps.move(buffer, 512); + gps_getline(buffer, 512); pc.puts(buffer); - //newlines--; + fputs(buffer, gps_file); + + counter++; + if(counter >= 20) { + sprintf(filename, "/sd/hab/gps%03d.log", file_counter++); + pc.printf("Opening: %s\r\n", filename); + freopen(filename, "w", gps_file); + counter = 0; + } } - } - int main() { - Thread thread(gps_thread, NULL, osPriorityRealtime); - + Thread thread(gps_thread, NULL, osPriorityHigh); + while(true); } \ No newline at end of file