From c99851364ad6e3a5a71affbf138d0ded9775b23a Mon Sep 17 00:00:00 2001
From: Stephan Enderlein <stephan@freifunk-dresden.de>
Date: Sat, 15 Jul 2023 23:49:11 +0200
Subject: [PATCH] - rework "hiding Pins" to easier configure pins for new
 displays (using a pin map, remove hard-coded if-statements) - rework display
 type handling: remove uneeded checks because defined context from which
 functions are called - default initialize "mMono" pointer (potential illegal
 memory access) - define EXACTLY one display type for ePaper display (type
 10). There is no need to use ranges and distinguish oled from epaper display.
 Simply one switch/case - correct type handling for display type (javascript).
 Event handler gives a string instead of number (display type)

---
 src/plugins/Display/Display.h          | 58 ++++++++++++--------------
 src/plugins/Display/Display_ePaper.cpp |  2 +-
 src/web/html/setup.html                | 36 +++++++++-------
 3 files changed, 47 insertions(+), 49 deletions(-)

diff --git a/src/plugins/Display/Display.h b/src/plugins/Display/Display.h
index fee4e35e..24c5b515 100644
--- a/src/plugins/Display/Display.h
+++ b/src/plugins/Display/Display.h
@@ -26,37 +26,29 @@ class Display {
         mLoopCnt = 0;
         mVersion = version;
 
-        if (mCfg->type == 0)
-            return;
+        switch (mCfg->type) {
+            case 0: mMono = NULL; break;
+            case 1: // fall-through
+            case 2: mMono = new DisplayMono128X64(); break;
+            case 3: mMono = new DisplayMono84X48(); break;
+            case 4: mMono = new DisplayMono128X32(); break;
+            case 5: mMono = new DisplayMono64X48(); break;
 
-        if ((0 < mCfg->type) && (mCfg->type < 10)) {
-            switch (mCfg->type) {
-                case 1: // fall-through
-                case 2:
-                    mMono = new DisplayMono128X64();
-                    break;
-                case 3:
-                    mMono = new DisplayMono84X48();
-                    break;
-                case 4:
-                    mMono = new DisplayMono128X32();
-                    break;
-                case 5:
-                    mMono = new DisplayMono64X48();
-                    break;
-
-                default:
-                    mMono = new DisplayMono128X64();
-                    break;
-            }
-            mMono->config(mCfg->pwrSaveAtIvOffline, mCfg->pxShift, mCfg->contrast);
-            mMono->init(mCfg->type, mCfg->rot, mCfg->disp_cs, mCfg->disp_dc, 0xff, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion);
-        } else if (mCfg->type >= 10) {
 #if defined(ESP32)
-            mRefreshCycle = 0;
-            mEpaper.config(mCfg->rot, mCfg->pwrSaveAtIvOffline);
-            mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion);
+            case 10:
+                mMono = NULL;   // ePaper does not use this
+                mRefreshCycle = 0;
+                mEpaper.config(mCfg->rot, mCfg->pwrSaveAtIvOffline);
+                mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion);
+                break;
 #endif
+
+            default: mMono = NULL; break;
+        }
+        if(mMono)
+        {
+            mMono->config(mCfg->pwrSaveAtIvOffline, mCfg->pxShift, mCfg->contrast);
+            mMono->init(mCfg->type, mCfg->rot, mCfg->disp_cs, mCfg->disp_dc, 0xff, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion);
         }
     }
 
@@ -104,14 +96,16 @@ class Display {
             totalYieldTotal += iv->getChannelFieldValue(CH0, FLD_YT, rec);
         }
 
-        if ((0 < mCfg->type) && (mCfg->type < 10) && (mMono != NULL)) {
+        if (mMono ) {
             mMono->disp(totalPower, totalYieldDay, totalYieldTotal, isprod);
-        } else if (mCfg->type >= 10) {
+        }
 #if defined(ESP32)
+        else if (mCfg->type == 10) {
+
             mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
             mRefreshCycle++;
-#endif
         }
+#endif
 
 #if defined(ESP32)
         if (mRefreshCycle > 480) {
@@ -133,7 +127,7 @@ class Display {
 #if defined(ESP32)
     DisplayEPaper mEpaper;
 #endif
-    DisplayMono *mMono;
+    DisplayMono *mMono = NULL; //default !!!
 };
 
 #endif /*__DISPLAY__*/
diff --git a/src/plugins/Display/Display_ePaper.cpp b/src/plugins/Display/Display_ePaper.cpp
index 924961a3..74000180 100644
--- a/src/plugins/Display/Display_ePaper.cpp
+++ b/src/plugins/Display/Display_ePaper.cpp
@@ -26,7 +26,7 @@ DisplayEPaper::DisplayEPaper() {
 void DisplayEPaper::init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, uint8_t _BUSY, uint8_t _SCK, uint8_t _MOSI, uint32_t *utcTs, const char *version) {
     mUtcTs = utcTs;
 
-    if (type > 9) {
+    if (type == 10) {
         Serial.begin(115200);
         _display = new GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT>(GxEPD2_150_BN(_CS, _DC, _RST, _BUSY));
         hspi.begin(_SCK, _BUSY, _MOSI, _CS);
diff --git a/src/web/html/setup.html b/src/web/html/setup.html
index f5649ff7..1ee056df 100644
--- a/src/web/html/setup.html
+++ b/src/web/html/setup.html
@@ -791,6 +791,7 @@
                     document.getElementsByName(i)[0].checked = obj[i];
 
                 var e = document.getElementById("dispPins");
+                //KEEP this order !!!
                 var pins = [['clock', 'disp_clk'], ['data', 'disp_data'], ['cs', 'disp_cs'], ['dc', 'disp_dc'], ['reset', 'disp_rst']];
                 if("ESP32" == type)
                     pins.push(['busy', 'disp_bsy']);
@@ -806,7 +807,7 @@
                 }
 
                 // keep display types grouped
-                var opts = [[0, "None"], [2, "SH1106 1.3\" 128X64"], [5, "SSD1306 0.66\" 64X48"], [4, "SSD1306 0.91\" 128X32"], [1, "SSD1306 0.96\" 128X64"], [3, "Nokia5110"]];
+                var opts = [[0, "None"], [2, "SH1106 1.3\" 128X64"], [5, "SSD1306 0.66\" 64X48 (Wemos OLED Shield)"], [4, "SSD1306 0.91\" 128X32"], [1, "SSD1306 0.96\" 128X64"], [3, "Nokia5110"]];
                 if("ESP32" == type)
                     opts.push([10, "ePaper"]);
                 var dispType = sel("disp_typ", opts, obj["disp_typ"]);
@@ -817,7 +818,7 @@
                     ])
                 );
                 dispType.addEventListener('change', (e) => {
-                    hideDispPins(pins, e.target.value)
+                    hideDispPins(pins, parseInt(e.target.value))
                 });
 
                 opts = [[0, "0&deg;"], [2, "180&deg;"]];
@@ -837,23 +838,26 @@
             }
 
             function hideDispPins(pins, dispType) {
+                // create pin map for each display type.
+                // It depends on fix pin array (see var pins)
+                // var pins = [['clock', 'disp_clk'], ['data', 'disp_data'], ['cs', 'disp_cs'], ['dc', 'disp_dc'], ['reset', 'disp_rst']];
+                const pinMap = new Map([
+                    [0, [0,0,0,0,0]], //none
+                    [1, [1,1,0,0,0]], //SSD1306_128X64
+                    [2, [1,1,0,0,0]], //SH1106_128X64
+                    [3, [1,1,1,1,0]], //PCD8544_84X48 /nokia5110
+                    [4, [1,1,0,0,0]], //SSD1306_128X32
+                    [5, [1,1,0,0,0]], //SSD1306_64X48
+                    [10, [1,1,1,1,1]] //ePaper
+                ])
                 for(var i = 0; i < pins.length; i++) {
                     var cl = document.getElementById("row_" + pins[i][1]).classList;
-
-                    if(0 == dispType)
-                        cl.add("hide");
-                    else if(dispType <= 2 || dispType == 4) { // OLED
-                        if(i < 2)
-                            cl.remove("hide");
-                        else
-                            cl.add("hide");
-                    } else if(dispType == 3) { // Nokia
-                        if(i < 4)
-                            cl.remove("hide");
-                        else
-                            cl.add("hide");
-                    } else // ePaper
+                    if(pinMap.get(dispType)[i]) {
                         cl.remove("hide");
+                    }
+                    else {
+                        cl.add("hide");
+                    }
                 }
             }