TKK_E32222388/App.h

427 lines
12 KiB
C

//Handle main app routine
//........................
//#include "ButtonRotaryHandler.h"
//#include "MenuHandler.h"
//#include "DisplayHandler.h"
#define MENU_NONE 0
#define MENU_DASHBOARD 1
#define MENU_SELECT_OPTION 2
#define MENU_DURATION_MAIN 3
#define MENU_DURATION_POST_UV 4
#define MENU_CONNECTION 5
#define MENU_ABOUT 6
#define SUBMENU_SELECT_NONE 0
int8_t displayIdx = MENU_NONE;
int8_t menuIdx = 0;
int8_t menuDisplayLowerBound = 0;
int8_t menuDisplayUpperBound = 0;
uint32_t waitDelay = 0;
uint32_t waitTick = 0;
bool responseCleanupButton = false;
bool responseCleanupRotary = false;
const char* textStartStop[] = {
"Mulai Sterilisasi",
"Stop Sterilisasi"
};
const char* textStartStopRefill[] = {
"Mulai Refill",
"Stop Refill"
};
const char* textAutoMode[] = {
"Otomasi Steril: Ya",
"Otomasi Steril: Tidak"
};
const char* textAutoRefillMode[] = {
"Otomasi Refill: Ya",
"Otomasi Refill: Tidak"
};
const char* menus[] = {
"Mulai/Stop Sterilisasi",
"Mulai/Stop Refill",
"Otomasi Steril: Ya/Tidak",
"Otomasi Refill: Ya/Tidak",
"Durasi Sterilisasi",
"Post-Sterilisasi UV",
"Koneksi",
"Tentang Aplikasi",
"Kembali"
};
#define SUBMENU_START_STOP 0
#define SUBMENU_START_STOP_REFILL 1
#define SUBMENU_AUTOMODE 2
#define SUBMENU_AUTOMODE_REFILL 3
#define SUBMENU_DURATION 4
#define SUBMENU_POST_UV 5
#define SUBMENU_CONNECTION 6
#define SUBMENU_ABOUT 7
#define SUBMENU_BACK 8
const char* durationSelect[] = {
"5 Menit",
"10 Menit",
"15 Menit",
"20 Menit",
"25 Menit",
"30 Menit"
};
const char* durationSelect2[] = {
"Non-Aktifan",
"5 Menit",
"10 Menit",
"15 Menit",
"20 Menit",
"25 Menit",
"30 Menit"
};
const char* apSelect2[] = {
"Kembali",
"Aktifkan/Nonaktifkan",
"Password Baru"
"Tanpa Password"
};
int dialogSelectionIndex = 0;
int SelectDialog(const char *title, const char *text, const char* durationList[], int indexLimit){
//limit index
if (dialogSelectionIndex>indexLimit) dialogSelectionIndex = indexLimit;
if (dialogSelectionIndex<0) dialogSelectionIndex = 0;
if (ButtonSwitchedEvent()==BUTTON_UNPRESSED_EVENT){
Serial.println("OK");
return dialogSelectionIndex;
}
int direction = RotaryEvent();
if (direction==DIRECTION_CW){
dialogSelectionIndex++;
if (dialogSelectionIndex>indexLimit) dialogSelectionIndex = indexLimit;
Serial.println(">>");
}else if (direction==DIRECTION_CCW){
dialogSelectionIndex--;
if (dialogSelectionIndex<0) dialogSelectionIndex = 0;
Serial.println("<<");
}
ClearDisplayBuffer();
DrawCenteredText(title, 0, false, false, false, true);
DrawCenteredText(text, 2, false);
//DrawCenteredText("30 Menit", 3, true, true, true);
DrawCenteredText(durationList[dialogSelectionIndex], 3, true, (dialogSelectionIndex>0), (dialogSelectionIndex<indexLimit));
SendDisplayBuffer();
return -1;
}
void SetWaitResponse(uint32_t delayMillis, bool needButtonCleanup=false, bool needRotaryCleanup = false){
waitDelay = delayMillis;
waitTick = millis();
responseCleanupButton = needButtonCleanup;
responseCleanupRotary = needRotaryCleanup;
}
void AppStartSterilizationSystem(){
Serial.println("AppStartSterilizationSystem()");
//copy configuration and start
bool useUV = GetPostUVTimeIndex()>0;
uint32_t uvDuration = ((uint32_t)GetPostUVTimeIndex()) * (5 * 60 * 1000);
ChamberSetPostUvDuration(uvDuration);
uint32_t ozoneDuration = ((uint32_t) (1+GetSterilizationTimeIndex())) * (5 * 60 * 1000);
//uint32_t ozoneDuration = ((uint32_t) (1+GetSterilizationTimeIndex())) * (1 * 60 * 1000);
ChamberSetSterlizationDuration(ozoneDuration);
bool autoMode = GetSettingAutoMode();
StartChamberSystem(autoMode, true, useUV);
}
void AppStartRefillSystem(){
Serial.println("AppStartRefillSystem()");
//copy configuration and start
StartWaterBankSystem(GetSettingAutoRefillMode(), true);
}
//handle app logic
void AppRoutine(){
//background task
//..................
if ((millis()-waitTick)<waitDelay){
if (responseCleanupButton) ButtonResetEvent();
if (responseCleanupRotary) RotaryResetEvent();
return;
}else{
if (responseCleanupButton) {
responseCleanupButton = false;
ButtonResetEvent();
}
if (responseCleanupRotary) {
responseCleanupRotary = false;
RotaryResetEvent();
}
}
switch (displayIdx){
case MENU_NONE:{
SetWaitResponse(2000, true, true);
displayIdx = MENU_DASHBOARD;
SplashScreen();
//u8g2.setPowerSave(1); //not working :(
Serial.println("Switch: MENU_DASHBOARD");
return;
}
break;
case MENU_DASHBOARD:{
//DashboardDemoRoutine();
DashboardRoutine();
//handle button to enter select option
if (ButtonSwitchedEvent()==BUTTON_UNPRESSED_EVENT){
displayIdx = MENU_SELECT_OPTION;
menuIdx = 0;
menuDisplayLowerBound = 0;
int maxMenuCount = sizeof(menus) / sizeof(menus[0]);;
menuDisplayUpperBound = min(DrawTextRowCount(), maxMenuCount)-1;
Serial.print("Menu upper bound: ");
Serial.println(menuDisplayUpperBound);
Serial.println("Switch: MENU_SELECT_OPTION");
SetWaitResponse(50, true, true);
}else{
SetWaitResponse(5, false, false);
}
}
break;
case MENU_SELECT_OPTION:{
//handle rotary
int maxDisplayTextRow = DrawTextRowCount();
int maxMenuCount = sizeof(menus) / sizeof(menus[0]);
int boundDiff = (min(DrawTextRowCount(), maxMenuCount)-1);
int direction = RotaryEvent();
bool rotaryChanged = false;
if (direction==DIRECTION_CW){
rotaryChanged = true;
menuIdx++;
if (menuIdx>=maxMenuCount){
menuIdx = 0;
menuDisplayLowerBound = 0;
menuDisplayUpperBound = boundDiff;
}
if (menuIdx>menuDisplayUpperBound){
menuDisplayUpperBound = menuIdx;
menuDisplayLowerBound = menuDisplayUpperBound-boundDiff;
}
}else if (direction==DIRECTION_CCW){
Serial.println("handle CCW");
rotaryChanged = true;
menuIdx--;
if (menuIdx<0){
menuIdx=maxMenuCount-1;
menuDisplayUpperBound = menuIdx;
menuDisplayLowerBound = menuDisplayUpperBound-boundDiff;
}
//Serial.print("lowerbound "); Serial.println(menuDisplayLowerBound);
//Serial.print("upperbound "); Serial.println(menuDisplayUpperBound);
// if (menuDisplayUpperBound<menuIdx){
// menuDisplayUpperBound = menuIdx;
// menuDisplayLowerBound = menuDisplayUpperBound-boundDiff;
// }
if (menuIdx<menuDisplayLowerBound){
menuDisplayLowerBound = menuIdx;
menuDisplayUpperBound = menuDisplayLowerBound+boundDiff;
if (menuDisplayUpperBound>=maxMenuCount) menuDisplayUpperBound = maxMenuCount-1;
}
}
if (rotaryChanged){
SetWaitResponse(50);//next response is 50 (best)
}
//handle button
if (ButtonSwitchedEvent()==BUTTON_UNPRESSED_EVENT){
Serial.print("Clicking sub menu: ");
Serial.println(menuIdx);
switch(menuIdx){
case SUBMENU_START_STOP:{
if (IsChamberSystemRunning()){
Serial.println("Call: StopChamberSystem()");
StopChamberSystem();
}else{
Serial.println("Call: AppStartSterilizationSystem()");
ClearWaterBankError();//clear error juga buat water tank
AppStartSterilizationSystem();
}
displayIdx = MENU_DASHBOARD;
Serial.println("Switch: MENU_DASHBOARD");
SetWaitResponse(0, true, true);
return;
};
case SUBMENU_START_STOP_REFILL:{
if (IsWaterBankSystemRunning()){
StopWaterBankSystem();
}else{
ClearChamberError();//clear error juga buat chamber
AppStartRefillSystem();
}
displayIdx = MENU_DASHBOARD;
Serial.println("Switch: MENU_DASHBOARD");
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_AUTOMODE:{
SetSettingAutoMode(!GetSettingAutoMode());
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_AUTOMODE_REFILL:{
SetSettingAutoRefillMode(!GetSettingAutoRefillMode());
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_DURATION:{
dialogSelectionIndex = GetSterilizationTimeIndex();
displayIdx = MENU_DURATION_MAIN;
Serial.println("Switch: MENU_DURATION_MAIN");
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_POST_UV:{
dialogSelectionIndex = GetUVTimeIndex();
displayIdx = MENU_DURATION_POST_UV;
Serial.println("Switch: MENU_DURATION_POST_UV");
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_CONNECTION:{
displayIdx = MENU_CONNECTION;
Serial.println("Switch: MENU_CONNECTION");
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_ABOUT:{
displayIdx = MENU_ABOUT;
Serial.println("Switch: MENU_ABOUT");
SetWaitResponse(0, true, true);
return;
};
break;
case SUBMENU_BACK:{
displayIdx = MENU_DASHBOARD;
Serial.println("Switch: MENU_DASHBOARD");
SetWaitResponse(200, true, true);
return;
};
break;
}
}
//adapt state
if (!IsChamberSystemRunning()){
menus[SUBMENU_START_STOP] = textStartStop[0];
}else{
menus[SUBMENU_START_STOP] = textStartStop[1];
}
//adapt state for refill
if (!IsWaterBankSystemRunning()){
menus[SUBMENU_START_STOP_REFILL] = textStartStopRefill[0];
}else{
menus[SUBMENU_START_STOP_REFILL] = textStartStopRefill[1];
}
//adapt sterilization auto mode text:
if (GetSettingAutoRefillMode()){
menus[SUBMENU_AUTOMODE_REFILL] = textAutoRefillMode[0];
}else{
menus[SUBMENU_AUTOMODE_REFILL] = textAutoRefillMode[1];
}
//adapt refill auto mode text:
if (GetSettingAutoMode()){
menus[SUBMENU_AUTOMODE] = textAutoMode[0];
}else{
menus[SUBMENU_AUTOMODE] = textAutoMode[1];
}
ClearDisplayBuffer();
//DrawSectionPlaceholder();
int pointerIdx = menuIdx;
int row = 0;
for (int i=menuDisplayLowerBound;i<=menuDisplayUpperBound;i++){
DrawTextMenuAtRow(menus[i], row, i==pointerIdx);
row++;
}
SendDisplayBuffer();
}
break;
case MENU_DURATION_MAIN:{
int idx = SelectDialog("Durasi Sterilisasi", "Pilihan Durasi:", durationSelect, 5);
if (idx>=0){
displayIdx = MENU_SELECT_OPTION;
SetSterilizationTimeIndex(idx);
SetWaitResponse(0, true, true);
}else{
SetWaitResponse(50, false, false);
}
}
break;
case MENU_DURATION_POST_UV:{
int limit = 6;
int idx = SelectDialog("Post-Sterilisasi UV", "Pilihan Durasi:", durationSelect2, limit);
if (idx>=0){
displayIdx = MENU_SELECT_OPTION;
SetPostUVTimeIndex(idx);
SetWaitResponse(0, true, true);
}else{
SetWaitResponse(50, false, false);
}
}
break;
case MENU_CONNECTION:{
//DrawUnderConstruction();
ClearDisplayBuffer();
DrawCenteredText("Koneksi", 0, false, false, false, true);
DrawCenteredText("SSID: HYDROZONER_V1", 1, false);
String pwd = "Password: " + GetApPassword();
DrawCenteredText(pwd.c_str(), 2, false);
SendDisplayBuffer();
displayIdx = MENU_SELECT_OPTION;
SetWaitResponse(5000, true, true);
}
break;
case MENU_ABOUT:{
DrawAbout();
if (ButtonSwitchedEvent()==BUTTON_UNPRESSED_EVENT){
displayIdx = MENU_SELECT_OPTION;
}
}
break;
}
}
void InitApp(){
//cek setingan kalau mode auto maka dijalankan
if (GetSettingAutoMode()){
AppStartSterilizationSystem();
}
if (GetSettingAutoRefillMode()){
AppStartRefillSystem();
}
}