#! /usr/bin/env python
"""
nmeatoenglish.py - Converts an NMEA data file to English

:Copyright: Copyright 2007 Dean Hall.  All rights reserved.
:Author: Dean Hall
:Revision: 0.2
:Date: 2007/12/12

:usage: ./nmeatoenglish.py < NMEAFILE
:usage: ./nmeatoenglish.py NMEAFILE
"""


import os, string, sys
import nmeagram


FILE_EXTENSION = ".txt"

# Lookup tables for NMEA field codes
POSITION_FIX = {'0' : "Invalid",
                '1' : "GPS SPS mode",
                '2' : "Differential",
                '3' : "GPS PPS mode",
               }

RMC_MODE = {'A' : "Autonomous",
            'D' : "DGPS",
            'E' : "DR",
            'N' : "Not valid",
            'S' : "Simulator",
           }

RMC_STATUS = {'A' : "Data valid",
              'V' : "Data not valid",
             }


def nmeaLineToEnglish(line):
    """Read a NMEA sentence and return a string
    containing pertinent data and its field name.
    """
    data = []
    nmeagram.parseLine(line)

    sentencetype = line[3:6]
    if sentencetype == "GGA":
        data.append("GGA {PosFix = %s, SatsUsed = %d}\n" %
                    (POSITION_FIX[nmeagram.getField("PositionFix")],
                     nmeagram.getField("SatellitesUsed"),
                    )
                   )
    elif sentencetype == "RMC":
        data.append("RMC {Date = %s, Status = %s, Mode = %s}\n" %
                    (nmeagram.getField("Date"),
                     RMC_STATUS[nmeagram.getField("RmcStatus")],
                     RMC_MODE[nmeagram.getField("RmcMode")],
                    )
                   )
    elif sentencetype == "VTG":
        data.append("VTG {Course = %s, Speed = %s}\n" %
                    (str(nmeagram.getField("Course0")),
                     str(nmeagram.getField("Speed0")),
                    )
                   )
    return string.join(data,'')


def main():

    # If no filename is given, use stdio
    if len(sys.argv) == 1:
        line = sys.stdin.readline()
        while line:
            sys.stdout.write(nmeaLineToEnglish(line))
            line = sys.stdin.readline()

    # If arg is given, expect an input file
    elif len(sys.argv) == 2:
        fn = sys.argv[1]
        assert os.path.exists(fn)
        fi = open(fn, 'r')

        for line in fi.readlines():
            sys.stdout.write(nmeaLineToEnglish(line))
        fi.close()

    else:
        sys.stderr.write(__doc__)
        sys.exit(2)


if __name__ == "__main__":
    main()