diff --git a/libraries/Robot_Control/Arduino_LCD.cpp b/libraries/Robot_Control/Arduino_LCD.cpp index db28cd042..3f6aeb863 100644 --- a/libraries/Robot_Control/Arduino_LCD.cpp +++ b/libraries/Robot_Control/Arduino_LCD.cpp @@ -25,8 +25,9 @@ // Constructor when using software SPI. All output pins are configurable. -Arduino_LCD::Arduino_LCD(uint8_t cs, uint8_t rs, uint8_t sid, - uint8_t sclk, uint8_t rst) { +Arduino_LCD::Arduino_LCD(uint8_t cs, uint8_t rs, uint8_t sid, uint8_t sclk, + uint8_t rst) : Adafruit_GFX(ILI9163C_TFTWIDTH, ILI9163C_TFTHEIGHT) +{ _cs = cs; _rs = rs; _sid = sid; @@ -38,7 +39,8 @@ Arduino_LCD::Arduino_LCD(uint8_t cs, uint8_t rs, uint8_t sid, // Constructor when using hardware SPI. Faster, but must use SPI pins // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.) -Arduino_LCD::Arduino_LCD(uint8_t cs, uint8_t rs, uint8_t rst) { +Arduino_LCD::Arduino_LCD(uint8_t cs, uint8_t rs, uint8_t rst) : + Adafruit_GFX(ILI9163C_TFTWIDTH, ILI9163C_TFTHEIGHT) { _cs = cs; _rs = rs; _rst = rst; @@ -325,8 +327,7 @@ void Arduino_LCD::commandList(uint8_t *addr) { //void Arduino_LCD::commonInit(prog_uchar *cmdList) { void Arduino_LCD::commonInit(uint8_t *cmdList) { - constructor(ILI9163C_TFTWIDTH, ILI9163C_TFTHEIGHT); - colstart = rowstart = 0; // May be overridden in init func + colstart = rowstart = 0; // May be overridden in init func pinMode(_rs, OUTPUT); pinMode(_cs, OUTPUT); diff --git a/libraries/Robot_Control/Arduino_LCD.h b/libraries/Robot_Control/Arduino_LCD.h index a5181332c..954251e30 100644 --- a/libraries/Robot_Control/Arduino_LCD.h +++ b/libraries/Robot_Control/Arduino_LCD.h @@ -25,7 +25,7 @@ #else #include "WProgram.h" #endif -#include "Adafruit_GFX.h" +#include "utility/Adafruit_GFX.h" //#include // some flags for initR() :( diff --git a/libraries/Robot_Control/Adafruit_GFX.cpp b/libraries/Robot_Control/utility/Adafruit_GFX.cpp similarity index 78% rename from libraries/Robot_Control/Adafruit_GFX.cpp rename to libraries/Robot_Control/utility/Adafruit_GFX.cpp index acfed1ddb..7d3a5bc29 100644 --- a/libraries/Robot_Control/Adafruit_GFX.cpp +++ b/libraries/Robot_Control/utility/Adafruit_GFX.cpp @@ -1,53 +1,69 @@ -/****************************************************************** - This is the core graphics library for all our displays, providing - basic graphics primitives (points, lines, circles, etc.). It needs - to be paired with a hardware-specific library for each display - device we carry (handling the lower-level functions). - - Adafruit invests time and resources providing this open - source code, please support Adafruit and open-source hardware - by purchasing products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - BSD license, check license.txt for more information. - All text above must be included in any redistribution. - ******************************************************************/ +/* +This is the core graphics library for all our displays, providing a common +set of graphics primitives (points, lines, circles, etc.). It needs to be +paired with a hardware-specific library for each display device we carry +(to handle the lower-level functions). + +Adafruit invests time and resources providing this open source code, please +support Adafruit & open-source hardware by purchasing products from Adafruit! + +Copyright (c) 2013 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ #include "Adafruit_GFX.h" #include "glcdfont.c" -#include +#ifdef __AVR__ + #include +#else + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif -void Adafruit_GFX::constructor(int16_t w, int16_t h) { - _width = WIDTH = w; - _height = HEIGHT = h; - - rotation = 0; - cursor_y = cursor_x = 0; - textsize = 1; +Adafruit_GFX::Adafruit_GFX(int16_t w, int16_t h): + WIDTH(w), HEIGHT(h) +{ + _width = WIDTH; + _height = HEIGHT; + rotation = 0; + cursor_y = cursor_x = 0; + textsize = 1; textcolor = textbgcolor = 0xFFFF; - wrap = true; - - strokeColor = 0; - useStroke = true; - fillColor = 0; - useFill = false; - + wrap = true; } - -// draw a circle outline -void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, - uint16_t color) { +// Draw a circle outline +void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) { int16_t f = 1 - r; int16_t ddF_x = 1; int16_t ddF_y = -2 * r; int16_t x = 0; int16_t y = r; - drawPixel(x0, y0+r, color); - drawPixel(x0, y0-r, color); - drawPixel(x0+r, y0, color); - drawPixel(x0-r, y0, color); + drawPixel(x0 , y0+r, color); + drawPixel(x0 , y0-r, color); + drawPixel(x0+r, y0 , color); + drawPixel(x0-r, y0 , color); while (x= 0) { @@ -67,7 +83,6 @@ void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, drawPixel(x0 - y, y0 + x, color); drawPixel(x0 + y, y0 - x, color); drawPixel(x0 - y, y0 - x, color); - } } @@ -107,15 +122,15 @@ void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0, } } -void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, +void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) { drawFastVLine(x0, y0-r, 2*r+1, color); fillCircleHelper(x0, y0, r, 3, 0, color); } -// used to do circles and roundrects! +// Used to do circles and roundrects void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, - uint8_t cornername, int16_t delta, uint16_t color) { + uint8_t cornername, int16_t delta, uint16_t color) { int16_t f = 1 - r; int16_t ddF_x = 1; @@ -144,9 +159,9 @@ void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, } } -// bresenham's algorithm - thx wikpedia -void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, - int16_t x1, int16_t y1, +// Bresenham's algorithm - thx wikpedia +void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, + int16_t x1, int16_t y1, uint16_t color) { int16_t steep = abs(y1 - y0) > abs(x1 - x0); if (steep) { @@ -186,10 +201,9 @@ void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, } } - -// draw a rectangle -void Adafruit_GFX::drawRect(int16_t x, int16_t y, - int16_t w, int16_t h, +// Draw a rectangle +void Adafruit_GFX::drawRect(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color) { drawFastHLine(x, y, w, color); drawFastHLine(x, y+h-1, w, color); @@ -197,40 +211,38 @@ void Adafruit_GFX::drawRect(int16_t x, int16_t y, drawFastVLine(x+w-1, y, h, color); } -void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, +void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { - // stupidest version - update in subclasses if desired! + // Update in subclasses if desired! drawLine(x, y, x, y+h-1, color); } - -void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, +void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { - // stupidest version - update in subclasses if desired! + // Update in subclasses if desired! drawLine(x, y, x+w-1, y, color); } -void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, +void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { - // stupidest version - update in subclasses if desired! + // Update in subclasses if desired! for (int16_t i=x; i= 100 size_t Adafruit_GFX::write(uint8_t c) { #else @@ -359,7 +370,7 @@ void Adafruit_GFX::write(uint8_t c) { #endif if (c == '\n') { cursor_y += textsize*8; - cursor_x = 0; + cursor_x = 0; } else if (c == '\r') { // skip em } else { @@ -375,13 +386,13 @@ void Adafruit_GFX::write(uint8_t c) { #endif } -// draw a character +// Draw a character void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) { if((x >= _width) || // Clip right (y >= _height) || // Clip bottom - ((x + 5 * size - 1) < 0) || // Clip left + ((x + 6 * size - 1) < 0) || // Clip left ((y + 8 * size - 1) < 0)) // Clip top return; @@ -403,7 +414,7 @@ void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, drawPixel(x+i, y+j, bg); else { // big size fillRect(x+i*size, y+j*size, size, size, bg); - } + } } line >>= 1; } @@ -415,71 +426,62 @@ void Adafruit_GFX::setCursor(int16_t x, int16_t y) { cursor_y = y; } - void Adafruit_GFX::setTextSize(uint8_t s) { textsize = (s > 0) ? s : 1; } - void Adafruit_GFX::setTextColor(uint16_t c) { - textcolor = c; - textbgcolor = c; - // for 'transparent' background, we'll set the bg + // For 'transparent' background, we'll set the bg // to the same as fg instead of using a flag + textcolor = textbgcolor = c; } - void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) { - textcolor = c; - textbgcolor = b; - } +void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) { + textcolor = c; + textbgcolor = b; +} void Adafruit_GFX::setTextWrap(boolean w) { wrap = w; } uint8_t Adafruit_GFX::getRotation(void) { - rotation %= 4; return rotation; } void Adafruit_GFX::setRotation(uint8_t x) { - x %= 4; // cant be higher than 3 - rotation = x; - switch (x) { - case 0: - case 2: - _width = WIDTH; + rotation = (x & 3); + switch(rotation) { + case 0: + case 2: + _width = WIDTH; _height = HEIGHT; break; - case 1: - case 3: - _width = HEIGHT; + case 1: + case 3: + _width = HEIGHT; _height = WIDTH; break; } } -void Adafruit_GFX::invertDisplay(boolean i) { - // do nothing, can be subclassed -} - - -// return the size of the display which depends on the rotation! -int16_t Adafruit_GFX::width(void) { - return _width; +// Return the size of the display (per current rotation) +int16_t Adafruit_GFX::width(void) { + return _width; } -int16_t Adafruit_GFX::height(void) { - return _height; +int16_t Adafruit_GFX::height(void) { + return _height; } - +void Adafruit_GFX::invertDisplay(boolean i) { + // Do nothing, must be subclassed if supported +} uint16_t Adafruit_GFX::newColor(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); } - void Adafruit_GFX::background(uint8_t red, uint8_t green, uint8_t blue) { background(newColor(red, green, blue)); } diff --git a/libraries/Robot_Control/Adafruit_GFX.h b/libraries/Robot_Control/utility/Adafruit_GFX.h similarity index 58% rename from libraries/Robot_Control/Adafruit_GFX.h rename to libraries/Robot_Control/utility/Adafruit_GFX.h index 1f6b8d827..5cbc9d73d 100644 --- a/libraries/Robot_Control/Adafruit_GFX.h +++ b/libraries/Robot_Control/utility/Adafruit_GFX.h @@ -41,61 +41,59 @@ typedef uint16_t color; class Adafruit_GFX : public Print { public: - //Adafruit_GFX(); - // i have no idea why we have to formally call the constructor. kinda sux - void constructor(int16_t w, int16_t h); + Adafruit_GFX(int16_t w, int16_t h); // Constructor - // this must be defined by the subclass - virtual void drawPixel(int16_t x, int16_t y, uint16_t color); - virtual void invertDisplay(boolean i); + // This MUST be defined by the subclass: + virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; - // these are 'generic' drawing functions, so we can share them! - virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, - uint16_t color); - virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); - virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); - virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color); - virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color); - virtual void fillScreen(uint16_t color); + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + virtual void + drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color), + drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), + drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), + drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), + fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), + fillScreen(uint16_t color), + invertDisplay(boolean i); - void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); - void drawCircleHelper(int16_t x0, int16_t y0, - int16_t r, uint8_t cornername, uint16_t color); - void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); - void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, - uint8_t cornername, int16_t delta, uint16_t color); + // These exist only with Adafruit_GFX (no subclass overrides) + void + drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + uint16_t color), + fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, + int16_t delta, uint16_t color), + drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, + int16_t w, int16_t h, uint16_t color), + drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, + uint16_t bg, uint8_t size), + setCursor(int16_t x, int16_t y), + setTextColor(uint16_t c), + setTextColor(uint16_t c, uint16_t bg), + setTextSize(uint8_t s), + setTextWrap(boolean w), + setRotation(uint8_t r); - void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, - int16_t x2, int16_t y2, uint16_t color); - void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, - int16_t x2, int16_t y2, uint16_t color); - void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, - int16_t radius, uint16_t color); - void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, - int16_t radius, uint16_t color); - - void drawBitmap(int16_t x, int16_t y, - const uint8_t *bitmap, int16_t w, int16_t h, - uint16_t color); - void drawChar(int16_t x, int16_t y, unsigned char c, - uint16_t color, uint16_t bg, uint8_t size); #if ARDUINO >= 100 virtual size_t write(uint8_t); #else virtual void write(uint8_t); #endif - void setCursor(int16_t x, int16_t y); - void setTextColor(uint16_t c); - void setTextColor(uint16_t c, uint16_t bg); - void setTextSize(uint8_t s); - void setTextWrap(boolean w); - int16_t height(void); - int16_t width(void); + int16_t + height(void), + width(void); - void setRotation(uint8_t r); uint8_t getRotation(void); @@ -166,14 +164,19 @@ class Adafruit_GFX : public Print { // void image(PImage & img, uint16_t x, uint16_t y); protected: - int16_t WIDTH, HEIGHT; // this is the 'raw' display w/h - never changes - int16_t _width, _height; // dependent on rotation - int16_t cursor_x, cursor_y; - uint16_t textcolor, textbgcolor; - uint8_t textsize; - uint8_t rotation; - boolean wrap; // If set, 'wrap' text at right edge of display - + const int16_t + WIDTH, HEIGHT; // This is the 'raw' display w/h - never changes + int16_t + _width, _height, // Display w/h as modified by current rotation + cursor_x, cursor_y; + uint16_t + textcolor, textbgcolor; + uint8_t + textsize, + rotation; + boolean + wrap; // If set, 'wrap' text at right edge of display + /* * Processing-style graphics state */ @@ -184,7 +187,4 @@ class Adafruit_GFX : public Print { bool useFill; }; - - - -#endif +#endif // _ADAFRUIT_GFX_H