113 lines
3.8 KiB
C++
113 lines
3.8 KiB
C++
//
|
|
// Created by robtor on 05.01.23.
|
|
//
|
|
|
|
#include "Menu_Controller.h"
|
|
|
|
namespace floatpump::menu {
|
|
|
|
void Menu_Controller::execute() {
|
|
displayMenu(m_menu);
|
|
}
|
|
|
|
void Menu_Controller::pushEvent(Menu_Controller::Event ev) {
|
|
switch (ev) {
|
|
case Increase:
|
|
increase(m_menu);
|
|
break;
|
|
case Decrease:
|
|
decrease(m_menu);
|
|
break;
|
|
case Push:
|
|
keypress(m_menu);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Menu_Controller::displayMenu(Menu *m) {
|
|
int page = m_current_index / 4; //Currently displayed page
|
|
int pageindex = m_current_index % 4; //Current line on page
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
m_driver.LCDSetCursor(0, i);
|
|
|
|
//Set arrow marker for currently selected line
|
|
if (pageindex == i) {
|
|
m_driver.LCDSendChar(LCD_I2C_Driver::SpecialChars::RightArrow);
|
|
} else {
|
|
m_driver.LCDSendCString((char *) " ");
|
|
}
|
|
|
|
m_driver.LCDSetCursor(1, i);
|
|
|
|
//Map screen line numbers to index
|
|
int entry_index = (page * 4) + i;
|
|
|
|
//Retreive menu contents
|
|
auto menutexts = m->getDisplayList();
|
|
|
|
if (entry_index < m->getAllEntriesNum()) {
|
|
std::string dspstring = menutexts[entry_index];
|
|
|
|
if (dspstring.length() > 19) {
|
|
dspstring = "-- ERR --";
|
|
} else {
|
|
dspstring.append((19 - dspstring.length()), ' ');
|
|
}
|
|
|
|
m_driver.LCDSendCString(const_cast<char *>(dspstring.c_str()));
|
|
} else {
|
|
//Clear rest of screen if not fully containing a menu
|
|
m_driver.LCDSendCString((char *) " ");
|
|
}
|
|
}
|
|
}
|
|
|
|
void Menu_Controller::keypress(Menu *m) {
|
|
//Enter submenu if entry is submenu
|
|
if (m->getSubmenu(m_current_index) != nullptr) {
|
|
//Replace containing menu with submenu
|
|
m_menu = m->getSubmenu(m_current_index);
|
|
m_current_index = 0;
|
|
//Forward press action if entry is entry
|
|
} else if (m->getEntry(m_current_index) != nullptr) {
|
|
m->getEntry(m_current_index)->action_press();
|
|
//If we are on the Go-Back-Entry and have a parent: replace menu with parent menu
|
|
} else if (m_menu->getParent() != nullptr) {
|
|
m_menu = m_menu->getParent();
|
|
m_current_index = 0;
|
|
}
|
|
}
|
|
|
|
void Menu_Controller::increase(Menu *m) {
|
|
if (m_current_index < m->getAllEntriesNum()) {
|
|
if (m->getEntry(m_current_index) != nullptr) {
|
|
//Forward increase action to entry if we have an entered entry
|
|
if (m->getEntry(m_current_index)->isEntered()) {
|
|
m->getEntry(m_current_index)->action_increase();
|
|
} else if (m_current_index < m->getAllEntriesNum() - 1) {
|
|
m_current_index++;
|
|
}
|
|
} else if (m_current_index < m->getAllEntriesNum() - 1) {
|
|
m_current_index++;
|
|
}
|
|
} else if (m_current_index < m->getAllEntriesNum() - 1) {
|
|
m_current_index++;
|
|
}
|
|
}
|
|
|
|
void Menu_Controller::decrease(Menu *m) {
|
|
if (m_current_index > 0) {
|
|
if (m->getEntry(m_current_index) != nullptr) {
|
|
//Forward decrease action to entry if we have an entered entry
|
|
if (m->getEntry(m_current_index)->isEntered()) {
|
|
m->getEntry(m_current_index)->action_decrease();
|
|
} else {
|
|
m_current_index--;
|
|
}
|
|
} else {
|
|
m_current_index--;
|
|
}
|
|
}
|
|
}
|
|
} // menu
|