summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/lcd/ssd1306.h
blob: e1fbc460cd474b081ab959f7a47a904f43ededf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*
 * 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;
};
}