A test program for SG12864A library.

Dependencies:   mbed RemoteIR SerialGPS SDFileSystem

Revision:
0:844df4828f01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 13 10:54:40 2010 +0000
@@ -0,0 +1,204 @@
+/**
+ * A test program for serial GPS module interface driver class (Version 0.0.1)
+ * The interface driver supports NMEA-0183 serial based modules.
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+#include "mbed.h"
+#include "TextLCD.h"
+#include "SerialGPS.h"
+#include "SDFileSystem.h"
+#include "ReceiverIR.h"
+#include "RemoteIR.h"
+
+/*
+ * Objects.
+ */
+TextLCD lcd(p24, p26, p27, p28, p29, p30);
+BusOut led(LED4, LED3, LED2, LED1);
+SerialGPS gps(p9, p10);
+SDFileSystem sd(p5, p6, p7, p8, "sd");
+Ticker ticker;
+ReceiverIR ir_rx(p15);
+
+/*
+ * Variables.
+ */
+static bool sd_disabled = false;
+static FILE *fp = NULL;
+static int display_mode = 0;
+
+/*
+ * Functions.
+ */
+
+/**
+ * A ticker function.
+ */
+void func_ticker(void) {
+    led = led + 1;
+}
+
+/**
+ * A callback function for logging data.
+ */
+void cbfunc_log(char *s) {
+    if (!sd_disabled) {
+        fprintf(fp, "%s\n", s);
+        fflush(fp);
+    } else {
+        printf("%s\n", s);
+    }
+}
+
+/**
+ * A callback function for GGA.
+ *
+ * GGA - Global Positioning System Fixed Data.
+ */
+void cbfunc_gga(SerialGPS::gps_gga_t *p) {
+    if (display_mode == 0) {
+        lcd.locate(0, 1);
+        lcd.printf("%02d:%02d:%02d(P%d,S%d)", p->hour, p->min, p->sec, p->position_fix, p->satellites_used);
+    }
+
+    if (display_mode == 1) {
+        lcd.locate(0, 1);
+        lcd.printf("%c=%10.4f", p->ns, p->latitude);
+    }
+    if (display_mode == 2) {
+        lcd.locate(0, 1);
+        lcd.printf("%c=%10.4f", p->ew, p->longitude);
+    }
+}
+
+/**
+ * A callback function for GSA.
+ *
+ * GSA - GNSS DOP and Active Satellites.
+ */
+void cbfunc_gsa(SerialGPS::gps_gsa_t *p) {
+    if (display_mode == 3) {
+        lcd.locate(0, 1);
+        lcd.printf("SEL:%c FIX:%d", p->selmode, p->fix);
+    }
+}
+
+/**
+ * A callback function for GSV.
+ *
+ * GSV - GNSS Satellites in View.
+ */
+void cbfunc_gsv(SerialGPS::gps_gsv_t *p) {
+    if (display_mode == 4) {
+        lcd.locate(0, 1);
+        lcd.printf("Satellites:%2d", p->satcnt);
+    }
+}
+
+/**
+ * A callback function for RMC.
+ *
+ * RMC - Recommended Minimum Specific GNSS Data.
+ */
+void cbfunc_rmc(SerialGPS::gps_rmc_t *p) {
+    if (display_mode == 5) {
+        lcd.locate(0, 1);
+        lcd.printf("%02d:%02d:%02d(%c)", p->hour, p->min, p->sec, p->status);
+    }
+}
+
+/**
+ * Entry point.
+ */
+int main() {
+    /*
+     * Attach callback functions.
+     */
+    SerialGPS::gps_callback_t cb;
+    cb.cbfunc_log = cbfunc_log;
+    cb.cbfunc_gga = cbfunc_gga;
+    cb.cbfunc_gsa = cbfunc_gsa;
+    cb.cbfunc_gsv = cbfunc_gsv;
+    cb.cbfunc_rmc = cbfunc_rmc;
+    gps.attach(&cb);
+
+    /*
+     * Test a SD card.
+     */
+    fp = fopen("/sd/gpslog.txt", "w");
+    if (fp == NULL) {
+        sd_disabled = true;
+    } else {
+        sd_disabled = false;
+        fprintf(fp, "Hello World!\n");
+    }
+
+    /*
+     * Attach a ticker for interrupt test.
+     */
+    ticker.attach_us(&func_ticker, 250 * 1000);
+
+    /*
+     * Initial display.
+     */
+    lcd.cls();
+    lcd.printf("GGA (Time)");
+
+    /*
+     * Loop.
+     */
+    int irlen;
+    uint8_t irbuf[32];
+    RemoteIR::Format irfmt;
+    while (1) {
+        irlen = ir_rx.getData(&irfmt, irbuf, sizeof(irbuf) * 8);
+        if (0 < irlen) {
+            uint64_t n = 0;
+            for (int i = 0; i < irlen; i++) {
+                if (irbuf[i / 8] & (1 << (i % 8))) {
+                    n = n | (1 << i);
+                }
+            }
+            // printf("%d:0x%llx\n", irlen, n);
+            if ((irlen == 12) && (irfmt == RemoteIR::SONY)) {
+                switch (n) {
+                    case 0x80:
+                        display_mode = 0;
+                        lcd.cls();
+                        lcd.printf("GGA (Time)");
+                        break;
+                    case 0x81:
+                        display_mode = 1;
+                        lcd.cls();
+                        lcd.printf("GGA (Latitude)");
+                        break;
+                    case 0x82:
+                        display_mode = 2;
+                        lcd.cls();
+                        lcd.printf("GGA (Longitude)");
+                        break;
+                    case 0x83:
+                        display_mode = 3;
+                        lcd.cls();
+                        lcd.printf("GSA (Statuses)");
+                        break;
+                    case 0x84:
+                        display_mode = 4;
+                        lcd.cls();
+                        lcd.printf("GSV (Satellites)");
+                        break;
+                    case 0x85:
+                        display_mode = 5;
+                        lcd.cls();
+                        lcd.printf("RMC (Time)");
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+        gps.processing();
+    }
+}