Subversion Repositories shark

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Project: S.Ha.R.K.
 *
 * Coordinators:
 *   Giorgio Buttazzo    <giorgio@sssup.it>
 *   Paolo Gai           <pj@gandalf.sssup.it>
 *
 * Authors     :
 *   Giacomo Guidi       <giacomo@gandalf.sssup.it>
 *   (see the web pages for full authors list)
 *
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
 *
 * http://www.sssup.it
 * http://retis.sssup.it
 * http://shark.sssup.it
 */


#include <kernel/kern.h>
#include <stdlib.h>
#include <math.h>

#include "nmea.h"

#include <drivers/shark_keyb26.h>
#include <drivers/shark_fb26.h>

/* Number of available COM links */
#define COM_LINKS       4
                                                                                                                             
#define COM1            0
#define COM2            1
#define COM3            2
#define COM4            3
                                                                                                                             
/* These values identify interrupt type */
#define RX_FULL         1
#define TX_EMPTY        2
#define LS_CHANGED      4
#define MS_CHANGED      8

/* Register displacements */
#define THR     0
#define RBR     0
#define IER     1
#define FCR     2
#define IIR     2
#define LCR     3
#define MCR     4
#define LSR     5
#define MSR     6
#define SPad    7
                                                                                                                             
/* Parity value */
#define NONE    0
#define ODD     1
#define EVEN    3

static unsigned int com_base[] = {0x03F8,0x02F8,0x03E8,0x02E8};

struct OUTDATA gNMEAdata;

unsigned int com_read(unsigned int port,unsigned int reg)
{
    unsigned int b;
    if (port > 3 || reg > 7) return(0);
    b = ll_in(com_base[port]+reg);
    return(b);
}

void com_write(unsigned int port,unsigned int reg,unsigned int value)
{
    if (port > 3 || reg > 7) return;
    ll_out(com_base[port]+reg,value);
}

void com_send(unsigned int port,BYTE b)
{
    while ((com_read(port,LSR) & 32) == 0);
    com_write(port,THR,b);
}
                                                                                                                             
unsigned int com_receive(unsigned int port)
{
    while ((com_read(port,LSR) & 1) == 0);
    return(com_read(port,RBR));
}

int open_com(unsigned int port, DWORD speed, BYTE parity, BYTE len, BYTE stop)
{
    unsigned long div,b_mask;

    /* Now set up the serial link */
    b_mask = (parity & 3) * 8 + (stop & 1) * 4 + ((len - 5) & 3);
    div = 115200L / speed;
    /* Clear serial interrupt enable register */
    com_write(port,IER,0);
    /* Empty input buffer */
    com_read(port,RBR);
    /* Activate DLAB bit for speed setting */
    com_write(port,LCR,0x80);
    /* Load baud divisor */
    com_write(port,0,div & 0x00FF);
    div >>= 8;
    com_write(port,1,div & 0x00FF);
    /* Load control word (parity,stop bit,bit len) */
    com_write(port,LCR,b_mask);
    /* Attiva OUT1 & OUT2 */
    com_write(port,MCR,0x0C);

    return 0;

}


int main(int argc, char **argv)
{

    unsigned int ch,i;
    char temp[100];

    open_com(COM1,4800,NONE,8,0);
    i = 0;

    while(1) {

        ch = com_receive(COM1);
        temp[i] = ch;
        if (ch == 13) {
                temp[i] = 0;
                cprintf("%s\n",temp);
                process_message(temp + 1);
                i = 0;

                cprintf("Lat: %f Lon: %f Alt: %f Sat: %d View: %d Mod: %d Time: %s\n",
                gNMEAdata.latitude,
                gNMEAdata.longitude,
                gNMEAdata.altitude,
                gNMEAdata.satellites,
                gNMEAdata.in_view,
                gNMEAdata.mode,
                gNMEAdata.utc);
       
                ch = com_receive(COM1);

        } else {
                i++;
        }

    }

    return 0;

}