Files
awtrix-light/src/MenuManager.cpp
2023-04-01 18:32:20 +02:00

488 lines
12 KiB
C++

#include <MenuManager.h>
#include <Arduino.h>
#include <Globals.h>
#include <ServerManager.h>
#include <DisplayManager.h>
#include <PeripheryManager.h>
#include <updater.h>
#include <icons.h>
String menuText;
int menuSelection;
int8_t stationIndex = 0;
bool isPlayingRadio = false;
enum MenuState
{
MainMenu,
BrightnessMenu,
FPSMenu,
ColorMenu,
SwitchMenu,
TspeedMenu,
AppTimeMenu,
TimeFormatMenu,
DateFormatMenu,
WeekdayMenu,
TempMenu,
Appmenu,
SoundMenu,
VolumeMenu
};
const char *menuItems[] PROGMEM = {
"BRIGHT",
"FPS",
"COLOR",
"SWITCH",
"T-SPEED",
"APPTIME",
"TIME",
"DATE",
"WEEKDAY",
"TEMP",
"APPS",
"SOUND",
"VOLUME",
"UPDATE"};
int8_t menuIndex = 0;
uint8_t menuItemCount = 14;
const char *timeFormat[] PROGMEM = {
"%H:%M:%S",
"%l:%M:%S",
"%H:%M",
"%H %M",
"%l:%M",
"%l %M",
"%l:%M %p",
"%l %M %p"};
int8_t timeFormatIndex;
uint8_t timeFormatCount = 8;
const char *dateFormat[] PROGMEM = {
"%d.%m.%y", // 01.04.22
"%d.%m", // 01.04
"%y-%m-%d", // 22-04-01
"%m-%d", // 04-01
"%m/%d/%y", // 04/01/22
"%m/%d", // 04/01
"%d/%m/%y", // 01/04/22
"%d/%m", // 01/04
"%m-%d-%y", // 04-01-22
};
int8_t dateFormatIndex;
uint8_t dateFormatCount = 9;
const char *appsItems[][2] PROGMEM = {
{"13", "time"},
{"1158", "date"},
{"234", "temp"},
#ifdef ULANZI
{"2075", "hum"},
{"1486", "bat"}};
#else
{"2075", "hum"}};
#endif
int8_t appsIndex;
uint8_t appsCount = 5;
MenuState currentState = MainMenu;
uint16_t textColors[] PROGMEM = {
0xFFFF, // White
0xF800, // Red
0xF812, // Dark orange
0xF81F, // Yellow
0x881F, // Dark green
0x001F, // Blue
0x04FF, // Light blue
0x07FC, // Cyan
0x07E2, // Seafoam green
0xAFE0, // Light green
0xFFE0, // Light yellow
0xFD60, // Dark yellow
0xFBC0}; // Pink
uint8_t currentColor;
MenuManager_ &MenuManager_::getInstance()
{
static MenuManager_ instance;
return instance;
}
// Initialize the global shared instance
MenuManager_ &MenuManager = MenuManager.getInstance();
String MenuManager_::menutext()
{
time_t now = time(nullptr);
char t[20];
char display[20];
switch (currentState)
{
case MainMenu:
DisplayManager.drawMenuIndicator(menuIndex, menuItemCount, 0xF800);
return menuItems[menuIndex];
case BrightnessMenu:
return AUTO_BRIGHTNESS ? "AUTO" : String(BRIGHTNESS_PERCENT) + "%";
case FPSMenu:
return String(MATRIX_FPS) + " FPS";
case ColorMenu:
DisplayManager.drawMenuIndicator(currentColor, sizeof(textColors) / sizeof(textColors[0]), 0xFBC0);
DisplayManager.setTextColor(textColors[currentColor]);
return "0x" + String(textColors[currentColor], HEX);
case SwitchMenu:
return AUTO_TRANSITION ? "ON" : "OFF";
case SoundMenu:
return SOUND_ACTIVE ? "ON" : "OFF";
case TspeedMenu:
return String(TIME_PER_TRANSITION / 1000.0, 1) + "s";
case AppTimeMenu:
return String(TIME_PER_APP / 1000.0, 0) + "s";
case TimeFormatMenu:
DisplayManager.drawMenuIndicator(timeFormatIndex, timeFormatCount, 0xFBC0);
char display[9];
if (timeFormat[timeFormatIndex][2] == ' ')
{
snprintf(display, sizeof(display), "%s", timeFormat[timeFormatIndex]);
display[2] = now % 2 ? ' ' : ':';
}
else
{
snprintf(display, sizeof(display), "%s", timeFormat[timeFormatIndex]);
}
strftime(t, sizeof(t), display, localtime(&now));
return t;
case DateFormatMenu:
DisplayManager.drawMenuIndicator(dateFormatIndex, dateFormatCount, 0xFBC0);
strftime(t, sizeof(t), dateFormat[dateFormatIndex], localtime(&now));
return t;
case WeekdayMenu:
return START_ON_MONDAY ? "MON" : "SUN";
case TempMenu:
return IS_CELSIUS ? "°C" : "°F";
case Appmenu:
DisplayManager.drawMenuIndicator(appsIndex, appsCount, 0xFBC0);
switch (appsIndex)
{
case 0:
DisplayManager.drawBMP(0, 0, get_icon(13), 8, 8);
return SHOW_TIME ? "ON" : "OFF";
case 1:
DisplayManager.drawBMP(0, 0, get_icon(1158), 8, 8);
return SHOW_DATE ? "ON" : "OFF";
case 2:
DisplayManager.drawBMP(0, 0, get_icon(234), 8, 8);
return SHOW_TEMP ? "ON" : "OFF";
case 3:
DisplayManager.drawBMP(0, 0, get_icon(2075), 8, 8);
return SHOW_HUM ? "ON" : "OFF";
#ifdef ULANZI
case 4:
DisplayManager.drawBMP(0, 0, get_icon(1486), 8, 8);
return SHOW_BAT ? "ON" : "OFF";
#endif
default:
break;
}
break;
default:
break;
}
return "";
}
void MenuManager_::rightButton()
{
if (!inMenu)
return;
switch (currentState)
{
case MainMenu:
menuIndex = (menuIndex + 1) % menuItemCount;
break;
case BrightnessMenu:
if (!AUTO_BRIGHTNESS)
{
BRIGHTNESS_PERCENT = (BRIGHTNESS_PERCENT % 100) + 1;
BRIGHTNESS = map(BRIGHTNESS_PERCENT, 0, 100, 0, 255);
DisplayManager.setBrightness(BRIGHTNESS);
}
break;
case FPSMenu:
if (MATRIX_FPS < 30)
++MATRIX_FPS;
break;
case ColorMenu:
currentColor = (currentColor + 1) % (sizeof(textColors) / sizeof(textColors[0]));
break;
case SwitchMenu:
AUTO_TRANSITION = !AUTO_TRANSITION;
break;
case TspeedMenu:
TIME_PER_TRANSITION = min(1200, TIME_PER_TRANSITION + 100);
break;
case AppTimeMenu:
TIME_PER_APP = min(30000, TIME_PER_APP + 1000);
break;
case TimeFormatMenu:
timeFormatIndex = (timeFormatIndex + 1) % timeFormatCount;
break;
case DateFormatMenu:
dateFormatIndex = (dateFormatIndex + 1) % dateFormatCount;
break;
case Appmenu:
appsIndex = (appsIndex + 1) % appsCount;
break;
case WeekdayMenu:
START_ON_MONDAY = !START_ON_MONDAY;
break;
case SoundMenu:
SOUND_ACTIVE = !SOUND_ACTIVE;
break;
case TempMenu:
IS_CELSIUS = !IS_CELSIUS;
break;
case VolumeMenu:
VOLUME_PERCENT = (VOLUME_PERCENT % 100) + 1;
VOLUME = map(VOLUME_PERCENT, 0, 100, 0, 30);
PeripheryManager.setVolume(VOLUME);
default:
break;
}
}
void MenuManager_::leftButton()
{
if (!inMenu)
{
return;
}
switch (currentState)
{
case MainMenu:
menuIndex = (menuIndex == 0) ? menuItemCount - 1 : menuIndex - 1;
break;
case BrightnessMenu:
if (!AUTO_BRIGHTNESS)
{
BRIGHTNESS_PERCENT = (BRIGHTNESS_PERCENT == 1) ? 100 : BRIGHTNESS_PERCENT - 1;
BRIGHTNESS = map(BRIGHTNESS_PERCENT, 0, 100, 0, 255);
DisplayManager.setBrightness(BRIGHTNESS);
}
break;
case FPSMenu:
if (MATRIX_FPS > 15)
{
MATRIX_FPS--;
}
break;
case ColorMenu:
currentColor = (currentColor + sizeof(textColors) / sizeof(textColors[0]) - 1) % (sizeof(textColors) / sizeof(textColors[0]));
break;
case SwitchMenu:
AUTO_TRANSITION = !AUTO_TRANSITION;
break;
case TspeedMenu:
TIME_PER_TRANSITION = max(200, TIME_PER_TRANSITION - 100);
break;
case AppTimeMenu:
TIME_PER_APP = max(1000, TIME_PER_APP - 1000);
break;
case TimeFormatMenu:
timeFormatIndex = (timeFormatIndex == 0) ? timeFormatCount - 1 : timeFormatIndex - 1;
break;
case DateFormatMenu:
dateFormatIndex = (dateFormatIndex == 0) ? dateFormatCount - 1 : dateFormatIndex - 1;
break;
case Appmenu:
appsIndex = (appsIndex == 0) ? appsCount - 1 : appsIndex - 1;
break;
case WeekdayMenu:
START_ON_MONDAY = !START_ON_MONDAY;
break;
case TempMenu:
IS_CELSIUS = !IS_CELSIUS;
break;
case SoundMenu:
SOUND_ACTIVE = !SOUND_ACTIVE;
break;
case VolumeMenu:
VOLUME_PERCENT = (VOLUME_PERCENT % 100) + 1;
VOLUME = map(VOLUME_PERCENT, 0, 100, 0, 30);
PeripheryManager.setVolume(VOLUME);
default:
break;
}
}
void MenuManager_::selectButton()
{
if (!inMenu)
{
return;
}
switch (currentState)
{
case MainMenu:
switch (menuIndex)
{
case 0:
BRIGHTNESS_PERCENT = map(BRIGHTNESS, 0, 255, 0, 100);
currentState = BrightnessMenu;
break;
case 1:
currentState = FPSMenu;
break;
case 2:
currentState = ColorMenu;
break;
case 3:
currentState = SwitchMenu;
break;
case 4:
currentState = TspeedMenu;
break;
case 5:
currentState = AppTimeMenu;
break;
case 6:
currentState = TimeFormatMenu;
break;
case 7:
currentState = DateFormatMenu;
break;
case 8:
currentState = WeekdayMenu;
break;
case 9:
currentState = TempMenu;
break;
case 10:
currentState = Appmenu;
break;
case 11:
currentState = SoundMenu;
break;
case 12:
#ifdef AWTRIX_UPGRADE
currentState = VolumeMenu;
#endif
break;
case 13:
if (FirmwareVersionCheck())
{
updateFirmware();
}
break;
default:
break;
}
break;
case BrightnessMenu:
AUTO_BRIGHTNESS = !AUTO_BRIGHTNESS;
if (!AUTO_BRIGHTNESS)
{
BRIGHTNESS = map(BRIGHTNESS_PERCENT, 0, 100, 0, 255);
DisplayManager.setBrightness(BRIGHTNESS);
}
break;
case Appmenu:
switch (appsIndex)
{
case 0:
SHOW_TIME = !SHOW_TIME;
break;
case 1:
SHOW_DATE = !SHOW_DATE;
break;
case 2:
SHOW_TEMP = !SHOW_TEMP;
break;
case 3:
SHOW_HUM = !SHOW_HUM;
break;
#ifdef ULANZI
case 4:
SHOW_BAT = !SHOW_BAT;
break;
#endif
default:
break;
}
break;
default:
break;
}
}
void MenuManager_::selectButtonLong()
{
if (inMenu)
{
switch (currentState)
{
case BrightnessMenu:
BRIGHTNESS = map(BRIGHTNESS_PERCENT, 0, 100, 0, 255);
saveSettings();
break;
case FPSMenu:
DisplayManager.setFPS(MATRIX_FPS);
saveSettings();
break;
case ColorMenu:
TEXTCOLOR_565 = textColors[currentColor];
saveSettings();
break;
case MainMenu:
inMenu = false;
break;
case SwitchMenu:
DisplayManager.setAutoTransition(AUTO_TRANSITION);
saveSettings();
break;
case TspeedMenu:
case AppTimeMenu:
DisplayManager.applyAllSettings();
saveSettings();
break;
case VolumeMenu:
#ifdef AWTRIX_UPGRADE
VOLUME = map(VOLUME_PERCENT, 0, 100, 0, 30);
saveSettings();
#endif
break;
case TimeFormatMenu:
TIME_FORMAT = timeFormat[timeFormatIndex];
saveSettings();
break;
case DateFormatMenu:
DATE_FORMAT = dateFormat[dateFormatIndex];
saveSettings();
case WeekdayMenu:
case SoundMenu:
case TempMenu:
saveSettings();
break;
case Appmenu:
DisplayManager.loadNativeApps();
saveSettings();
break;
default:
break;
}
currentState = MainMenu;
}
else
{
inMenu = true;
}
}