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,10 +188,13 @@ CSetClockScreen::keyHandler(uint8_t event)
}
// press UP
if(event & key_Up) {
if(_rowSel == 0)
if(_rowSel == 0) {
_rowSel = 1;
}
else {
_adjTimeDate(+1);
}
}
// press DOWN
if(event & key_Down) {
if(_rowSel == 0) {

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) {
if(newID) {
requestOn();
activeDow = dow; // dow when timer interval started
retval = 1;
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 {
requestOff();
else { // non repeating timer
// delete one shot timer - note that this may require ticking off each day as they appear
if((lookup & 0x80) == 0) { // non repeating timer
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(activeTimer-1, timer);
if(timer.enabled & 0x80)
NVstore.getTimerInfo(ID, timer);
if(timer.enabled & 0x80) {
DebugPort.println("Cancelling next day");
timer.enabled = 0; // ouright cancel anyday timer
else
}
else {
DebugPort.print("Cancelling specific day idx"); DebugPort.println(activeDow);
timer.enabled &= ~(0x01 << activeDow); // cancel specific day that started the timer
NVstore.setTimerInfo(activeTimer-1, 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();
retval = 2;
}
activeTimer = newID;

Binary file not shown.