/* * Author: Pawel Jablonski * E-mail: pj@xirx.net * WWW: xirx.net * GIT: git.xirx.net * * License: You can use this code however you like * but leave information about the original author. * Code is free for non-commercial and commercial use. */ #include "lcd.h" /** * Constructor for the LCD class * * @param parent Parent object */ LCD::LCD(QObject *parent) : QObject(parent) { this->reset(); } //! Reset the LCD buffers and clear the screen void LCD::reset() { this->clear(); this->refresh(); } //! Copy data from the canvas painting buffer to the ready to show buffer void LCD::refresh() { for(int i = 0; i < HEIGHT; i++) { for(int j = 0; j < WIDTH; j++) { this->buffer[1].charData[i][j] = this->buffer[0].charData[i][j]; this->buffer[1].colorData[i][j] = this->buffer[0].colorData[i][j]; } } } //! Clear the canvas painting buffer void LCD::clear() { for(int i = 0; i < HEIGHT; i++) { for(int j = 0; j < WIDTH; j++) { this->buffer[0].charData[i][j] = 0; this->buffer[0].colorData[i][j] = 0; } } } /** * Set char in the buffer * * @param c Char to set * @param x Horizontal position in range 0-WIDTH * @param y Vertical position in range 0-HEIGHT * @param charColor Foreground color code in range 0-15 * @param backgroundColor Background color code in range 0-15 */ void LCD::setChar(unsigned char c, int x, int y, unsigned char charColor, unsigned char backgroundColor) { if((x >= 0) && (x < WIDTH) && (y >= 0) && (y < HEIGHT)) { this->buffer[0].charData[y][x] = c; this->buffer[0].colorData[y][x] = static_cast((charColor & COLOR_MASK) | ((backgroundColor & COLOR_MASK) << 4)); } } //! Scroll the canvas painting buffer one line up void LCD::scroll() { for(int y = 0; y < (HEIGHT - 1); y++) { for(int x = 0; x < WIDTH; x++) { this->buffer[0].charData[y][x] = this->buffer[0].charData[y + 1][x]; this->buffer[0].colorData[y][x] = this->buffer[0].colorData[y + 1][x]; } } for(int x = 0; x < WIDTH; x++) { this->buffer[0].charData[HEIGHT - 1][x] = 0; this->buffer[0].colorData[HEIGHT - 1][x] = 0; } } //! Emit the update signal with ready to show buffer data void LCD::update() { emit updateBufferSignal(this->buffer[1]); }