2019-04-06 10:45:25 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the "bluetoothheater" distribution
|
|
|
|
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
|
|
|
|
*
|
|
|
|
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2018-12-01 00:36:25 +00:00
|
|
|
#include "ScreenManager.h"
|
2019-01-18 07:09:40 +00:00
|
|
|
#include "DetailedScreen.h"
|
|
|
|
#include "BasicScreen.h"
|
|
|
|
#include "PrimingScreen.h"
|
|
|
|
#include "WiFiScreen.h"
|
|
|
|
#include "FuelMixtureScreen.h"
|
|
|
|
#include "SetClockScreen.h"
|
|
|
|
#include "SetTimerScreen.h"
|
|
|
|
#include "ClockScreen.h"
|
2019-01-16 09:22:17 +00:00
|
|
|
#include "RebootScreen.h"
|
2019-01-18 20:15:02 +00:00
|
|
|
#include "HeaterSettingsScreen.h"
|
2019-01-19 11:05:14 +00:00
|
|
|
#include "SettingsScreen.h"
|
2019-04-09 23:28:46 +00:00
|
|
|
#include "ThermostatModeScreen.h"
|
2019-03-16 03:57:37 +00:00
|
|
|
#include "FontDumpScreen.h"
|
2019-02-14 10:20:15 +00:00
|
|
|
#include "TimerChartScreen.h"
|
2019-03-01 23:16:37 +00:00
|
|
|
#include "InheritSettingsScreen.h"
|
2019-04-09 23:28:46 +00:00
|
|
|
#include "GPIOScreen.h"
|
2019-04-19 11:38:39 +00:00
|
|
|
#include "VersionInfoScreen.h"
|
2019-04-19 23:49:22 +00:00
|
|
|
#include "HomeMenuSelScreen.h"
|
2019-04-19 11:38:39 +00:00
|
|
|
#include "OtherOptionsScreen.h"
|
2018-12-16 07:34:39 +00:00
|
|
|
#include <Wire.h>
|
|
|
|
#include "../cfg/pins.h"
|
|
|
|
#include "../cfg/BTCConfig.h"
|
2019-01-19 11:05:14 +00:00
|
|
|
#include "../protocol/helpers.h"
|
2019-04-08 23:12:42 +00:00
|
|
|
#include "keypad.h"
|
2018-11-22 10:30:51 +00:00
|
|
|
|
2018-11-25 04:45:17 +00:00
|
|
|
|
2018-11-27 10:44:47 +00:00
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// splash creen created using image2cpp http://javl.github.io/image2cpp/
|
|
|
|
// Settings:
|
|
|
|
// Black background
|
|
|
|
// Invert [X]
|
|
|
|
// Arduino code, single bitmap
|
|
|
|
// Identifier: DieselSplash
|
|
|
|
// Draw Mode: Horizontal
|
|
|
|
//
|
2018-11-26 19:25:51 +00:00
|
|
|
const unsigned char DieselSplash [] PROGMEM = {
|
|
|
|
// 'Splash2, 128x64px
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x18, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x02, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00,
|
|
|
|
0x00, 0x10, 0x00, 0x00, 0x21, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x88, 0x00, 0x00,
|
|
|
|
0x00, 0x18, 0x00, 0x00, 0x20, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x84, 0x00, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x20, 0x40, 0x00, 0x20, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x84, 0x00, 0x00,
|
|
|
|
0x00, 0x52, 0x00, 0x00, 0x40, 0x40, 0x00, 0x10, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x84, 0x00, 0x00,
|
|
|
|
0x00, 0x34, 0x00, 0x00, 0x40, 0x20, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00,
|
|
|
|
0x00, 0x18, 0x00, 0x00, 0x40, 0x10, 0x00, 0x04, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x34, 0x00, 0x00, 0x80, 0x10, 0x00, 0x02, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x52, 0x00, 0x00, 0x80, 0x08, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x80, 0x08, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x18, 0x00, 0x01, 0x00, 0x04, 0x3e, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x10, 0x00, 0x01, 0x00, 0x07, 0xc0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x06, 0x80, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0xc4, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x40, 0x64, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x3c, 0x40, 0x84, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0xc0, 0x40, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x26, 0x23, 0x04, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1e, 0x00, 0x40, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x43, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x40, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x41, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x40, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x41, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x40, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x40, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x40, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x60, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x30, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x10, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x19, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x0f, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x07, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x07, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0xf8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x1f, 0x20, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x03, 0xe8, 0x20, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7c, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x04, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x0a, 0x08, 0x00, 0x00, 0x00, 0x21, 0x10, 0x01, 0x00, 0x00, 0x84, 0x00, 0x40, 0x01, 0x40, 0x00,
|
|
|
|
0x11, 0x08, 0x00, 0x00, 0x00, 0x21, 0x10, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x01, 0x40, 0x00,
|
|
|
|
0x11, 0x3a, 0x4e, 0x73, 0x18, 0xe1, 0x13, 0x1d, 0xcc, 0xb0, 0x80, 0xc7, 0x75, 0x99, 0x4c, 0xb0,
|
|
|
|
0x1f, 0x4a, 0x52, 0x94, 0xa5, 0x21, 0xf4, 0xa5, 0x12, 0xc0, 0x81, 0x29, 0x46, 0x25, 0x52, 0xc0,
|
|
|
|
0x11, 0x4a, 0x52, 0x94, 0x3d, 0x21, 0x17, 0xa5, 0x1e, 0x80, 0x81, 0x29, 0x44, 0x25, 0x5e, 0x80,
|
|
|
|
0x11, 0x49, 0x92, 0x94, 0xa1, 0x21, 0x14, 0x25, 0x10, 0x80, 0x85, 0x29, 0x44, 0x25, 0x50, 0x80,
|
|
|
|
0x11, 0x39, 0x8e, 0x93, 0x18, 0xe1, 0x13, 0x1c, 0xcc, 0x80, 0x78, 0xc9, 0x34, 0x19, 0x4c, 0x80
|
|
|
|
};
|
2018-11-27 10:44:47 +00:00
|
|
|
|
2018-12-01 00:36:25 +00:00
|
|
|
|
2018-11-25 04:45:17 +00:00
|
|
|
CScreenManager::CScreenManager()
|
2018-11-17 02:08:22 +00:00
|
|
|
{
|
2018-11-25 04:45:17 +00:00
|
|
|
_pDisplay = NULL;
|
2019-03-15 12:42:54 +00:00
|
|
|
_menu = -1;
|
|
|
|
_subMenu = 0;
|
2019-03-15 10:48:22 +00:00
|
|
|
_rootMenu = -1;
|
2018-11-27 10:44:47 +00:00
|
|
|
_bReqUpdate = false;
|
2019-04-27 10:41:47 +00:00
|
|
|
_DimTime_ms = millis() + 60000;
|
|
|
|
_MenuTimeout = millis() + 60000;
|
2019-01-16 09:22:17 +00:00
|
|
|
_pRebootScreen = NULL;
|
2019-04-27 10:41:47 +00:00
|
|
|
_bDimmed = false;
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
2018-11-23 10:34:37 +00:00
|
|
|
|
2018-11-25 04:45:17 +00:00
|
|
|
CScreenManager::~CScreenManager()
|
|
|
|
{
|
2019-03-15 12:42:54 +00:00
|
|
|
for(int i=0; i < _Screens.size(); i++) {
|
|
|
|
for(int j=0; j < _Screens[i].size(); j++) {
|
|
|
|
if(_Screens[i][j]) {
|
|
|
|
delete _Screens[i][j];
|
|
|
|
_Screens[i][j] = NULL;
|
|
|
|
}
|
|
|
|
}
|
2019-01-18 07:09:40 +00:00
|
|
|
}
|
2018-11-25 04:45:17 +00:00
|
|
|
if(_pDisplay) {
|
|
|
|
delete _pDisplay; _pDisplay = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-01-27 01:17:49 +00:00
|
|
|
CScreenManager::begin(bool bNoClock)
|
2018-11-25 04:45:17 +00:00
|
|
|
{
|
|
|
|
|
2018-12-06 19:53:45 +00:00
|
|
|
// 128 x 64 OLED support (I2C)
|
2019-01-10 05:01:52 +00:00
|
|
|
// xxxx_SWITCHCAPVCC = generate display voltage from 3.3V internally
|
2018-11-26 10:26:38 +00:00
|
|
|
_pDisplay = new C128x64_OLED(OLED_SDA_pin, OLED_SCL_pin);
|
2019-01-10 05:01:52 +00:00
|
|
|
#if USE_ADAFRUIT_SH1106 == 1
|
2018-11-26 10:26:38 +00:00
|
|
|
_pDisplay->begin(SH1106_SWITCHCAPVCC);
|
2019-01-10 05:01:52 +00:00
|
|
|
Wire.begin(OLED_SDA_pin, OLED_SCL_pin, 800000); // speed up I2C from the default crappy 100kHz set via the adafruit begin!
|
|
|
|
#elif USE_ADAFRUIT_SSD1306 == 1
|
|
|
|
_pDisplay->begin(SSD1306_SWITCHCAPVCC, 0x3c);
|
|
|
|
_pDisplay->ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
|
|
|
|
_pDisplay->ssd1306_command(0x1F); // correct lame reversal of OLED current phases
|
|
|
|
#endif
|
2018-11-26 10:26:38 +00:00
|
|
|
|
2018-11-26 19:25:51 +00:00
|
|
|
// replace adafruit splash screen
|
|
|
|
_pDisplay->clearDisplay();
|
|
|
|
_pDisplay->drawBitmap(0, 0, DieselSplash, 128, 64, WHITE);
|
2018-11-17 02:08:22 +00:00
|
|
|
|
|
|
|
// Show initial display buffer contents on the screen --
|
2018-11-25 04:45:17 +00:00
|
|
|
_pDisplay->display();
|
2018-11-17 02:08:22 +00:00
|
|
|
|
2018-12-07 11:16:04 +00:00
|
|
|
DebugPort.println("Creating Screens");
|
2019-03-15 12:42:54 +00:00
|
|
|
|
|
|
|
std::vector<CScreen*> menuloop;
|
|
|
|
// create root menu loop
|
|
|
|
menuloop.push_back(new CDetailedScreen(*_pDisplay, *this)); // detail control
|
|
|
|
menuloop.push_back(new CBasicScreen(*_pDisplay, *this)); // basic control
|
2019-01-27 01:17:49 +00:00
|
|
|
if(!bNoClock)
|
2019-03-15 12:42:54 +00:00
|
|
|
menuloop.push_back(new CClockScreen(*_pDisplay, *this)); // clock
|
|
|
|
menuloop.push_back(new CPrimingScreen(*_pDisplay, *this)); // mode / priming
|
|
|
|
menuloop.push_back(new CWiFiScreen(*_pDisplay, *this)); // comms info
|
2019-04-10 23:00:36 +00:00
|
|
|
menuloop.push_back(new CGPIOInfoScreen(*_pDisplay, *this)); // GPIO info
|
|
|
|
menuloop.push_back(new CSettingsScreen(*_pDisplay, *this)); // Tuning info
|
2019-03-15 12:42:54 +00:00
|
|
|
_Screens.push_back(menuloop);
|
2019-04-19 11:38:39 +00:00
|
|
|
|
2019-03-15 12:42:54 +00:00
|
|
|
// create timer screens loop
|
|
|
|
menuloop.clear();
|
|
|
|
menuloop.push_back(new CTimerChartScreen(*_pDisplay, *this, 0)); // timer chart
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 0)); // set timer 1
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 1)); // set timer 2
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 2)); // set timer 3
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 3)); // set timer 4
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 4)); // set timer 5
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 5)); // set timer 6
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 6)); // set timer 7
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 7)); // set timer 8
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 8)); // set timer 9
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 9)); // set timer 10
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 10)); // set timer 11
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 11)); // set timer 12
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 12)); // set timer 13
|
|
|
|
menuloop.push_back(new CSetTimerScreen(*_pDisplay, *this, 13)); // set timer 14
|
|
|
|
_Screens.push_back(menuloop);
|
2019-04-19 11:38:39 +00:00
|
|
|
|
2019-03-15 12:42:54 +00:00
|
|
|
// create heater tuning screens loop - password protected
|
|
|
|
menuloop.clear();
|
|
|
|
menuloop.push_back(new CFuelMixtureScreen(*_pDisplay, *this)); // tuning
|
|
|
|
menuloop.push_back(new CHeaterSettingsScreen(*_pDisplay, *this)); // tuning
|
|
|
|
_Screens.push_back(menuloop);
|
2019-04-19 11:38:39 +00:00
|
|
|
|
2019-04-09 23:28:46 +00:00
|
|
|
// create User Settings screens loop
|
|
|
|
menuloop.clear();
|
|
|
|
menuloop.push_back(new CThermostatModeScreen(*_pDisplay, *this)); // experimental settings screen
|
|
|
|
menuloop.push_back(new CGPIOScreen(*_pDisplay, *this)); // GPIO settings screen
|
2019-04-19 11:38:39 +00:00
|
|
|
menuloop.push_back(new CVersionInfoScreen(*_pDisplay, *this)); // GPIO settings screen
|
2019-04-19 23:49:22 +00:00
|
|
|
menuloop.push_back(new CHomeMenuSelScreen(*_pDisplay, *this)); // Home menu settings screen
|
2019-04-19 11:38:39 +00:00
|
|
|
menuloop.push_back(new COtherOptionsScreen(*_pDisplay, *this)); // Other options screen
|
2019-04-09 23:28:46 +00:00
|
|
|
_Screens.push_back(menuloop);
|
2019-04-19 11:38:39 +00:00
|
|
|
|
2019-03-15 10:48:22 +00:00
|
|
|
// create branch screens
|
2019-03-15 12:42:54 +00:00
|
|
|
menuloop.clear();
|
|
|
|
menuloop.push_back(new CSetClockScreen(*_pDisplay, *this)); // clock set branch screen
|
|
|
|
menuloop.push_back(new CInheritSettingsScreen(*_pDisplay, *this)); // inherit OEM settings branch screen
|
2019-03-16 03:57:37 +00:00
|
|
|
menuloop.push_back(new CFontDumpScreen(*_pDisplay, *this)); // font dump branch screen
|
2019-03-15 12:42:54 +00:00
|
|
|
_Screens.push_back(menuloop);
|
2018-12-09 01:10:56 +00:00
|
|
|
|
2019-03-15 12:42:54 +00:00
|
|
|
_menu = 0;
|
2018-12-09 01:10:56 +00:00
|
|
|
#if RTC_USE_DS3231==0 && RTC_USE_DS1307==0 && RTC_USE_PCF8523==0
|
2019-03-15 12:42:54 +00:00
|
|
|
_rootMenu = 2; // bring up clock set screen first if using millis based RTC!
|
|
|
|
_subMenu = 2;
|
2018-12-09 01:10:56 +00:00
|
|
|
#else
|
2019-03-15 10:48:22 +00:00
|
|
|
_rootMenu = 1; // basic control screen
|
2019-03-15 12:42:54 +00:00
|
|
|
_subMenu = 1;
|
2018-12-09 01:10:56 +00:00
|
|
|
#endif
|
2018-11-25 04:45:17 +00:00
|
|
|
|
2019-02-28 08:56:13 +00:00
|
|
|
_enterScreen();
|
2018-11-17 02:08:22 +00:00
|
|
|
}
|
|
|
|
|
2018-12-01 18:25:10 +00:00
|
|
|
bool
|
2018-12-01 00:36:25 +00:00
|
|
|
CScreenManager::checkUpdate()
|
2018-11-25 04:45:17 +00:00
|
|
|
{
|
2019-04-27 10:41:47 +00:00
|
|
|
long dimTimeout = NVstore.getDimTime();
|
|
|
|
|
|
|
|
// manage dimming or blanking the display, according to user defined inactivity interval
|
|
|
|
if(dimTimeout && _DimTime_ms) {
|
|
|
|
long tDelta = millis() - _DimTime_ms;
|
2018-12-22 10:32:13 +00:00
|
|
|
if(tDelta > 0) {
|
2019-02-28 07:14:02 +00:00
|
|
|
// time to dim the display
|
2019-04-27 10:41:47 +00:00
|
|
|
_dim(true);
|
|
|
|
_DimTime_ms = 0;
|
|
|
|
|
|
|
|
if(dimTimeout < 0) {
|
|
|
|
_pDisplay->clearDisplay();
|
|
|
|
_pDisplay->display(); // blank screen
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(NVstore.getMenuTimeout() && _MenuTimeout) {
|
|
|
|
long tDelta = millis() - _MenuTimeout;
|
|
|
|
if(tDelta > 0) {
|
|
|
|
_MenuTimeout = 0;
|
|
|
|
// we will be blanking the display, transit through a dim stage first
|
|
|
|
if(dimTimeout < 0)
|
|
|
|
_dim(true);
|
2019-02-28 07:14:02 +00:00
|
|
|
|
2019-02-28 08:56:13 +00:00
|
|
|
_leaveScreen();
|
2019-02-28 07:14:02 +00:00
|
|
|
// fall back to main menu
|
2019-03-15 21:43:44 +00:00
|
|
|
selectMenu(RootMenuLoop);
|
|
|
|
// upon dim timeout - sticky root menu screens are the first 3 in the list:
|
|
|
|
// Detailed Control
|
|
|
|
// Basic Control
|
|
|
|
// Clock
|
|
|
|
// return to those upon timeout, otherwise return to Basic Control screen
|
2019-03-15 10:48:22 +00:00
|
|
|
if(_rootMenu > 2) {
|
2019-04-19 23:49:22 +00:00
|
|
|
uint8_t userHomeMenu = NVstore.getHomeMenu().onTimeout;
|
|
|
|
if(userHomeMenu) { // allow user to override defualt screen
|
|
|
|
userHomeMenu--;
|
2019-04-20 09:13:24 +00:00
|
|
|
DebugPort.print("Screen Manager: Menu timeout, falling back to user preferred screen: ");
|
|
|
|
switch(userHomeMenu) {
|
|
|
|
case 0: DebugPort.println("Detailed control menu"); break;
|
|
|
|
case 1: DebugPort.println("Basic control menu"); break;
|
|
|
|
case 2: DebugPort.println("Clock menu"); break;
|
|
|
|
}
|
2019-04-19 23:49:22 +00:00
|
|
|
_rootMenu = _subMenu = userHomeMenu;
|
2019-04-19 11:38:39 +00:00
|
|
|
}
|
2019-04-20 09:13:24 +00:00
|
|
|
else {
|
|
|
|
_rootMenu = _subMenu = 1;
|
|
|
|
DebugPort.print("Screen Manager: Menu timeout, falling back to Basic control screen");
|
|
|
|
}
|
2019-02-28 07:14:02 +00:00
|
|
|
}
|
2019-02-28 08:56:13 +00:00
|
|
|
_enterScreen();
|
2018-12-22 10:32:13 +00:00
|
|
|
}
|
2019-04-20 09:13:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int prevRunState = -1;
|
|
|
|
int runState = getHeaterInfo().getRunStateEx();
|
|
|
|
if(runState != prevRunState) {
|
|
|
|
if(runState > 0 && prevRunState == 0) {
|
|
|
|
// heater has started
|
|
|
|
uint8_t userStartMenu = NVstore.getHomeMenu().onStart;
|
|
|
|
if(userStartMenu && userStartMenu <= 3) { // allow user to override defualt screen
|
|
|
|
userStartMenu--;
|
|
|
|
DebugPort.print("Screen Manager: Heater start detected, switching to user preferred screen: ");
|
|
|
|
switch(userStartMenu) {
|
|
|
|
case 0: DebugPort.println("Detailed control menu"); break;
|
|
|
|
case 1: DebugPort.println("Basic control menu"); break;
|
|
|
|
case 2: DebugPort.println("Clock menu"); break;
|
|
|
|
}
|
|
|
|
_rootMenu = _subMenu = userStartMenu;
|
|
|
|
_enterScreen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(runState == 0 && prevRunState != 0) {
|
|
|
|
// heater has stopped
|
|
|
|
uint8_t userStopMenu = NVstore.getHomeMenu().onStop;
|
|
|
|
if(userStopMenu && userStopMenu <= 3) { // allow user to override defualt screen
|
|
|
|
userStopMenu--;
|
|
|
|
DebugPort.print("Screen Manager: Heater stop detected, switching to user preferred screen: ");
|
|
|
|
switch(userStopMenu) {
|
|
|
|
case 0: DebugPort.println("Detailed control menu"); break;
|
|
|
|
case 1: DebugPort.println("Basic control menu"); break;
|
|
|
|
case 2: DebugPort.println("Clock menu"); break;
|
|
|
|
}
|
|
|
|
_rootMenu = _subMenu = userStopMenu;
|
|
|
|
_enterScreen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
prevRunState = runState;
|
2018-12-22 10:32:13 +00:00
|
|
|
}
|
|
|
|
|
2019-04-20 09:13:24 +00:00
|
|
|
|
2018-11-27 10:44:47 +00:00
|
|
|
if(_bReqUpdate) {
|
2019-04-27 10:41:47 +00:00
|
|
|
if((dimTimeout < 0) && (_DimTime_ms == 0)) {
|
|
|
|
// no screen updates, we should be blanked!
|
2019-01-16 09:22:17 +00:00
|
|
|
}
|
|
|
|
else {
|
2019-04-27 10:41:47 +00:00
|
|
|
if(_pRebootScreen) {
|
|
|
|
_pRebootScreen->show();
|
2019-01-16 09:22:17 +00:00
|
|
|
_bReqUpdate = false;
|
|
|
|
return true;
|
|
|
|
}
|
2019-04-27 10:41:47 +00:00
|
|
|
else {
|
|
|
|
if(_menu >= 0) {
|
|
|
|
_Screens[_menu][_subMenu]->show();
|
|
|
|
_bReqUpdate = false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2018-11-27 10:44:47 +00:00
|
|
|
}
|
|
|
|
}
|
2018-12-01 18:25:10 +00:00
|
|
|
return false;
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
|
|
|
|
2018-11-27 10:44:47 +00:00
|
|
|
void
|
|
|
|
CScreenManager::reqUpdate()
|
|
|
|
{
|
|
|
|
_bReqUpdate = true;
|
|
|
|
}
|
|
|
|
|
2018-12-01 18:25:10 +00:00
|
|
|
bool
|
2018-11-25 04:45:17 +00:00
|
|
|
CScreenManager::animate()
|
2018-11-17 02:08:22 +00:00
|
|
|
{
|
2019-04-27 10:41:47 +00:00
|
|
|
if((NVstore.getDimTime() < 0) && (_DimTime_ms == 0)) {
|
|
|
|
// no screen updates, we should be blanked!
|
|
|
|
return false;
|
|
|
|
}
|
2019-03-15 12:42:54 +00:00
|
|
|
if(_menu >= 0)
|
|
|
|
return _Screens[_menu][_subMenu]->animate();
|
2018-12-01 18:25:10 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CScreenManager::refresh()
|
|
|
|
{
|
|
|
|
if(_pDisplay)
|
|
|
|
_pDisplay->display();
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-02-28 08:56:13 +00:00
|
|
|
CScreenManager::_enterScreen()
|
2018-11-25 04:45:17 +00:00
|
|
|
{
|
2019-03-15 12:42:54 +00:00
|
|
|
if(_menu >= 0)
|
|
|
|
_Screens[_menu][_subMenu]->onSelect();
|
2018-12-08 04:18:37 +00:00
|
|
|
|
2018-11-27 10:44:47 +00:00
|
|
|
reqUpdate();
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
|
|
|
|
2019-02-28 08:56:13 +00:00
|
|
|
void
|
|
|
|
CScreenManager::_leaveScreen()
|
|
|
|
{
|
2019-03-15 12:42:54 +00:00
|
|
|
if(_menu >= 0)
|
|
|
|
_Screens[_menu][_subMenu]->onExit();
|
2019-02-28 08:56:13 +00:00
|
|
|
}
|
|
|
|
|
2019-03-15 21:43:44 +00:00
|
|
|
void
|
|
|
|
CScreenManager::_changeSubMenu(int dir)
|
|
|
|
{
|
|
|
|
_leaveScreen();
|
|
|
|
_subMenu += dir;
|
|
|
|
int bounds = _Screens[_menu].size() - 1;
|
|
|
|
ROLLUPPERLIMIT(_subMenu, bounds, 0);
|
|
|
|
ROLLLOWERLIMIT(_subMenu, 0, bounds);
|
|
|
|
if(_menu == 0)
|
|
|
|
_rootMenu = _subMenu; // track the root menu for when we branch then return
|
|
|
|
_enterScreen();
|
|
|
|
}
|
|
|
|
|
2018-11-25 04:45:17 +00:00
|
|
|
void
|
2019-03-15 21:43:44 +00:00
|
|
|
CScreenManager::nextMenu()
|
2018-11-25 04:45:17 +00:00
|
|
|
{
|
2019-03-15 21:43:44 +00:00
|
|
|
if(_menu >= 0 && _menu != BranchMenu) {
|
|
|
|
_changeSubMenu(+1);
|
2018-11-23 10:34:37 +00:00
|
|
|
}
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2019-03-15 21:43:44 +00:00
|
|
|
CScreenManager::prevMenu()
|
2018-11-25 04:45:17 +00:00
|
|
|
{
|
2019-03-15 21:43:44 +00:00
|
|
|
if(_menu >= 0 && _menu != BranchMenu) {
|
|
|
|
_changeSubMenu(-1);
|
2018-11-25 04:45:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CScreenManager::keyHandler(uint8_t event)
|
|
|
|
{
|
2019-04-27 10:41:47 +00:00
|
|
|
long dimTime = NVstore.getDimTime();
|
|
|
|
|
|
|
|
if(_bDimmed) {
|
2019-04-08 23:12:42 +00:00
|
|
|
if(event & keyReleased) {
|
2019-04-27 10:41:47 +00:00
|
|
|
_dim(false);
|
|
|
|
_DimTime_ms = (millis() + abs(dimTime)) | 1;
|
|
|
|
_MenuTimeout = millis() + NVstore.getMenuTimeout();
|
2019-04-08 23:12:42 +00:00
|
|
|
}
|
2019-04-27 10:41:47 +00:00
|
|
|
return; // initial press when dimmed is always thrown away
|
2019-01-19 11:05:14 +00:00
|
|
|
}
|
2018-12-22 10:32:13 +00:00
|
|
|
|
2019-04-27 10:41:47 +00:00
|
|
|
// _dim(false);
|
|
|
|
_DimTime_ms = (millis() + abs(dimTime)) | 1;
|
|
|
|
_MenuTimeout = millis() + NVstore.getMenuTimeout();
|
2019-01-20 03:19:38 +00:00
|
|
|
|
2019-03-01 23:32:50 +00:00
|
|
|
// call key handler for active screen
|
2019-03-15 12:42:54 +00:00
|
|
|
if(_menu >= 0)
|
|
|
|
_Screens[_menu][_subMenu]->keyHandler(event);
|
2018-11-17 02:08:22 +00:00
|
|
|
}
|
|
|
|
|
2019-03-01 23:32:50 +00:00
|
|
|
void
|
2019-03-15 21:43:44 +00:00
|
|
|
CScreenManager::selectMenu(eUIMenuSets menuSet, int specific)
|
2019-03-15 07:19:30 +00:00
|
|
|
{
|
|
|
|
_leaveScreen();
|
2019-03-15 21:43:44 +00:00
|
|
|
if(_menu >= 0) { // only true once we have created the screens
|
|
|
|
_menu = menuSet;
|
|
|
|
if(specific >= 0) {
|
|
|
|
// targetting a specific menu
|
|
|
|
_subMenu = specific;
|
|
|
|
UPPERLIMIT(_subMenu, _Screens[_menu].size()-1); // check bounds!
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// default sub menu behaviour
|
|
|
|
if(_menu == 0)
|
|
|
|
_subMenu = _rootMenu; // return to last used root menu
|
|
|
|
else
|
|
|
|
_subMenu = 0; // branches always go to first sub menu
|
|
|
|
}
|
2019-03-15 12:42:54 +00:00
|
|
|
}
|
2019-03-15 07:19:30 +00:00
|
|
|
_enterScreen();
|
|
|
|
}
|
|
|
|
|
2019-01-16 09:22:17 +00:00
|
|
|
void
|
|
|
|
CScreenManager::showRebootMsg(const char* content[2], long delayTime)
|
|
|
|
{
|
|
|
|
if(_pRebootScreen == NULL)
|
|
|
|
_pRebootScreen = new CRebootScreen(*_pDisplay, *this);
|
|
|
|
|
|
|
|
_pRebootScreen->setMessage(content, delayTime);
|
|
|
|
_bReqUpdate = true;
|
2019-04-27 10:41:47 +00:00
|
|
|
_dim(false);
|
2019-01-16 09:22:17 +00:00
|
|
|
}
|
2019-01-18 07:09:40 +00:00
|
|
|
|
2019-04-27 10:41:47 +00:00
|
|
|
void
|
|
|
|
CScreenManager::_dim(bool state)
|
|
|
|
{
|
|
|
|
_bDimmed = state;
|
|
|
|
_pDisplay->dim(state);
|
|
|
|
}
|