From a9711fd46d554d96f1d9839187e7dfbbe472ac33 Mon Sep 17 00:00:00 2001 From: Fisch Date: Sat, 11 Feb 2023 18:26:52 +0100 Subject: [PATCH] optimize updatebycolumn function to only flip necessary dots --- flipcontrol_esp32/include/image.h | 5 ++- flipcontrol_esp32/src/flipdot.cpp | 1 + flipcontrol_esp32/src/image.cpp | 57 ++++++++++++++++++++++--------- flipcontrol_esp32/src/main.cpp | 29 ++-------------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/flipcontrol_esp32/include/image.h b/flipcontrol_esp32/include/image.h index e25d419..2f93144 100644 --- a/flipcontrol_esp32/include/image.h +++ b/flipcontrol_esp32/include/image.h @@ -10,8 +10,6 @@ #define ROWS 16 -#define UPDATE_INTERVAL 5 //TODO: remove this - enum UpdateReturn { wait, finished, @@ -37,8 +35,9 @@ private: unsigned long lastUpdateMillis; //time when last dots where started flipping - unsigned long updateInterval; + unsigned long updateDelay; + void serialPrintInt(uint16_t source); diff --git a/flipcontrol_esp32/src/flipdot.cpp b/flipcontrol_esp32/src/flipdot.cpp index e4c3995..66a65f9 100644 --- a/flipcontrol_esp32/src/flipdot.cpp +++ b/flipcontrol_esp32/src/flipdot.cpp @@ -61,6 +61,7 @@ void Flipdot::selectColumnSet(uint8_t selcolumn) { selectColumn(selcolumn, false); } void Flipdot::selectColumn(uint8_t selcolumn, bool clear) { + //set shift registers for columns to select one column to positive voltage uint8_t sc_bit=3-(selcolumn%4); //each two shift registers control four columns uint8_t sc_byte=selcolumn/4; diff --git a/flipcontrol_esp32/src/image.cpp b/flipcontrol_esp32/src/image.cpp index 3767fd0..eaece41 100644 --- a/flipcontrol_esp32/src/image.cpp +++ b/flipcontrol_esp32/src/image.cpp @@ -8,13 +8,19 @@ Image::Image() } +void Image::serialPrintInt(uint16_t source) +{ + for(uint8_t i = 0; i < 16; i++) + Serial.print((source & (1 << i)) > 0); +} + void Image::init() { flipdot.init(); //sets pin modes etc. flag_updating=false; update_counter=0; - updateInterval=30; + updateDelay=5; } uint8_t Image::getW() { @@ -63,34 +69,53 @@ UpdateReturn Image::updateByColumn(bool direction, bool clearFirst, bool optimiz return nochange; //finished } - if (millis()-lastUpdateMillis0) { //at least on dot has to be cleared in this column + flipdot.setRow(0); + flipdot.selectColumnClear(x); + + if (!flipdot.clearSelectedColumn()) { + Serial.println("Error clearing column!"); + } + lastUpdateMillis=millis(); + frontBuffer[x]=0; } - frontBuffer[x]=0; - }else{ //odd counter numbers are for setting - flipdot.selectColumnSet(x); //lower column number is on the left - - flipdot.setRow(backBuffer[x]); - flipdot.setSelectedDot(); - frontBuffer[x]=backBuffer[x]; //flip current column in buffer + }else{ //odd counter numbers are for setting + uint16_t _colSet=backBuffer[x]& ~frontBuffer[x]; + if (!optimizeSet || _colSet>0) { //at least on dot has to be set in this column (if optimize is enabled) + flipdot.selectColumnSet(x); //lower column number is on the left + if (!optimizeSet) { + flipdot.setRow(backBuffer[x]); //flip all set dots in this column + }else{ + flipdot.setRow(_colSet); //flip only currently not set dots in this column that have to be set + } + + if (!flipdot.setSelectedDot()) { + Serial.println("Error setting dots!"); + } + lastUpdateMillis=millis(); + + frontBuffer[x]=backBuffer[x]; //flip current column in buffer + } } update_counter++; //next column - unsigned long _duration=millis()-lastUpdateMillis; //how long it took to shift data and flip dots in this update + unsigned long _duration=millis()-functionStartMillis; //how long it took to shift data and flip dots in this update updateDuration=max(updateDuration,_duration); //store maximum value diff --git a/flipcontrol_esp32/src/main.cpp b/flipcontrol_esp32/src/main.cpp index 2bf3ea7..ffa28a4 100644 --- a/flipcontrol_esp32/src/main.cpp +++ b/flipcontrol_esp32/src/main.cpp @@ -33,7 +33,7 @@ void loop() { //flip.setBuffer_solid(color); //color=1-color; - uint8_t _randomvalue=random(256); + uint8_t _randomvalue=random(64); Serial.print("set buffer random. "); Serial.println(_randomvalue); flip.setBuffer_random(_randomvalue); @@ -42,7 +42,7 @@ void loop() { } - UpdateReturn result=flip.updateByColumn(0,0,0,0); //0=not finished, 1=finished + UpdateReturn result=flip.updateByColumn(0,0,true,true); //0=not finished, 1=finished if (result == finished) //just finished { unsigned long duration=millis()-last_change; @@ -50,30 +50,5 @@ void loop() { Serial.print("Update max took "); Serial.print(flip.updateDuration); Serial.println(" ms"); flip.updateDuration=0; //reset } - - - /* - if (loopmillis > last_update + UPDATE_INTERVAL) - { - Serial.print("UpdateByColumn "); - bool result=flip.updateByColumn(0,0,0,0); - Serial.println(result); - - last_update=loopmillis; - } - */ - - - /* - if (loopmillis > last_update + UPDATE_INTERVAL) - { - flip.loop_drawClearTest(); - //loop_testDots(); - - last_update=loopmillis; - } - */ - - }