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

main.cpp

Committer:
tylerjw
Date:
2012-12-09
Revision:
9:4debfbc1fb3e
Parent:
8:13360ec824a7
Child:
10:b13416bbb4cd

File content as of revision 9:4debfbc1fb3e:

#include "mbed.h"
#include "rtos.h"
#include "SDFileSystem.h"
//#include "MODSERIAL.h"

Serial pc(USBTX, USBRX);

float test_lat =  39.943039;
float test_long = -104.978226;

// Connect the TX of the GPS module to p10 RX input
Serial gps(NC, p14);

SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board

DigitalOut irq_led(LED1);

Semaphore newlines(0);

// Called everytime a new character goes into
// the RX buffer. Test that character for \n
// Note, rxGetLastChar() gets the last char that
// we received but it does NOT remove it from
// the RX buffer.
char gps_buffer[1024];
int buffer_counter = 0;
int newline_pos = 0;

void rxCallback()
{
    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];
    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, 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) {
        newlines.wait(); // wait for next line
        memset(buffer, 0, 512);
        gps_getline(buffer, 512);
        pc.puts(buffer);
        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, osPriorityHigh);

    while(true);
}