implement buffer with pixel operations
This commit is contained in:
parent
33c4af6dc3
commit
de31ddb395
|
@ -52,6 +52,7 @@ void Display::send_commands(const uint8_t *cc, uint8_t n){
|
||||||
Display::Display(const uint8_t resetPin){
|
Display::Display(const uint8_t resetPin){
|
||||||
_rstPin = resetPin;
|
_rstPin = resetPin;
|
||||||
_wire = &Wire;
|
_wire = &Wire;
|
||||||
|
_buffer = (uint8_t*) malloc(_width * ((_height + 7) / 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Display::begin(){
|
void Display::begin(){
|
||||||
|
@ -118,7 +119,29 @@ void Display::begin(){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define swap(a, b) \
|
||||||
|
(((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation
|
||||||
|
|
||||||
void Display::clear(){
|
void Display::clear(){
|
||||||
|
memset(_buffer, 0, _width * ((_height + 7) / 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display::setPixel(int16_t x, int16_t y, const bool white){
|
||||||
|
if( x > _width || y > _height || x < 0 || y < 0 ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// swap(x, y);
|
||||||
|
// x = _width - x - 1;
|
||||||
|
// y = _height - y - 1;
|
||||||
|
|
||||||
|
if( white ){
|
||||||
|
_buffer[x + (y/8)*_width] |= (1 << (y&7));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_buffer[x + (y/8)*_width] &= ~(1 << (y&7));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display::apply(){
|
||||||
TRANSACTION_START
|
TRANSACTION_START
|
||||||
|
|
||||||
static const uint8_t PROGMEM dlist1[] = {
|
static const uint8_t PROGMEM dlist1[] = {
|
||||||
|
@ -131,9 +154,10 @@ void Display::clear(){
|
||||||
send_commands(dlist1, sizeof(dlist1));
|
send_commands(dlist1, sizeof(dlist1));
|
||||||
send_command(_width - 1); // Column end address
|
send_command(_width - 1); // Column end address
|
||||||
|
|
||||||
|
uint16_t count = _width * ((_height + 7) / 8);
|
||||||
|
uint8_t* ptr = _buffer;
|
||||||
_wire->beginTransmission(_i2caddr);
|
_wire->beginTransmission(_i2caddr);
|
||||||
_wire->write((uint8_t) 0x40);
|
_wire->write((uint8_t) 0x40);
|
||||||
uint16_t count = _width * ((_height + 7) / 8);
|
|
||||||
uint8_t written = 1;
|
uint8_t written = 1;
|
||||||
while(count--){
|
while(count--){
|
||||||
if( written >= WIRE_MAX ){
|
if( written >= WIRE_MAX ){
|
||||||
|
@ -142,15 +166,65 @@ void Display::clear(){
|
||||||
_wire->write((uint8_t) 0x40);
|
_wire->write((uint8_t) 0x40);
|
||||||
written = 1;
|
written = 1;
|
||||||
}
|
}
|
||||||
_wire->write(0);
|
_wire->write(*ptr++);
|
||||||
|
written++;
|
||||||
}
|
}
|
||||||
_wire->endTransmission();
|
_wire->endTransmission();
|
||||||
|
|
||||||
TRANSACTION_END
|
TRANSACTION_END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Display::setTitle(const String title){
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
// draws a progress bar to a fixed location
|
// draws a progress bar to a fixed location
|
||||||
// the progress value is between 0 and 255
|
// the progress value is between 0 and 1023
|
||||||
void Display::progress(const uint8_t progress){
|
void Display::progress(const short progress, const uint8_t startLine, const uint8_t endLine, const bool absolute){
|
||||||
|
// top line
|
||||||
|
for( uint8_t i = 0 ; i < 128 ; i++ ){
|
||||||
|
setPixel(i, startLine, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// bottom line
|
||||||
|
for( uint8_t i = 0 ; i < 128 ; i++ ){
|
||||||
|
setPixel(i, endLine, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// center tip
|
||||||
|
for( uint8_t i = startLine+2 ; i < endLine-1 ; i++ ){
|
||||||
|
setPixel(64, endLine, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t scaledProgress = (progress+7) / 8;
|
||||||
|
|
||||||
|
// draw absolute progression
|
||||||
|
if( absolute ){
|
||||||
|
for( uint8_t x = 0 ; x < scaledProgress ; x++ ){
|
||||||
|
for( uint8_t y = startLine+1 ; y < endLine ; y++ ){
|
||||||
|
setPixel(x, y, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw left relative progression
|
||||||
|
if( progress < 512 ){
|
||||||
|
|
||||||
|
for( uint8_t x = scaledProgress ; x < 64 ; x++ ){
|
||||||
|
for( uint8_t y = startLine+1 ; y < endLine ; y++ ){
|
||||||
|
setPixel(x, y, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw right relative progression
|
||||||
|
} else {
|
||||||
|
|
||||||
|
for( uint8_t x = 64 ; x < scaledProgress ; x++ ){
|
||||||
|
for( uint8_t y = startLine+1 ; y < endLine ; y++ ){
|
||||||
|
setPixel(x, y, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
|
@ -49,14 +49,18 @@
|
||||||
Display(const uint8_t resetPin=-1);
|
Display(const uint8_t resetPin=-1);
|
||||||
void begin();
|
void begin();
|
||||||
void clear();
|
void clear();
|
||||||
void progress(const uint8_t progress);
|
void setTitle(const String title);
|
||||||
|
void setPixel(int16_t x, int16_t y, const bool white=true);
|
||||||
|
void progress(const short progress, const uint8_t startLine, const uint8_t endLine, const bool absolute=true);
|
||||||
|
void apply();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void send_command(const uint8_t c);
|
void send_command(const uint8_t c);
|
||||||
void send_commands(const uint8_t *cc, const uint8_t n);
|
void send_commands(const uint8_t *cc, const uint8_t n);
|
||||||
private:
|
private:
|
||||||
const uint8_t _width { 128 };
|
const static int16_t _width { 128 };
|
||||||
const uint8_t _height { 32 };
|
const static int16_t _height { 32 };
|
||||||
|
uint8_t* _buffer { nullptr };
|
||||||
const uint8_t _comPin { 0x02 };
|
const uint8_t _comPin { 0x02 };
|
||||||
const uint8_t _i2caddr { 0x3C };
|
const uint8_t _i2caddr { 0x3C };
|
||||||
const uint8_t _contrast { 0x8F };
|
const uint8_t _contrast { 0x8F };
|
||||||
|
|
Loading…
Reference in New Issue