| /* |
| * Author: Marc Graham <marc@m2ag.net> |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * Adapted from ssd1308 library. |
| * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com> |
| * Copyright (c) 2014 Intel Corporation. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining |
| * a copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sublicense, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #pragma once |
| |
| #include <string> |
| #include <mraa/i2c.hpp> |
| #include "lcd.h" |
| #include "ssd.h" |
| |
| namespace upm |
| { |
| const uint8_t DISPLAY_CMD_SET_NORMAL_1306 = 0xA6; |
| const uint8_t SSD1306_SETCONTRAST = 0x81; |
| const uint8_t SSD1306_DISPLAYALLON_RESUME =0xA4; |
| const uint8_t SSD1306_DISPLAYALLON = 0xA5; |
| const uint8_t DISPLAY_CMD_SET_INVERT_1306 = 0xA7; |
| |
| const uint8_t SSD1306_SETDISPLAYOFFSET =0xD3; |
| const uint8_t SSD1306_SETCOMPINS = 0xDA; |
| |
| const uint8_t SSD1306_SETVCOMDETECT = 0xDB; |
| |
| const uint8_t SSD1306_SETDISPLAYCLOCKDIV = 0xD5; |
| const uint8_t SSD1306_SETPRECHARGE = 0xD9; |
| |
| const uint8_t SSD1306_SETMULTIPLEX = 0xA8; |
| |
| const uint8_t SSD1306_SETLOWCOLUM = 0x00; |
| const uint8_t SSD1306_SETHIGHCOLUMN = 0x10; |
| |
| const uint8_t SSD1306_SETSTARTLINE = 0x40; |
| |
| const uint8_t SSD1306_MEMORYMODE = 0x20; |
| const uint8_t SSD1306_COLUMNADDR = 0x21; |
| const uint8_t SSD1306_PAGEADDR = 0x22; |
| |
| const uint8_t SSD1306_COMSCANINC = 0xC0; |
| const uint8_t SSD1306_COMSCANDEC = 0xC8; |
| |
| const uint8_t SSD1306_SEGREMAP = 0xA0; |
| |
| const uint8_t SSD1306_CHARGEPUMP = 0x8D; |
| |
| const uint8_t SSD1306_EXTERNALVCC = 0x1; |
| const uint8_t SSD1306_SWITCHCAPVCC = 0x2; |
| |
| // Scrolling const uint8_t s |
| const uint8_t SSD1306_ACTIVATE_SCROLL = 0x2F; |
| const uint8_t SSD1306_DEACTIVATE_SCROLL = 0x2E; |
| const uint8_t SSD1306_SET_VERTICAL_SCROLL_AREA = 0xA3; |
| const uint8_t SSD1306_RIGHT_HORIZONTAL_SCROLL = 0x26; |
| const uint8_t SSD1306_LEFT_HORIZONTAL_SCROLL = 0x27; |
| const uint8_t SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29; |
| const uint8_t SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A; |
| |
| const uint8_t SSD1306_BLACK = 0; |
| const uint8_t SSD1306_WHITE = 1; |
| const uint8_t SSD1306_LCDWIDTH = 128; |
| const uint8_t SSD1306_LCDHEIGHT = 64; |
| |
| /** |
| * @library i2clcd |
| * @sensor ssd1306 |
| * @comname SSD1306 OLED Display |
| * @altname Adafruit SSD1306 OLED Display 0.96" |
| * @type display |
| * @man adafruit |
| * @web https://www.adafruit.com/datasheets/SSD1306.pdf |
| * @web http://www.farnell.com/datasheets/609753.pdf |
| * @con i2c |
| * |
| * @brief API for SSD1306 I2C-controlled OLED displays |
| * |
| * SSD1306 is a 128x64 dot-matrix OLED/PLED segment driver with a |
| * controller. This device is available from many suppliers for a |
| * very low cost. This implementation was tested using a generic |
| * SSD1306 device from eBay. |
| * |
| * @image html ssd1306.jpeg |
| * @snippet ssd1306-oled.cxx Interesting |
| */ |
| class SSD1306 : public LCD |
| { |
| public: |
| /** |
| * SSD1306 constructor; calls libmraa initialisation functions |
| * |
| * @param bus I2C bus to use |
| * @param address Slave address the LCD is registered on |
| */ |
| SSD1306(int bus, int address = 0x3C); |
| /** |
| * SSD1306 destructor |
| */ |
| ~SSD1306(); |
| /** |
| * Draws an image; see examples/python/make_oled_pic.py for an |
| * explanation of how pixels are mapped to bytes |
| * |
| * @param data Buffer to read |
| * @param bytes Number of bytes to read from the pointer |
| * @return Result of the operation |
| */ |
| mraa::Result draw(uint8_t* data, int bytes); |
| /** |
| * Writes a string to the LCD |
| * |
| * @param msg std::string to write to the display; note: only ASCII |
| * characters are supported |
| * @return Result of the operation |
| */ |
| mraa::Result write(std::string msg); |
| /** |
| * Sets the cursor to specified coordinates |
| * |
| * @param row Row to set the cursor to |
| * @param column Column to set the cursor to |
| * @return Result of the operation |
| */ |
| mraa::Result setCursor(int row, int column); |
| /** |
| * Clears the display of all characters |
| * |
| * @return Result of the operation |
| */ |
| mraa::Result clear(); |
| /** |
| * Returns to the original coordinates (0,0) |
| * |
| * @return Result of the operation |
| */ |
| mraa::Result home(); |
| /** |
| * Inverts the display |
| * |
| * @param i true to invert, false for normal display |
| * @return Result of the operation |
| */ |
| mraa::Result invert(bool i); |
| /** |
| * Activate a scroll to the right for rows start through stop |
| * The display is 16 rows tall. To scroll the whole display, run: |
| * display.scrollright(0x00, 0x0F) |
| * |
| * @param start First row to scroll |
| * @param stop Last row to scroll |
| * @return void |
| */ |
| void startscrollright(uint8_t start, uint8_t stop); |
| /** |
| * Activate a scroll to the left for rows start through stop |
| * The display is 16 rows tall. To scroll the whole display, run: |
| * display.startscrollright(0x00, 0x0F) |
| * |
| * @param start First row to scroll |
| * @param stop Last row to scroll |
| * @return void |
| */ |
| void startscrollleft(uint8_t start, uint8_t stop); |
| /** |
| * Activate a scroll to the upper right for rows start through stop |
| * The display is 16 rows tall. To scroll the whole display, run: |
| * display.startscrollleft(0x00, 0x0F) |
| * |
| * @param start First row to scroll |
| * @param stop Last row to scroll |
| * @return void |
| */ |
| void startscrolldiagright(uint8_t start, uint8_t stop); |
| /** |
| * Activate a scroll to the upper left for rows start through stop |
| * The display is 16 rows tall. To scroll the whole display, run: |
| * display.startscrolldiaagright(0x00, 0x0F) |
| * |
| * @param start First row to scroll |
| * @param stop Last row to scroll |
| * @return void |
| */ |
| void startscrolldiagleft(uint8_t start, uint8_t stop); |
| /** |
| * Stops display scrolling. |
| * |
| * @return void |
| */ |
| void stopscroll(void); |
| /** |
| * Dims display |
| * |
| * @param dim True to dim display, false for max intensity |
| * @return Result of last operation |
| */ |
| void dim(bool dim); |
| |
| private: |
| mraa::Result writeChar(uint8_t value); |
| mraa::Result setNormalDisplay(); |
| mraa::Result setAddressingMode(displayAddressingMode mode); |
| |
| int m_lcd_control_address; |
| mraa::I2c m_i2c_lcd_control; |
| |
| int _vccstate; |
| }; |
| } |