152 lines
2.4 KiB
C++
152 lines
2.4 KiB
C++
#include "screen/menu.h"
|
|
#include "config.h"
|
|
#include "buzzer.h"
|
|
|
|
#include "menu/time.h"
|
|
|
|
|
|
MenuScreen::MenuScreen(ScreenManager* screenManager) : BaseScreen(screenManager)
|
|
{
|
|
mCount = 3;
|
|
mItems = new MenuItem*[mCount];
|
|
|
|
mItems[0] = new TimeMenuItem();
|
|
mItems[1] = new TimeMenuItem();
|
|
mItems[2] = new TimeMenuItem();
|
|
}
|
|
|
|
|
|
MenuScreen::~MenuScreen()
|
|
{
|
|
for (uint8_t i = 0; i < mCount; i++)
|
|
delete mItems[i];
|
|
|
|
delete[] mItems;
|
|
}
|
|
|
|
|
|
void MenuScreen::onShow()
|
|
{
|
|
printFullUpdate();
|
|
}
|
|
|
|
|
|
void MenuScreen::onHide()
|
|
{
|
|
}
|
|
|
|
|
|
void MenuScreen::printFullUpdate()
|
|
{
|
|
printTitle();
|
|
printScrollIndicators();
|
|
printValue();
|
|
}
|
|
|
|
|
|
void MenuScreen::printTitle()
|
|
{
|
|
LiquidCrystal* display = getDisplay();
|
|
|
|
const char* title = mItems[mSelected]->getTitle();
|
|
uint8_t titleLength = strlen(title);
|
|
uint8_t maxWidth = LCDWidth - 2;
|
|
|
|
display->setCursor(1, 0);
|
|
|
|
if (titleLength >= maxWidth)
|
|
{
|
|
// Title too long, cut off
|
|
char* character = (char*)title;
|
|
for (uint8_t i = 0; i < maxWidth; i++)
|
|
{
|
|
display->write(byte(*character));
|
|
character++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Center title
|
|
uint8_t offset = (maxWidth - titleLength) / 2;
|
|
|
|
for (uint8_t i = 0; i < offset; i++)
|
|
display->write(' ');
|
|
|
|
display->print(title);
|
|
offset += titleLength;
|
|
|
|
while (offset < LCDWidth - 2)
|
|
{
|
|
display->print(' ');
|
|
offset++;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MenuScreen::printScrollIndicators()
|
|
{
|
|
LiquidCrystal* display = getDisplay();
|
|
|
|
display->setCursor(0, 0);
|
|
if (mSelected > 0)
|
|
display->write(mEditing ? LCDCharArrowLeftHollow : LCDCharArrowLeft);
|
|
else
|
|
display->write(' ');
|
|
|
|
display->setCursor(LCDWidth - 1, 0);
|
|
if (mSelected < mCount - 1)
|
|
display->write(mEditing ? LCDCharArrowRightHollow : LCDCharArrowRight);
|
|
else
|
|
display->write(' ');
|
|
}
|
|
|
|
|
|
void MenuScreen::printValue()
|
|
{
|
|
LiquidCrystal* display = getDisplay();
|
|
|
|
display->setCursor(0, 1);
|
|
for (uint8_t x = 0; x < LCDWidth; x++)
|
|
display->write(' ');
|
|
}
|
|
|
|
|
|
|
|
void MenuScreen::onButton()
|
|
{
|
|
}
|
|
|
|
|
|
void MenuScreen::onEncoder(long lastPosition, long newPosition)
|
|
{
|
|
if (!mEditing)
|
|
{
|
|
if (newPosition > lastPosition)
|
|
{
|
|
if (mSelected < mCount - 1)
|
|
{
|
|
Buzzer::select();
|
|
mSelected++;
|
|
|
|
printFullUpdate();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (mSelected > 0)
|
|
{
|
|
Buzzer::select();
|
|
mSelected--;
|
|
|
|
printFullUpdate();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MenuScreen::onTick()
|
|
{
|
|
}
|