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-12
Revision:
13:db6af0620264
Parent:
12:0d943d69d3ec
Child:
14:dce4d8c29b17

File content as of revision 13:db6af0620264:

#include "mbed.h"
#include "rtos.h"
#include "buffered_serial.h"
#include "ff.h"

#define CELLS       3.0
#define LIPO_EMPTY  3.4
#define LIPO_FULL   4.2

const float BAT_MUL = 4.7;
const float BAT_FULL = (CELLS * LIPO_FULL);
const float BAT_EMPTY = (CELLS * LIPO_EMPTY);
const float BAT_RANGE = BAT_FULL - BAT_EMPTY;

Serial pc(USBTX, USBRX);
BufferedSerial gps(NC, p14);
AnalogIn gps_battery(p20);

typedef struct {
    char    line[80];
} gps_line;
MemoryPool<gps_line, 16> mpool_gps_line;
Queue<gps_line, 16> queue_gps_line;

typedef struct {
    float gps_battery; // gps battery voltage
} sensor_line;
MemoryPool<sensor_line, 16> mpool_sensor_line;
Queue<sensor_line, 16> queue_sensor_line;

void gps_thread(void const *args)
{
    char buffer[80];

    DigitalOut gps_led(LED4);

    gps.baud(4800);

    while(true) {
        gps.read_line(buffer);
        gps_led = !gps_led;
        pc.puts(buffer);
        // send to log...
        gps_line *message = mpool_gps_line.alloc();
        strcpy(message->line, buffer);
        queue_gps_line.put(message);
    }
}

void log_thread(const void *args)
{
    FATFS fs;
    FIL fp_gps, fp_sensor;
    char buffer[80];

    DigitalOut log_led(LED3);

    f_mount(0, &fs);
    f_open(&fp_gps, "0:gps.txt", FA_CREATE_ALWAYS | FA_WRITE);
    f_open(&fp_sensor, "0:sensor.txt", FA_CREATE_ALWAYS | FA_WRITE);
    log_led = 1;

    while(1) {
        osEvent evt = queue_gps_line.get(1);
        if (evt.status == osEventMessage) {
            gps_line *message = (gps_line*)evt.value.p;

            log_led = !log_led;
            f_puts(message->line, &fp_gps);
            f_sync(&fp_gps);
            
            mpool_gps_line.free(message);
        }
        
        evt = queue_sensor_line.get(1);
        if(evt.status == osEventMessage) {
            sensor_line *message = (sensor_line*)evt.value.p;
            
            sprintf(buffer, "%f\r\n", message->gps_battery);
            
            mpool_sensor_line.free(message);
        }
    }
}

void sensor_thread(const void* args)
{
    while(true)
    {
        //get sensor line memory
        sensor_line *message = mpool_sensor_line.alloc();
        
        //gps battery
        float sample = gps_battery.read();
        float voltage = sample*BAT_MUL*3.3;
        message->gps_battery = voltage;
        
        // more sensors
        
        queue_sensor_line.put(message);        
        Thread::wait(1000);
    }
}

int main()
{
    pc.baud(9600);
    Thread thread(gps_thread, NULL, osPriorityHigh);
    Thread thread2(log_thread, NULL, osPriorityNormal);
    //Thread thread3(sensor_thread, NULL, osPriorityNormal);

    while(true) {
    }
}