ssd1306: updated to C++ types and new exceptions, fixed repeated call to i2cfrequency

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Mihai Tudor Panu 2015-09-14 17:50:47 -07:00
parent 3159005aa3
commit 4e70ed4973
2 changed files with 38 additions and 45 deletions

View File

@ -44,11 +44,19 @@ SSD1306::SSD1306(int bus_in, int addr_in) : m_i2c_lcd_control(bus_in)
m_lcd_control_address = addr_in;
m_name = "SSD1306";
mraa_result_t error = m_i2c_lcd_control.address(m_lcd_control_address);
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
if (error != mraa_SUCCESS) {
fprintf(stderr, "Failed to initialize i2c bus\n");
mraa::Result error = m_i2c_lcd_control.address(m_lcd_control_address);
if (error != mraa::SUCCESS) {
throw std::runtime_error(std::string(__FUNCTION__) +
": mraa_i2c_address() failed");
return;
}
error = m_i2c_lcd_control.frequency(mraa::I2C_FAST);
if (error != mraa::SUCCESS) {
throw std::invalid_argument(std::string(__FUNCTION__) +
": mraa_i2c_frequency(MRAA_I2C_FAST) failed");
return;
}
@ -105,11 +113,10 @@ SSD1306::~SSD1306()
{
}
mraa_result_t
mraa::Result
SSD1306::draw(uint8_t* data, int bytes)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t error = mraa_SUCCESS;
mraa::Result error = mraa::SUCCESS;
setAddressingMode(HORIZONTAL);
for (int idx = 0; idx < bytes; idx++) {
@ -124,11 +131,10 @@ SSD1306::draw(uint8_t* data, int bytes)
* virtual area
* **************
*/
mraa_result_t
mraa::Result
SSD1306::write(std::string msg)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t error = mraa_SUCCESS;
mraa::Result error = mraa::SUCCESS;
setAddressingMode(PAGE);
for (std::string::size_type i = 0; i < msg.size(); ++i) {
@ -138,11 +144,10 @@ SSD1306::write(std::string msg)
return error;
}
mraa_result_t
mraa::Result
SSD1306::setCursor(int row, int column)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t error = mraa_SUCCESS;
mraa::Result error = mraa::SUCCESS;
error = m_i2c_lcd_control.writeReg(LCD_CMD, BASE_PAGE_START_ADDR + row); // set page address
error = m_i2c_lcd_control.writeReg(LCD_CMD,
@ -155,11 +160,10 @@ SSD1306::setCursor(int row, int column)
return error;
}
mraa_result_t
mraa::Result
SSD1306::clear()
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t error = mraa_SUCCESS;
mraa::Result error = mraa::SUCCESS;
uint8_t columnIdx, rowIdx;
m_i2c_lcd_control.writeReg(LCD_CMD, DISPLAY_CMD_OFF); // display off
@ -177,10 +181,9 @@ SSD1306::clear()
return error;
}
mraa_result_t
mraa::Result
SSD1306::home()
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
return setCursor(0, 0);
}
@ -189,11 +192,10 @@ SSD1306::home()
* private area
* **************
*/
mraa_result_t
mraa::Result
SSD1306::writeChar(uint8_t value)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t rv;
mraa::Result rv;
if (value < 0x20 || value > 0x7F) {
value = 0x20; // space
}
@ -205,31 +207,28 @@ SSD1306::writeChar(uint8_t value)
return rv;
}
mraa_result_t
mraa::Result
SSD1306::setNormalDisplay()
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
return m_i2c_lcd_control.writeReg(LCD_CMD,
DISPLAY_CMD_SET_NORMAL_1306); // set to normal display '1' is
// ON
}
mraa_result_t
mraa::Result
SSD1306::setAddressingMode(displayAddressingMode mode)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t rv;
mraa::Result rv;
rv =m_i2c_lcd_control.writeReg(LCD_CMD, DISPLAY_CMD_MEM_ADDR_MODE); // set addressing mode
rv =m_i2c_lcd_control.writeReg(LCD_CMD, mode); // set page addressing mode
return rv;
}
mraa_result_t
mraa::Result
SSD1306::invert(bool i)
{
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
mraa_result_t rv;
mraa::Result rv;
if(i){
rv = m_i2c_lcd_control.writeReg(LCD_CMD, DISPLAY_CMD_SET_INVERT_1306);
} else {
@ -240,7 +239,6 @@ SSD1306::invert(bool i)
void SSD1306::startscrollright(uint8_t start, uint8_t stop){
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
m_i2c_lcd_control.writeReg(LCD_CMD,SSD1306_RIGHT_HORIZONTAL_SCROLL);
m_i2c_lcd_control.writeReg(LCD_CMD,0X00);
m_i2c_lcd_control.writeReg(LCD_CMD,start);
@ -253,7 +251,6 @@ void SSD1306::startscrollright(uint8_t start, uint8_t stop){
void SSD1306::startscrollleft(uint8_t start, uint8_t stop){
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
m_i2c_lcd_control.writeReg(LCD_CMD,SSD1306_LEFT_HORIZONTAL_SCROLL);
m_i2c_lcd_control.writeReg(LCD_CMD,0X00);
m_i2c_lcd_control.writeReg(LCD_CMD,start);
@ -265,7 +262,6 @@ void SSD1306::startscrollleft(uint8_t start, uint8_t stop){
}
void SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
m_i2c_lcd_control.writeReg(LCD_CMD, SSD1306_SET_VERTICAL_SCROLL_AREA);
m_i2c_lcd_control.writeReg(LCD_CMD, 0X00);
m_i2c_lcd_control.writeReg(LCD_CMD, SSD1306_LCDHEIGHT);
@ -279,7 +275,6 @@ void SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){
}
void SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
m_i2c_lcd_control.writeReg(LCD_CMD, SSD1306_SET_VERTICAL_SCROLL_AREA);
m_i2c_lcd_control.writeReg(LCD_CMD, 0X00);
m_i2c_lcd_control.writeReg(LCD_CMD, SSD1306_LCDHEIGHT);
@ -293,7 +288,6 @@ void SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){
}
void SSD1306::stopscroll(void){
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
m_i2c_lcd_control.writeReg(LCD_CMD,SSD1306_DEACTIVATE_SCROLL);
}
@ -301,7 +295,6 @@ void SSD1306::stopscroll(void){
// dim = true: display is dimmed
// dim = false: display is normal
void SSD1306::dim(bool dim) {
m_i2c_lcd_control.frequency(MRAA_I2C_FAST);
uint8_t contrast;
if (dim) {

View File

@ -127,7 +127,7 @@ class SSD1306 : public LCD
* @param bytes Number of bytes to read from the pointer
* @return Result of the operation
*/
mraa_result_t draw(uint8_t* data, int bytes);
mraa::Result draw(uint8_t* data, int bytes);
/**
* Writes a string to the LCD
*
@ -135,7 +135,7 @@ class SSD1306 : public LCD
* characters are supported
* @return Result of the operation
*/
mraa_result_t write(std::string msg);
mraa::Result write(std::string msg);
/**
* Sets the cursor to specified coordinates
*
@ -143,26 +143,26 @@ class SSD1306 : public LCD
* @param column Column to set the cursor to
* @return Result of the operation
*/
mraa_result_t setCursor(int row, int column);
mraa::Result setCursor(int row, int column);
/**
* Clears the display of all characters
*
* @return Result of the operation
*/
mraa_result_t clear();
mraa::Result clear();
/**
* Returns to the original coordinates (0,0)
*
* @return Result of the operation
*/
mraa_result_t home();
mraa::Result home();
/**
* Inverts the display
*
* @param i true to invert, false for normal display
* @return Result of the operation
*/
mraa_result_t invert(bool i);
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:
@ -218,9 +218,9 @@ class SSD1306 : public LCD
void dim(bool dim);
private:
mraa_result_t writeChar(uint8_t value);
mraa_result_t setNormalDisplay();
mraa_result_t setAddressingMode(displayAddressingMode mode);
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;