Move kfile interface to the io/ directory.
[bertos.git] / bertos / net / nmea.h
index 8c28b65800d5a44ae913a3601223f9de1ec298de..184a7a0aa1e4d07faf30df923807af84e56c29c4 100644 (file)
  * Copyright 2009 Develer S.r.l. (http://www.develer.com/)
  *
  * -->
- * \brief NMEA Parser
+ * \brief NMEA Parser.
  *
  * \author Daniele Basile <asterix@develer.com>
  *
  * $WIZ$ module_name = "nmea"
  * $WIZ$ module_configuration = "bertos/cfg/cfg_nmea.h"
- * $WIZ$ module_depends = "kfile"
+ * $WIZ$ module_depends = "kfile", "nmeap01"
  */
 
 #ifndef NET_NMEA_H
@@ -45,7 +45,9 @@
 
 #include <net/nmeap/inc/nmeap.h>
 
-#include <kern/kfile.h>
+#include <io/kfile.h>
+
+#include <time.h>
 
 /*
  * Implemented NMEA parser strings.
 #define NMEA_GPGSV 4   // GSV MESSAGE ID
 
 // Standart type to rappresent fiels.
-typedef uint32_t udegree_t;    // Micro degrees
-typedef uint32_t mdegree_t;    // Milli degrees
-typedef uint16_t degree_t;     // Degrees
-typedef uint16_t cm_t;         // Centimeter
-typedef uint32_t sec_t;        // Seconds
-typedef uint32_t str_time_t;   // Time format HH:MM:SS
-typedef uint32_t mknots_t;     // Milli knots
-typedef uint32_t mkh_t;        // Milli kilometers/hour
-typedef uint16_t number_t;      // Pure number
+typedef int32_t udegree_t;    // Micro degrees
+typedef int32_t mdegree_t;    // Milli degrees
+typedef int16_t degree_t;     // Degrees
 
 
 /**
+ * Global Positioning System Fix Data.
  * Extracted data from a GGA message
+ *
+ * Note: time member contains the seconds elapsed from 00:00:00 1/1/1970,
+ * because from nmea sentence we read only the time of UTC position, we
+ * have not any reference of date (day, month and year) so time is referred to
+ * the start of unix time.
  */
 typedef struct NmeaGga
 {
-       udegree_t     latitude;
-       udegree_t     longitude;
-       cm_t          altitude;
-       sec_t         time;
-       number_t       satellites;
-       number_t       quality;
-       udegree_t     hdop;
-       udegree_t     geoid;
+       udegree_t     latitude;   /* Latitude (micro degree) */
+       udegree_t     longitude;  /* Longitude (micro degree) */
+       int32_t       altitude;   /* Altitude (Meter) */
+       time_t        time;       /* UTC of position  (Unix time) */
+       uint16_t      satellites; /* Satellites are in view */
+       uint16_t      quality;    /* Fix Quality: 0 = Invalid; 1 = GPS fix; 2 = DGPS fix; */
+       uint16_t      hdop;       /* Relative accuracy of horizontal position (hdop * 10) */
+       int16_t       geoid;      /* Height of geoid above WGS84 ellipsoid (Meter) */
 } NmeaGga;
 
 /**
+ * Recommended minimum specific GPS/Transit data.
  * Extracted data from an RMC message
+ *
+ * Note: RMC sentences contain also date stamp so, time contains real seconds elapsed
+ * from 0:00:00 1/1/1970.
  */
 typedef struct NmeaRmc
 {
-       str_time_t    time;
-       char          warn;
-       udegree_t     latitude;
-       udegree_t     longitude;
-       mknots_t      speed;
-       mdegree_t     course;
-       str_time_t    date;
-       mdegree_t     mag_var;
+       time_t        time;       /* UTC of position  (Unix time) */
+       char          warn;       /* Navigation receiver warning A = OK, V = warning */
+       udegree_t     latitude;   /* Latitude (micro degree) */
+       udegree_t     longitude;  /* Longitude (micro degree) */
+       uint16_t      speed;      /* Speed over ground (knots) */
+       degree_t      course;     /* Track made good in degrees True (degree) */
+       degree_t      mag_var;    /* Magnetic variation degrees (degree) */
 } NmeaRmc;
 
 /**
@@ -102,35 +107,28 @@ typedef struct NmeaRmc
  */
 typedef struct NmeaVtg
 {
-       mdegree_t     track_good;
-       mknots_t      knot_speed;
-       mkh_t         km_speed;
+       degree_t     track_good;  /* True track made good (degree) */
+       uint16_t     knot_speed;  /* Speed over ground (knots) */
+       uint16_t     km_speed;    /* Speed over ground in kilometers/hour */
 } NmeaVtg;
 
 /**
  * Extracted data from an gsv message
  */
+struct SvInfo
+{
+       uint16_t    sv_prn;       /* SV PRN number */
+       degree_t    elevation;    /* Elevation in degrees, 90 maximum */
+       degree_t    azimut;       /* Azimuth, degrees from true north, 000 to 359 */
+       uint16_t    snr;          /* SNR, 00-99 dB (null when not tracking) */
+};
+
 typedef struct NmeaGsv
 {
-       number_t       tot_message;
-       number_t       message_num;
-       number_t       tot_svv;
-       number_t       sv_prn;
-       degree_t          elevation;
-       degree_t      azimut;
-       number_t       snr;
-       number_t       sv_prn2;
-       degree_t          elevation2;
-       degree_t      azimut2;
-       number_t       snr2;
-       number_t       sv_prn3;
-       degree_t          elevation3;
-       degree_t      azimut3;
-       number_t       snr3;
-       number_t       sv_prn4;
-       degree_t          elevation4;
-       degree_t      azimut4;
-       number_t       snr4;
+       uint16_t    tot_message;  /* Total number of messages of this type in this cycle */
+       uint16_t    message_num;  /* Message number */
+       uint16_t    tot_svv;      /* Total number of SVs in view */
+       struct SvInfo info[4];    /* Stanrd gsv nmea report up to 4 sv info */
 } NmeaGsv;
 
 void nmea_poll(nmeap_context_t *context, KFile *channel);
@@ -140,4 +138,14 @@ int nmea_gpvtg(nmeap_context_t *context, nmeap_sentence_t *sentence);
 int nmea_gprmc(nmeap_context_t *context, nmeap_sentence_t *sentence);
 int nmea_gpgga(nmeap_context_t *context, nmeap_sentence_t *sentence);
 
+// Example of callout
+void gpgga_callout(nmeap_context_t *context, void *data, void *user_data);
+void gprmc_callout(nmeap_context_t *context, void *data, void *user_data);
+void gpgsv_callout(nmeap_context_t *context, void *data, void *user_data);
+void gpvtg_callout(nmeap_context_t *context, void *data, void *user_data);
+
+int nmea_testSetup(void);
+int nmea_testTearDown(void);
+int nmea_testRun(void);
+
 #endif /* NET_NMEA_H */