Library for Modtronix im4OLED board with 128x64 OLED and 4 buttons. For details, see product page http://modtronix.com/im4oled.html. Is a clone of Adafruit_GFX library, with some additional code added.

Fork of Adafruit_GFX by Neal Horman

Committer:
modtronix-com
Date:
Wed Oct 21 14:49:56 2015 +1100
Revision:
23:44309099c532
Parent:
22:f63aeb3769b5
Child:
26:ef08580c35df
Changed defines and added dependency for modtronix_config.h file.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
modtronix-com 22:f63aeb3769b5 1 /*********************************************************************
modtronix-com 22:f63aeb3769b5 2 This is a library for our Monochrome OLEDs based on SSD1306 drivers
modtronix-com 22:f63aeb3769b5 3
modtronix-com 22:f63aeb3769b5 4 Pick one up today in the adafruit shop!
modtronix-com 22:f63aeb3769b5 5 ------> http://www.adafruit.com/category/63_98
modtronix-com 22:f63aeb3769b5 6
modtronix-com 22:f63aeb3769b5 7 These displays use SPI to communicate, 4 or 5 pins are required to
modtronix-com 22:f63aeb3769b5 8 interface
modtronix-com 22:f63aeb3769b5 9
modtronix-com 22:f63aeb3769b5 10 Adafruit invests time and resources providing this open source code,
modtronix-com 22:f63aeb3769b5 11 please support Adafruit and open-source hardware by purchasing
modtronix-com 22:f63aeb3769b5 12 products from Adafruit!
modtronix-com 22:f63aeb3769b5 13
modtronix-com 22:f63aeb3769b5 14 Written by Limor Fried/Ladyada for Adafruit Industries.
modtronix-com 22:f63aeb3769b5 15 BSD license, check license.txt for more information
modtronix-com 22:f63aeb3769b5 16 All text above, and the splash screen must be included in any redistribution
modtronix-com 22:f63aeb3769b5 17 *********************************************************************/
modtronix-com 22:f63aeb3769b5 18
modtronix-com 22:f63aeb3769b5 19 /*
modtronix-com 22:f63aeb3769b5 20 * Modified by Neal Horman 7/14/2012 for use in mbed
modtronix-com 22:f63aeb3769b5 21 */
modtronix-com 22:f63aeb3769b5 22
modtronix-com 22:f63aeb3769b5 23 #ifndef _ADAFRUIT_SSD1306_H_
modtronix-com 22:f63aeb3769b5 24 #define _ADAFRUIT_SSD1306_H_
modtronix-com 22:f63aeb3769b5 25
modtronix-com 22:f63aeb3769b5 26 #include "mbed.h"
modtronix-com 22:f63aeb3769b5 27 #include "mx_gfx.h"
modtronix-com 22:f63aeb3769b5 28
modtronix-com 23:44309099c532 29 #if (OLED_USE_VECTOR==1)
modtronix-com 22:f63aeb3769b5 30 #include <vector>
modtronix-com 22:f63aeb3769b5 31 #endif
modtronix-com 22:f63aeb3769b5 32 #include <algorithm>
modtronix-com 22:f63aeb3769b5 33
modtronix-com 22:f63aeb3769b5 34 #define OLED_HAS_RESET 0
modtronix-com 22:f63aeb3769b5 35
modtronix-com 22:f63aeb3769b5 36 // A DigitalOut sub-class that provides a constructed default state
modtronix-com 22:f63aeb3769b5 37 class DigitalOut2 : public DigitalOut
modtronix-com 22:f63aeb3769b5 38 {
modtronix-com 22:f63aeb3769b5 39 public:
modtronix-com 22:f63aeb3769b5 40 DigitalOut2(PinName pin, bool active = false) : DigitalOut(pin) { write(active); };
modtronix-com 22:f63aeb3769b5 41 DigitalOut2& operator= (int value) { write(value); return *this; };
modtronix-com 22:f63aeb3769b5 42 DigitalOut2& operator= (DigitalOut2& rhs) { write(rhs.read()); return *this; };
modtronix-com 22:f63aeb3769b5 43 operator int() { return read(); };
modtronix-com 22:f63aeb3769b5 44 };
modtronix-com 22:f63aeb3769b5 45
modtronix-com 22:f63aeb3769b5 46 #define SSD1306_EXTERNALVCC 0x1
modtronix-com 22:f63aeb3769b5 47 #define SSD1306_SWITCHCAPVCC 0x2
modtronix-com 22:f63aeb3769b5 48
modtronix-com 22:f63aeb3769b5 49 /** The pure base class for the SSD1306 display driver.
modtronix-com 22:f63aeb3769b5 50 *
modtronix-com 22:f63aeb3769b5 51 * You should derive from this for a new transport interface type,
modtronix-com 22:f63aeb3769b5 52 * such as the SPI and I2C drivers.
modtronix-com 22:f63aeb3769b5 53 */
modtronix-com 22:f63aeb3769b5 54 class MxSSD1306 : public MxGfx
modtronix-com 22:f63aeb3769b5 55 {
modtronix-com 22:f63aeb3769b5 56 public:
modtronix-com 22:f63aeb3769b5 57 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 58 MxSSD1306(PinName RST, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 59 : MxGfx(rawWidth,rawHeight)
modtronix-com 22:f63aeb3769b5 60 , colBlock(0)
modtronix-com 22:f63aeb3769b5 61 , rowBlock(0)
modtronix-com 22:f63aeb3769b5 62 , rst(RST,false)
modtronix-com 22:f63aeb3769b5 63 #else
modtronix-com 22:f63aeb3769b5 64 MxSSD1306(uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 65 : MxGfx(rawWidth,rawHeight)
modtronix-com 22:f63aeb3769b5 66 , colBlock(0)
modtronix-com 22:f63aeb3769b5 67 , rowBlock(0)
modtronix-com 22:f63aeb3769b5 68 #endif
modtronix-com 22:f63aeb3769b5 69 {
modtronix-com 22:f63aeb3769b5 70 //Initialize as all dirty
modtronix-com 22:f63aeb3769b5 71 memset(&dirty[0], 0xff, sizeof(dirty));
modtronix-com 22:f63aeb3769b5 72
modtronix-com 23:44309099c532 73 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 74 memset(&buffer[0], 0, sizeof(buffer));
modtronix-com 22:f63aeb3769b5 75 #else
modtronix-com 22:f63aeb3769b5 76 buffer.resize(rawHeight * rawWidth / 8);
modtronix-com 22:f63aeb3769b5 77 #endif
modtronix-com 22:f63aeb3769b5 78 };
modtronix-com 22:f63aeb3769b5 79
modtronix-com 22:f63aeb3769b5 80 /** Initialize
modtronix-com 22:f63aeb3769b5 81 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 82 */
modtronix-com 22:f63aeb3769b5 83 uint8_t begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC);
modtronix-com 22:f63aeb3769b5 84
modtronix-com 22:f63aeb3769b5 85 // These must be implemented in the derived transport driver
modtronix-com 22:f63aeb3769b5 86 virtual uint8_t command(uint8_t c) = 0;
modtronix-com 22:f63aeb3769b5 87 virtual uint8_t data(uint8_t c) = 0;
modtronix-com 22:f63aeb3769b5 88 virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
modtronix-com 22:f63aeb3769b5 89
modtronix-com 22:f63aeb3769b5 90 /**
modtronix-com 22:f63aeb3769b5 91 * Clear the display buffer. Requires a display() call at some point afterwards.
modtronix-com 22:f63aeb3769b5 92 * NOTE that this function will make the WHOLE display as dirty! The next display() call will update the
modtronix-com 22:f63aeb3769b5 93 * entire display! This can be prevented by just clearing the required part of the display using fillRect()!
modtronix-com 22:f63aeb3769b5 94 */
modtronix-com 22:f63aeb3769b5 95 void clearDisplay(void);
modtronix-com 22:f63aeb3769b5 96
modtronix-com 22:f63aeb3769b5 97 /** Set display contrast
modtronix-com 22:f63aeb3769b5 98 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 99 */
modtronix-com 22:f63aeb3769b5 100 virtual uint8_t setContrast(uint8_t contrast);
modtronix-com 22:f63aeb3769b5 101
modtronix-com 22:f63aeb3769b5 102 /** Turn display on or off
modtronix-com 22:f63aeb3769b5 103 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 104 */
modtronix-com 22:f63aeb3769b5 105 virtual uint8_t displayOn(bool on);
modtronix-com 22:f63aeb3769b5 106
modtronix-com 22:f63aeb3769b5 107 /** Invert Display
modtronix-com 22:f63aeb3769b5 108 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 109 */
modtronix-com 22:f63aeb3769b5 110 virtual uint8_t invertDisplay(bool i);
modtronix-com 22:f63aeb3769b5 111
modtronix-com 22:f63aeb3769b5 112 /** Cause the display to be updated with the buffer content.
modtronix-com 22:f63aeb3769b5 113 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 114 */
modtronix-com 22:f63aeb3769b5 115 uint8_t display();
modtronix-com 22:f63aeb3769b5 116
modtronix-com 22:f63aeb3769b5 117 // Fill the buffer with the AdaFruit splash screen.
modtronix-com 22:f63aeb3769b5 118 virtual void splash();
modtronix-com 22:f63aeb3769b5 119
modtronix-com 22:f63aeb3769b5 120 protected:
modtronix-com 22:f63aeb3769b5 121 /** Write contents of display buffer to OLED display.
modtronix-com 22:f63aeb3769b5 122 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 123 */
modtronix-com 22:f63aeb3769b5 124 virtual uint8_t sendDisplayBuffer() = 0;
modtronix-com 22:f63aeb3769b5 125
modtronix-com 22:f63aeb3769b5 126 /** Write a block of display data. The 128x64 pixels are divided into:
modtronix-com 22:f63aeb3769b5 127 * - 8 RowBlocks, each with 8 rows. This is 1 page of the SSD1206
modtronix-com 22:f63aeb3769b5 128 * - 8 ColBlocks, each with 16 columns.
modtronix-com 22:f63aeb3769b5 129 *
modtronix-com 22:f63aeb3769b5 130 * @param rowBlock Value 0-7 indicating what block of 8 rows to write. 0=0-7,
modtronix-com 22:f63aeb3769b5 131 * 1=8-15, ...., 7=56-63
modtronix-com 22:f63aeb3769b5 132 * @param colBlock Value 0-7 indicating what block of 16 columns to write. 0=0-15,
modtronix-com 22:f63aeb3769b5 133 * 1=16-31, ...., 7=112-127
modtronix-com 22:f63aeb3769b5 134 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 135 */
modtronix-com 22:f63aeb3769b5 136 virtual uint8_t sendDisplayBuffer(uint8_t rowBlock, uint8_t colBlock) = 0;
modtronix-com 22:f63aeb3769b5 137
modtronix-com 22:f63aeb3769b5 138 public:
modtronix-com 22:f63aeb3769b5 139 // Set whole display as being dirty
modtronix-com 22:f63aeb3769b5 140 virtual void setAllDirty();
modtronix-com 22:f63aeb3769b5 141
modtronix-com 22:f63aeb3769b5 142 // Protected Data
modtronix-com 22:f63aeb3769b5 143 protected:
modtronix-com 22:f63aeb3769b5 144 uint8_t colBlock, rowBlock;
modtronix-com 22:f63aeb3769b5 145
modtronix-com 22:f63aeb3769b5 146 #if (OLED_WIDTH <= 128 )
modtronix-com 22:f63aeb3769b5 147 uint8_t dirty[OLED_HEIGHT/8]; //Each bit marks block of "8 Rows x 16 Columns". So, a single byte is enough for up to 128col. One byte for each 8 rows.
modtronix-com 22:f63aeb3769b5 148 #elif (OLED_WIDTH <= 256 )
modtronix-com 22:f63aeb3769b5 149 uint16_t dirty[OLED_HEIGHT/8]; //Each bit marks block of "8 Rows x 16 Columns". One UINT16 = 16x16 = 256 columns.
modtronix-com 22:f63aeb3769b5 150 #endif
modtronix-com 22:f63aeb3769b5 151
modtronix-com 22:f63aeb3769b5 152 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 153 DigitalOut2 rst;
modtronix-com 22:f63aeb3769b5 154 #endif
modtronix-com 22:f63aeb3769b5 155
modtronix-com 22:f63aeb3769b5 156 // the memory buffer for the LCD
modtronix-com 23:44309099c532 157 #if (OLED_USE_VECTOR==1)
modtronix-com 23:44309099c532 158 std::vector<uint8_t> buffer;
modtronix-com 22:f63aeb3769b5 159 #else
modtronix-com 23:44309099c532 160 uint8_t buffer[OLED_HEIGHT * OLED_WIDTH / 8];
modtronix-com 22:f63aeb3769b5 161 #endif
modtronix-com 22:f63aeb3769b5 162 };
modtronix-com 22:f63aeb3769b5 163
modtronix-com 22:f63aeb3769b5 164
modtronix-com 22:f63aeb3769b5 165 /** This is the SPI SSD1306 display driver transport class
modtronix-com 22:f63aeb3769b5 166 *
modtronix-com 22:f63aeb3769b5 167 */
modtronix-com 22:f63aeb3769b5 168 class MxSSD1306_SPI : public MxSSD1306
modtronix-com 22:f63aeb3769b5 169 {
modtronix-com 22:f63aeb3769b5 170 public:
modtronix-com 22:f63aeb3769b5 171 /** Create a SSD1306 SPI transport display driver instance with the specified DC, RST, and CS pins, as well as the display dimentions
modtronix-com 22:f63aeb3769b5 172 *
modtronix-com 22:f63aeb3769b5 173 * Required parameters
modtronix-com 22:f63aeb3769b5 174 * @param spi - a reference to an initialized SPI object
modtronix-com 22:f63aeb3769b5 175 * @param DC (Data/Command) pin name
modtronix-com 22:f63aeb3769b5 176 * @param RST (Reset) pin name
modtronix-com 22:f63aeb3769b5 177 * @param CS (Chip Select) pin name
modtronix-com 22:f63aeb3769b5 178 *
modtronix-com 22:f63aeb3769b5 179 * Optional parameters
modtronix-com 22:f63aeb3769b5 180 * @param rawHeight - the vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 181 * @param rawWidth - the horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 182 */
modtronix-com 22:f63aeb3769b5 183 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 184 MxSSD1306_SPI(SPI &spi, PinName DC, PinName RST, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 185 : MxSSD1306(RST, rawHieght, rawWidth)
modtronix-com 22:f63aeb3769b5 186 #else
modtronix-com 22:f63aeb3769b5 187 MxSSD1306_SPI(SPI &spi, PinName DC, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 188 : MxSSD1306(rawHieght, rawWidth)
modtronix-com 22:f63aeb3769b5 189 #endif
modtronix-com 22:f63aeb3769b5 190 , cs(CS,true)
modtronix-com 22:f63aeb3769b5 191 , dc(DC,false)
modtronix-com 22:f63aeb3769b5 192 , mspi(spi)
modtronix-com 22:f63aeb3769b5 193 {
modtronix-com 22:f63aeb3769b5 194 begin();
modtronix-com 22:f63aeb3769b5 195 splash();
modtronix-com 22:f63aeb3769b5 196 display();
modtronix-com 22:f63aeb3769b5 197 };
modtronix-com 22:f63aeb3769b5 198
modtronix-com 22:f63aeb3769b5 199 /** Send command via SPI
modtronix-com 22:f63aeb3769b5 200 * @param c The command to send
modtronix-com 22:f63aeb3769b5 201 * @return 0 if success, else SPI error
modtronix-com 22:f63aeb3769b5 202 */
modtronix-com 22:f63aeb3769b5 203 virtual uint8_t command(uint8_t c)
modtronix-com 22:f63aeb3769b5 204 {
modtronix-com 22:f63aeb3769b5 205 cs = 1;
modtronix-com 22:f63aeb3769b5 206 dc = 0;
modtronix-com 22:f63aeb3769b5 207 cs = 0;
modtronix-com 22:f63aeb3769b5 208 mspi.write(c);
modtronix-com 22:f63aeb3769b5 209 cs = 1;
modtronix-com 22:f63aeb3769b5 210 return 0;
modtronix-com 22:f63aeb3769b5 211 };
modtronix-com 22:f63aeb3769b5 212
modtronix-com 22:f63aeb3769b5 213 /** Send Data via SPI
modtronix-com 22:f63aeb3769b5 214 * @param c The data to send
modtronix-com 22:f63aeb3769b5 215 * @return 0 if success, else SPI error
modtronix-com 22:f63aeb3769b5 216 */
modtronix-com 22:f63aeb3769b5 217 virtual uint8_t data(uint8_t c)
modtronix-com 22:f63aeb3769b5 218 {
modtronix-com 22:f63aeb3769b5 219 cs = 1;
modtronix-com 22:f63aeb3769b5 220 dc = 1;
modtronix-com 22:f63aeb3769b5 221 cs = 0;
modtronix-com 22:f63aeb3769b5 222 mspi.write(c);
modtronix-com 22:f63aeb3769b5 223 cs = 1;
modtronix-com 22:f63aeb3769b5 224 return 0;
modtronix-com 22:f63aeb3769b5 225 };
modtronix-com 22:f63aeb3769b5 226
modtronix-com 22:f63aeb3769b5 227 protected:
modtronix-com 22:f63aeb3769b5 228 virtual uint8_t sendDisplayBuffer()
modtronix-com 22:f63aeb3769b5 229 {
modtronix-com 22:f63aeb3769b5 230 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 231 cs = 1;
modtronix-com 22:f63aeb3769b5 232 dc = 1;
modtronix-com 22:f63aeb3769b5 233 cs = 0;
modtronix-com 22:f63aeb3769b5 234
modtronix-com 23:44309099c532 235 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 236 for(uint16_t i=0, q=sizeof(buffer); i<q; i++) {
modtronix-com 22:f63aeb3769b5 237 #else
modtronix-com 22:f63aeb3769b5 238 for(uint16_t i=0, q=buffer.size(); i<q; i++) {
modtronix-com 22:f63aeb3769b5 239 #endif
modtronix-com 22:f63aeb3769b5 240 if((retVal=mspi.write(buffer[i])) != 0) {
modtronix-com 22:f63aeb3769b5 241 cs = 1;
modtronix-com 22:f63aeb3769b5 242 return retVal;
modtronix-com 22:f63aeb3769b5 243 }
modtronix-com 22:f63aeb3769b5 244 }
modtronix-com 22:f63aeb3769b5 245
modtronix-com 22:f63aeb3769b5 246 if(height() == 32)
modtronix-com 22:f63aeb3769b5 247 {
modtronix-com 23:44309099c532 248 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 249 for(uint16_t i=0, q=sizeof(buffer); i<q; i++) {
modtronix-com 22:f63aeb3769b5 250 #else
modtronix-com 22:f63aeb3769b5 251 for(uint16_t i=0, q=buffer.size(); i<q; i++) {
modtronix-com 22:f63aeb3769b5 252 #endif
modtronix-com 22:f63aeb3769b5 253 if((retVal=mspi.write(0)) != 0) {
modtronix-com 22:f63aeb3769b5 254 cs = 1;
modtronix-com 22:f63aeb3769b5 255 return retVal;
modtronix-com 22:f63aeb3769b5 256 }
modtronix-com 22:f63aeb3769b5 257 }
modtronix-com 22:f63aeb3769b5 258 }
modtronix-com 22:f63aeb3769b5 259
modtronix-com 22:f63aeb3769b5 260 cs = 1;
modtronix-com 22:f63aeb3769b5 261 return 0;
modtronix-com 22:f63aeb3769b5 262 };
modtronix-com 22:f63aeb3769b5 263
modtronix-com 22:f63aeb3769b5 264 DigitalOut2 cs, dc;
modtronix-com 22:f63aeb3769b5 265 SPI &mspi;
modtronix-com 22:f63aeb3769b5 266 };
modtronix-com 22:f63aeb3769b5 267
modtronix-com 22:f63aeb3769b5 268 /** This is the I2C SSD1306 display driver transport class
modtronix-com 22:f63aeb3769b5 269 *
modtronix-com 22:f63aeb3769b5 270 */
modtronix-com 22:f63aeb3769b5 271 class MxSSD1306_I2C : public MxSSD1306
modtronix-com 22:f63aeb3769b5 272 {
modtronix-com 22:f63aeb3769b5 273 public:
modtronix-com 22:f63aeb3769b5 274 #define SSD_I2C_ADDRESS 0x78
modtronix-com 22:f63aeb3769b5 275 /** Create a SSD1306 I2C transport display driver instance with the specified RST pin name, the I2C address, as well as the display dimensions
modtronix-com 22:f63aeb3769b5 276 *
modtronix-com 22:f63aeb3769b5 277 * Required parameters
modtronix-com 22:f63aeb3769b5 278 * @param i2c - A reference to an initialized I2C object
modtronix-com 22:f63aeb3769b5 279 * @param RST - The Reset pin name
modtronix-com 22:f63aeb3769b5 280 *
modtronix-com 22:f63aeb3769b5 281 * Optional parameters
modtronix-com 22:f63aeb3769b5 282 * @param i2cAddress - The i2c address of the display
modtronix-com 22:f63aeb3769b5 283 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 284 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 285 */
modtronix-com 22:f63aeb3769b5 286 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 287 Adafruit_SSD1306_I2c(I2C &i2c, PinName RST, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 288 : MxSSD1306(RST, rawHeight, rawWidth)
modtronix-com 22:f63aeb3769b5 289 #else
modtronix-com 22:f63aeb3769b5 290 MxSSD1306_I2C(I2C &i2c, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 291 : MxSSD1306(rawHeight, rawWidth)
modtronix-com 22:f63aeb3769b5 292 #endif
modtronix-com 22:f63aeb3769b5 293 , mi2c(i2c)
modtronix-com 22:f63aeb3769b5 294 , mi2cAddress(i2cAddress)
modtronix-com 22:f63aeb3769b5 295 {
modtronix-com 22:f63aeb3769b5 296 begin();
modtronix-com 22:f63aeb3769b5 297 splash();
modtronix-com 22:f63aeb3769b5 298 display();
modtronix-com 22:f63aeb3769b5 299 };
modtronix-com 22:f63aeb3769b5 300
modtronix-com 22:f63aeb3769b5 301
modtronix-com 22:f63aeb3769b5 302 /**Constructor without doing any initialization requiring I2C object. Use this constructor if the I2C object must still be
modtronix-com 22:f63aeb3769b5 303 * initialized, or used after startup delay.
modtronix-com 22:f63aeb3769b5 304 * !!!!! IMPORTANT !!!!!
modtronix-com 22:f63aeb3769b5 305 * This constructor must be followed by calling the init() function BEFORE using any other functions!
modtronix-com 22:f63aeb3769b5 306 *
modtronix-com 22:f63aeb3769b5 307 * Required parameters
modtronix-com 22:f63aeb3769b5 308 * @param i2cAddress - The i2c address of the display
modtronix-com 22:f63aeb3769b5 309 * @param i2c - A reference to an initialized I2C object
modtronix-com 22:f63aeb3769b5 310 *
modtronix-com 22:f63aeb3769b5 311 * Optional parameters
modtronix-com 22:f63aeb3769b5 312 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 313 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 314 */
modtronix-com 22:f63aeb3769b5 315 MxSSD1306_I2C(uint8_t i2cAddress, I2C &i2c, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 316 : MxSSD1306(rawHeight, rawWidth), mi2c(i2c), mi2cAddress(i2cAddress)
modtronix-com 22:f63aeb3769b5 317 {
modtronix-com 22:f63aeb3769b5 318 };
modtronix-com 22:f63aeb3769b5 319
modtronix-com 22:f63aeb3769b5 320
modtronix-com 22:f63aeb3769b5 321 /**
modtronix-com 22:f63aeb3769b5 322 * Initialize with given I2C bus.
modtronix-com 22:f63aeb3769b5 323 * !!!!! IMPORTANT !!!!!
modtronix-com 22:f63aeb3769b5 324 * This function must be called after the Adafruit_SSD1306_I2c(rawHeight, rawWidth) constructor!
modtronix-com 22:f63aeb3769b5 325 *
modtronix-com 22:f63aeb3769b5 326 * @param i2c I2C Bus to use
modtronix-com 22:f63aeb3769b5 327 * @return 0 if OK, else error code
modtronix-com 22:f63aeb3769b5 328 */
modtronix-com 22:f63aeb3769b5 329 uint8_t init()
modtronix-com 22:f63aeb3769b5 330 {
modtronix-com 22:f63aeb3769b5 331 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 332 if((retVal=begin()) != 0) {
modtronix-com 22:f63aeb3769b5 333 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 334 }
modtronix-com 22:f63aeb3769b5 335
modtronix-com 22:f63aeb3769b5 336 //splash();
modtronix-com 22:f63aeb3769b5 337 if((retVal=display()) != 0) {
modtronix-com 22:f63aeb3769b5 338 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 339 }
modtronix-com 22:f63aeb3769b5 340 return 0;
modtronix-com 22:f63aeb3769b5 341 }
modtronix-com 22:f63aeb3769b5 342
modtronix-com 22:f63aeb3769b5 343 /** Send command via I2C
modtronix-com 22:f63aeb3769b5 344 * @param c The command to send
modtronix-com 22:f63aeb3769b5 345 * @return 0 if success, else I2C error
modtronix-com 22:f63aeb3769b5 346 */
modtronix-com 22:f63aeb3769b5 347 virtual uint8_t command(uint8_t c)
modtronix-com 22:f63aeb3769b5 348 {
modtronix-com 22:f63aeb3769b5 349 char buff[2];
modtronix-com 22:f63aeb3769b5 350 buff[0] = 0; // Command Mode
modtronix-com 22:f63aeb3769b5 351 buff[1] = c;
modtronix-com 22:f63aeb3769b5 352 return mi2c.write(mi2cAddress, buff, sizeof(buff));
modtronix-com 22:f63aeb3769b5 353 }
modtronix-com 22:f63aeb3769b5 354
modtronix-com 22:f63aeb3769b5 355 /** Send Data via I2C
modtronix-com 22:f63aeb3769b5 356 * @param c The data to send
modtronix-com 22:f63aeb3769b5 357 * @return 0 if success, else I2C error
modtronix-com 22:f63aeb3769b5 358 */
modtronix-com 22:f63aeb3769b5 359 virtual uint8_t data(uint8_t c)
modtronix-com 22:f63aeb3769b5 360 {
modtronix-com 22:f63aeb3769b5 361 char buff[2];
modtronix-com 22:f63aeb3769b5 362 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 363 buff[1] = c;
modtronix-com 22:f63aeb3769b5 364 return mi2c.write(mi2cAddress, buff, sizeof(buff));
modtronix-com 22:f63aeb3769b5 365 };
modtronix-com 22:f63aeb3769b5 366
modtronix-com 22:f63aeb3769b5 367 protected:
modtronix-com 22:f63aeb3769b5 368 virtual uint8_t sendDisplayBuffer()
modtronix-com 22:f63aeb3769b5 369 {
modtronix-com 22:f63aeb3769b5 370 char buff[17];
modtronix-com 22:f63aeb3769b5 371 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 372
modtronix-com 22:f63aeb3769b5 373 // send display buffer in 16 byte chunks
modtronix-com 23:44309099c532 374 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 375 for(uint16_t i=0, q=sizeof(buffer); i<q; i+=16 ) {
modtronix-com 22:f63aeb3769b5 376 #else
modtronix-com 22:f63aeb3769b5 377 for(uint16_t i=0, q=buffer.size(); i<q; i+=16 ) {
modtronix-com 22:f63aeb3769b5 378 #endif
modtronix-com 22:f63aeb3769b5 379 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 380 uint8_t x;
modtronix-com 22:f63aeb3769b5 381
modtronix-com 22:f63aeb3769b5 382 for(x=1; x<sizeof(buff); x++) {
modtronix-com 22:f63aeb3769b5 383 buff[x] = buffer[i+x-1];
modtronix-com 22:f63aeb3769b5 384 }
modtronix-com 22:f63aeb3769b5 385
modtronix-com 22:f63aeb3769b5 386 if((retVal=mi2c.write(mi2cAddress, buff, sizeof(buff))) != 0) {
modtronix-com 22:f63aeb3769b5 387 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 388 }
modtronix-com 22:f63aeb3769b5 389 }
modtronix-com 22:f63aeb3769b5 390 return 0;
modtronix-com 22:f63aeb3769b5 391 };
modtronix-com 22:f63aeb3769b5 392
modtronix-com 22:f63aeb3769b5 393 /** Write a block of display data. The 128x64 pixels are divided into:
modtronix-com 22:f63aeb3769b5 394 * - 8 RowBlocks, each with 8 rows. This is 1 page of the SSD1206
modtronix-com 22:f63aeb3769b5 395 * - 8 ColBlocks, each with 16 columns.
modtronix-com 22:f63aeb3769b5 396 *
modtronix-com 22:f63aeb3769b5 397 * @param rowBlock Value 0-7 indicating what block of 8 rows to write. 0=0-7,
modtronix-com 22:f63aeb3769b5 398 * 1=8-15, ...., 7=56-63
modtronix-com 22:f63aeb3769b5 399 * @param colBlock Value 0-7 indicating what block of 16 columns to write. 0=0-15,
modtronix-com 22:f63aeb3769b5 400 * 1=16-31, ...., 7=112-127
modtronix-com 22:f63aeb3769b5 401 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 402 */
modtronix-com 22:f63aeb3769b5 403 uint8_t sendDisplayBuffer(uint8_t rowBlock, uint8_t colBlock) {
modtronix-com 22:f63aeb3769b5 404 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 405 int idxBuffer;
modtronix-com 22:f63aeb3769b5 406 char buff[17];
modtronix-com 22:f63aeb3769b5 407
modtronix-com 22:f63aeb3769b5 408 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 409
modtronix-com 22:f63aeb3769b5 410 //Each byte of buffer contains 8pixels for single column, and 8 rows. For example:
modtronix-com 22:f63aeb3769b5 411 //buffer[0] contains row 0-7 for column 0
modtronix-com 22:f63aeb3769b5 412 //buffer[1] contains row 0-7 for column 1
modtronix-com 22:f63aeb3769b5 413 idxBuffer = (rowBlock*128) + (colBlock*16);
modtronix-com 22:f63aeb3769b5 414
modtronix-com 22:f63aeb3769b5 415 // Copy requested "row block" and "column block"
modtronix-com 22:f63aeb3769b5 416 for(uint16_t i=0; i<16; i++) {
modtronix-com 22:f63aeb3769b5 417 buff[i+1] = buffer[idxBuffer+i];
modtronix-com 22:f63aeb3769b5 418 }
modtronix-com 22:f63aeb3769b5 419
modtronix-com 22:f63aeb3769b5 420 //Write all display data
modtronix-com 22:f63aeb3769b5 421 if((retVal=mi2c.write(mi2cAddress, buff, 17)) != 0) {
modtronix-com 22:f63aeb3769b5 422 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 423 }
modtronix-com 22:f63aeb3769b5 424
modtronix-com 22:f63aeb3769b5 425 return 0;
modtronix-com 22:f63aeb3769b5 426 }
modtronix-com 22:f63aeb3769b5 427
modtronix-com 22:f63aeb3769b5 428 I2C &mi2c;
modtronix-com 22:f63aeb3769b5 429 uint8_t mi2cAddress;
modtronix-com 22:f63aeb3769b5 430 };
modtronix-com 22:f63aeb3769b5 431
modtronix-com 22:f63aeb3769b5 432 #endif