A test program for SG12864A library.

Dependencies:   mbed RemoteIR SerialGPS SDFileSystem

Committer:
shintamainjp
Date:
Wed Oct 13 10:54:40 2010 +0000
Revision:
0:844df4828f01
First version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:844df4828f01 1 /**
shintamainjp 0:844df4828f01 2 * A test program for serial GPS module interface driver class (Version 0.0.1)
shintamainjp 0:844df4828f01 3 * The interface driver supports NMEA-0183 serial based modules.
shintamainjp 0:844df4828f01 4 *
shintamainjp 0:844df4828f01 5 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:844df4828f01 6 * http://shinta.main.jp/
shintamainjp 0:844df4828f01 7 */
shintamainjp 0:844df4828f01 8 #include "mbed.h"
shintamainjp 0:844df4828f01 9 #include "TextLCD.h"
shintamainjp 0:844df4828f01 10 #include "SerialGPS.h"
shintamainjp 0:844df4828f01 11 #include "SDFileSystem.h"
shintamainjp 0:844df4828f01 12 #include "ReceiverIR.h"
shintamainjp 0:844df4828f01 13 #include "RemoteIR.h"
shintamainjp 0:844df4828f01 14
shintamainjp 0:844df4828f01 15 /*
shintamainjp 0:844df4828f01 16 * Objects.
shintamainjp 0:844df4828f01 17 */
shintamainjp 0:844df4828f01 18 TextLCD lcd(p24, p26, p27, p28, p29, p30);
shintamainjp 0:844df4828f01 19 BusOut led(LED4, LED3, LED2, LED1);
shintamainjp 0:844df4828f01 20 SerialGPS gps(p9, p10);
shintamainjp 0:844df4828f01 21 SDFileSystem sd(p5, p6, p7, p8, "sd");
shintamainjp 0:844df4828f01 22 Ticker ticker;
shintamainjp 0:844df4828f01 23 ReceiverIR ir_rx(p15);
shintamainjp 0:844df4828f01 24
shintamainjp 0:844df4828f01 25 /*
shintamainjp 0:844df4828f01 26 * Variables.
shintamainjp 0:844df4828f01 27 */
shintamainjp 0:844df4828f01 28 static bool sd_disabled = false;
shintamainjp 0:844df4828f01 29 static FILE *fp = NULL;
shintamainjp 0:844df4828f01 30 static int display_mode = 0;
shintamainjp 0:844df4828f01 31
shintamainjp 0:844df4828f01 32 /*
shintamainjp 0:844df4828f01 33 * Functions.
shintamainjp 0:844df4828f01 34 */
shintamainjp 0:844df4828f01 35
shintamainjp 0:844df4828f01 36 /**
shintamainjp 0:844df4828f01 37 * A ticker function.
shintamainjp 0:844df4828f01 38 */
shintamainjp 0:844df4828f01 39 void func_ticker(void) {
shintamainjp 0:844df4828f01 40 led = led + 1;
shintamainjp 0:844df4828f01 41 }
shintamainjp 0:844df4828f01 42
shintamainjp 0:844df4828f01 43 /**
shintamainjp 0:844df4828f01 44 * A callback function for logging data.
shintamainjp 0:844df4828f01 45 */
shintamainjp 0:844df4828f01 46 void cbfunc_log(char *s) {
shintamainjp 0:844df4828f01 47 if (!sd_disabled) {
shintamainjp 0:844df4828f01 48 fprintf(fp, "%s\n", s);
shintamainjp 0:844df4828f01 49 fflush(fp);
shintamainjp 0:844df4828f01 50 } else {
shintamainjp 0:844df4828f01 51 printf("%s\n", s);
shintamainjp 0:844df4828f01 52 }
shintamainjp 0:844df4828f01 53 }
shintamainjp 0:844df4828f01 54
shintamainjp 0:844df4828f01 55 /**
shintamainjp 0:844df4828f01 56 * A callback function for GGA.
shintamainjp 0:844df4828f01 57 *
shintamainjp 0:844df4828f01 58 * GGA - Global Positioning System Fixed Data.
shintamainjp 0:844df4828f01 59 */
shintamainjp 0:844df4828f01 60 void cbfunc_gga(SerialGPS::gps_gga_t *p) {
shintamainjp 0:844df4828f01 61 if (display_mode == 0) {
shintamainjp 0:844df4828f01 62 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 63 lcd.printf("%02d:%02d:%02d(P%d,S%d)", p->hour, p->min, p->sec, p->position_fix, p->satellites_used);
shintamainjp 0:844df4828f01 64 }
shintamainjp 0:844df4828f01 65
shintamainjp 0:844df4828f01 66 if (display_mode == 1) {
shintamainjp 0:844df4828f01 67 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 68 lcd.printf("%c=%10.4f", p->ns, p->latitude);
shintamainjp 0:844df4828f01 69 }
shintamainjp 0:844df4828f01 70 if (display_mode == 2) {
shintamainjp 0:844df4828f01 71 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 72 lcd.printf("%c=%10.4f", p->ew, p->longitude);
shintamainjp 0:844df4828f01 73 }
shintamainjp 0:844df4828f01 74 }
shintamainjp 0:844df4828f01 75
shintamainjp 0:844df4828f01 76 /**
shintamainjp 0:844df4828f01 77 * A callback function for GSA.
shintamainjp 0:844df4828f01 78 *
shintamainjp 0:844df4828f01 79 * GSA - GNSS DOP and Active Satellites.
shintamainjp 0:844df4828f01 80 */
shintamainjp 0:844df4828f01 81 void cbfunc_gsa(SerialGPS::gps_gsa_t *p) {
shintamainjp 0:844df4828f01 82 if (display_mode == 3) {
shintamainjp 0:844df4828f01 83 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 84 lcd.printf("SEL:%c FIX:%d", p->selmode, p->fix);
shintamainjp 0:844df4828f01 85 }
shintamainjp 0:844df4828f01 86 }
shintamainjp 0:844df4828f01 87
shintamainjp 0:844df4828f01 88 /**
shintamainjp 0:844df4828f01 89 * A callback function for GSV.
shintamainjp 0:844df4828f01 90 *
shintamainjp 0:844df4828f01 91 * GSV - GNSS Satellites in View.
shintamainjp 0:844df4828f01 92 */
shintamainjp 0:844df4828f01 93 void cbfunc_gsv(SerialGPS::gps_gsv_t *p) {
shintamainjp 0:844df4828f01 94 if (display_mode == 4) {
shintamainjp 0:844df4828f01 95 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 96 lcd.printf("Satellites:%2d", p->satcnt);
shintamainjp 0:844df4828f01 97 }
shintamainjp 0:844df4828f01 98 }
shintamainjp 0:844df4828f01 99
shintamainjp 0:844df4828f01 100 /**
shintamainjp 0:844df4828f01 101 * A callback function for RMC.
shintamainjp 0:844df4828f01 102 *
shintamainjp 0:844df4828f01 103 * RMC - Recommended Minimum Specific GNSS Data.
shintamainjp 0:844df4828f01 104 */
shintamainjp 0:844df4828f01 105 void cbfunc_rmc(SerialGPS::gps_rmc_t *p) {
shintamainjp 0:844df4828f01 106 if (display_mode == 5) {
shintamainjp 0:844df4828f01 107 lcd.locate(0, 1);
shintamainjp 0:844df4828f01 108 lcd.printf("%02d:%02d:%02d(%c)", p->hour, p->min, p->sec, p->status);
shintamainjp 0:844df4828f01 109 }
shintamainjp 0:844df4828f01 110 }
shintamainjp 0:844df4828f01 111
shintamainjp 0:844df4828f01 112 /**
shintamainjp 0:844df4828f01 113 * Entry point.
shintamainjp 0:844df4828f01 114 */
shintamainjp 0:844df4828f01 115 int main() {
shintamainjp 0:844df4828f01 116 /*
shintamainjp 0:844df4828f01 117 * Attach callback functions.
shintamainjp 0:844df4828f01 118 */
shintamainjp 0:844df4828f01 119 SerialGPS::gps_callback_t cb;
shintamainjp 0:844df4828f01 120 cb.cbfunc_log = cbfunc_log;
shintamainjp 0:844df4828f01 121 cb.cbfunc_gga = cbfunc_gga;
shintamainjp 0:844df4828f01 122 cb.cbfunc_gsa = cbfunc_gsa;
shintamainjp 0:844df4828f01 123 cb.cbfunc_gsv = cbfunc_gsv;
shintamainjp 0:844df4828f01 124 cb.cbfunc_rmc = cbfunc_rmc;
shintamainjp 0:844df4828f01 125 gps.attach(&cb);
shintamainjp 0:844df4828f01 126
shintamainjp 0:844df4828f01 127 /*
shintamainjp 0:844df4828f01 128 * Test a SD card.
shintamainjp 0:844df4828f01 129 */
shintamainjp 0:844df4828f01 130 fp = fopen("/sd/gpslog.txt", "w");
shintamainjp 0:844df4828f01 131 if (fp == NULL) {
shintamainjp 0:844df4828f01 132 sd_disabled = true;
shintamainjp 0:844df4828f01 133 } else {
shintamainjp 0:844df4828f01 134 sd_disabled = false;
shintamainjp 0:844df4828f01 135 fprintf(fp, "Hello World!\n");
shintamainjp 0:844df4828f01 136 }
shintamainjp 0:844df4828f01 137
shintamainjp 0:844df4828f01 138 /*
shintamainjp 0:844df4828f01 139 * Attach a ticker for interrupt test.
shintamainjp 0:844df4828f01 140 */
shintamainjp 0:844df4828f01 141 ticker.attach_us(&func_ticker, 250 * 1000);
shintamainjp 0:844df4828f01 142
shintamainjp 0:844df4828f01 143 /*
shintamainjp 0:844df4828f01 144 * Initial display.
shintamainjp 0:844df4828f01 145 */
shintamainjp 0:844df4828f01 146 lcd.cls();
shintamainjp 0:844df4828f01 147 lcd.printf("GGA (Time)");
shintamainjp 0:844df4828f01 148
shintamainjp 0:844df4828f01 149 /*
shintamainjp 0:844df4828f01 150 * Loop.
shintamainjp 0:844df4828f01 151 */
shintamainjp 0:844df4828f01 152 int irlen;
shintamainjp 0:844df4828f01 153 uint8_t irbuf[32];
shintamainjp 0:844df4828f01 154 RemoteIR::Format irfmt;
shintamainjp 0:844df4828f01 155 while (1) {
shintamainjp 0:844df4828f01 156 irlen = ir_rx.getData(&irfmt, irbuf, sizeof(irbuf) * 8);
shintamainjp 0:844df4828f01 157 if (0 < irlen) {
shintamainjp 0:844df4828f01 158 uint64_t n = 0;
shintamainjp 0:844df4828f01 159 for (int i = 0; i < irlen; i++) {
shintamainjp 0:844df4828f01 160 if (irbuf[i / 8] & (1 << (i % 8))) {
shintamainjp 0:844df4828f01 161 n = n | (1 << i);
shintamainjp 0:844df4828f01 162 }
shintamainjp 0:844df4828f01 163 }
shintamainjp 0:844df4828f01 164 // printf("%d:0x%llx\n", irlen, n);
shintamainjp 0:844df4828f01 165 if ((irlen == 12) && (irfmt == RemoteIR::SONY)) {
shintamainjp 0:844df4828f01 166 switch (n) {
shintamainjp 0:844df4828f01 167 case 0x80:
shintamainjp 0:844df4828f01 168 display_mode = 0;
shintamainjp 0:844df4828f01 169 lcd.cls();
shintamainjp 0:844df4828f01 170 lcd.printf("GGA (Time)");
shintamainjp 0:844df4828f01 171 break;
shintamainjp 0:844df4828f01 172 case 0x81:
shintamainjp 0:844df4828f01 173 display_mode = 1;
shintamainjp 0:844df4828f01 174 lcd.cls();
shintamainjp 0:844df4828f01 175 lcd.printf("GGA (Latitude)");
shintamainjp 0:844df4828f01 176 break;
shintamainjp 0:844df4828f01 177 case 0x82:
shintamainjp 0:844df4828f01 178 display_mode = 2;
shintamainjp 0:844df4828f01 179 lcd.cls();
shintamainjp 0:844df4828f01 180 lcd.printf("GGA (Longitude)");
shintamainjp 0:844df4828f01 181 break;
shintamainjp 0:844df4828f01 182 case 0x83:
shintamainjp 0:844df4828f01 183 display_mode = 3;
shintamainjp 0:844df4828f01 184 lcd.cls();
shintamainjp 0:844df4828f01 185 lcd.printf("GSA (Statuses)");
shintamainjp 0:844df4828f01 186 break;
shintamainjp 0:844df4828f01 187 case 0x84:
shintamainjp 0:844df4828f01 188 display_mode = 4;
shintamainjp 0:844df4828f01 189 lcd.cls();
shintamainjp 0:844df4828f01 190 lcd.printf("GSV (Satellites)");
shintamainjp 0:844df4828f01 191 break;
shintamainjp 0:844df4828f01 192 case 0x85:
shintamainjp 0:844df4828f01 193 display_mode = 5;
shintamainjp 0:844df4828f01 194 lcd.cls();
shintamainjp 0:844df4828f01 195 lcd.printf("RMC (Time)");
shintamainjp 0:844df4828f01 196 break;
shintamainjp 0:844df4828f01 197 default:
shintamainjp 0:844df4828f01 198 break;
shintamainjp 0:844df4828f01 199 }
shintamainjp 0:844df4828f01 200 }
shintamainjp 0:844df4828f01 201 }
shintamainjp 0:844df4828f01 202 gps.processing();
shintamainjp 0:844df4828f01 203 }
shintamainjp 0:844df4828f01 204 }