BUG FIXES:

Repeating timers were being cancelled!
Set time always advanced by one day upon entry.
Desired temperature was incorrect when using enhanced thermostat modes in Detailed menu
This commit is contained in:
rljonesau 2019-04-18 21:02:39 +10:00
parent 1819a244f9
commit 9a36df14ec
6 changed files with 66 additions and 19 deletions

View file

@ -93,7 +93,7 @@ CDetailedScreen::show()
float desiredT = 0;
if((runstate && (runstate <= 5)) || _showTarget) {
if(getThermostatModeActive())
desiredT = getHeaterInfo().getTemperature_Desired();
desiredT = getTemperatureDesired();
else
desiredT = -getHeaterInfo().getPump_Fixed();
}

View file

@ -188,9 +188,12 @@ CSetClockScreen::keyHandler(uint8_t event)
}
// press UP
if(event & key_Up) {
if(_rowSel == 0)
if(_rowSel == 0) {
_rowSel = 1;
_adjTimeDate(+1);
}
else {
_adjTimeDate(+1);
}
}
// press DOWN
if(event & key_Down) {

View file

@ -63,6 +63,7 @@ CThermostatModeScreen::_initUI()
{
_rowSel = 0;
_animateCount = 0;
_keyRepeat = -1;
}
bool
@ -156,6 +157,7 @@ bool
CThermostatModeScreen::keyHandler(uint8_t event)
{
if(event & keyPressed) {
_keyRepeat = 0; // unlock hold function
// press LEFT to select previous screen
if(event & key_Left) {
switch(_rowSel) {
@ -192,7 +194,7 @@ CThermostatModeScreen::keyHandler(uint8_t event)
}
if(event & key_Down) {
if(_rowSel == 0) {
_ScreenManager.selectMenu(CScreenManager::BranchMenu, CScreenManager::FontDumpUI);
// _ScreenManager.selectMenu(CScreenManager::BranchMenu, CScreenManager::FontDumpUI);
}
else {
_rowSel--;
@ -235,6 +237,18 @@ CThermostatModeScreen::keyHandler(uint8_t event)
}
_ScreenManager.reqUpdate();
}
if(event & keyRepeat) {
_keyRepeat++;
if((event & key_Down) && (keyRepeat >= 4)) {
_keyRepeat = -1;
if(_rowSel == 0) {
_ScreenManager.selectMenu(CScreenManager::BranchMenu, CScreenManager::FontDumpUI);
}
}
}
if(event & keyReleased) {
_keyRepeat = -1;
}
return true;
}

View file

@ -31,6 +31,7 @@ class CScreenManager;
class CThermostatModeScreen : public CPasswordScreen
{
int _rowSel;
int _keyRepeat;
void _adjust(int dir);
float _window;
int _thermoMode;

View file

@ -219,29 +219,58 @@ CTimerManager::manageTime(int _hour, int _minute, int _dow)
int retval = 0;
int dayMinute = (hour * 60) + minute;
int lookup = weekTimerIDs[dow][dayMinute];
int newID = lookup & 0x0f;
int newID = weekTimerIDs[dow][dayMinute];
if(activeTimer != newID) {
DebugPort.print("Timer ID change detected ");
DebugPort.print(activeTimer & 0x0f);
if(activeTimer & 0x80) DebugPort.print("(repeating)");
DebugPort.print(" -> ");
DebugPort.print(newID & 0x0f);
if(newID & 0x80) DebugPort.print("(repeating)");
DebugPort.println("");
if(activeTimer) {
// deal with expired timer
DebugPort.println("Handling expired timer cleanup");
if(activeTimer & 0x80) {
DebugPort.println("Expired timer repeats, leaving definition alone");
}
else { // non repeating timer
// delete one shot timer - note that this may require ticking off each day as they appear
DebugPort.print("Expired timer does not repeat - Cancelling"); DebugPort.println(activeTimer);
int ID = activeTimer & 0x0f;
if(ID) {
ID--;
sTimer timer;
// get timer settings
NVstore.getTimerInfo(ID, timer);
if(timer.enabled & 0x80) {
DebugPort.println("Cancelling next day");
timer.enabled = 0; // ouright cancel anyday timer
}
else {
DebugPort.print("Cancelling specific day idx"); DebugPort.println(activeDow);
timer.enabled &= ~(0x01 << activeDow); // cancel specific day that started the timer
}
NVstore.setTimerInfo(ID, timer);
NVstore.save();
createMap();
}
}
}
if(newID) {
DebugPort.println("Start of timer interval, starting heater");
requestOn();
activeDow = dow; // dow when timer interval started
// activeRepeat = lookup & 0x80;
retval = 1;
}
else {
DebugPort.println("End of timer interval, stopping heater");
requestOff();
// delete one shot timer - note that this may require ticking off each day as they appear
if((lookup & 0x80) == 0) { // non repeating timer
sTimer timer;
// get timer settings
NVstore.getTimerInfo(activeTimer-1, timer);
if(timer.enabled & 0x80)
timer.enabled = 0; // ouright cancel anyday timer
else
timer.enabled &= ~(0x01 << activeDow); // cancel specific day that started the timer
NVstore.setTimerInfo(activeTimer-1, timer);
NVstore.save();
createMap();
}
retval = 2;
}
activeTimer = newID;

Binary file not shown.