Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.

Dependencies:   mbed Watchdog SDFileSystem DigoleSerialDisp

Committer:
shimniok
Date:
Fri Nov 30 16:11:53 2018 +0000
Revision:
25:bb5356402687
Parent:
20:1c2067937065
Initial publish of revised version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:a6a169de725f 1 #include "mbed.h"
shimniok 20:1c2067937065 2 #include "util.h"
shimniok 0:a6a169de725f 3 #include "Display.h"
shimniok 0:a6a169de725f 4
shimniok 20:1c2067937065 5 // TODO 3 would also be nice if we did all the printf crap here too
shimniok 0:a6a169de725f 6
shimniok 0:a6a169de725f 7 #define LCD_FMT "%-20s" // used to fill a single line on the LCD screen
shimniok 0:a6a169de725f 8
shimniok 0:a6a169de725f 9 // This is for the Sparkfun module
shimniok 0:a6a169de725f 10 #define DISPLAY_CLEAR 0x01
shimniok 0:a6a169de725f 11 #define DISPLAY_SET_POS 0x08
shimniok 0:a6a169de725f 12
shimniok 0:a6a169de725f 13 Display::Display(void):
shimniok 0:a6a169de725f 14 lcd(p17, p18, SD_FW),
shimniok 0:a6a169de725f 15 v(1, 20, 35, 20, 'V'),
shimniok 0:a6a169de725f 16 //a(11, 40, 15, 'A'),
shimniok 0:a6a169de725f 17 g1(22, 20, 35, 20, 'G'),
shimniok 0:a6a169de725f 18 g2(43, 20, 35, 20, 'H')
shimniok 0:a6a169de725f 19 {
shimniok 0:a6a169de725f 20 // nothin to do
shimniok 0:a6a169de725f 21 }
shimniok 0:a6a169de725f 22
shimniok 0:a6a169de725f 23 void Display::init()
shimniok 0:a6a169de725f 24 {
shimniok 0:a6a169de725f 25 lcd.baud(115200);
shimniok 20:1c2067937065 26 lcd.puts("test\n"); // hopefully force 115200 on powerup
shimniok 0:a6a169de725f 27 lcd.clear();
shimniok 0:a6a169de725f 28 wait(0.3);
shimniok 0:a6a169de725f 29 }
shimniok 0:a6a169de725f 30
shimniok 0:a6a169de725f 31 void Display::status(const char *st)
shimniok 0:a6a169de725f 32 {
shimniok 20:1c2067937065 33 int pad;
shimniok 20:1c2067937065 34 char *s = (char *) st;
shimniok 20:1c2067937065 35 for (pad=20; pad > 0; pad--) {
shimniok 20:1c2067937065 36 if (*s++ == '\0') break;
shimniok 20:1c2067937065 37 }
shimniok 0:a6a169de725f 38 lcd.pos(0,1);
shimniok 20:1c2067937065 39 lcd.puts(st);
shimniok 20:1c2067937065 40 while (pad--) {
shimniok 20:1c2067937065 41 lcd.puts(" ");
shimniok 20:1c2067937065 42 }
shimniok 0:a6a169de725f 43 }
shimniok 0:a6a169de725f 44
shimniok 0:a6a169de725f 45 void Display::menu(const char *itemName)
shimniok 0:a6a169de725f 46 {
shimniok 20:1c2067937065 47 int pad;
shimniok 20:1c2067937065 48 char *s = (char *) itemName;
shimniok 20:1c2067937065 49 for (pad=20; pad > 0; pad--) {
shimniok 20:1c2067937065 50 if (*s++ == '\0') break;
shimniok 20:1c2067937065 51 }
shimniok 0:a6a169de725f 52 lcd.pos(0,0);
shimniok 20:1c2067937065 53 lcd.puts("< ");
shimniok 20:1c2067937065 54 lcd.puts(itemName);
shimniok 20:1c2067937065 55 lcd.puts(" >");
shimniok 20:1c2067937065 56 pad -= 4; // account for "< " and " >"
shimniok 20:1c2067937065 57 while (pad--) {
shimniok 20:1c2067937065 58 lcd.puts(" ");
shimniok 20:1c2067937065 59 }
shimniok 0:a6a169de725f 60 }
shimniok 0:a6a169de725f 61
shimniok 0:a6a169de725f 62 void Display::select(const char *itemName)
shimniok 0:a6a169de725f 63 {
shimniok 0:a6a169de725f 64 lcd.pos(0,0);
shimniok 20:1c2067937065 65 lcd.puts(">>");
shimniok 20:1c2067937065 66 lcd.puts(itemName);
shimniok 0:a6a169de725f 67 }
shimniok 0:a6a169de725f 68
shimniok 0:a6a169de725f 69 // display gauge at a given position (slot) along the bottom
shimniok 0:a6a169de725f 70 void Display::gauge(int slot)
shimniok 0:a6a169de725f 71 {
shimniok 0:a6a169de725f 72 }
shimniok 0:a6a169de725f 73
shimniok 20:1c2067937065 74 #define WIDTH 22
shimniok 0:a6a169de725f 75
shimniok 20:1c2067937065 76 void Display::update(SystemState *state) {
shimniok 20:1c2067937065 77 if (state) {
shimniok 20:1c2067937065 78 // TODO 2 fix padding/overwrite
shimniok 20:1c2067937065 79 lcd.pos(0,3);
shimniok 20:1c2067937065 80 lcd.puts("V:");
shimniok 20:1c2067937065 81 lcd.puts(cvftos(state->voltage, 1));
shimniok 20:1c2067937065 82 lcd.puts(" G:");
shimniok 20:1c2067937065 83 lcd.puts(cvftos(state->gpsHDOP, 1));
shimniok 20:1c2067937065 84 lcd.puts(" ");
shimniok 20:1c2067937065 85 lcd.puts(cvitos(state->gpsSats));
shimniok 20:1c2067937065 86
shimniok 20:1c2067937065 87 lcd.pos(0,4);
shimniok 20:1c2067937065 88 lcd.puts("H:");
shimniok 20:1c2067937065 89 lcd.puts(cvftos(state->estHeading, 1));
shimniok 20:1c2067937065 90 lcd.puts(" B:");
shimniok 20:1c2067937065 91 lcd.puts(cvftos(state->bearing, 1));
shimniok 20:1c2067937065 92 lcd.puts(" ");
shimniok 20:1c2067937065 93 lcd.puts(cvftos(state->LABrg, 1));
shimniok 20:1c2067937065 94 }
shimniok 0:a6a169de725f 95 }
shimniok 0:a6a169de725f 96
shimniok 20:1c2067937065 97 void Display::redraw() { // TODO 3 rename
shimniok 0:a6a169de725f 98 }
shimniok 0:a6a169de725f 99
shimniok 0:a6a169de725f 100
shimniok 20:1c2067937065 101