Import NMEAP 0.3 library.
[bertos.git] / bertos / net / nmeap / tst / test1.c
diff --git a/bertos/net/nmeap/tst/test1.c b/bertos/net/nmeap/tst/test1.c
new file mode 100644 (file)
index 0000000..3c5e18b
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+Copyright (c) 2005, David M Howard (daveh at dmh2000.com)
+All rights reserved.
+
+This product is licensed for use and distribution under the BSD Open Source License.
+see the file COPYING for more details.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+
+*/
+
+/*
+========================================================================================================
+EXAMPLE : SETUP FOR GGA AND RMC SENTENCES WITH CHARACTER BY CHARACTER IO
+=======================================================================================================
+*/   
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "nmeap.h"
+
+nmeap_gga_t g_gga;
+
+char test_vector[] = {
+"$GPGGA,123519,3929.946667,N,11946.086667,E,1,08,0.9,545.4,M,46.9,M,,*4A\r\n" /* good */
+"$xyz,1234,asdfadfasdfasdfljsadfkjasdfk\r\n"                                  /* junk */
+"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68\r\n"      /* good */
+"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*48\r\n"      /* checksum error */
+};
+
+char *pvec = test_vector;
+
+/** simulate character by character IO */
+int readchar() 
+{
+    int ch;
+    if (*pvec == 0) {
+        ch = -1;
+    }
+    else {
+        ch = *pvec++;
+    }
+    return ch;
+}
+
+/** do something with the GGA data */
+static void print_gga(nmeap_gga_t *gga)
+{
+    printf("found GPGGA message %.6f %.6f %.0f %lu %d %d %f %f\n",
+            gga->latitude  ,
+            gga->longitude, 
+            gga->altitude , 
+            gga->time     , 
+            gga->satellites,
+            gga->quality   ,
+            gga->hdop      ,
+            gga->geoid     
+            );
+}
+
+/** called when a gpgga message is received and parsed */
+static void gpgga_callout(nmeap_context_t *context,void *data,void *user_data)
+{
+    nmeap_gga_t *gga = (nmeap_gga_t *)data;
+    
+    printf("-------------callout\n");
+    print_gga(gga);
+}
+
+
+/** do something with the RMC data */
+static void print_rmc(nmeap_rmc_t *rmc)
+{
+    printf("found GPRMC Message %lu %c %.6f %.6f %f %f %lu %f\n",
+            rmc->time,
+            rmc->warn,
+            rmc->latitude,
+            rmc->longitude,
+            rmc->speed,
+            rmc->course,
+            rmc->date,
+            rmc->magvar
+            );
+}
+
+/** called when a gprmc message is received and parsed */
+static void gprmc_callout(nmeap_context_t *context,void *data,void *user_data)
+{
+    nmeap_rmc_t *rmc = (nmeap_rmc_t *)data;
+    
+    printf("-------------callout\n");
+    print_rmc(rmc);
+}
+
+/* ---------------------------------------------------------------------------------------*/
+/* STEP 1 : allocate the data structures. be careful if you put them on the stack because */
+/*          they need to be live for the duration of the parser                           */
+/* ---------------------------------------------------------------------------------------*/
+static nmeap_context_t nmea;      /* parser context */
+static nmeap_gga_t     gga;               /* this is where the data from GGA messages will show up */
+static nmeap_rmc_t     rmc;               /* this is where the data from RMC messages will show up */
+static int             user_data; /* user can pass in anything. typically it will be a pointer to some user data */
+
+int main(int argc,char *argv[])
+{
+    int             status;
+    char            ch;
+    
+       /* ---------------------------------------*/
+       /*STEP 2 : initialize the nmea context    */                                                
+       /* ---------------------------------------*/
+    status = nmeap_init(&nmea,(void *)&user_data);
+    if (status != 0) {
+        printf("nmeap_init %d\n",status);
+        exit(1);
+    }
+    
+       /* ---------------------------------------*/
+       /*STEP 3 : add standard GPGGA parser      */                                                
+       /* -------------------------------------- */
+    status = nmeap_addParser(&nmea,"GPGGA",nmeap_gpgga,gpgga_callout,&gga);
+    if (status != 0) {
+        printf("nmeap_add %d\n",status);
+        exit(1);
+    }
+
+       /* ---------------------------------------*/
+       /*STEP 4 : add standard GPRMC parser      */                                                
+       /* -------------------------------------- */
+    status = nmeap_addParser(&nmea,"GPRMC",nmeap_gprmc,gprmc_callout,&rmc);
+    if (status != 0) {
+        printf("nmeap_add %d\n",status);
+        exit(1);
+    }
+    
+       /* ---------------------------------------*/
+       /*STEP 5 : process input until done       */                                                
+       /* -------------------------------------- */
+    for(;;) {
+               /* ---------------------------------------*/
+               /*STEP 6 : get a byte at a time           */                                                
+               /* -------------------------------------- */
+        ch = readchar();
+        if (ch <= 0) {
+            break;
+        }
+        
+               /* --------------------------------------- */
+               /*STEP 7 : pass it to the parser           */
+               /* status indicates whether a complete msg */
+               /* arrived for this byte                   */
+               /* NOTE : in addition to the return status */
+               /* the message callout will be fired when  */
+               /* a complete message is processed         */
+               /* --------------------------------------- */
+        status = nmeap_parse(&nmea,ch);
+        
+               /* ---------------------------------------*/
+               /*STEP 8 : process the return code        */                                                
+               /* -------------------------------------- */
+        switch(status) {
+        case NMEAP_GPGGA:
+                       /* GOT A GPGGA MESSAGE */
+            printf("-------------switch\n");
+            print_gga(&gga);
+            printf("-------------\n");
+            break;
+        case NMEAP_GPRMC:
+                       /* GOT A GPRMC MESSAGE */
+            printf("-------------switch\n");
+            print_rmc(&rmc);
+            printf("-------------\n");
+            break;
+        default:
+            break;
+        }
+    }
+    
+    return 0;
+}
+