Merge branch 'master' into 7dayTimers

Resolved  Conflicts:
	Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp
	Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.cpp
	Arduino/BTCDieselHeater/src/OLED/SetTimerScreen.h
This commit is contained in:
rljonesau 2019-03-02 10:59:19 +11:00
commit df4a1837d9
25 changed files with 319 additions and 106 deletions

View file

@ -159,6 +159,7 @@ TelnetSpy DebugPort;
sRxLine PCline; sRxLine PCline;
long lastRxTime; // used to observe inter character delays long lastRxTime; // used to observe inter character delays
bool bHasOEMController = false; bool bHasOEMController = false;
bool bHasOEMLCDController = false;
bool bHasHtrData = false; bool bHasHtrData = false;
bool bReportBlueWireData = REPORT_RAW_DATA; bool bReportBlueWireData = REPORT_RAW_DATA;
@ -488,6 +489,7 @@ void loop()
} }
if(CommState.is(CommStates::OEMCtrlRx)) { if(CommState.is(CommStates::OEMCtrlRx)) {
bHasOEMController = false; bHasOEMController = false;
bHasOEMLCDController = false;
if(bReportRecyleEvents) if(bReportRecyleEvents)
DebugPort.println("Timeout collecting OEM controller data, returning to Idle State"); 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. // Skip state machine immediately to BTC_Tx, sending our own settings.
bHasHtrData = false; bHasHtrData = false;
bHasOEMController = false; bHasOEMController = false;
bHasOEMLCDController = false;
bool isBTCmaster = true; bool isBTCmaster = true;
TxManage.PrepareFrame(DefaultBTCParams, isBTCmaster); // use our parameters, and mix in NV storage values TxManage.PrepareFrame(DefaultBTCParams, isBTCmaster); // use our parameters, and mix in NV storage values
TxManage.Start(timenow); TxManage.Start(timenow);
@ -593,6 +596,9 @@ void loop()
// filled OEM controller frame // filled OEM controller frame
OEMCtrlFrame.setTime(); OEMCtrlFrame.setTime();
// LCD controllers use 0x76 as first byte, rotary knobs use 0x78
bHasOEMLCDController = (OEMCtrlFrame.Controller.Byte0 != 0x78);
CommState.set(CommStates::HeaterRx1); CommState.set(CommStates::HeaterRx1);
break; break;
@ -1125,6 +1131,11 @@ bool hasOEMcontroller()
return bHasOEMController; return bHasOEMController;
} }
bool hasOEMLCDcontroller()
{
return bHasOEMLCDController;
}
int getSmartError() int getSmartError()
{ {
return SmartError.getError(); return SmartError.getError();

View file

@ -112,6 +112,9 @@ CDetailedScreen::show()
showGlowPlug(power); showGlowPlug(power);
} }
if(_showTarget)
showFanV(getHeaterInfo().getFan_Voltage());
else
showFan(getHeaterInfo().getFan_Actual()); showFan(getHeaterInfo().getFan_Actual());
showFuel(getHeaterInfo().getPump_Actual()); showFuel(getHeaterInfo().getPump_Actual());
@ -227,6 +230,7 @@ CDetailedScreen::keyHandler(uint8_t event)
if(event & key_Centre) { // short Centre press - show target if(event & key_Centre) { // short Centre press - show target
_showTarget = millis() + 3500; _showTarget = millis() + 3500;
} }
_ScreenManager.reqUpdate();
} }
_keyRepeatCount = -1; _keyRepeatCount = -1;
} }
@ -354,6 +358,21 @@ CDetailedScreen::showFan(int RPM)
_printMenuText(X_FAN_ICON + (W_FAN_ICON/2), Y_BASELINE, msg, false, eCentreJustify); _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 void
CDetailedScreen::showFuel(float rate) CDetailedScreen::showFuel(float rate)
{ {

View file

@ -45,6 +45,7 @@ class CDetailedScreen : public CScreenHeader
void showBodyThermometer(int actual); void showBodyThermometer(int actual);
void showGlowPlug(float power); void showGlowPlug(float power);
void showFan(int RPM); void showFan(int RPM);
void showFanV(float volts);
void showFuel(float rate); void showFuel(float rate);
void showRunState(int state, int errstate); void showRunState(int state, int errstate);
public: public:

View file

@ -37,19 +37,28 @@
CFuelMixtureScreen::CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) CFuelMixtureScreen::CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr)
{ {
_rowSel = 0; _initUI();
_colSel = 0;
} }
void void
CFuelMixtureScreen::onSelect() CFuelMixtureScreen::onSelect()
{ {
CPasswordScreen::onSelect();
_initUI();
adjPump[0] = getHeaterInfo().getPump_Min(); adjPump[0] = getHeaterInfo().getPump_Min();
adjPump[1] = getHeaterInfo().getPump_Max(); adjPump[1] = getHeaterInfo().getPump_Max();
adjFan[0] = getHeaterInfo().getFan_Min(); adjFan[0] = getHeaterInfo().getFan_Min();
adjFan[1] = getHeaterInfo().getFan_Max(); adjFan[1] = getHeaterInfo().getFan_Max();
} }
void
CFuelMixtureScreen::_initUI()
{
_rowSel = 0;
_colSel = 0;
}
bool bool
CFuelMixtureScreen::show() CFuelMixtureScreen::show()
{ {

View file

@ -34,6 +34,7 @@ class CFuelMixtureScreen : public CPasswordScreen {
int _rowSel; int _rowSel;
int _colSel; int _colSel;
void _adjustSetting(int dir); void _adjustSetting(int dir);
void _initUI();
public: public:
CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr); CFuelMixtureScreen(C128x64_OLED& display, CScreenManager& mgr);

View file

@ -42,21 +42,29 @@ static const int plugPowers[] = { 35, 40, 45, 80, 85, 90};
CHeaterSettingsScreen::CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) CHeaterSettingsScreen::CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr)
{ {
_rowSel = 0; _initUI();
_fanSensor = 1; _fanSensor = 1;
_glowDrive = 5; _glowDrive = 5;
_sysVoltage = 12; _sysVoltage = 12;
_animateCount = 0;
} }
void void
CHeaterSettingsScreen::onSelect() CHeaterSettingsScreen::onSelect()
{ {
CPasswordScreen::onSelect();
_initUI();
_fanSensor = getHeaterInfo().getFan_Sensor(); _fanSensor = getHeaterInfo().getFan_Sensor();
_glowDrive = getHeaterInfo().getGlow_Drive(); _glowDrive = getHeaterInfo().getGlow_Drive();
_sysVoltage = int(getHeaterInfo().getSystemVoltage()); _sysVoltage = int(getHeaterInfo().getSystemVoltage());
} }
void
CHeaterSettingsScreen::_initUI()
{
_rowSel = 0;
_animateCount = 0;
}
bool bool
CHeaterSettingsScreen::show() CHeaterSettingsScreen::show()
{ {

View file

@ -36,6 +36,7 @@ class CHeaterSettingsScreen : public CPasswordScreen
int _fanSensor; int _fanSensor;
int _glowDrive; int _glowDrive;
int _animateCount; int _animateCount;
void _initUI();
public: public:
CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); CHeaterSettingsScreen(C128x64_OLED& display, CScreenManager& mgr);
bool show(); bool show();

View file

@ -36,6 +36,18 @@
CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr)
{
_initUI();
}
void
CPasswordScreen::onSelect()
{
_initUI();
}
void
CPasswordScreen::_initUI()
{ {
_bGetPassword = false; _bGetPassword = false;
_bPasswordOK = false; _bPasswordOK = false;
@ -45,7 +57,6 @@ CPasswordScreen::CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr) : C
_SaveTime = 0; _SaveTime = 0;
} }
bool bool
CPasswordScreen::show() CPasswordScreen::show()
{ {

View file

@ -38,8 +38,10 @@ protected:
void _getPassword(); void _getPassword();
bool _isPasswordOK() { return _bPasswordOK; }; bool _isPasswordOK() { return _bPasswordOK; };
void _showStoringMessage(); void _showStoringMessage();
void _initUI();
public: public:
CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr); CPasswordScreen(C128x64_OLED& display, CScreenManager& mgr);
void onSelect();
bool show(); bool show();
bool keyHandler(uint8_t event); bool keyHandler(uint8_t event);
bool animate(); bool animate();

View file

@ -35,6 +35,26 @@
CPrimingScreen::CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) 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; _PrimeStop = 0;
_PrimeCheck = 0; _PrimeCheck = 0;
@ -42,7 +62,6 @@ CPrimingScreen::CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr) : CSc
_colSel = 0; _colSel = 0;
} }
bool bool
CPrimingScreen::show() CPrimingScreen::show()
{ {
@ -92,12 +111,12 @@ CPrimingScreen::show()
// recognise if heater has stopped pump, after an initial holdoff upon first starting // recognise if heater has stopped pump, after an initial holdoff upon first starting
long tDelta = millis() - _PrimeCheck; long tDelta = millis() - _PrimeCheck;
if(_PrimeCheck && tDelta > 0 && pumpHz < 0.1) { if(_PrimeCheck && tDelta > 0 && pumpHz < 0.1) {
stopPump(); _stopPump();
} }
// test if time is up, stop priming if so // test if time is up, stop priming if so
tDelta = millis() - _PrimeStop; tDelta = millis() - _PrimeStop;
if(_PrimeStop && tDelta > 0) { if(_PrimeStop && tDelta > 0) {
stopPump(); _stopPump();
} }
if(_PrimeStop) { if(_PrimeStop) {
@ -191,7 +210,7 @@ CPrimingScreen::keyHandler(uint8_t event)
_PrimeCheck = millis() + 3000; // holdoff upon start before testing for heater shutting off pump _PrimeCheck = millis() + 3000; // holdoff upon start before testing for heater shutting off pump
} }
else { else {
stopPump(); _stopPump();
} }
_ScreenManager.reqUpdate(); _ScreenManager.reqUpdate();
@ -200,7 +219,7 @@ CPrimingScreen::keyHandler(uint8_t event)
} }
void void
CPrimingScreen::stopPump() CPrimingScreen::_stopPump()
{ {
reqPumpPrime(false); reqPumpPrime(false);
_PrimeCheck = 0; _PrimeCheck = 0;

View file

@ -33,9 +33,12 @@ class CPrimingScreen : public CScreenHeader {
unsigned long _PrimeCheck; unsigned long _PrimeCheck;
int _rowSel; int _rowSel;
int _colSel; int _colSel;
void stopPump(); void _stopPump();
void _initUI();
public: public:
CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr); CPrimingScreen(C128x64_OLED& display, CScreenManager& mgr);
void onSelect();
void onExit();
bool show(); bool show();
bool keyHandler(uint8_t event); bool keyHandler(uint8_t event);
bool animate() { return CScreen::animate(); }; bool animate() { return CScreen::animate(); };

View file

@ -44,6 +44,10 @@ CScreen::onSelect()
{ {
} }
void
CScreen::onExit()
{
}
void void
CScreen::_printMenuText(int x, int y, const char* str, bool selected, eJUSTIFY justify, int border, int radius) CScreen::_printMenuText(int x, int y, const char* str, bool selected, eJUSTIFY justify, int border, int radius)

View file

@ -49,6 +49,7 @@ public:
CScreen(C128x64_OLED& disp, CScreenManager& mgr); CScreen(C128x64_OLED& disp, CScreenManager& mgr);
virtual ~CScreen(); virtual ~CScreen();
virtual void onSelect(); virtual void onSelect();
virtual void onExit();
virtual bool animate(); virtual bool animate();
virtual bool show(); virtual bool show();
virtual bool keyHandler(uint8_t event) { return false; }; virtual bool keyHandler(uint8_t event) { return false; };

View file

@ -11,6 +11,7 @@
#include "HeaterSettingsScreen.h" #include "HeaterSettingsScreen.h"
#include "SettingsScreen.h" #include "SettingsScreen.h"
#include "TimerChartScreen.h" #include "TimerChartScreen.h"
#include "InheritSettingsScreen.h"
#include <Wire.h> #include <Wire.h>
#include "../cfg/pins.h" #include "../cfg/pins.h"
#include "../cfg/BTCConfig.h" #include "../cfg/BTCConfig.h"
@ -98,21 +99,22 @@ const unsigned char DieselSplash [] PROGMEM = {
CScreenManager::CScreenManager() CScreenManager::CScreenManager()
{ {
_pDisplay = NULL; _pDisplay = NULL;
_currentScreen = -1; _rootMenuScreen = -1;
_timerScreen = -1; _timerScreen = -1;
_settingScreen = -1; _tuningScreen = -1;
_bReqUpdate = false; _bReqUpdate = false;
_bSetTime = false; _bSetTimeScreenActive = false;
_bInheritScreenActive = false;
_DimTime = millis() + 60000; _DimTime = millis() + 60000;
_pRebootScreen = NULL; _pRebootScreen = NULL;
} }
CScreenManager::~CScreenManager() CScreenManager::~CScreenManager()
{ {
for(int i=0; i < _Screens.size(); i++) { for(int i=0; i < _RootScreens.size(); i++) {
if(_Screens[i]) { if(_RootScreens[i]) {
delete _Screens[i]; delete _RootScreens[i];
_Screens[i] = NULL; _RootScreens[i] = NULL;
} }
} }
for(int i=0; i < _TimerScreens.size(); i++) { for(int i=0; i < _TimerScreens.size(); i++) {
@ -154,14 +156,13 @@ CScreenManager::begin(bool bNoClock)
_pDisplay->display(); _pDisplay->display();
DebugPort.println("Creating Screens"); DebugPort.println("Creating Screens");
_Screens.push_back(new CDetailedScreen(*_pDisplay, *this)); // detail control _RootScreens.push_back(new CDetailedScreen(*_pDisplay, *this)); // detail control
_Screens.push_back(new CBasicScreen(*_pDisplay, *this)); // basic control _RootScreens.push_back(new CBasicScreen(*_pDisplay, *this)); // basic control
if(!bNoClock) if(!bNoClock)
_Screens.push_back(new CClockScreen(*_pDisplay, *this)); // clock _RootScreens.push_back(new CClockScreen(*_pDisplay, *this)); // clock
_Screens.push_back(new CPrimingScreen(*_pDisplay, *this)); // mode / priming _RootScreens.push_back(new CPrimingScreen(*_pDisplay, *this)); // mode / priming
_Screens.push_back(new CWiFiScreen(*_pDisplay, *this)); // comms info _RootScreens.push_back(new CWiFiScreen(*_pDisplay, *this)); // comms info
_Screens.push_back(new CSettingsScreen(*_pDisplay, *this)); // tuning info _RootScreens.push_back(new CSettingsScreen(*_pDisplay, *this)); // tuning info
_SetTimeScreen = new CSetClockScreen(*_pDisplay, *this); // clock set
_TimerScreens.push_back(new CTimerChartScreen(*_pDisplay, *this, 0)); // timer chart _TimerScreens.push_back(new CTimerChartScreen(*_pDisplay, *this, 0)); // timer chart
_TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 0)); // set timer 1 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 0)); // set timer 1
_TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 1)); // set timer 2 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 1)); // set timer 2
@ -177,16 +178,18 @@ CScreenManager::begin(bool bNoClock)
_TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 11)); // set timer 12 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 11)); // set timer 12
_TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 12)); // set timer 13 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 12)); // set timer 13
_TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 13)); // set timer 14 _TimerScreens.push_back(new CSetTimerScreen(*_pDisplay, *this, 13)); // set timer 14
_SettingsScreens.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning _TuningScreens.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning
_SettingsScreens.push_back(new CHeaterSettingsScreen(*_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 #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 #else
_currentScreen = 1; // basic control screen _rootMenuScreen = 1; // basic control screen
#endif #endif
_switchScreen(); _enterScreen();
} }
bool bool
@ -195,9 +198,23 @@ CScreenManager::checkUpdate()
if(_DimTime) { if(_DimTime) {
long tDelta = millis() - _DimTime; long tDelta = millis() - _DimTime;
if(tDelta > 0) { if(tDelta > 0) {
// time to dim the display
// if(NVstore.getDimTime()) // if(NVstore.getDimTime())
_pDisplay->dim(true); _pDisplay->dim(true);
_DimTime = 0; _DimTime = 0;
_leaveScreen();
// fall back to main menu
selectTimerScreen(false);
selectSetTimeScreen(false);
selectSettingsScreen(false);
selectInheritScreen(false);
// sticky screens are Detailed Control, Basic Control, or Clock.
// otherwise return to Basic Control screen
if(_rootMenuScreen > 2) {
_rootMenuScreen = 1;
}
_enterScreen();
} }
} }
@ -208,13 +225,18 @@ CScreenManager::checkUpdate()
return true; return true;
} }
else { else {
if(_bSetTime) { if(_bSetTimeScreenActive) {
_SetTimeScreen->show(); _SetTimeScreen->show();
_bReqUpdate = false; _bReqUpdate = false;
return true; return true;
} }
else if(_settingScreen >= 0) { else if(_bInheritScreenActive) {
_SettingsScreens[_settingScreen]->show(); _InheritScreen->show();
_bReqUpdate = false;
return true;
}
else if(_tuningScreen >= 0) {
_TuningScreens[_tuningScreen]->show();
_bReqUpdate = false; _bReqUpdate = false;
return true; return true;
} }
@ -223,8 +245,8 @@ CScreenManager::checkUpdate()
_bReqUpdate = false; _bReqUpdate = false;
return true; return true;
} }
else if(_currentScreen >= 0) { else if(_rootMenuScreen >= 0) {
_Screens[_currentScreen]->show(); _RootScreens[_rootMenuScreen]->show();
_bReqUpdate = false; _bReqUpdate = false;
return true; return true;
} }
@ -242,9 +264,11 @@ CScreenManager::reqUpdate()
bool bool
CScreenManager::animate() 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(_timerScreen >= 0) return _TimerScreens[_timerScreen]->animate();
if(_currentScreen >= 0) return _Screens[_currentScreen]->animate(); if(_rootMenuScreen >= 0) return _RootScreens[_rootMenuScreen]->animate();
return false; return false;
} }
@ -256,54 +280,75 @@ CScreenManager::refresh()
} }
void void
CScreenManager::_switchScreen() CScreenManager::_enterScreen()
{ {
if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onSelect(); if(_bSetTimeScreenActive) _SetTimeScreen->onSelect();
else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->onSelect(); else if(_bInheritScreenActive) _InheritScreen->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(); reqUpdate();
} }
void
CScreenManager::_leaveScreen()
{
if(_bSetTimeScreenActive) _SetTimeScreen->onExit();
else if(_bInheritScreenActive) _InheritScreen->onExit();
else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->onExit();
else if(_tuningScreen >= 0) _TuningScreens[_tuningScreen]->onExit();
else if(_rootMenuScreen >= 0) _RootScreens[_rootMenuScreen]->onExit();
}
void void
CScreenManager::nextScreen() CScreenManager::nextScreen()
{ {
if(_bSetTime) { if(_bSetTimeScreenActive || _bInheritScreenActive) {
} }
else if(_timerScreen >= 0) { else if(_timerScreen >= 0) {
_leaveScreen();
_timerScreen++; _timerScreen++;
ROLLUPPERLIMIT(_timerScreen, _TimerScreens.size()-1, 0); ROLLUPPERLIMIT(_timerScreen, _TimerScreens.size()-1, 0);
_enterScreen();
} }
else if(_settingScreen >= 0) { else if(_tuningScreen >= 0) {
_settingScreen++; _leaveScreen();
ROLLUPPERLIMIT(_settingScreen, _SettingsScreens.size()-1, 0); _tuningScreen++;
ROLLUPPERLIMIT(_tuningScreen, _TuningScreens.size()-1, 0);
_enterScreen();
} }
else { else {
_currentScreen++; _leaveScreen();
ROLLUPPERLIMIT(_currentScreen, _Screens.size()-1, 0); _rootMenuScreen++;
ROLLUPPERLIMIT(_rootMenuScreen, _RootScreens.size()-1, 0);
_enterScreen();
} }
_switchScreen();
} }
void void
CScreenManager::prevScreen() CScreenManager::prevScreen()
{ {
if(_bSetTime) { if(_bSetTimeScreenActive || _bInheritScreenActive) {
} }
else if(_timerScreen >=0) { else if(_timerScreen >=0) {
_leaveScreen();
_timerScreen--; _timerScreen--;
ROLLLOWERLIMIT(_timerScreen, 0, _TimerScreens.size()-1); ROLLLOWERLIMIT(_timerScreen, 0, _TimerScreens.size()-1);
_enterScreen();
} }
else if(_settingScreen >= 0) { else if(_tuningScreen >= 0) {
_settingScreen--; _leaveScreen();
ROLLLOWERLIMIT(_settingScreen, 0, _SettingsScreens.size()-1); _tuningScreen--;
ROLLLOWERLIMIT(_tuningScreen, 0, _TuningScreens.size()-1);
_enterScreen();
} }
else { else {
_currentScreen--; _leaveScreen();
ROLLLOWERLIMIT(_currentScreen, 0, _Screens.size()-1); _rootMenuScreen--;
ROLLLOWERLIMIT(_rootMenuScreen, 0, _RootScreens.size()-1);
_enterScreen();
} }
_switchScreen();
} }
void void
@ -317,39 +362,58 @@ CScreenManager::keyHandler(uint8_t event)
_DimTime = (millis() + NVstore.getDimTime()) | 1; _DimTime = (millis() + NVstore.getDimTime()) | 1;
// call handler for active screen // call key handler for active screen
if(_bSetTime) _SetTimeScreen->keyHandler(event); if(_bSetTimeScreenActive) _SetTimeScreen->keyHandler(event);
else if(_settingScreen >= 0) _SettingsScreens[_settingScreen]->keyHandler(event); else if(_bInheritScreenActive) _InheritScreen->keyHandler(event);
else if(_tuningScreen >= 0) _TuningScreens[_tuningScreen]->keyHandler(event);
else if(_timerScreen >= 0) _TimerScreens[_timerScreen]->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 void
CScreenManager::selectTimerScreen(bool show) CScreenManager::selectTimerScreen(bool show)
{ {
_leaveScreen();
_cancelBranchScreens();
_timerScreen = show ? 0 : -1; _timerScreen = show ? 0 : -1;
_settingScreen = -1; _enterScreen();
_bSetTime = false;
_switchScreen();
} }
void void
CScreenManager::selectSettingsScreen(bool show) CScreenManager::selectSettingsScreen(bool show)
{ {
_settingScreen = show ? 0 : -1; _leaveScreen();
_timerScreen = -1; _cancelBranchScreens();
_bSetTime = false; _tuningScreen = show ? 0 : -1;
_switchScreen(); _enterScreen();
} }
void void
CScreenManager::selectSetTimeScreen(bool show) CScreenManager::selectSetTimeScreen(bool show)
{ {
_bSetTime = show; _leaveScreen();
_settingScreen = -1; _cancelBranchScreens();
_timerScreen = -1; _bSetTimeScreenActive = show;
_switchScreen(); _enterScreen();
}
void
CScreenManager::selectInheritScreen(bool show)
{
_leaveScreen();
_cancelBranchScreens();
_bInheritScreenActive = show;
_enterScreen();
} }
void void

View file

@ -31,18 +31,22 @@ class CScreen;
class CRebootScreen; class CRebootScreen;
class CScreenManager { class CScreenManager {
std::vector<CScreen*> _Screens; std::vector<CScreen*> _RootScreens;
std::vector<CScreen*> _TimerScreens; std::vector<CScreen*> _TimerScreens;
std::vector<CScreen*> _SettingsScreens; std::vector<CScreen*> _TuningScreens;
CScreen* _SetTimeScreen; CScreen* _SetTimeScreen;
CScreen* _InheritScreen;
C128x64_OLED* _pDisplay; C128x64_OLED* _pDisplay;
int _currentScreen; int _rootMenuScreen;
int _timerScreen; int _timerScreen;
int _settingScreen; int _tuningScreen;
bool _bSetTime; bool _bSetTimeScreenActive;
bool _bInheritScreenActive;
unsigned long _DimTime; unsigned long _DimTime;
bool _bReqUpdate; bool _bReqUpdate;
void _switchScreen(); void _enterScreen();
void _leaveScreen();
void _cancelBranchScreens();
CRebootScreen* _pRebootScreen; CRebootScreen* _pRebootScreen;
public: public:
CScreenManager(); CScreenManager();
@ -59,6 +63,7 @@ public:
void selectTimerScreen(bool show); void selectTimerScreen(bool show);
void selectSetTimeScreen(bool show); void selectSetTimeScreen(bool show);
void selectSettingsScreen(bool show); void selectSettingsScreen(bool show);
void selectInheritScreen(bool show);
}; };
#endif // __SCREEN_MANAGER_H__ #endif // __SCREEN_MANAGER_H__

View file

@ -36,6 +36,18 @@
CSetClockScreen::CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) CSetClockScreen::CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr)
{
_initUI();
}
void
CSetClockScreen::onSelect()
{
_initUI();
}
void
CSetClockScreen::_initUI()
{ {
_rowSel = 0; _rowSel = 0;
_nextT = millis(); _nextT = millis();
@ -148,7 +160,7 @@ CSetClockScreen::keyHandler(uint8_t event)
_ScreenManager.selectSetTimeScreen(false); _ScreenManager.selectSetTimeScreen(false);
} }
else { else {
adjTimeDate(-1); _adjTimeDate(-1);
} }
} }
// press RIGHT // press RIGHT
@ -157,7 +169,7 @@ CSetClockScreen::keyHandler(uint8_t event)
_ScreenManager.selectSetTimeScreen(false); _ScreenManager.selectSetTimeScreen(false);
} }
else { else {
adjTimeDate(+1); _adjTimeDate(+1);
} }
} }
// press UP // press UP
@ -179,11 +191,11 @@ CSetClockScreen::keyHandler(uint8_t event)
if(_rowSel>=1) { if(_rowSel>=1) {
// hold RIGHT // hold RIGHT
if(event & key_Right) { if(event & key_Right) {
adjTimeDate(+1); _adjTimeDate(+1);
} }
// hold LEFT // hold LEFT
if(event & key_Left) { if(event & key_Left) {
adjTimeDate(-1); _adjTimeDate(-1);
} }
} }
} }
@ -194,7 +206,7 @@ CSetClockScreen::keyHandler(uint8_t event)
} }
void void
CSetClockScreen::adjTimeDate(int dir) CSetClockScreen::_adjTimeDate(int dir)
{ {
int days; int days;
switch(_rowSel) { switch(_rowSel) {

View file

@ -36,10 +36,12 @@ class CSetClockScreen : public CScreenHeader {
BTCDateTime working; BTCDateTime working;
unsigned long _SaveTime; unsigned long _SaveTime;
void adjTimeDate(int dir); void _adjTimeDate(int dir);
void _initUI();
public: public:
CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr); CSetClockScreen(C128x64_OLED& display, CScreenManager& mgr);
void onSelect();
bool show(); bool show();
void showTime(int); void showTime(int);
bool keyHandler(uint8_t event); bool keyHandler(uint8_t event);

View file

@ -39,9 +39,7 @@ const char* briefDOW[] = { "S", "M", "T", "W", "T", "F", "S" };
CSetTimerScreen::CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance) : CScreenHeader(display, mgr) CSetTimerScreen::CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance) : CScreenHeader(display, mgr)
{ {
_rowSel = 0; _initUI();
_colSel = 0;
_SaveTime = 0;
_ConflictTime = 0; _ConflictTime = 0;
_conflictID = 0; _conflictID = 0;
_timerID = instance; _timerID = instance;
@ -50,9 +48,18 @@ CSetTimerScreen::CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int
void void
CSetTimerScreen::onSelect() CSetTimerScreen::onSelect()
{ {
_initUI();
NVstore.getTimerInfo(_timerID, _timerInfo); NVstore.getTimerInfo(_timerID, _timerInfo);
} }
void
CSetTimerScreen::_initUI()
{
_rowSel = 0;
_colSel = 0;
_SaveTime = 0;
}
bool bool
CSetTimerScreen::show() CSetTimerScreen::show()
{ {
@ -242,8 +249,8 @@ CSetTimerScreen::keyHandler(uint8_t event)
bHeld = true; bHeld = true;
if(_rowSel == 1) { if(_rowSel == 1) {
if(_colSel < 4) { if(_colSel < 4) {
if(event & key_Left) adjust(-1); if(event & key_Left) _adjust(-1);
if(event & key_Right) adjust(+1); if(event & key_Right) _adjust(+1);
} }
else if(_colSel == 4) { else if(_colSel == 4) {
if(event & key_Right) { if(event & key_Right) {
@ -268,7 +275,7 @@ CSetTimerScreen::keyHandler(uint8_t event)
if(event & key_Left) { if(event & key_Left) {
switch(_rowSel) { switch(_rowSel) {
case 1: case 1:
adjust(-1); _adjust(-1);
break; break;
} }
} }
@ -292,7 +299,7 @@ CSetTimerScreen::keyHandler(uint8_t event)
switch(_rowSel) { switch(_rowSel) {
case 1: case 1:
// adjust selected item // adjust selected item
adjust(+1); _adjust(+1);
break; break;
} }
} }
@ -320,7 +327,7 @@ CSetTimerScreen::keyHandler(uint8_t event)
void void
CSetTimerScreen::adjust(int dir) CSetTimerScreen::_adjust(int dir)
{ {
int days; int days;
int maskDOW = 0x01 << _colSel; // if doing Day of Week - (_rowSel == 2) int maskDOW = 0x01 << _colSel; // if doing Day of Week - (_rowSel == 2)

View file

@ -38,8 +38,9 @@ class CSetTimerScreen : public CScreenHeader {
unsigned long _ConflictTime; unsigned long _ConflictTime;
int _conflictID; int _conflictID;
sTimer _timerInfo; sTimer _timerInfo;
void adjust(int dir); void _adjust(int dir);
void _printEnabledTimers(); void _printEnabledTimers();
void _initUI();
public: public:
CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance); CSetTimerScreen(C128x64_OLED& display, CScreenManager& mgr, int instance);

View file

@ -42,9 +42,23 @@ static const int plugPowers[] = { 35, 40, 45, 80, 85, 90};
CSettingsScreen::CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) CSettingsScreen::CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr)
{ {
_animateCount = 0; _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;
}
bool bool
CSettingsScreen::show() CSettingsScreen::show()
@ -63,14 +77,10 @@ CSettingsScreen::show()
sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min()); sprintf(str, "Min: %.1f/%d", getHeaterInfo().getPump_Min(), getHeaterInfo().getFan_Min());
_printMenuText(0, Line2, str); _printMenuText(0, Line2, str);
// sprintf(str, "SN-%d", getHeaterInfo().getFan_Sensor());
// _printMenuText(_display.width(), yPos, str, false, eRightJustify);
sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max()); sprintf(str, "Max: %.1f/%d", getHeaterInfo().getPump_Max(), getHeaterInfo().getFan_Max());
_printMenuText(0, Line1, str); _printMenuText(0, Line1, str);
// sprintf(str, "PF-%d", getHeaterInfo().getGlow_Drive());
// _printMenuText(_display.width(), yPos, str, false, eRightJustify);
// navigation line
int yPos = 53; int yPos = 53;
int xPos = _display.xCentre(); int xPos = _display.xCentre();
_printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify); _printMenuText(xPos, yPos, "<- enter ->", true, eCentreJustify);
@ -82,6 +92,9 @@ CSettingsScreen::show()
bool bool
CSettingsScreen::animate() CSettingsScreen::animate()
{ {
if(CScreen::animate())
return true;
char msg[16]; char msg[16];
if(isPasswordBusy()) { // Password screen activity if(isPasswordBusy()) { // Password screen activity
@ -151,8 +164,13 @@ CSettingsScreen::keyHandler(uint8_t event)
} }
// press UP // press UP
if(event & (key_Up | key_Centre)) { if(event & (key_Up | key_Centre)) {
if(hasOEMcontroller()) if(hasOEMcontroller()) {
if(event & key_Centre)
_reqOEMWarning(); _reqOEMWarning();
else {
_ScreenManager.selectInheritScreen(true);
}
}
else { else {
_getPassword(); _getPassword();
} }

View file

@ -30,11 +30,13 @@ class CScreenManager;
class CSettingsScreen : public CPasswordScreen { class CSettingsScreen : public CPasswordScreen {
int _animateCount; int _animateCount;
void _initUI();
public: public:
CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr); CSettingsScreen(C128x64_OLED& display, CScreenManager& mgr);
bool show(); bool show();
bool keyHandler(uint8_t event); bool keyHandler(uint8_t event);
bool animate(); bool animate();
void onSelect();
}; };
#endif #endif

View file

@ -23,9 +23,6 @@
#include "KeyPad.h" #include "KeyPad.h"
#include "../Protocol/helpers.h" #include "../Protocol/helpers.h"
#include "../Wifi/BTCWifi.h" #include "../Wifi/BTCWifi.h"
// #include "fonts/Tahoma8.h"
// #include "fonts/FranklinGothic.h"
// #include "fonts/Arial.h"
#include "../Utility/NVstorage.h" #include "../Utility/NVstorage.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -40,12 +37,23 @@
#define STA_HOLD_TIME 10 #define STA_HOLD_TIME 10
CWiFiScreen::CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) CWiFiScreen::CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr)
{
_initUI();
}
void
CWiFiScreen::onSelect()
{
_initUI();
}
void
CWiFiScreen::_initUI()
{ {
_rowSel = 0; _rowSel = 0;
_bShowMAC = false; _bShowMAC = false;
} }
bool bool
CWiFiScreen::show() CWiFiScreen::show()
{ {

View file

@ -31,12 +31,14 @@ class CScreenManager;
class CWiFiScreen : public CScreenHeader { class CWiFiScreen : public CScreenHeader {
public: public:
CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr); CWiFiScreen(C128x64_OLED& display, CScreenManager& mgr);
void onSelect();
bool show(); bool show();
bool keyHandler(uint8_t event); bool keyHandler(uint8_t event);
private: private:
int _rowSel; int _rowSel;
int _repeatCount; int _repeatCount;
bool _bShowMAC; bool _bShowMAC;
void _initUI();
}; };
#endif #endif

View file

@ -50,6 +50,7 @@ extern void resetWebModerator();
extern void resetJSONmoderator(); extern void resetJSONmoderator();
extern const char* getBlueWireStatStr(); extern const char* getBlueWireStatStr();
extern bool hasOEMcontroller(); extern bool hasOEMcontroller();
extern bool hasOEMLCDcontroller();
extern int getBlueWireStat(); extern int getBlueWireStat();
extern int getSmartError(); extern int getSmartError();

View file

@ -41,6 +41,7 @@ Working so far:
To be implemented 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). * 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 * MQTT pub/sub
* "fuel gauge" - Integrate pump frequency, assuming a repeatable dose of fuel per pump cycle... * "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) * Proper 7 day timer with each day settable for at least 2 times (eg morning/evening)