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
UI/Display/Display.cpp@25:bb5356402687, 2018-11-30 (annotated)
- 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?
User | Revision | Line number | New 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 |