using Gert van der Knokke´s vga lib and Ivo van Poorten´ss fastlib to receive from GPS data and display on monitor

Dependencies:   mbed vga640x480g

main.cpp

Committer:
smayr
Date:
2012-01-01
Revision:
2:794da1b39773
Parent:
0:2b28d7f11022

File content as of revision 2:794da1b39773:

/*
 * 640x480 60Hz fullgraphic monochrome VGA Driver demo program
 *
 * Copyright (C) 2011 by Ivo van Poorten <ivop(at)euronet.nl>
 * and Gert van der Knokke <gertk(at)xs4all.nl>
 * This file is licensed under the terms of the GNU Lesser
 * General Public License, version 3.
 *
 * Inspired by Simon's (not Ford) Cookbook entry and Cliff Biffle's
 * assembly code.
 */
 
#include "mbed.h"
#include "fastlib/common.h"
#include "fastlib/pinsel.h"
#include "fastlib/gpio.h"
#include "fastlib/clock.h"
#include "fastlib/power.h"
#include "fastlib/pwm.h"
#include "fastlib/i2s.h"
#include "fastlib/uart.h"
#include "fastlib/dma.h"
#include "fastlib/nvic.h"

#include "vga640x480g.h"


// visual feedback
DigitalOut myled(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);   // Data sent LED

// Commands for SIRF III GPS
// to turn on or off data strings
#define GGA_ON   "$PSRF103,00,00,01,01*25\r\n"
#define GGA_OFF  "$PSRF103,00,00,00,01*24\r\n"
#define GLL_ON   "$PSRF103,01,00,01,01*24\r\n"
#define GLL_OFF  "$PSRF103,01,00,00,01*25\r\n"
#define GSA_ON   "$PSRF103,02,00,01,01*27\r\n"
#define GSA_OFF  "$PSRF103,02,00,00,01*26\r\n"
#define GSV_ON   "$PSRF103,03,00,05,01*22\r\n"
#define GSV_OFF  "$PSRF103,03,00,00,01*27\r\n"
#define RMC_ON   "$PSRF103,04,00,01,01*21\r\n"
#define RMC_OFF  "$PSRF103,04,00,00,01*20\r\n"
#define VTG_ON   "$PSRF103,05,00,01,01*20\r\n"
#define VTG_OFF  "$PSRF103,05,00,00,01*21\r\n"
//#define WAAS_ON  "$PSRF151,1*3F\r\n"
//#define WAAS_OFF "$PSRF151,0*3E\r\n"
#define UARTPORT 3

// Set up serial ports and LEDs
// SIRF GPS on Pin28 and Pin7
//Serial gps(p9, p10);     // tx, rx - 4800 baud required

//TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d0-d3

//char buffidx;
char vgatxtbuff[80];    // Data buffer for VGA output
char msg[256];           // GPS data buffer
char status;             // GPS status 'V' = Not locked; 'A' = Locked
char *parseptr;          // Pointer for parsing GPS message
char time_buff[7] = "000000";
char date_buff[7] = "000000";
char sens_buff[7] = "123456";
int i;

void putcharact(char chardata) {

  while ((fl_uart_get_line_status(UARTPORT)& 0x60)==0) {
  
  }
  *FL_UART(UARTPORT, THR)= chardata;
}
char getcharact(void) {
  while ((fl_uart_get_line_status(UARTPORT)& 0x01)==0) {
  }
  return fl_uart_receive_byte(UARTPORT);
}

// Switch off all but $GPRMC string
void setgps() {
    sprintf(msg,GGA_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
    sprintf(msg,GLL_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
    sprintf(msg,GSA_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
    sprintf(msg,GSV_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
    sprintf(msg,RMC_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
    sprintf(msg,VTG_ON);
    i=0;
    while (msg[i]!= 0) {
      putcharact(msg[i]);
      i++;
    }
//    gps.printf(WAAS_OFF);
    return;
}

// Get line of data from GPS
void getline() {
    while (getcharact() != '$'); // Wait for start of line
    for (int i=0; i<256; i++) {
        msg[i] = getcharact();
        if (msg[i] == '\r') {
            msg[i] = 0;
            return;
        }
    }
}


float trunc(float v) {
    if(v < 0.0) {
        v*= -1.0;
        v = floor(v);
        v*=-1.0;
    } else {
        v = floor(v);
    }
    return v;
}

/** The longitude (call sample() to set) */
float longitude;
/** The latitude (call sample() to set) */
float latitude;
float gps_time;
char ns, ew;
int lock,sat_used;
float HDOP;
float altitude;

int toggle_flag=0;
int gps_hour;
int gps_min;
int gps_sec;
int s;
unsigned power_state;

int main() {
    // init the VGA subsystem (always do this first!)
    init_vga();
    setbuf(stdout, NULL); // no buffering for this filehandle

//    gps.baud(4800);         // NB GPS baud rate 4800
    fl_power_uart3(FL_ON);
    fl_select_clock_uart3(FL_CLOCK_DIV1);
    *FL_UART(UARTPORT, LCR) = 0x00000083; //DLAB 1 for access to divisors
    fl_uart_set_fractional_divider(UARTPORT, 0, 0);
    fl_uart_set_divisor_latch(UARTPORT, 1302);
    *FL_UART(UARTPORT, FCR) = 0x00000007; // FIFO enable (must) and clear FIFOs
    *FL_UART(UARTPORT, LCR) = 0x00000003; // DLAB 0
    *FL_UART(UARTPORT, IER) = 0x00000000; // no interrupts
    fl_pinsel(0, 0, FL_FUNC_ALT2, FL_IGNORE, FL_IGNORE);    // TX3
    fl_pinsel(0, 1, FL_FUNC_ALT2, FL_IGNORE, FL_IGNORE);    // RX3
    fl_uart_transmitter_enable(UARTPORT, 1);
    
    setgps();


    // clear the screen
    vga_cls();
    // circumfence the screen
    vga_box(0,0,639,479,WHITE);
           vga_putstring(400,370,"GPS DEMO",WHITE);
/*    // put a string on screen
    for (s=0; s<150; s++) {
       vga_putstring(400,370-s,"GPS DEMO",WHITE);
       wait(0.01);
       vga_putstring(400,370-s,"GPS DEMO",BLACK);
    }
      for (s=0; s<150; s++) {
       vga_putstring(400-s,220,"GPS DEMO",WHITE);
       wait(0.01);
       vga_putstring(400-s,220,"GPS DEMO",BLACK);
    }
      for (s=0; s<150; s++) {
       vga_putstring(250,220+s,"GPS DEMO",WHITE);
       wait(0.01);
       vga_putstring(250,220+s,"GPS DEMO",BLACK);
    }
      for (s=0; s<150; s++) {
       vga_putstring(250+s,370,"GPS DEMO",WHITE);
       wait(0.01);
       vga_putstring(250+s,370,"GPS DEMO",BLACK);
    }
        wait(1);
    for (s=0;s<30;s++){
       vga_putstring(400,370,"GPS DEMO",WHITE);
         wait(.1);
       vga_putstring(400,370,"GPS DEMO",BLACK);
         wait(.1);
    }
*/
    
    vga_putstring(10,50,"CGA",WHITE);
    vga_putstring(10,70,"GLL",WHITE);
    vga_putstring(10,90,"GSA",WHITE);
    vga_putstring(10,110,"GSV",WHITE);
    vga_putstring(10,130,"RMC",WHITE);
    vga_putstring(10,150,"RMC",WHITE);
   
   

    while (1) {
led4=1;
        getline();
        if (sscanf(msg,"GPGGA,%s", &vgatxtbuff)>=1){
            vga_putstring(50,50,vgatxtbuff,WHITE);
        }
        if (sscanf(msg,"GPGLL,%s", &vgatxtbuff)>=1){
            vga_putstring(50,70,vgatxtbuff,WHITE);
        }
        if (sscanf(msg,"GPGSA,%s", &vgatxtbuff)>=1){
            vga_putstring(50,90,vgatxtbuff,WHITE);
        }
        if (sscanf(msg,"GPGSV,%s", &vgatxtbuff)>=1){
            vga_putstring(50,110,vgatxtbuff,WHITE);
        }
        if (sscanf(msg,"GPRMC,%s", &vgatxtbuff)>=1){
            vga_putstring(50,130,vgatxtbuff,WHITE);
        }
        if (sscanf(msg,"GPVTG,%s", &vgatxtbuff)>=1){
            vga_putstring(50,150,vgatxtbuff,WHITE);
        }
       // Check if it is a GPGGA msg (matches both locked and non-locked msg)
        if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f", &gps_time, &latitude, &ns, &longitude, &ew, &lock, &sat_used, &HDOP, &altitude) >= 1) { 
            if(!lock) {
                led4 = 1;
                longitude = 0.0;
                latitude = 0.0;        
            } else {
                led4 = 0;
                if(ns == 'S') {    latitude  *= -1.0; }
                if(ew == 'W') {    longitude *= -1.0; }
                float degrees = trunc(latitude / 100.0f);
                float minutes = latitude - (degrees * 100.0f);
                latitude = degrees + minutes / 60.0f;    
                degrees = trunc(longitude / 100.0f);
                minutes = longitude - (degrees * 100.0f);
                longitude = degrees + minutes / 60.0f;
                gps_hour = trunc(gps_time/10000.0f);
                gps_min = trunc((gps_time - gps_hour*10000.0f)/100.0f);
                gps_sec = trunc(gps_time-gps_hour*10000.0f-gps_min*100.0f);
                gps_hour++;
                if (gps_hour>=24) {
                    gps_hour=0;
                }
            }
            sprintf(vgatxtbuff, "lat: %3.7f long: %3.7f time: %2.4f sat_used: %d alt: %5.3f",latitude, longitude,gps_time, sat_used, altitude);
            vga_putstring(10,30,vgatxtbuff,WHITE);
        }
    }
}