226 lines
5.5 KiB
C++
226 lines
5.5 KiB
C++
/**
|
|
* \file cimditssd1306.h
|
|
* \brief Declaration of the CimditSSD1306 class
|
|
* \author GrumpyDeveloper (Sascha Nitsch)
|
|
* \copyright 2022 Sascha Nitsch
|
|
* Licensed under MIT license
|
|
*
|
|
*/
|
|
|
|
#ifndef CIMDITSSD1306_H_
|
|
#define CIMDITSSD1306_H_
|
|
|
|
// system includes
|
|
#include <Wire.h>
|
|
|
|
/// memory adressing mode
|
|
#define SSD1306_SET_MEMORY_ADDRESSING_MODE 0x20
|
|
/// column address start and end
|
|
#define SSD1306_SET_COLUMN_ADDRESS 0x21
|
|
/// page start and end address
|
|
#define SSD1306_SET_PAGE_ADDRESS 0x22
|
|
/// deactivate scrolling
|
|
#define SSD1306_DEACTIVATE_SCROLL 0x2E
|
|
/// set display start line to 0
|
|
#define SSD1306_SET_DISPLAY_START_LINE_0 0x40
|
|
/// set contrast
|
|
#define SSD1306_SET_CONTRAST_CONTROL 0x81
|
|
/// charge pump setting
|
|
#define SSD1306_CHARGE_PUMP_SETTING 0x8D
|
|
/// set segment re-map to column 127
|
|
#define SSD1306_SET_SEGMENT_RE_MAP_127 0xA1
|
|
/// entire display on
|
|
#define SSD1306_ENTIRE_DISPLAY_ON 0xA4
|
|
/// set normal display
|
|
#define SSD1306_SET_NORMAL_DISPLAY 0xA6
|
|
/// set multiplex ratio
|
|
#define SSD1306_SET_MULTIPLEX_RATIO 0xA8
|
|
/// set display off
|
|
#define SSD1306_SET_DISPLAY_OFF 0xAE
|
|
/// set display on
|
|
#define SSD1306_SET_DISPLAY_ON 0xAF
|
|
/// set COM output scan direction to remapped
|
|
#define SSD1306_SET_COM_OUTPUT_SCAN_DIRECTION_REMAPPED 0xC8
|
|
/// set display offser
|
|
#define SSD1306_SET_DISPLAY_OFFSET 0xD3
|
|
/// set display clock divide ratio
|
|
#define SSD1306_SET_DISPLAY_CLOCK_DIVIDE_RATIO 0xD5
|
|
// set pre-charge period
|
|
#define SSD1306_SET_PRE_CHARGE_PERIOD 0xD9
|
|
// set com pins hardware configuration
|
|
#define SSD1306_SET_COM_PINS_HARDWARE_CONFIGURATION 0xDA
|
|
// set VCOM deselect level
|
|
#define SSD1306_SET_VCOM_DESELECT_LEVEL 0xDB
|
|
|
|
/**
|
|
* \brief Simple drawing class for SSD1306 OLED displays
|
|
*/
|
|
class CimditSSD1306 : public Print {
|
|
public:
|
|
/**
|
|
* \brief constructor
|
|
* \param w width of display in pixel
|
|
* \param h height of display in pixel
|
|
* \param i2cAddr i2c address
|
|
*/
|
|
CimditSSD1306(uint8_t w, uint8_t h, uint8_t i2cAddr);
|
|
|
|
/**
|
|
* \brief destructor
|
|
*
|
|
*/
|
|
~CimditSSD1306();
|
|
|
|
/**
|
|
* \brief initialize library, needs to be called before any other graphic functions
|
|
* \return true on success
|
|
*/
|
|
bool begin();
|
|
|
|
/**
|
|
* \brief send internal buffer to display
|
|
*
|
|
*/
|
|
void display(void);
|
|
|
|
/**
|
|
* \brief send part of internal buffer to display
|
|
* \param part which part of screen (each part is 8 pixel high, starting from top at 0
|
|
*/
|
|
void displayPartial(uint8_t part);
|
|
|
|
/**
|
|
* \brief clear display content in internal buffer, call display or displayPartial to take effect
|
|
*
|
|
*/
|
|
void clearDisplay(void);
|
|
|
|
/**
|
|
* \brief set a pixel to on or off
|
|
* \param x x coordinate of pixel
|
|
* \param y y coordinate of pixel
|
|
* \param state true for on, false for off
|
|
*/
|
|
void drawPixel(uint8_t x, uint8_t y, bool state);
|
|
|
|
/**
|
|
* \brief draw a horizontal line
|
|
* \param x start x position
|
|
* \param y start y position
|
|
* \param w width in pixel
|
|
* \param state true for on, false for off
|
|
*/
|
|
void drawFastHLine(uint8_t x, uint8_t y, uint8_t w, bool state);
|
|
|
|
/**
|
|
* \brief Draw a vertical line with a width and state.
|
|
* Functionality based on adafruit GFX library
|
|
* \param x x coordinate
|
|
* \param y top y coordinate
|
|
* \param h height of the line in pixels
|
|
* \param state true for pixel on, false for off
|
|
* \note Changes buffer contents only, no immediate effect on display.
|
|
Follow up with a call to display() or displayPartial()
|
|
*/
|
|
void drawFastVLine(uint8_t x, uint8_t y, uint8_t h, bool state);
|
|
|
|
/**
|
|
* \brief draw a filled rectangle
|
|
*
|
|
* \param x x start position
|
|
* \param y y start position
|
|
* \param w width in pixel
|
|
* \param h height in pixel
|
|
* \param state
|
|
*/
|
|
void fillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, bool state);
|
|
|
|
/**
|
|
* \brief set text scaling factor
|
|
*
|
|
* \param sx X-scaling factor
|
|
* \param sy Y-scaling factor
|
|
*/
|
|
void setTextSize(uint8_t sx, uint8_t sy);
|
|
|
|
using Print::write;
|
|
/**
|
|
* \brief print a single character to screen
|
|
*
|
|
* \param c character to print
|
|
* \return 1
|
|
*/
|
|
size_t write(uint8_t c);
|
|
|
|
/**
|
|
* \brief set text cursor position
|
|
* \param x X coordinate
|
|
* \param y Y coordinate
|
|
*/
|
|
void setCursor(uint8_t x, uint8_t y);
|
|
|
|
/**
|
|
* \brief set text state
|
|
* \param state state to output
|
|
*/
|
|
void setTextState(bool state);
|
|
|
|
private:
|
|
/**
|
|
* \brief draw a single character c at x,y with scaling sX, sY
|
|
* \param x left coordinate of character
|
|
* \param y lower coordinate of character
|
|
* \param c character to print
|
|
* \param sX horizontal scaling factor
|
|
* \param sY veritcal scaling factor
|
|
*/
|
|
void drawChar(uint8_t x, uint8_t y, unsigned char c, uint8_t size_x, uint8_t size_y);
|
|
|
|
/**
|
|
* \brief start command transmission
|
|
*
|
|
*/
|
|
void commandStart();
|
|
|
|
/**
|
|
* \brief send command list from program memory
|
|
* \param c start pointer
|
|
* \param n number of items to output
|
|
*/
|
|
void commandListProgMem(const uint8_t *c, uint8_t n);
|
|
|
|
/**
|
|
* \brief finish command sending
|
|
*/
|
|
void commandEnd();
|
|
|
|
/// display width
|
|
uint8_t m_width;
|
|
|
|
/// display height
|
|
uint8_t m_height;
|
|
|
|
/// text cursor position X
|
|
uint8_t m_cursorX;
|
|
|
|
/// text cursor position Y
|
|
uint8_t m_cursorY;
|
|
|
|
/// text drawing state
|
|
bool m_state;
|
|
|
|
/// horizontal text scaling factor
|
|
uint8_t m_textsizeX;
|
|
|
|
/// vertical text scaling factor
|
|
uint8_t m_textsizeY;
|
|
|
|
/// internal buffer for screen pixel data
|
|
uint8_t *m_buffer;
|
|
|
|
/// i2c address of display
|
|
uint8_t m_i2cAddr;
|
|
};
|
|
|
|
#endif // CIMDITSSD1306_H_
|