1 /*
2  * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 #pragma once
26 
27 #include <string>
28 #include <mraa/i2c.hpp>
29 #include "lcd.h"
30 #include "ssd.h"
31 
32 namespace upm
33 {
34 const uint8_t DISPLAY_CMD_SET_NORMAL = 0xA4;
35 
36 /**
37  * @library i2clcd
38  * @sensor ssd1327
39  * @comname SSD1327 OLED Display
40  * @altname Grove OLED Display 1.12"
41  * @type display
42  * @man seeed adafruit
43  * @web http://garden.seeedstudio.com/images/8/82/SSD1327_datasheet.pdf
44  * @web http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_1.12%22
45  * @con i2c
46  *
47  * @brief API for SSD1327 I2C-controlled OLED displays
48  *
49  * SSD1327 is a 96x96 dot-matrix OLED/PLED segment driver with a controller.
50  * This implementation was tested using the Grove LED 96×96 Display module,
51  * which is an OLED monochrome display.
52  *
53  * @image html ssd1327.jpeg
54  * @snippet ssd1327-oled.cxx Interesting
55  */
56 class SSD1327 : public LCD
57 {
58   public:
59     /**
60      * SSD1327 constructor; calls libmraa initialisation functions
61      *
62      * @param bus I2C bus to use
63      * @param address Slave address the LCD is registered on
64      */
65     SSD1327(int bus, int address = 0x3C);
66     /**
67      * SSD1327 destructor
68      */
69     ~SSD1327();
70     /**
71      * Draws an image; see examples/python/make_oled_pic.py for an
72      * explanation of how pixels are mapped to bytes
73      *
74      * @param data Buffer to read
75      * @param bytes Number of bytes to read from the pointer
76      * @return Result of the operation
77      */
78     mraa::Result draw(uint8_t* data, int bytes);
79     /**
80      * Sets the gray level for the LCD panel
81      *
82      * @param gray level from 0 to 255
83      * @return Result of the operation
84      */
85     void setGrayLevel(uint8_t level);
86     /**
87      * Writes a string to the LCD
88      *
89      * @param msg std::string to write to the display; note: only ASCII
90      * characters are supported
91      * @return Result of the operation
92      */
93     mraa::Result write(std::string msg);
94     /**
95      * Sets the cursor to specified coordinates
96      *
97      * @param row Row to set the cursor to
98      * @param column Column to set the cursor to
99      * @return Result of the operation
100      */
101     mraa::Result setCursor(int row, int column);
102     /**
103      * Clears the display of all characters
104      *
105      * @return Result of the operation
106      */
107     mraa::Result clear();
108     /**
109      * Returns to the original coordinates (0,0)
110      *
111      * @return Result of the operation
112      */
113     mraa::Result home();
114 
115   private:
116     mraa::Result writeChar(uint8_t value);
117     mraa::Result setNormalDisplay();
118     mraa::Result setHorizontalMode();
119     mraa::Result setVerticalMode();
120 
121     uint8_t grayHigh;
122     uint8_t grayLow;
123 
124     int m_lcd_control_address;
125     mraa::I2c m_i2c_lcd_control;
126 };
127 }
128