From d27ce9b8887c89da327126166de3488f647d9071 Mon Sep 17 00:00:00 2001 From: Ray Jones Date: Sat, 16 Feb 2019 07:56:37 +0000 Subject: [PATCH 1/6] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4b90485..d367019 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Working so far: To be implemented -------------------------- * Add 2 external digital inputs, 2 digital outputs, analogue input 433MHz Rx stream, 433MHz Tx stream connections. This would allow external timer units for example, or analogue temeprature demand (which is still only 1 degree resolution). +* Implement narrow hysteresis to trick heater into a tighter thermostat temperature range. eg tell heater it is 23 degrees when it really is only 22.25 degrees (only 0.25 above set point). * MQTT pub/sub * "fuel gauge" - Integrate pump frequency, assuming a repeatable dose of fuel per pump cycle... * Proper 7 day timer with each day settable for at least 2 times (eg morning/evening) From 4bc1c79a6dd22d56f762ed1617a2abaadd602d35 Mon Sep 17 00:00:00 2001 From: rljonesau Date: Wed, 27 Feb 2019 22:51:02 +1100 Subject: [PATCH 2/6] Added inheritance of LCD controller setting to OLED menus. Can show fan volts in detailed control menu. --- Arduino/BTCDieselHeater/BTCDieselHeater.ino | 11 ++ .../src/OLED/DetailedScreen.cpp | 21 +++- .../BTCDieselHeater/src/OLED/DetailedScreen.h | 1 + .../src/OLED/SettingsScreen.cpp | 104 ++++++++++++++---- .../BTCDieselHeater/src/OLED/SettingsScreen.h | 1 + .../BTCDieselHeater/src/Protocol/helpers.h | 1 + 6 files changed, 116 insertions(+), 23 deletions(-) diff --git a/Arduino/BTCDieselHeater/BTCDieselHeater.ino b/Arduino/BTCDieselHeater/BTCDieselHeater.ino index 1089e71..4081811 100644 --- a/Arduino/BTCDieselHeater/BTCDieselHeater.ino +++ b/Arduino/BTCDieselHeater/BTCDieselHeater.ino @@ -159,6 +159,7 @@ TelnetSpy DebugPort; sRxLine PCline; long lastRxTime; // used to observe inter character delays bool bHasOEMController = false; +bool bHasOEMLCDController = false; bool bHasHtrData = false; bool bReportBlueWireData = REPORT_RAW_DATA; @@ -488,6 +489,7 @@ void loop() } if(CommState.is(CommStates::OEMCtrlRx)) { bHasOEMController = false; + bHasOEMLCDController = false; if(bReportRecyleEvents) DebugPort.println("Timeout collecting OEM controller data, returning to Idle State"); } @@ -532,6 +534,7 @@ void loop() // Skip state machine immediately to BTC_Tx, sending our own settings. bHasHtrData = false; bHasOEMController = false; + bHasOEMLCDController = false; bool isBTCmaster = true; TxManage.PrepareFrame(DefaultBTCParams, isBTCmaster); // use our parameters, and mix in NV storage values TxManage.Start(timenow); @@ -593,6 +596,9 @@ void loop() // filled OEM controller frame OEMCtrlFrame.setTime(); + // LCD controllers use 0x76 as first byte, rotary knobs use 0x78 + bHasOEMLCDController = (OEMCtrlFrame.Controller.Byte0 != 0x78); + CommState.set(CommStates::HeaterRx1); break; @@ -1125,6 +1131,11 @@ bool hasOEMcontroller() return bHasOEMController; } +bool hasOEMLCDcontroller() +{ + return bHasOEMLCDController; +} + int getSmartError() { return SmartError.getError(); diff --git a/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.cpp index d4ae084..1b58719 100644 --- a/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.cpp @@ -112,7 +112,10 @@ CDetailedScreen::show() showGlowPlug(power); } - showFan(getHeaterInfo().getFan_Actual()); + if(_showTarget) + showFanV(getHeaterInfo().getFan_Voltage()); + else + showFan(getHeaterInfo().getFan_Actual()); showFuel(getHeaterInfo().getPump_Actual()); @@ -227,6 +230,7 @@ CDetailedScreen::keyHandler(uint8_t event) if(event & key_Centre) { // short Centre press - show target _showTarget = millis() + 3500; } + _ScreenManager.reqUpdate(); } _keyRepeatCount = -1; } @@ -354,6 +358,21 @@ CDetailedScreen::showFan(int RPM) _printMenuText(X_FAN_ICON + (W_FAN_ICON/2), Y_BASELINE, msg, false, eCentreJustify); } +void +CDetailedScreen::showFanV(float volts) +{ + // NOTE: fan rotation animation performed in animateOLED + _animateRPM = volts != 0; // used by animation routine + + _display.setTextColor(WHITE); + char msg[16]; + sprintf(msg, "%.1fV", volts); +#ifdef MINI_FANLABEL + CTransientFont AF(_display, &MINIFONT); // temporarily use a mini font +#endif + _printMenuText(X_FAN_ICON + (W_FAN_ICON/2), Y_BASELINE, msg, false, eCentreJustify); +} + void CDetailedScreen::showFuel(float rate) { diff --git a/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.h b/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.h index 96ff619..cfb7ab3 100644 --- a/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/DetailedScreen.h @@ -45,6 +45,7 @@ class CDetailedScreen : public CScreenHeader void showBodyThermometer(int actual); void showGlowPlug(float power); void showFan(int RPM); + void showFanV(float volts); void showFuel(float rate); void showRunState(int state, int errstate); public: diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp index 7e288c3..be18ed9 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp @@ -43,6 +43,7 @@ static const int plugPowers[] = { 35, 40, 45, 80, 85, 90}; CSettingsScreen::CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) { _animateCount = 0; + _nAdoptSettings = 0; } @@ -58,22 +59,35 @@ CSettingsScreen::show() if(!CPasswordScreen::show()) { - sprintf(str, "%.0fV", getHeaterInfo().getSystemVoltage()); - _printMenuText(_display.width(), Line3, str, false, eRightJustify); + if(_nAdoptSettings == 1) { + _display.clearDisplay(); + _display.writeFillRect(0, 0, 128, 20, WHITE); + _printInverted(_display.xCentre(), 2, "Adopt LCD controller", true, eCentreJustify); + _printInverted(_display.xCentre(), 11, "settings? ", true, eCentreJustify); + _printMenuText(_display.xCentre(), 35, "Press RIGHT to", false, eCentreJustify); + _printMenuText(_display.xCentre(), 45, "inherit and save", false, eCentreJustify); + } + else if(_nAdoptSettings == 2) { + _display.clearDisplay(); + _printInverted(_display.xCentre(), 2, " Cannot inherit knob ", true, eCentreJustify); + _printInverted(_display.xCentre(), 11, " controller settings ", true, eCentreJustify); + _printMenuText(_display.xCentre(), 35, "Press any key", false, eCentreJustify); + _printMenuText(_display.xCentre(), 45, "to abort", false, eCentreJustify); + } + else { + sprintf(str, "%.0fV", getHeaterInfo().getSystemVoltage()); + _printMenuText(_display.width(), Line3, str, false, eRightJustify); - sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min()); - _printMenuText(0, Line2, str); - // sprintf(str, "SN-%d", getHeaterInfo().getFan_Sensor()); - // _printMenuText(_display.width(), yPos, str, false, eRightJustify); + sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min()); + _printMenuText(0, Line2, str); - sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max()); - _printMenuText(0, Line1, str); - // sprintf(str, "PF-%d", getHeaterInfo().getGlow_Drive()); - // _printMenuText(_display.width(), yPos, str, false, eRightJustify); - // navigation line - int yPos = 53; - int xPos = _display.xCentre(); - _printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify); + sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max()); + _printMenuText(0, Line1, str); + + int yPos = 53; + int xPos = _display.xCentre(); + _printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify); + } } return true; @@ -82,13 +96,16 @@ CSettingsScreen::show() bool CSettingsScreen::animate() { + if(CScreen::animate()) + return true; + char msg[16]; if(isPasswordBusy()) { // Password screen activity _printMenuText(Column, Line1, " "); _printMenuText(Column, Line2, " "); } - else { + else if(_nAdoptSettings == 0) { _animateCount++; ROLLUPPERLIMIT(_animateCount, 9, 0); @@ -134,8 +151,23 @@ CSettingsScreen::keyHandler(uint8_t event) { if(CPasswordScreen::keyHandler(event)) { if(_isPasswordOK()) { - _ScreenManager.selectSettingsScreen(true); + if(_nAdoptSettings == 3) { + setPumpMin(getHeaterInfo().getPump_Min()); + setPumpMax(getHeaterInfo().getPump_Max()); + setFanMin(getHeaterInfo().getFan_Min()); + setFanMax(getHeaterInfo().getFan_Max()); + setFanSensor(getHeaterInfo().getFan_Sensor()); + setSystemVoltage(getHeaterInfo().getSystemVoltage()); + saveNV(); + _showStoringMessage(); + _nAdoptSettings = 0; + } + else { + _ScreenManager.selectSettingsScreen(true); + } } + if(!isPasswordBusy()) + _nAdoptSettings = 0; } else { @@ -143,19 +175,47 @@ CSettingsScreen::keyHandler(uint8_t event) if(event & keyPressed) { // press LEFT if(event & key_Left) { - _ScreenManager.prevScreen(); + if(_nAdoptSettings == 0) + _ScreenManager.prevScreen(); + _nAdoptSettings = 0; } // press RIGHT if(event & key_Right) { - _ScreenManager.nextScreen(); + if(_nAdoptSettings == 1) { + _nAdoptSettings = 3; + _getPassword(); + } + else { + if(_nAdoptSettings == 0) + _ScreenManager.nextScreen(); + _nAdoptSettings = 0; + } } // press UP if(event & (key_Up | key_Centre)) { - if(hasOEMcontroller()) - _reqOEMWarning(); - else { - _getPassword(); + if(_nAdoptSettings == 0) { + if(hasOEMcontroller()) { + if(event & key_Centre) + _reqOEMWarning(); + else { + if(hasOEMLCDcontroller()) { + _nAdoptSettings = 1; + } + else { + _nAdoptSettings = 2; + } + } + } + else { + _getPassword(); + } } + else { + _nAdoptSettings = 0; + } + } + if(event & key_Down) { + _nAdoptSettings = 0; } } } diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h index db01749..408b32f 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h @@ -30,6 +30,7 @@ class CScreenManager; class CSettingsScreen : public CPasswordScreen { int _animateCount; + int _nAdoptSettings; public: CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); bool show(); diff --git a/Arduino/BTCDieselHeater/src/Protocol/helpers.h b/Arduino/BTCDieselHeater/src/Protocol/helpers.h index a9b95cf..bfedb63 100644 --- a/Arduino/BTCDieselHeater/src/Protocol/helpers.h +++ b/Arduino/BTCDieselHeater/src/Protocol/helpers.h @@ -50,6 +50,7 @@ extern void resetWebModerator(); extern void resetJSONmoderator(); extern const char* getBlueWireStatStr(); extern bool hasOEMcontroller(); +extern bool hasOEMLCDcontroller(); extern int getBlueWireStat(); extern int getSmartError(); From 5875a300644f4826beb41b741c3c2ce7da4f7240 Mon Sep 17 00:00:00 2001 From: rljonesau Date: Thu, 28 Feb 2019 18:14:02 +1100 Subject: [PATCH 3/6] Added fallback to Basic Control menu when dimming timeout elapses, unless in Detailed Control or Clock --- Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp | 11 +++++++++++ Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp | 11 ++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index e9a5339..f7b88ed 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -181,9 +181,20 @@ CScreenManager::checkUpdate() if(_DimTime) { long tDelta = millis() - _DimTime; if(tDelta > 0) { + // time to dim the display // if(NVstore.getDimTime()) _pDisplay->dim(true); _DimTime = 0; + + // fall back to main menu + selectTimerScreen(false); + selectSetTimeScreen(false); + selectSettingsScreen(false); + // sticky screens are Detailed Control, Basic Control, or Clock. + // otherwise return to Basic Control screen + if(_currentScreen > 2) { + _currentScreen = 1; + } } } diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp index be18ed9..7c29dc3 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp @@ -61,16 +61,17 @@ CSettingsScreen::show() if(_nAdoptSettings == 1) { _display.clearDisplay(); - _display.writeFillRect(0, 0, 128, 20, WHITE); - _printInverted(_display.xCentre(), 2, "Adopt LCD controller", true, eCentreJustify); - _printInverted(_display.xCentre(), 11, "settings? ", true, eCentreJustify); + _display.writeFillRect(0, 0, 128, 24, WHITE); + _printInverted(_display.xCentre(), 4, "Adopt LCD controller", true, eCentreJustify); + _printInverted(_display.xCentre(), 13, "settings? ", true, eCentreJustify); _printMenuText(_display.xCentre(), 35, "Press RIGHT to", false, eCentreJustify); _printMenuText(_display.xCentre(), 45, "inherit and save", false, eCentreJustify); } else if(_nAdoptSettings == 2) { _display.clearDisplay(); - _printInverted(_display.xCentre(), 2, " Cannot inherit knob ", true, eCentreJustify); - _printInverted(_display.xCentre(), 11, " controller settings ", true, eCentreJustify); + _display.writeFillRect(0, 0, 128, 24, WHITE); + _printInverted(_display.xCentre(), 4, " Cannot inherit knob ", true, eCentreJustify); + _printInverted(_display.xCentre(), 13, " controller settings ", true, eCentreJustify); _printMenuText(_display.xCentre(), 35, "Press any key", false, eCentreJustify); _printMenuText(_display.xCentre(), 45, "to abort", false, eCentreJustify); } From 12ed7301dc2ee167c0c9152b65e170603b4bcedf Mon Sep 17 00:00:00 2001 From: rljonesau Date: Thu, 28 Feb 2019 19:56:13 +1100 Subject: [PATCH 4/6] Added initUI calls, along with onSelect when screens come into view - ensures fresh start every time --- .../src/OLED/FuelMixtureScreen.cpp | 12 +++++-- .../src/OLED/FuelMixtureScreen.h | 1 + .../src/OLED/HeaterSettingsScreen.cpp | 12 +++++-- .../src/OLED/HeaterSettingsScreen.h | 1 + .../src/OLED/PasswordScreen.cpp | 13 +++++++- .../BTCDieselHeater/src/OLED/PasswordScreen.h | 2 ++ .../src/OLED/PrimingScreen.cpp | 29 ++++++++++++++--- .../BTCDieselHeater/src/OLED/PrimingScreen.h | 5 ++- Arduino/BTCDieselHeater/src/OLED/Screen.cpp | 4 +++ Arduino/BTCDieselHeater/src/OLED/Screen.h | 1 + .../src/OLED/ScreenManager.cpp | 32 +++++++++++++++---- .../BTCDieselHeater/src/OLED/ScreenManager.h | 3 +- .../src/OLED/SetClockScreen.cpp | 22 ++++++++++--- .../BTCDieselHeater/src/OLED/SetClockScreen.h | 4 ++- .../src/OLED/SetTimerScreen.cpp | 23 ++++++++----- .../BTCDieselHeater/src/OLED/SetTimerScreen.h | 3 +- .../src/OLED/SettingsScreen.cpp | 16 +++++++++- .../BTCDieselHeater/src/OLED/SettingsScreen.h | 2 ++ .../BTCDieselHeater/src/OLED/WiFiScreen.cpp | 16 +++++++--- Arduino/BTCDieselHeater/src/OLED/WiFiScreen.h | 2 ++ 20 files changed, 164 insertions(+), 39 deletions(-) diff --git a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp index 04ae0a8..92d4360 100644 --- a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp @@ -37,19 +37,27 @@ CFuelMixtureScreen::CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) { - _rowSel = 0; - _colSel = 0; + _initUI(); } void CFuelMixtureScreen::onSelect() { + CPasswordScreen::onSelect(); + _initUI(); adjPump[0] = getHeaterInfo().getPump_Min(); adjPump[1] = getHeaterInfo().getPump_Max(); adjFan[0] = getHeaterInfo().getFan_Min(); adjFan[1] = getHeaterInfo().getFan_Max(); } +void +CFuelMixtureScreen::_initUI() +{ + _rowSel = 0; + _colSel = 0; +} + bool CFuelMixtureScreen::show() { diff --git a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.h b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.h index 0adf2c3..160bc6d 100644 --- a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.h @@ -34,6 +34,7 @@ class CFuelMixtureScreen : public CPasswordScreen { int _rowSel; int _colSel; void _adjustSetting(int dir); + void _initUI(); public: CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr); diff --git a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp index cc00c25..bcb8877 100644 --- a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp @@ -42,21 +42,29 @@ static const int plugPowers[] = { 35, 40, 45, 80, 85, 90}; CHeaterSettingsScreen::CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) { - _rowSel = 0; + _initUI(); _fanSensor = 1; _glowDrive = 5; _sysVoltage = 12; - _animateCount = 0; } void CHeaterSettingsScreen::onSelect() { + CPasswordScreen::onSelect(); + _initUI(); _fanSensor = getHeaterInfo().getFan_Sensor(); _glowDrive = getHeaterInfo().getGlow_Drive(); _sysVoltage = int(getHeaterInfo().getSystemVoltage()); } +void +CHeaterSettingsScreen::_initUI() +{ + _rowSel = 0; + _animateCount = 0; +} + bool CHeaterSettingsScreen::show() { diff --git a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h index 76e9445..36f439a 100644 --- a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h @@ -36,6 +36,7 @@ class CHeaterSettingsScreen : public CPasswordScreen int _fanSensor; int _glowDrive; int _animateCount; + void _initUI(); public: CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); bool show(); diff --git a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.cpp index 9fcea35..46a3fff 100644 --- a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.cpp @@ -36,6 +36,18 @@ CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) +{ + _initUI(); +} + +void +CPasswordScreen::onSelect() +{ + _initUI(); +} + +void +CPasswordScreen::_initUI() { _bGetPassword = false; _bPasswordOK = false; @@ -45,7 +57,6 @@ CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : C _SaveTime = 0; } - bool CPasswordScreen::show() { diff --git a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h index b7de6ce..ca77715 100644 --- a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h @@ -38,8 +38,10 @@ protected: void _getPassword(); bool _isPasswordOK() { return _bPasswordOK; }; void _showStoringMessage(); + void _initUI(); public: CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr); + void onSelect(); bool show(); bool keyHandler(uint8_t event); bool animate(); diff --git a/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.cpp index cac7f4a..3e24369 100644 --- a/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.cpp @@ -35,6 +35,26 @@ CPrimingScreen::CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) +{ + _initUI(); +} + +void +CPrimingScreen::onSelect() +{ + _stopPump(); + _initUI(); +} + +void +CPrimingScreen::onExit() +{ + _stopPump(); +} + + +void +CPrimingScreen::_initUI() { _PrimeStop = 0; _PrimeCheck = 0; @@ -42,7 +62,6 @@ CPrimingScreen::CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr) : CSc _colSel = 0; } - bool CPrimingScreen::show() { @@ -92,12 +111,12 @@ CPrimingScreen::show() // recognise if heater has stopped pump, after an initial holdoff upon first starting long tDelta = millis() - _PrimeCheck; if(_PrimeCheck && tDelta > 0 && pumpHz < 0.1) { - stopPump(); + _stopPump(); } // test if time is up, stop priming if so tDelta = millis() - _PrimeStop; if(_PrimeStop && tDelta > 0) { - stopPump(); + _stopPump(); } if(_PrimeStop) { @@ -191,7 +210,7 @@ CPrimingScreen::keyHandler(uint8_t event) _PrimeCheck = millis() + 3000; // holdoff upon start before testing for heater shutting off pump } else { - stopPump(); + _stopPump(); } _ScreenManager.reqUpdate(); @@ -200,7 +219,7 @@ CPrimingScreen::keyHandler(uint8_t event) } void -CPrimingScreen::stopPump() +CPrimingScreen::_stopPump() { reqPumpPrime(false); _PrimeCheck = 0; diff --git a/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.h b/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.h index e5f6ff5..75d5471 100644 --- a/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/PrimingScreen.h @@ -33,9 +33,12 @@ class CPrimingScreen : public CScreenHeader { unsigned long _PrimeCheck; int _rowSel; int _colSel; - void stopPump(); + void _stopPump(); + void _initUI(); public: CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr); + void onSelect(); + void onExit(); bool show(); bool keyHandler(uint8_t event); bool animate() { return CScreen::animate(); }; diff --git a/Arduino/BTCDieselHeater/src/OLED/Screen.cpp b/Arduino/BTCDieselHeater/src/OLED/Screen.cpp index 3bfa466..e5d3b36 100644 --- a/Arduino/BTCDieselHeater/src/OLED/Screen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/Screen.cpp @@ -44,6 +44,10 @@ CScreen::onSelect() { } +void +CScreen::onExit() +{ +} void CScreen::_printMenuText(int x, int y, const char* str, bool selected, eJUSTIFY justify, int border, int radius) diff --git a/Arduino/BTCDieselHeater/src/OLED/Screen.h b/Arduino/BTCDieselHeater/src/OLED/Screen.h index 66af870..7198576 100644 --- a/Arduino/BTCDieselHeater/src/OLED/Screen.h +++ b/Arduino/BTCDieselHeater/src/OLED/Screen.h @@ -49,6 +49,7 @@ public: CScreen(C128x64_OLED& disp, CScreenManager& mgr); virtual ~CScreen(); virtual void onSelect(); + virtual void onExit(); virtual bool animate(); virtual bool show(); virtual bool keyHandler(uint8_t event) { return false; }; diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index f7b88ed..ca20f75 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -172,7 +172,7 @@ CScreenManager::begin(bool bNoClock) _currentScreen = 1; // basic control screen #endif - _switchScreen(); + _enterScreen(); } bool @@ -186,6 +186,7 @@ CScreenManager::checkUpdate() _pDisplay->dim(true); _DimTime = 0; + _leaveScreen(); // fall back to main menu selectTimerScreen(false); selectSetTimeScreen(false); @@ -195,6 +196,7 @@ CScreenManager::checkUpdate() if(_currentScreen > 2) { _currentScreen = 1; } + _enterScreen(); } } @@ -253,7 +255,7 @@ CScreenManager::refresh() } void -CScreenManager::_switchScreen() +CScreenManager::_enterScreen() { if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onSelect(); @@ -262,9 +264,19 @@ CScreenManager::_switchScreen() reqUpdate(); } +void +CScreenManager::_leaveScreen() +{ + if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit(); + else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onExit(); + else if(_currentScreen >= 0) _Screens[_currentScreen]->onExit(); +} + void CScreenManager::nextScreen() { + _leaveScreen(); + if(_bSetTime) { } @@ -280,12 +292,15 @@ CScreenManager::nextScreen() _currentScreen++; ROLLUPPERLIMIT(_currentScreen, _Screens.size()-1, 0); } - _switchScreen(); + + _enterScreen(); } void CScreenManager::prevScreen() { + _leaveScreen(); + if(_bSetTime) { } else if(_timerScreen >=0) { @@ -300,7 +315,7 @@ CScreenManager::prevScreen() _currentScreen--; ROLLLOWERLIMIT(_currentScreen, 0, _Screens.size()-1); } - _switchScreen(); + _enterScreen(); } void @@ -325,28 +340,31 @@ CScreenManager::keyHandler(uint8_t event) void CScreenManager::selectTimerScreen(bool show) { + _leaveScreen(); _timerScreen = show ? 0 : -1; _settingScreen = -1; _bSetTime = false; - _switchScreen(); + _enterScreen(); } void CScreenManager::selectSettingsScreen(bool show) { + _leaveScreen(); _settingScreen = show ? 0 : -1; _timerScreen = -1; _bSetTime = false; - _switchScreen(); + _enterScreen(); } void CScreenManager::selectSetTimeScreen(bool show) { + _leaveScreen(); _bSetTime = show; _settingScreen = -1; _timerScreen = -1; - _switchScreen(); + _enterScreen(); } void diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h index bc7d085..2040c94 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h @@ -42,7 +42,8 @@ class CScreenManager { bool _bSetTime; unsigned long _DimTime; bool _bReqUpdate; - void _switchScreen(); + void _enterScreen(); + void _leaveScreen(); CRebootScreen* _pRebootScreen; public: CScreenManager(); diff --git a/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.cpp index 3bdaed3..fef534e 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.cpp @@ -36,6 +36,18 @@ CSetClockScreen::CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) +{ + _initUI(); +} + +void +CSetClockScreen::onSelect() +{ + _initUI(); +} + +void +CSetClockScreen::_initUI() { _rowSel = 0; _nextT = millis(); @@ -148,7 +160,7 @@ CSetClockScreen::keyHandler(uint8_t event) _ScreenManager.selectSetTimeScreen(false); } else { - adjTimeDate(-1); + _adjTimeDate(-1); } } // press RIGHT @@ -157,7 +169,7 @@ CSetClockScreen::keyHandler(uint8_t event) _ScreenManager.selectSetTimeScreen(false); } else { - adjTimeDate(+1); + _adjTimeDate(+1); } } // press UP @@ -179,11 +191,11 @@ CSetClockScreen::keyHandler(uint8_t event) if(_rowSel>=1) { // hold RIGHT if(event & key_Right) { - adjTimeDate(+1); + _adjTimeDate(+1); } // hold LEFT if(event & key_Left) { - adjTimeDate(-1); + _adjTimeDate(-1); } } } @@ -194,7 +206,7 @@ CSetClockScreen::keyHandler(uint8_t event) } void -CSetClockScreen::adjTimeDate(int dir) +CSetClockScreen::_adjTimeDate(int dir) { int days; switch(_rowSel) { diff --git a/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.h b/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.h index a17346e..45dafdc 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/SetClockScreen.h @@ -36,10 +36,12 @@ class CSetClockScreen : public CScreenHeader { BTCDateTime working; unsigned long _SaveTime; - void adjTimeDate(int dir); + void _adjTimeDate(int dir); + void _initUI(); public: CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr); + void onSelect(); bool show(); void showTime(int); bool keyHandler(uint8_t event); diff --git a/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.cpp index 4f50310..24d8e35 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.cpp @@ -38,18 +38,25 @@ const char* briefDOW[] = { "S", "M", "T", "W", "T", "F", "S" }; CSetTimerScreen::CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance) : CScreenHeader(display, mgr) { - _rowSel = 0; - _colSel = 0; - _SaveTime = 0; + _initUI(); _instance = instance; } void CSetTimerScreen::onSelect() { + _initUI(); NVstore.getTimerInfo(_instance, _timer); } +void +CSetTimerScreen::_initUI() +{ + _rowSel = 0; + _colSel = 0; + _SaveTime = 0; +} + bool CSetTimerScreen::show() { @@ -207,8 +214,8 @@ CSetTimerScreen::keyHandler(uint8_t event) bHeld = true; if(_rowSel == 1) { if(_colSel < 4) { - if(event & key_Left) adjust(-1); - if(event & key_Right) adjust(+1); + if(event & key_Left) _adjust(-1); + if(event & key_Right) _adjust(+1); } else if(_colSel == 4) { if(event & key_Right) { @@ -233,7 +240,7 @@ CSetTimerScreen::keyHandler(uint8_t event) if(event & key_Left) { switch(_rowSel) { case 1: - adjust(-1); + _adjust(-1); break; } } @@ -257,7 +264,7 @@ CSetTimerScreen::keyHandler(uint8_t event) switch(_rowSel) { case 1: // adjust selected item - adjust(+1); + _adjust(+1); break; } } @@ -285,7 +292,7 @@ CSetTimerScreen::keyHandler(uint8_t event) void -CSetTimerScreen::adjust(int dir) +CSetTimerScreen::_adjust(int dir) { int days; int maskDOW = 0x01 << _colSel; // if doing Day of Week - (_rowSel == 2) diff --git a/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.h b/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.h index 2900472..497c66f 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.h @@ -36,8 +36,9 @@ class CSetTimerScreen : public CScreenHeader { int _instance; unsigned long _SaveTime; sTimer _timer; - void adjust(int dir); + void _adjust(int dir); void _printEnabledTimers(); + void _initUI(); public: CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance); diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp index 7c29dc3..d79c02f 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp @@ -42,11 +42,25 @@ static const int plugPowers[] = { 35, 40, 45, 80, 85, 90}; CSettingsScreen::CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) { + _initUI(); +} + +void +CSettingsScreen::onSelect() +{ + // ensure standard entry to screen - especially after a dimming timeout + CPasswordScreen::onSelect(); + _initUI(); +} + +void +CSettingsScreen::_initUI() +{ + // ensure standard entry to screen - especially after a dimming timeout _animateCount = 0; _nAdoptSettings = 0; } - bool CSettingsScreen::show() { diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h index 408b32f..0eaf5ab 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h @@ -31,11 +31,13 @@ class CScreenManager; class CSettingsScreen : public CPasswordScreen { int _animateCount; int _nAdoptSettings; + void _initUI(); public: CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); bool show(); bool keyHandler(uint8_t event); bool animate(); + void onSelect(); }; #endif \ No newline at end of file diff --git a/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.cpp index 382030d..dc8a88b 100644 --- a/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.cpp @@ -23,9 +23,6 @@ #include "KeyPad.h" #include "../Protocol/helpers.h" #include "../Wifi/BTCWifi.h" -// #include "fonts/Tahoma8.h" -// #include "fonts/FranklinGothic.h" -// #include "fonts/Arial.h" #include "../Utility/NVstorage.h" /////////////////////////////////////////////////////////////////////////// @@ -40,12 +37,23 @@ #define STA_HOLD_TIME 10 CWiFiScreen::CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) +{ + _initUI(); +} + +void +CWiFiScreen::onSelect() +{ + _initUI(); +} + +void +CWiFiScreen::_initUI() { _rowSel = 0; _bShowMAC = false; } - bool CWiFiScreen::show() { diff --git a/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.h b/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.h index cbd5489..dcb1b8e 100644 --- a/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/WiFiScreen.h @@ -31,12 +31,14 @@ class CScreenManager; class CWiFiScreen : public CScreenHeader { public: CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr); + void onSelect(); bool show(); bool keyHandler(uint8_t event); private: int _rowSel; int _repeatCount; bool _bShowMAC; + void _initUI(); }; #endif From 807709adc8bc9a586326d81087e697b7956f564a Mon Sep 17 00:00:00 2001 From: rljonesau Date: Sat, 2 Mar 2019 10:16:37 +1100 Subject: [PATCH 5/6] refactored inheritance of OEM settings into a new screen - MUCH TIDIER! --- .../src/OLED/FuelMixtureScreen.cpp | 1 + .../src/OLED/ScreenManager.cpp | 55 ++++++++--- .../BTCDieselHeater/src/OLED/ScreenManager.h | 5 +- .../src/OLED/SettingsScreen.cpp | 93 ++++--------------- .../BTCDieselHeater/src/OLED/SettingsScreen.h | 1 - 5 files changed, 67 insertions(+), 88 deletions(-) diff --git a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp index 92d4360..a032d52 100644 --- a/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/FuelMixtureScreen.cpp @@ -45,6 +45,7 @@ CFuelMixtureScreen::onSelect() { CPasswordScreen::onSelect(); _initUI(); + adjPump[0] = getHeaterInfo().getPump_Min(); adjPump[1] = getHeaterInfo().getPump_Max(); adjFan[0] = getHeaterInfo().getFan_Min(); diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index ca20f75..7beb7bb 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -10,6 +10,7 @@ #include "RebootScreen.h" #include "HeaterSettingsScreen.h" #include "SettingsScreen.h" +#include "InheritSettingsScreen.h" #include #include "../cfg/pins.h" #include "../cfg/BTCConfig.h" @@ -101,7 +102,8 @@ CScreenManager::CScreenManager() _timerScreen = -1; _settingScreen = -1; _bReqUpdate = false; - _bSetTime = false; + _bSetTimeScreenActive = false; + _bInheritScreenActive = false; _DimTime = millis() + 60000; _pRebootScreen = NULL; } @@ -165,6 +167,7 @@ CScreenManager::begin(bool bNoClock) _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 1)); // set timer 2 _SettingsScreens.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning _SettingsScreens.push_back(new CHeaterSettingsScreen(*_pDisplay, *this)); // tuning + _InheritScreen = new CInheritSettingsScreen(*_pDisplay, *this); // inherit OEM settings #if RTC_USE_DS3231==0 && RTC_USE_DS1307==0 && RTC_USE_PCF8523==0 _currentScreen = 6; // bring up clock set screen first if using millis based RTC! @@ -191,6 +194,7 @@ CScreenManager::checkUpdate() selectTimerScreen(false); selectSetTimeScreen(false); selectSettingsScreen(false); + selectInheritScreen(false); // sticky screens are Detailed Control, Basic Control, or Clock. // otherwise return to Basic Control screen if(_currentScreen > 2) { @@ -207,11 +211,16 @@ CScreenManager::checkUpdate() return true; } else { - if(_bSetTime) { + if(_bSetTimeScreenActive) { _SetTimeScreen->show(); _bReqUpdate = false; return true; } + else if(_bInheritScreenActive) { + _InheritScreen->show(); + _bReqUpdate = false; + return true; + } else if(_settingScreen >= 0) { _SettingsScreens[_settingScreen]->show(); _bReqUpdate = false; @@ -242,6 +251,8 @@ bool CScreenManager::animate() { if(_settingScreen >= 0) return _SettingsScreens[_settingScreen]->animate(); + if(_bSetTimeScreenActive) return _SetTimeScreen->animate(); + if(_bInheritScreenActive) return _InheritScreen->animate(); if(_timerScreen >= 0) return _TimerScreens[_timerScreen]->animate(); if(_currentScreen >= 0) return _Screens[_currentScreen]->animate(); return false; @@ -257,7 +268,9 @@ CScreenManager::refresh() void CScreenManager::_enterScreen() { - if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); + if(_bSetTimeScreenActive) _SetTimeScreen->onSelect(); + else if(_bInheritScreenActive) _InheritScreen->onSelect(); + else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onSelect(); else if(_currentScreen >= 0) _Screens[_currentScreen]->onSelect(); @@ -267,7 +280,9 @@ CScreenManager::_enterScreen() void CScreenManager::_leaveScreen() { - if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit(); + if(_bSetTimeScreenActive) _SetTimeScreen->onExit(); + else if(_bInheritScreenActive) _InheritScreen->onExit(); + else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit(); else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onExit(); else if(_currentScreen >= 0) _Screens[_currentScreen]->onExit(); } @@ -277,8 +292,9 @@ CScreenManager::nextScreen() { _leaveScreen(); - if(_bSetTime) { - + if(_bSetTimeScreenActive) { + } + else if(_bInheritScreenActive) { } else if(_timerScreen >= 0) { _timerScreen++; @@ -301,7 +317,9 @@ CScreenManager::prevScreen() { _leaveScreen(); - if(_bSetTime) { + if(_bSetTimeScreenActive) { + } + else if (_bInheritScreenActive) { } else if(_timerScreen >=0) { _timerScreen--; @@ -330,7 +348,8 @@ CScreenManager::keyHandler(uint8_t event) _DimTime = (millis() + NVstore.getDimTime()) | 1; // call handler for active screen - if(_bSetTime) _SetTimeScreen->keyHandler(event); + if(_bSetTimeScreenActive) _SetTimeScreen->keyHandler(event); + else if(_bInheritScreenActive) _InheritScreen->keyHandler(event); else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->keyHandler(event); else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->keyHandler(event); else if(_currentScreen >= 0) _Screens[_currentScreen]->keyHandler(event); @@ -343,7 +362,8 @@ CScreenManager::selectTimerScreen(bool show) _leaveScreen(); _timerScreen = show ? 0 : -1; _settingScreen = -1; - _bSetTime = false; + _bSetTimeScreenActive = false; + _bInheritScreenActive = false; _enterScreen(); } @@ -353,7 +373,8 @@ CScreenManager::selectSettingsScreen(bool show) _leaveScreen(); _settingScreen = show ? 0 : -1; _timerScreen = -1; - _bSetTime = false; + _bSetTimeScreenActive = false; + _bInheritScreenActive = false; _enterScreen(); } @@ -361,12 +382,24 @@ void CScreenManager::selectSetTimeScreen(bool show) { _leaveScreen(); - _bSetTime = show; + _bSetTimeScreenActive = show; + _bInheritScreenActive = false; _settingScreen = -1; _timerScreen = -1; _enterScreen(); } +void +CScreenManager::selectInheritScreen(bool show) +{ + _leaveScreen(); + _bInheritScreenActive = show; + _bSetTimeScreenActive = false; + _timerScreen = -1; + _settingScreen = -1; + _enterScreen(); +} + void CScreenManager::showRebootMsg(const char* content[2], long delayTime) { diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h index 2040c94..33adb88 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h @@ -35,11 +35,13 @@ class CScreenManager { std::vector _TimerScreens; std::vector _SettingsScreens; CScreen* _SetTimeScreen; + CScreen* _InheritScreen; C128x64_OLED* _pDisplay; int _currentScreen; int _timerScreen; int _settingScreen; - bool _bSetTime; + bool _bSetTimeScreenActive; + bool _bInheritScreenActive; unsigned long _DimTime; bool _bReqUpdate; void _enterScreen(); @@ -60,6 +62,7 @@ public: void selectTimerScreen(bool show); void selectSetTimeScreen(bool show); void selectSettingsScreen(bool show); + void selectInheritScreen(bool show); }; #endif // __SCREEN_MANAGER_H__ diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp index d79c02f..c366d48 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.cpp @@ -58,7 +58,6 @@ CSettingsScreen::_initUI() { // ensure standard entry to screen - especially after a dimming timeout _animateCount = 0; - _nAdoptSettings = 0; } bool @@ -73,36 +72,18 @@ CSettingsScreen::show() if(!CPasswordScreen::show()) { - if(_nAdoptSettings == 1) { - _display.clearDisplay(); - _display.writeFillRect(0, 0, 128, 24, WHITE); - _printInverted(_display.xCentre(), 4, "Adopt LCD controller", true, eCentreJustify); - _printInverted(_display.xCentre(), 13, "settings? ", true, eCentreJustify); - _printMenuText(_display.xCentre(), 35, "Press RIGHT to", false, eCentreJustify); - _printMenuText(_display.xCentre(), 45, "inherit and save", false, eCentreJustify); - } - else if(_nAdoptSettings == 2) { - _display.clearDisplay(); - _display.writeFillRect(0, 0, 128, 24, WHITE); - _printInverted(_display.xCentre(), 4, " Cannot inherit knob ", true, eCentreJustify); - _printInverted(_display.xCentre(), 13, " controller settings ", true, eCentreJustify); - _printMenuText(_display.xCentre(), 35, "Press any key", false, eCentreJustify); - _printMenuText(_display.xCentre(), 45, "to abort", false, eCentreJustify); - } - else { - sprintf(str, "%.0fV", getHeaterInfo().getSystemVoltage()); - _printMenuText(_display.width(), Line3, str, false, eRightJustify); + sprintf(str, "%.0fV", getHeaterInfo().getSystemVoltage()); + _printMenuText(_display.width(), Line3, str, false, eRightJustify); - sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min()); - _printMenuText(0, Line2, str); + sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min()); + _printMenuText(0, Line2, str); - sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max()); - _printMenuText(0, Line1, str); + sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max()); + _printMenuText(0, Line1, str); - int yPos = 53; - int xPos = _display.xCentre(); - _printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify); - } + int yPos = 53; + int xPos = _display.xCentre(); + _printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify); } return true; @@ -120,7 +101,7 @@ CSettingsScreen::animate() _printMenuText(Column, Line1, " "); _printMenuText(Column, Line2, " "); } - else if(_nAdoptSettings == 0) { + else { _animateCount++; ROLLUPPERLIMIT(_animateCount, 9, 0); @@ -166,23 +147,8 @@ CSettingsScreen::keyHandler(uint8_t event) { if(CPasswordScreen::keyHandler(event)) { if(_isPasswordOK()) { - if(_nAdoptSettings == 3) { - setPumpMin(getHeaterInfo().getPump_Min()); - setPumpMax(getHeaterInfo().getPump_Max()); - setFanMin(getHeaterInfo().getFan_Min()); - setFanMax(getHeaterInfo().getFan_Max()); - setFanSensor(getHeaterInfo().getFan_Sensor()); - setSystemVoltage(getHeaterInfo().getSystemVoltage()); - saveNV(); - _showStoringMessage(); - _nAdoptSettings = 0; - } - else { - _ScreenManager.selectSettingsScreen(true); - } + _ScreenManager.selectSettingsScreen(true); } - if(!isPasswordBusy()) - _nAdoptSettings = 0; } else { @@ -190,48 +156,25 @@ CSettingsScreen::keyHandler(uint8_t event) if(event & keyPressed) { // press LEFT if(event & key_Left) { - if(_nAdoptSettings == 0) - _ScreenManager.prevScreen(); - _nAdoptSettings = 0; + _ScreenManager.prevScreen(); } // press RIGHT if(event & key_Right) { - if(_nAdoptSettings == 1) { - _nAdoptSettings = 3; - _getPassword(); - } - else { - if(_nAdoptSettings == 0) - _ScreenManager.nextScreen(); - _nAdoptSettings = 0; - } + _ScreenManager.nextScreen(); } // press UP if(event & (key_Up | key_Centre)) { - if(_nAdoptSettings == 0) { - if(hasOEMcontroller()) { - if(event & key_Centre) - _reqOEMWarning(); - else { - if(hasOEMLCDcontroller()) { - _nAdoptSettings = 1; - } - else { - _nAdoptSettings = 2; - } - } - } + if(hasOEMcontroller()) { + if(event & key_Centre) + _reqOEMWarning(); else { - _getPassword(); + _ScreenManager.selectInheritScreen(true); } } else { - _nAdoptSettings = 0; + _getPassword(); } } - if(event & key_Down) { - _nAdoptSettings = 0; - } } } _ScreenManager.reqUpdate(); diff --git a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h index 0eaf5ab..553b5bb 100644 --- a/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/SettingsScreen.h @@ -30,7 +30,6 @@ class CScreenManager; class CSettingsScreen : public CPasswordScreen { int _animateCount; - int _nAdoptSettings; void _initUI(); public: CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); From 83f564cf95741f1fec63beb80a6e8f449cbe019d Mon Sep 17 00:00:00 2001 From: rljonesau Date: Sat, 2 Mar 2019 10:32:50 +1100 Subject: [PATCH 6/6] tidied CScreenManager --- .../src/OLED/ScreenManager.cpp | 150 +++++++++--------- .../BTCDieselHeater/src/OLED/ScreenManager.h | 9 +- 2 files changed, 81 insertions(+), 78 deletions(-) diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index 7beb7bb..87907f5 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -98,9 +98,9 @@ const unsigned char DieselSplash [] PROGMEM = { CScreenManager::CScreenManager() { _pDisplay = NULL; - _currentScreen = -1; + _rootMenuScreen = -1; _timerScreen = -1; - _settingScreen = -1; + _tuningScreen = -1; _bReqUpdate = false; _bSetTimeScreenActive = false; _bInheritScreenActive = false; @@ -110,10 +110,10 @@ CScreenManager::CScreenManager() CScreenManager::~CScreenManager() { - for(int i=0; i < _Screens.size(); i++) { - if(_Screens[i]) { - delete _Screens[i]; - _Screens[i] = NULL; + for(int i=0; i < _RootScreens.size(); i++) { + if(_RootScreens[i]) { + delete _RootScreens[i]; + _RootScreens[i] = NULL; } } for(int i=0; i < _TimerScreens.size(); i++) { @@ -155,24 +155,24 @@ CScreenManager::begin(bool bNoClock) _pDisplay->display(); DebugPort.println("Creating Screens"); - _Screens.push_back(new CDetailedScreen(*_pDisplay, *this)); // detail control - _Screens.push_back(new CBasicScreen(*_pDisplay, *this)); // basic control + _RootScreens.push_back(new CDetailedScreen(*_pDisplay, *this)); // detail control + _RootScreens.push_back(new CBasicScreen(*_pDisplay, *this)); // basic control if(!bNoClock) - _Screens.push_back(new CClockScreen(*_pDisplay, *this)); // clock - _Screens.push_back(new CPrimingScreen(*_pDisplay, *this)); // mode / priming - _Screens.push_back(new CWiFiScreen(*_pDisplay, *this)); // comms info - _Screens.push_back(new CSettingsScreen(*_pDisplay, *this)); // tuning info - _SetTimeScreen = new CSetClockScreen(*_pDisplay, *this); // clock set + _RootScreens.push_back(new CClockScreen(*_pDisplay, *this)); // clock + _RootScreens.push_back(new CPrimingScreen(*_pDisplay, *this)); // mode / priming + _RootScreens.push_back(new CWiFiScreen(*_pDisplay, *this)); // comms info + _RootScreens.push_back(new CSettingsScreen(*_pDisplay, *this)); // tuning info _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 0)); // set timer 1 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 1)); // set timer 2 - _SettingsScreens.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning - _SettingsScreens.push_back(new CHeaterSettingsScreen(*_pDisplay, *this)); // tuning - _InheritScreen = new CInheritSettingsScreen(*_pDisplay, *this); // inherit OEM settings + _TuningScreens.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning + _TuningScreens.push_back(new CHeaterSettingsScreen(*_pDisplay, *this)); // tuning + _SetTimeScreen = new CSetClockScreen(*_pDisplay, *this); // clock set + _InheritScreen = new CInheritSettingsScreen(*_pDisplay, *this); // inherit OEM settings #if RTC_USE_DS3231==0 && RTC_USE_DS1307==0 && RTC_USE_PCF8523==0 - _currentScreen = 6; // bring up clock set screen first if using millis based RTC! + _rootMenuScreen = 6; // bring up clock set screen first if using millis based RTC! #else - _currentScreen = 1; // basic control screen + _rootMenuScreen = 1; // basic control screen #endif _enterScreen(); @@ -197,8 +197,8 @@ CScreenManager::checkUpdate() selectInheritScreen(false); // sticky screens are Detailed Control, Basic Control, or Clock. // otherwise return to Basic Control screen - if(_currentScreen > 2) { - _currentScreen = 1; + if(_rootMenuScreen > 2) { + _rootMenuScreen = 1; } _enterScreen(); } @@ -221,8 +221,8 @@ CScreenManager::checkUpdate() _bReqUpdate = false; return true; } - else if(_settingScreen >= 0) { - _SettingsScreens[_settingScreen]->show(); + else if(_tuningScreen >= 0) { + _TuningScreens[_tuningScreen]->show(); _bReqUpdate = false; return true; } @@ -231,8 +231,8 @@ CScreenManager::checkUpdate() _bReqUpdate = false; return true; } - else if(_currentScreen >= 0) { - _Screens[_currentScreen]->show(); + else if(_rootMenuScreen >= 0) { + _RootScreens[_rootMenuScreen]->show(); _bReqUpdate = false; return true; } @@ -250,11 +250,11 @@ CScreenManager::reqUpdate() bool CScreenManager::animate() { - if(_settingScreen >= 0) return _SettingsScreens[_settingScreen]->animate(); + if(_tuningScreen >= 0) return _TuningScreens[_tuningScreen]->animate(); if(_bSetTimeScreenActive) return _SetTimeScreen->animate(); if(_bInheritScreenActive) return _InheritScreen->animate(); - if(_timerScreen >= 0) return _TimerScreens[_timerScreen]->animate(); - if(_currentScreen >= 0) return _Screens[_currentScreen]->animate(); + if(_timerScreen >= 0) return _TimerScreens[_timerScreen]->animate(); + if(_rootMenuScreen >= 0) return _RootScreens[_rootMenuScreen]->animate(); return false; } @@ -268,11 +268,11 @@ CScreenManager::refresh() void CScreenManager::_enterScreen() { - if(_bSetTimeScreenActive) _SetTimeScreen->onSelect(); + if(_bSetTimeScreenActive) _SetTimeScreen->onSelect(); else if(_bInheritScreenActive) _InheritScreen->onSelect(); - else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); - else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onSelect(); - else if(_currentScreen >= 0) _Screens[_currentScreen]->onSelect(); + else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); + else if(_tuningScreen >= 0) _TuningScreens[_tuningScreen]->onSelect(); + else if(_rootMenuScreen >= 0) _RootScreens[_rootMenuScreen]->onSelect(); reqUpdate(); } @@ -280,60 +280,61 @@ CScreenManager::_enterScreen() void CScreenManager::_leaveScreen() { - if(_bSetTimeScreenActive) _SetTimeScreen->onExit(); + if(_bSetTimeScreenActive) _SetTimeScreen->onExit(); else if(_bInheritScreenActive) _InheritScreen->onExit(); - else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit(); - else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onExit(); - else if(_currentScreen >= 0) _Screens[_currentScreen]->onExit(); + else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit(); + else if(_tuningScreen >= 0) _TuningScreens[_tuningScreen]->onExit(); + else if(_rootMenuScreen >= 0) _RootScreens[_rootMenuScreen]->onExit(); } void CScreenManager::nextScreen() { - _leaveScreen(); - - if(_bSetTimeScreenActive) { - } - else if(_bInheritScreenActive) { + if(_bSetTimeScreenActive || _bInheritScreenActive) { } else if(_timerScreen >= 0) { + _leaveScreen(); _timerScreen++; ROLLUPPERLIMIT(_timerScreen, _TimerScreens.size()-1, 0); + _enterScreen(); } - else if(_settingScreen >= 0) { - _settingScreen++; - ROLLUPPERLIMIT(_settingScreen, _SettingsScreens.size()-1, 0); + else if(_tuningScreen >= 0) { + _leaveScreen(); + _tuningScreen++; + ROLLUPPERLIMIT(_tuningScreen, _TuningScreens.size()-1, 0); + _enterScreen(); } else { - _currentScreen++; - ROLLUPPERLIMIT(_currentScreen, _Screens.size()-1, 0); + _leaveScreen(); + _rootMenuScreen++; + ROLLUPPERLIMIT(_rootMenuScreen, _RootScreens.size()-1, 0); + _enterScreen(); } - - _enterScreen(); } void CScreenManager::prevScreen() { - _leaveScreen(); - - if(_bSetTimeScreenActive) { - } - else if (_bInheritScreenActive) { + if(_bSetTimeScreenActive || _bInheritScreenActive) { } else if(_timerScreen >=0) { + _leaveScreen(); _timerScreen--; ROLLLOWERLIMIT(_timerScreen, 0, _TimerScreens.size()-1); + _enterScreen(); } - else if(_settingScreen >= 0) { - _settingScreen--; - ROLLLOWERLIMIT(_settingScreen, 0, _SettingsScreens.size()-1); + else if(_tuningScreen >= 0) { + _leaveScreen(); + _tuningScreen--; + ROLLLOWERLIMIT(_tuningScreen, 0, _TuningScreens.size()-1); + _enterScreen(); } else { - _currentScreen--; - ROLLLOWERLIMIT(_currentScreen, 0, _Screens.size()-1); + _leaveScreen(); + _rootMenuScreen--; + ROLLLOWERLIMIT(_rootMenuScreen, 0, _RootScreens.size()-1); + _enterScreen(); } - _enterScreen(); } void @@ -347,23 +348,30 @@ CScreenManager::keyHandler(uint8_t event) _DimTime = (millis() + NVstore.getDimTime()) | 1; - // call handler for active screen + // call key handler for active screen if(_bSetTimeScreenActive) _SetTimeScreen->keyHandler(event); else if(_bInheritScreenActive) _InheritScreen->keyHandler(event); - else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->keyHandler(event); + else if(_tuningScreen >= 0) _TuningScreens[_tuningScreen]->keyHandler(event); else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->keyHandler(event); - else if(_currentScreen >= 0) _Screens[_currentScreen]->keyHandler(event); + else if(_rootMenuScreen >= 0) _RootScreens[_rootMenuScreen]->keyHandler(event); } +void +CScreenManager::_cancelBranchScreens() +{ + _timerScreen = -1; + _tuningScreen = -1; + _bSetTimeScreenActive = false; + _bInheritScreenActive = false; +} + void CScreenManager::selectTimerScreen(bool show) { _leaveScreen(); + _cancelBranchScreens(); _timerScreen = show ? 0 : -1; - _settingScreen = -1; - _bSetTimeScreenActive = false; - _bInheritScreenActive = false; _enterScreen(); } @@ -371,10 +379,8 @@ void CScreenManager::selectSettingsScreen(bool show) { _leaveScreen(); - _settingScreen = show ? 0 : -1; - _timerScreen = -1; - _bSetTimeScreenActive = false; - _bInheritScreenActive = false; + _cancelBranchScreens(); + _tuningScreen = show ? 0 : -1; _enterScreen(); } @@ -382,10 +388,8 @@ void CScreenManager::selectSetTimeScreen(bool show) { _leaveScreen(); + _cancelBranchScreens(); _bSetTimeScreenActive = show; - _bInheritScreenActive = false; - _settingScreen = -1; - _timerScreen = -1; _enterScreen(); } @@ -393,10 +397,8 @@ void CScreenManager::selectInheritScreen(bool show) { _leaveScreen(); + _cancelBranchScreens(); _bInheritScreenActive = show; - _bSetTimeScreenActive = false; - _timerScreen = -1; - _settingScreen = -1; _enterScreen(); } diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h index 33adb88..f816a1d 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h @@ -31,21 +31,22 @@ class CScreen; class CRebootScreen; class CScreenManager { - std::vector _Screens; + std::vector _RootScreens; std::vector _TimerScreens; - std::vector _SettingsScreens; + std::vector _TuningScreens; CScreen* _SetTimeScreen; CScreen* _InheritScreen; C128x64_OLED* _pDisplay; - int _currentScreen; + int _rootMenuScreen; int _timerScreen; - int _settingScreen; + int _tuningScreen; bool _bSetTimeScreenActive; bool _bInheritScreenActive; unsigned long _DimTime; bool _bReqUpdate; void _enterScreen(); void _leaveScreen(); + void _cancelBranchScreens(); CRebootScreen* _pRebootScreen; public: CScreenManager();