Code for autonomous ground vehicle, Data Bus, 3rd place winner in 2012 Sparkfun AVC.
Dependencies: Watchdog mbed Schedule SimpleFilter LSM303DLM PinDetect DebounceIn Servo
Diff: UI/SerialGraphicLCD/SerialGraphicLCD.cpp
- Revision:
- 0:826c6171fc1b
diff -r 000000000000 -r 826c6171fc1b UI/SerialGraphicLCD/SerialGraphicLCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UI/SerialGraphicLCD/SerialGraphicLCD.cpp Wed Jun 20 14:57:48 2012 +0000 @@ -0,0 +1,157 @@ +#include "SerialGraphicLCD.h" + +#define XSIZE 6 +#define YSIZE 9 + +SerialGraphicLCD::SerialGraphicLCD(PinName tx, PinName rx): + Serial(tx, rx), _firmware(SFE_FW) +{ + baud(115200); // default baud rate + resolution(LCD_128x64); // default resolution +} + +SerialGraphicLCD::SerialGraphicLCD(PinName tx, PinName rx, int firmware): + Serial(tx, rx), _firmware(firmware) +{ + baud(115200); // default baud rate + resolution(LCD_128x64); // default resolution +} + +void SerialGraphicLCD::clear() { + putc(0x7c); + putc(0x00); +} + +void SerialGraphicLCD::pos(int col, int row) { + if (_firmware == SD_FW) + posXY(XSIZE*col, (YSIZE*row)); + else if (_firmware == SFE_FW) + posXY(XSIZE*col, _yMax-(YSIZE*row)-1); +} + +void SerialGraphicLCD::posXY(int x, int y) { + putc(0x7c); + putc(0x18); + putc(x); + putc(0x7c); + putc(0x19); + putc(y); +} + +void SerialGraphicLCD::pixel(int x, int y, bool set) { + putc(0x7c); + putc(0x10); + putc(x); + putc(y); + putc((set) ? 0x01 : 0x00); +} + +void SerialGraphicLCD::line(int x1, int y1, int x2, int y2, bool set) { + putc(0x7c); + putc(0x0c); + putc(x1); + putc(y1); + putc(x2); + putc(y2); + putc((set) ? 0x01 : 0x00); +} + +void SerialGraphicLCD::circle(int x, int y, int r, bool set) { + putc(0x7c); + putc(0x03); + putc(x); + putc(y); + putc(r); + putc((set) ? 0x01 : 0x00); +} + +// Unfortunately, the datasheet for the stock firmware is incorrect; +// the box command does not take a 5th parameter for draw/erase like the others +// However, it does in the sd firmware +void SerialGraphicLCD::rect(int x1, int y1, int x2, int y2) { + putc(0x7c); + putc(0x0f); + putc(x1); + putc(y1); + putc(x2); + putc(y2); + if (_firmware == SD_FW) + putc(0x01); +} + +void SerialGraphicLCD::rect(int x1, int y1, int x2, int y2, bool set) { + putc(0x7c); + putc(0x0f); + putc(x1); + putc(y1); + putc(x2); + putc(y2); + if (_firmware == SD_FW) + putc((set) ? 0x01 : 0x00); +} + +void SerialGraphicLCD::rectFill(int x1, int y1, int x2, int y2, char fillByte) { + if (_firmware == SD_FW) { + + // Bugs in firmware; if y2-y1 == 2, nothing drawn; if y2-y1 == 3, fill is 4 tall +// if ((y2 - y1) > 3) { + putc(0x7c); + putc(0x12); + putc(x1); + putc(y1); + putc(x2+1); // bug in firmware, off-by-one on x2 + putc(y2); + putc(fillByte); +// } else { +// for (int y=y1; y <= y2; y++) +// line(x1, y, x2, y, fillByte == FILL); +// } + } +} + +void SerialGraphicLCD::erase(int x1, int y1, int x2, int y2) { + putc(0x7c); + putc(0x05); + putc(x1); + putc(y1); + putc(x2); + putc(y2); +} + +void SerialGraphicLCD::backlight(int i) { + if (i >= 0 && i <= 100) { + putc(0x7c); + putc(0x02); + putc(i); + } +} + +void SerialGraphicLCD::reverseMode() { + putc(0x7c); + putc(0x12); +} + +void SerialGraphicLCD::resolution(int type) { + switch (type) { + case LCD_128x64 : + resolution(128, 64); + break; + case LCD_160x128 : + resolution(160, 128); + break; + } +} + +void SerialGraphicLCD::resolution(int x, int y) { + _xMax = x; + _yMax = y; +} + + +void SerialGraphicLCD::lcdbaud(int b) { + if (b > 0 && b < 7) { + putc(0x7c); + putc(0x07); + putc(b+'0'); + } +}