diff --git a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp index 640347a..b95bfe8 100644 --- a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.cpp @@ -25,7 +25,6 @@ #include "../Protocol/helpers.h" #include "../Utility/UtilClasses.h" - /////////////////////////////////////////////////////////////////////////// // // CHeaterSettingsScreen @@ -34,19 +33,27 @@ // /////////////////////////////////////////////////////////////////////////// +static const int Line3 = 14; +static const int Line2 = 27; +static const int Line1 = 40; +static const int Column = 96; + +static const int plugPowers[] = { 35, 40, 45, 80, 85, 90}; + CHeaterSettingsScreen::CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) { _rowSel = 0; _fanSensor = 1; - _glowPower = 5; + _glowDrive = 5; _sysVoltage = 12; + _animateCount = 0; } void CHeaterSettingsScreen::onSelect() { _fanSensor = getHeaterInfo().getFan_Sensor(); - _glowPower = getHeaterInfo().getGlow_Drive(); + _glowDrive = getHeaterInfo().getGlow_Drive(); _sysVoltage = int(getHeaterInfo().getSystemVoltage()); } @@ -54,12 +61,8 @@ bool CHeaterSettingsScreen::show() { char msg[20]; - int xPos, yPos; _display.clearDisplay(); - - yPos = 14; - if(!CPasswordScreen::show()) { // for showing "saving settings" if(_rowSel == 4) { @@ -69,20 +72,14 @@ CHeaterSettingsScreen::show() } else { _printInverted(_display.xCentre(), 0, " Heater Settings ", true, eCentreJustify); - _printMenuText(98, yPos, "Glow plug power:", false, eRightJustify); - sprintf(msg, "PF-%d", _glowPower); - _printMenuText(100, yPos, msg, _rowSel == 3); - yPos = 27; - _printMenuText(98, yPos, "Fan sensor:", false, eRightJustify); - sprintf(msg, "SN-%d", _fanSensor); - _printMenuText(100, yPos, msg, _rowSel == 2); - yPos = 40; - _printMenuText(98, yPos, "System voltage:", false, eRightJustify); + _printMenuText(97, Line3, "System voltage:", false, eRightJustify); + _printMenuText(97, Line2, "Fan sensor:", false, eRightJustify); + _printMenuText(97, Line1, "Glowplug power:", false, eRightJustify); sprintf(msg, "%dV", _sysVoltage); - _printMenuText(100, yPos, msg, _rowSel == 1); + _printMenuText(Column, Line3, msg, _rowSel == 3); // navigation line - yPos = 53; - xPos = _display.xCentre(); + int yPos = 53; + int xPos = _display.xCentre(); _printMenuText(xPos, yPos, "<- exit ->", _rowSel == 0, eCentreJustify); } } @@ -91,6 +88,61 @@ CHeaterSettingsScreen::show() } +bool +CHeaterSettingsScreen::animate() +{ + char msg[16]; + + if(isPasswordBusy() || (_rowSel == 4)) { // Password screen activity + _printMenuText(Column, Line2, " "); + _printMenuText(Column, Line1, " "); + if(_rowSel == 4) + _printMenuText(_display.xCentre(), 43, "confirm save", false, eCentreJustify); + } + else { + _animateCount++; + ROLLUPPERLIMIT(_animateCount, 9, 0); + + if(_rowSel == 1) { + _display.drawRect(Column-border, Line1-border, 34, 8+2*border, BLACK); + _display.drawRoundRect(Column-border, Line1-border, 34, 8+2*border, radius, WHITE); + } + else { + _printMenuText(Column, Line1, " "); + } + + if(_animateCount < 4) + sprintf(msg, "PF-%d ", _glowDrive); + else + sprintf(msg, "(%dW)", plugPowers[_glowDrive-1]); + _printMenuText(Column, Line1, msg); + + int xPos = Column; + _printMenuText(xPos, Line2, " ", _rowSel == 2); // erase, but create selection loop + if(_animateCount < 4) { + sprintf(msg, "SN-%d", _fanSensor); + _printMenuText(Column, Line2, msg/*, _rowSel == 2*/); + } + else { + _printMenuText(xPos, Line2, "("); + xPos += 6; + // . + // draw old fashioned divide symbol ----- + // . + int barOfs = 3; + _display.drawLine(xPos, Line2+barOfs, xPos+4, Line2+barOfs, WHITE); + _display.drawPixel(xPos+2, Line2+barOfs-2, WHITE); + _display.drawPixel(xPos+2, Line2+barOfs+2, WHITE); + xPos += 6; + sprintf(msg, "%d)", _fanSensor); + _printMenuText(xPos, Line2, msg); + } + + } + return true; +} + + bool CHeaterSettingsScreen::keyHandler(uint8_t event) { @@ -145,7 +197,7 @@ CHeaterSettingsScreen::keyHandler(uint8_t event) _showStoringMessage(); setSystemVoltage(float(_sysVoltage)); setFanSensor(_fanSensor); - setGlowDrive(_glowPower); + setGlowDrive(_glowDrive); saveNV(); _rowSel = 0; break; @@ -174,16 +226,16 @@ void CHeaterSettingsScreen::_adjust(int dir) { switch(_rowSel) { - case 1: // system voltage - _sysVoltage = (_sysVoltage == 12) ? 24 : 12; + case 1: // glow power + _glowDrive += dir; + UPPERLIMIT(_glowDrive, 6); + LOWERLIMIT(_glowDrive, 1); break; case 2: // fan sensor _fanSensor = (_fanSensor == 1) ? 2 : 1; break; - case 3: // glow power - _glowPower += dir; - UPPERLIMIT(_glowPower, 6); - LOWERLIMIT(_glowPower, 1); + case 3: // system voltage + _sysVoltage = (_sysVoltage == 12) ? 24 : 12; break; } } diff --git a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h index 60bafcd..76e9445 100644 --- a/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/HeaterSettingsScreen.h @@ -34,10 +34,12 @@ class CHeaterSettingsScreen : public CPasswordScreen void _adjust(int dir); int _sysVoltage; int _fanSensor; - int _glowPower; + int _glowDrive; + int _animateCount; public: CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); bool show(); + bool animate(); bool keyHandler(uint8_t event); void onSelect(); }; diff --git a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h index 26b1295..2bb0b6e 100644 --- a/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h +++ b/Arduino/BTCDieselHeater/src/OLED/PasswordScreen.h @@ -43,6 +43,7 @@ public: bool show(); bool keyHandler(uint8_t event); bool animate() { return CScreen::animate(); }; + bool isPasswordBusy() { return (_SaveTime != 0) || _bGetPassword; }; }; #endif \ No newline at end of file diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index ed15411..c06f23d 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -199,7 +199,6 @@ CScreenManager::checkUpdate() return true; } else if(_settingScreen >= 0) { - DebugPort.println("setting screen show"); _SettingsScreens[_settingScreen]->show(); _bReqUpdate = false; return true; @@ -228,15 +227,9 @@ CScreenManager::reqUpdate() bool CScreenManager::animate() { - if(_settingScreen >= 0) { - return _SettingsScreens[_settingScreen]->animate(); - } - if(_timerScreen >= 0) { - return _TimerScreens[_timerScreen]->animate(); - } - if(_currentScreen >= 0) { - return _Screens[_currentScreen]->animate(); - } + if(_settingScreen >= 0) return _SettingsScreens[_settingScreen]->animate(); + if(_timerScreen >= 0) return _TimerScreens[_timerScreen]->animate(); + if(_currentScreen >= 0) return _Screens[_currentScreen]->animate(); return false; } @@ -250,13 +243,9 @@ CScreenManager::refresh() void CScreenManager::_switchScreen() { - if(_timerScreen >= 0) - _TimerScreens[_timerScreen]->onSelect(); - else if(_settingScreen >= 0) { - _SettingsScreens[_settingScreen]->onSelect(); - } - else if(_currentScreen >= 0) - _Screens[_currentScreen]->onSelect(); + if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); + else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onSelect(); + else if(_currentScreen >= 0) _Screens[_currentScreen]->onSelect(); reqUpdate(); } @@ -305,21 +294,20 @@ CScreenManager::prevScreen() void CScreenManager::keyHandler(uint8_t event) { - if(_bSetTime) - _SetTimeScreen->keyHandler(event); - else if(_settingScreen >= 0) { - DebugPort.println("setting screen keyhandler"); - _SettingsScreens[_settingScreen]->keyHandler(event); - } - else if(_timerScreen >= 0) - _TimerScreens[_timerScreen]->keyHandler(event); - else if(_currentScreen >= 0) - _Screens[_currentScreen]->keyHandler(event); - - if(_DimTime == 0) + if(_DimTime == 0) { _pDisplay->dim(false); + _DimTime = (millis() + NVstore.getDimTime()) | 1; + return; // initial press when dimmed is thrown away + } + _DimTime = (millis() + NVstore.getDimTime()) | 1; -// _DimTime = (millis() + 60000) | 1; + + // call handler for active screen + if(_bSetTime) _SetTimeScreen->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); + } void