5#ifndef OSCR_INTERFACES_H_
6#define OSCR_INTERFACES_H_
10#include "common/specializations.h"
11#include "common/Util.h"
12#include "api/Storage.h"
14#define menuoptionsize(menu) (size_t)sizeof(menu.options[0])
15#define menusize(menu) (size_t)(sizeof(menu.options)/sizeof(menu.options[0]))
24 extern bool const kSupportsLineAdjments;
77 template <u
int8_t optionCount, u
int8_t optionLength>
80 char options[optionCount][optionLength];
82 uint8_t
const length = optionLength;
83 uint8_t
const max = optionCount;
85 char * operator[](
size_t idx) {
return options[idx]; }
86 char const * operator[](
size_t idx)
const {
return options[idx]; }
159 RangeSelect(__FlashStringHelper
const * menuTitle, uint16_t
const rangeMin = 0, uint16_t
const rangeMax = UINT16_MAX);
190 __FlashStringHelper
const * title;
193 uint16_t currentValue;
196 uint8_t currentPosition = 0;
197 bool rendered =
false;
199 bool valueInBounds(uint32_t newValue);
200 int32_t diffValue(
bool willRollover, int32_t tens, int8_t rolloverNumber, int8_t step);
201 bool adjustValue(
bool willRollover, int32_t tens, int8_t rolloverNumber, int8_t step);
203 uint8_t getPositionsFor(uint16_t value);
204 int8_t getNumberAt(uint16_t value, uint8_t position);
208 void navigate(
NavDir direction);
209 void onSelectionChange();
226 MenuRenderer(
char const * menuTitle);
227 MenuRenderer(
char const * menuTitle, uint16_t entryCount);
229 MenuRenderer(__FlashStringHelper
const * menuTitle);
230 MenuRenderer(__FlashStringHelper
const * menuTitle, uint16_t entryCount);
232 virtual ~MenuRenderer() {};
235 uint16_t getPageCount();
237 uint16_t getPageEntryCount();
238 uint16_t getPageEntryOffset();
239 uint16_t getEntryIndex();
240 void gotoPage(uint16_t page);
260 uint16_t pageEntriesLast;
262 uint16_t currentPage = 1;
263 uint16_t selection = 0;
264 bool rendered =
false;
266 char pageEntries[UI_PAGE_SIZE][UI_PAGE_ENTRY_LENTH_MAX];
269 void navigate(
NavDir direction);
270 void onSelectionChange();
273 virtual bool onConfirm() = 0;
274 virtual void setup() = 0;
275 virtual void onPageChange() = 0;
289 class MenuBase:
public MenuRenderer
292 MenuBase(
char const * menuTitle, uint8_t entryCount,
MenuMode menuBaseMode, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
293 MenuBase(__FlashStringHelper
const * menuTitle, uint8_t entryCount,
MenuMode menuBaseMode, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
297 uint8_t entryLengthMax;
325 Menu(
char const * menuTitle,
char const *
const menuEntries[], uint8_t entryCount);
326 Menu(__FlashStringHelper
const * menuTitle,
char const *
const menuEntries[], uint8_t entryCount);
328 Menu(
char const * menuTitle, __FlashStringHelper
const *
const * menuEntries, uint8_t entryCount);
329 Menu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const *
const * menuEntries, uint8_t entryCount);
339 Menu(
char const * menuTitle,
char * menuEntries[], uint8_t entryCount, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
340 Menu(__FlashStringHelper
const * menuTitle,
char * menuEntries[], uint8_t entryCount, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
343 char const *
const * entries;
349 template<u
int8_t optionCount, u
int8_t optionLength>
363 __FlashStringHelper
const * templateString;
381 FlashTemplateMenu(
char const * menuTitle, __FlashStringHelper
const * templateStr,
char const *
const menuEntries[], uint8_t entryCount);
382 FlashTemplateMenu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const * templateStr,
char const *
const menuEntries[], uint8_t entryCount);
385 __FlashStringHelper
const * templateString;
386 char const *
const * entries;
392 template <
typename T,
393 OSCR::Util::if_is_integer_t<T> Enable =
true>
405 IntegerTemplateMenu(
char const * menuTitle, __FlashStringHelper
const * templateStr, T
const * menuEntries, uint8_t entryCount);
406 IntegerTemplateMenu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const * templateStr, T
const * menuEntries, uint8_t entryCount);
409 __FlashStringHelper
const * templateString;
416 uint16_t rangeSelect(__FlashStringHelper
const * menuTitle, uint16_t
const rangeMax);
417 uint16_t rangeSelect(__FlashStringHelper
const * menuTitle, uint16_t
const rangeMin, uint16_t
const rangeMax);
418 uint16_t rangeSelect(__FlashStringHelper
const * menuTitle, uint16_t
const rangeMin, uint16_t
const rangeMax, uint16_t
const startAt);
427 extern uint8_t
menu(__FlashStringHelper
const * menuTitle,
char const *
const menuEntries[], uint8_t entryCount);
428 extern uint8_t
menu(
char const * menuTitle,
char const *
const menuEntries[], uint8_t entryCount);
437 extern uint8_t
menu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const *
const * menuEntries, uint8_t entryCount);
438 extern uint8_t
menu(
char const * menuTitle, __FlashStringHelper
const *
const * menuEntries, uint8_t entryCount);
448 extern uint8_t
menu(__FlashStringHelper
const * menuTitle,
char * menuEntries[], uint8_t entryCount, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
449 extern uint8_t
menu(
char const * menuTitle,
char * menuEntries[], uint8_t entryCount, uint8_t entryLength = UI_PAGE_ENTRY_LENTH_MAX);
451 extern uint8_t
menu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const * templateStr,
char const *
const menuEntries[], uint8_t entryCount);
452 extern uint8_t
menu(
char const * menuTitle, __FlashStringHelper
const * templateStr,
char const *
const menuEntries[], uint8_t entryCount);
454 template <
typename T,
455 OSCR::Util::enable_if_t<OSCR::Util::is_integer<T>::value,
bool> Enable =
true>
456 extern uint8_t
menu(__FlashStringHelper
const * menuTitle, __FlashStringHelper
const * templateStr, T
const * menuEntries, uint8_t entryCount);
458 template <
typename T,
459 OSCR::Util::enable_if_t<OSCR::Util::is_integer<T>::value,
bool> Enable =
true>
460 extern uint8_t
menu(
char const * menuTitle, __FlashStringHelper
const * templateStr, T
const * menuEntries, uint8_t entryCount);
473 template<u
int8_t optionCount, u
int8_t optionLength>
476 template<u
int8_t optionCount, u
int8_t optionLength>
488 extern void printHeader(__FlashStringHelper
const * title);
513 template <
bool prfx =
true,
515 OSCR::Util::if_is_any_unsigned_t<T> Enable =
true>
523 template <
bool prfx =
true,
525 OSCR::Util::if_is_any_unsigned_t<T> Enable =
true>
535 template <
bool sync =
false,
537 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true,
538 OSCR::Util::enable_if_t<!(OSCR::Util::is_printable<T>::value),
bool> NonPrintable =
true>
548 template <
bool sync =
false,
550 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true,
551 OSCR::Util::enable_if_t<!(OSCR::Util::is_printable<T>::value),
bool> NonPrintable =
true>
561 template <
typename T,
562 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true,
563 OSCR::Util::enable_if_t<!(OSCR::Util::is_printable<T>::value),
bool> NonPrintable =
true>
576 template <
typename T,
577 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true,
578 OSCR::Util::enable_if_t<!(OSCR::Util::is_printable<T>::value),
bool> NonPrintable =
true>
589 template <
bool sync = false>
610 template <
bool sync =
false,
612 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value,
bool> Enable =
true>
613 extern void print(Tint number,
int base = DEC);
623 template <
bool sync =
false,
625 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value,
bool> Enable =
true>
636 template <
bool sync =
false,
638 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value,
bool> Enable =
true>
652 template <
bool sync =
false,
654 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value,
bool> Enable =
true>
799 template <
typename T,
800 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true>
806 extern void error(
void);
815 template <
typename T,
816 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true>
817 extern void error(T message);
833 template <
typename T,
834 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value),
bool> Enable =
true>
835 [[ noreturn ]]
extern void fatalError(T message);
887 extern __constinit uint32_t
current;
892 extern __constinit uint32_t
total;
899 extern void init(uint32_t maxProgress);
910 extern void init(uint32_t maxProgress, uint8_t lineOffset);
917 extern void advance(uint32_t steps = 1);
927 extern void render(
bool end =
false);
void valueIncrement()
Definition interfaces.cpp:208
RangeSelect(__FlashStringHelper const *menuTitle, uint16_t const rangeMin=0, uint16_t const rangeMax=UINT16_MAX)
Create a menu interface for selecting a number from a range.
Definition interfaces.cpp:112
uint16_t select(uint16_t const startAt)
void valueDecrement()
Definition interfaces.cpp:168
Wrapper for clamping variable values.
Definition Util.h:503
Progress bar methods.
Definition interfaces.h:883
void finish()
Definition ascii.cpp:339
uint32_t current
Definition interfaces.cpp:631
void advance(uint32_t steps=1)
Definition ascii.cpp:324
void render(bool end=false)
Definition ascii.cpp:345
void init(uint32_t maxProgress)
Definition ascii.cpp:318
uint32_t total
Definition interfaces.cpp:632
User interface methods.
Definition Types.h:118
NavDir
Definition Types.h:149
uint8_t const kDisplayHeight
Display height in pixels (0 = unsupported).
UserInput checkButton()
Definition ascii.cpp:65
void _errorFormat()
Definition ascii.cpp:242
MenuMode
Definition Types.h:168
void _fatalErrorFormat()
Definition ascii.cpp:249
bool overlapsCurrentLineBottom(uint8_t lineNumber)
uint8_t const kDisplayLineStart
Y position of the first line.
void fatalErrorStorage()
Definition interfaces.cpp:55
void wait()
Definition ascii.cpp:263
bool overlapsCurrentLine(uint8_t lineNumber)
void printSync(T string)
Definition interfaces.h:564
void notification(void)
Definition interfaces.cpp:8
void gotoLast()
Definition serial.cpp:83
void fatalError(void)
Definition interfaces.cpp:36
void fatalErrorInvalidData()
Definition interfaces.cpp:83
void printHexLine(T number)
Definition interfaces.cpp:106
void gotoLine(uint8_t lineNumber)
void blinkLED()
Definition interfaces.cpp:608
uint8_t menu(__FlashStringHelper const *menuTitle, char const *const menuEntries[], uint8_t entryCount)
Definition interfaces.cpp:398
void _fatalError()
Definition ascii.cpp:251
void printNotificationHeader(char const *title)
void error(void)
Definition interfaces.cpp:22
void _notificationFormat()
void _error()
Definition ascii.cpp:244
void fatalErrorNoBuffer()
Definition interfaces.cpp:76
void printFatalErrorHeader(char const *title)
void printHeader(char const *title)
void clear()
Definition ascii.cpp:59
void fatalErrorBufferOverflow()
Definition interfaces.cpp:61
void ncFatalErrorStorage()
Definition interfaces.cpp:50
void printHex(T number)
Definition interfaces.cpp:93
UserInput waitInput()
Definition ascii.cpp:296
uint8_t const kDisplayWidth
Display width in pixels (0 = unsupported).
uint8_t const kDisplayLines
Lines that can be seen at once (0 = unlimited).
void wake()
Definition ascii.cpp:48
void setLineRel(int8_t numLines)
void fatalErrorNameOverflow()
Definition interfaces.cpp:68
void printLineSync(void)
Definition interfaces.h:597
UserInput
Definition Types.h:123
uint8_t const kLineHeight
Line height in pixels (0 = unsupported).
void printErrorHeader(char const *title)
void setup()
Definition ascii.cpp:34
void sleep()
Definition ascii.cpp:43
void waitButton()
Definition ascii.cpp:290
void gotoLineBottom(uint8_t lineNumber)
void update()
Definition ascii.cpp:53
Main program.
Definition Storage.h:13