Use log macro to silent warning.
[bertos.git] / bertos / net / nmea.c
index 23e6dbcdc8bcbf305d82d4212a2ecd48a7b117dd..2dc32d5872c8e19f20b6df61b5d0c95d9b3b227a 100644 (file)
  * Copyright 2009 Develer S.r.l. (http://www.develer.com/)
  *
  * -->
- * \brief NMEA implementation.
+ *
+ * \brief NMEA parser implementation.
+ *
+ * NMEA 0183 is acronym of National Marine Electronics Association that
+ * combined electrical and data specification for communication between marine
+ * electronic devices such as echo sounder, sonars, anemometer (wind speed and direction),
+ * gyrocompass, autopilot, GPS receivers and many other types of instruments.
+ * It has been defined by, and is controlled by, the U.S.-based National Marine
+ * Electronics Association.
+ * The NMEA 0183 standard uses a simple ASCII, serial communications protocol
+ * that defines how data is transmitted in a "sentence" from one "talker"
+ * to multiple "listeners" at a time.
+ * At the application layer, the standard also defines the contents of each sentence
+ * (message) type so that all listeners can parse messages accurately.
+ *
  *
  * \author Daniele Basile <asterix@develer.com>
  *
 #include <string.h>
 #include <stdlib.h>
 
-
+/*
+ * Make conversion from one string to int.
+ *
+ * You can specify the precision if the string is a float
+ * number. The result is an int multiplied to 10^precision.
+ */
 static uint32_t tokenToInt(const char *s, int precision)
 {
        uint32_t num = 0;
@@ -89,6 +108,9 @@ static uint32_t tokenToInt(const char *s, int precision)
        return num;
 }
 
+/*
+ * Convert a string to micro degree.
+ */
 static udegree_t convertToDegree(const char *str)
 {
        uint32_t dec;
@@ -108,6 +130,9 @@ static udegree_t convertToDegree(const char *str)
        return dec;
 }
 
+/*
+ * Retun latitude in micro degree from a string.
+ */
 static udegree_t nmea_latitude(const char *plat, const char *phem)
 {
        int ns;
@@ -116,15 +141,15 @@ static udegree_t nmea_latitude(const char *plat, const char *phem)
         return 0;
 
     /* north lat is +, south lat is - */
-    if (*phem == 'N')
-        ns = 1;
-    else
-        ns = -1;
+       ns = (*phem == 'N') ? 1 : -1;
 
 
        return ns * convertToDegree(plat);
 }
 
+/*
+ * Retun longitude in micro degree from a string.
+ */
 static udegree_t nmea_longitude(const char *plot, const char *phem)
 {
        int ew;
@@ -133,14 +158,15 @@ static udegree_t nmea_longitude(const char *plot, const char *phem)
         return 0;
 
     /* west long is negative, east long is positive */
-    if (*phem == 'E')
-        ew = 1;
-    else
-        ew = -1;
+   ew = (*phem == 'E') ? 1 : -1;
 
        return ew * convertToDegree(plot);
 }
 
+/*
+ * Return altitude in meter from a string.
+ *
+ */
 static uint16_t nmea_altitude(const char *palt, const char *punits)
 {
        uint32_t alt;
@@ -165,6 +191,9 @@ static uint16_t nmea_altitude(const char *palt, const char *punits)
        return alt;
 }
 
+/*
+ * Convert time and date stamp string to unix time.
+ */
 static time_t timestampToSec(uint32_t time_stamp, uint32_t date_stamp)
 {
        struct tm t;
@@ -180,6 +209,7 @@ static time_t timestampToSec(uint32_t time_stamp, uint32_t date_stamp)
        uint32_t res = time_stamp / 1000;
        uint32_t all = time_stamp;
        msec = all - res * 1000;
+
        for (int i = 0; i < 3; i++)
        {
                all = res;
@@ -193,7 +223,7 @@ static time_t timestampToSec(uint32_t time_stamp, uint32_t date_stamp)
        t.tm_hour = tmr[2];
        //If we not have refence data, we set as default 1/1/1970.
        t.tm_mday = 1;
-       t.tm_mon = 1;
+       t.tm_mon = 0;
        t.tm_year = 70;
 
        if (date_stamp)
@@ -217,6 +247,77 @@ static time_t timestampToSec(uint32_t time_stamp, uint32_t date_stamp)
        return  mktime(&t);
 }
 
+/**
+ *  Callout example for GGA data
+ */
+void gpgga_callout(nmeap_context_t *context, void *data, void *user_data)
+{
+       (void)context;
+       (void)user_data;
+       (void)data;
+       LOG_INFOB(NmeaGga *gga = (NmeaGga *)data;);
+
+    LOG_INFO("Found GPGGA message %ld %ld %d %lu %d %d %d %d\n",
+            (long)gga->latitude,
+            (long)gga->longitude,
+            gga->altitude,
+            gga->time,
+            gga->satellites,
+            gga->quality,
+            gga->hdop,
+            gga->geoid);
+}
+
+/**
+ * Callout example for RMC
+ */
+void gprmc_callout(nmeap_context_t *context, void *data, void *user_data)
+{
+       (void)context;
+       (void)user_data;
+       (void)data;
+    LOG_INFOB(NmeaRmc *rmc = (NmeaRmc *)data;);
+
+       LOG_INFO("Found GPRMC message %lu %c %ld %ld %d %d %d\n",
+            rmc->time,
+            rmc->warn,
+            (long)rmc->latitude,
+            (long)rmc->longitude,
+            rmc->speed,
+            rmc->course,
+            rmc->mag_var);
+}
+
+/**
+ * Callout example for GSV data
+ */
+void gpgsv_callout(nmeap_context_t *context, void *data, void *user_data)
+{
+       (void)context;
+       (void)user_data;
+       (void)data;
+       LOG_INFOB(NmeaGsv *gsv = (NmeaGsv *)data;);
+
+    LOG_INFO("Found GPGSV message %d %d %d\n", gsv->tot_message, gsv->message_num, gsv->tot_svv);
+
+       for (int i = 0; i < 4; i++)
+           LOG_INFO("%d %d %d %d\n", gsv->info[i].sv_prn, gsv->info[i].elevation, gsv->info[i].azimut, gsv->info[i].snr);
+}
+
+/**
+ * Callout example for VTG data
+ */
+void gpvtg_callout(nmeap_context_t *context, void *data, void *user_data)
+{
+       (void)context;
+       (void)user_data;
+       (void)data;
+       LOG_INFOB(NmeaVtg *vtg = (NmeaVtg *)data;);
+
+    LOG_INFO("Found GPVTG message %d %d %d\n", vtg->track_good,        vtg->knot_speed, vtg->km_speed);
+}
+
+
 
 /**
  * standard GPGGA sentence parser
@@ -267,7 +368,7 @@ int nmea_gprmc(nmeap_context_t *context, nmeap_sentence_t *sentence)
        /*
         * extract data from the tokens
         */
-       rmc->time       = timestampToSec(tokenToInt(context->token[1], 3), atoi(context->token[9]));
+       rmc->time       = timestampToSec(tokenToInt(context->token[1], 3), tokenToInt(context->token[9], 0));
        rmc->warn       = *context->token[2];
        rmc->latitude   = nmea_latitude(context->token[3],context->token[4]);
        rmc->longitude  = nmea_longitude(context->token[5],context->token[6]);
@@ -351,6 +452,10 @@ int nmea_gpgsv(nmeap_context_t *context, nmeap_sentence_t *sentence)
     return NMEA_GPGSV;
 }
 
+
+/*
+ * Parse NMEA sentence from a channel.
+ */
 void nmea_poll(nmeap_context_t *context, KFile *channel)
 {
        int c;