OSCR
Open Source Cartridge Reader
Loading...
Searching...
No Matches
interfaces.h
1/********************************************************************
2* Open Source Cartridge Reader *
3********************************************************************/
4#pragma once
5#ifndef OSCR_INTERFACES_H_
6#define OSCR_INTERFACES_H_
7
8#include "syslibinc.h"
9#include "config.h"
10#include "common/specializations.h"
11#include "common/Util.h"
12#include "api/Storage.h"
13
14#define menuoptionsize(menu) (size_t)sizeof(menu.options[0])
15#define menusize(menu) (size_t)(sizeof(menu.options)/sizeof(menu.options[0]))
16
17namespace OSCR
18{
22 namespace UI
23 {
24 extern bool const kSupportsLineAdjments;
25
32 extern uint8_t const kDisplayWidth;
33
40 extern uint8_t const kDisplayHeight;
41
48 extern uint8_t const kLineHeight;
49
56 extern uint8_t const kDisplayLines;
57
64 extern uint8_t const kDisplayLineStart;
65
77 template <uint8_t optionCount, uint8_t optionLength>
79 {
80 char options[optionCount][optionLength];
82 uint8_t const length = optionLength;
83 uint8_t const max = optionCount;
84
85 char * operator[](size_t idx) { return options[idx]; }
86 char const * operator[](size_t idx) const { return options[idx]; }
87 };
88
92 extern void drowse();
93
97 extern void sleep();
98
102 extern void wake();
103
107 extern void wait();
108
112 extern void waitButton();
113
117 extern UserInput waitInput();
118
122 extern void setup();
123
127 extern void blinkLED();
128
132 extern void update();
133
137 extern void clear();
138
142 extern void clearLine();
143
147 extern UserInput checkButton();
148
150 {
151 public:
159 RangeSelect(__FlashStringHelper const * menuTitle, uint16_t const rangeMin = 0, uint16_t const rangeMax = UINT16_MAX);
160
161 // From UI submodule
162 void render();
163
169 uint16_t select();
170
177 uint16_t select(uint16_t const startAt);
178
182 void valueIncrement();
183
187 void valueDecrement();
188
189 protected:
190 __FlashStringHelper const * title;
191 uint16_t minValue;
192 uint16_t maxValue;
193 uint16_t currentValue;
194
195 uint8_t positions;
196 uint8_t currentPosition = 0;
197 bool rendered = false;
198
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);
202
203 uint8_t getPositionsFor(uint16_t value);
204 int8_t getNumberAt(uint16_t value, uint8_t position);
205 void _setup();
206
207 // From UI submodule
208 void navigate(NavDir direction);
209 void onSelectionChange();
210 };
211
223 class MenuRenderer
224 {
225 public:
226 MenuRenderer(char const * menuTitle);
227 MenuRenderer(char const * menuTitle, uint16_t entryCount);
228
229 MenuRenderer(__FlashStringHelper const * menuTitle);
230 MenuRenderer(__FlashStringHelper const * menuTitle, uint16_t entryCount);
231
232 virtual ~MenuRenderer() {}; // Virtual destructor
233
234 uint16_t getPage();
235 uint16_t getPageCount();
236 bool isLast();
237 uint16_t getPageEntryCount();
238 uint16_t getPageEntryOffset();
239 uint16_t getEntryIndex();
240 void gotoPage(uint16_t page);
241 void navNext();
242 void navPrev();
243 void nextPage();
244 void prevPage();
245
246 // From UI submodule
247 void render();
248
254 uint16_t select();
255
256 protected:
257 char title[30] = {};
258 uint16_t count;
259 uint16_t totalPages;
260 uint16_t pageEntriesLast;
261
262 uint16_t currentPage = 1;
263 uint16_t selection = 0;
264 bool rendered = false;
265
266 char pageEntries[UI_PAGE_SIZE][UI_PAGE_ENTRY_LENTH_MAX];
267
268 // From UI submodule
269 void navigate(NavDir direction);
270 void onSelectionChange();
271
272 // Implementation
273 virtual bool onConfirm() = 0;
274 virtual void setup() = 0;
275 virtual void onPageChange() = 0;
276 };
277
289 class MenuBase: public MenuRenderer
290 {
291 public:
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);
294
295 protected:
296 MenuMode menuMode;
297 uint8_t entryLengthMax;
298
299 // Must be implemented in UI submodule
300 void setup();
301 bool onConfirm();
302 };
303
315 class Menu: public MenuBase
316 {
317 public:
325 Menu(char const * menuTitle, char const * const menuEntries[], uint8_t entryCount);
326 Menu(__FlashStringHelper const * menuTitle, char const * const menuEntries[], uint8_t entryCount);
327
328 Menu(char const * menuTitle, __FlashStringHelper const * const * menuEntries, uint8_t entryCount);
329 Menu(__FlashStringHelper const * menuTitle, __FlashStringHelper const * const * menuEntries, uint8_t entryCount);
330
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);
341
342 protected:
343 char const * const * entries;
344
345 // Must be implemented in UI submodule
346 void onPageChange();
347 };
348
349 template<uint8_t optionCount, uint8_t optionLength>
350 class MenuOptionsMenu : public MenuBase
351 {
352 public:
359 MenuOptionsMenu(char const * menuTitle, MenuOptions<optionCount, optionLength> & menuEntries);
360 MenuOptionsMenu(__FlashStringHelper const * menuTitle, MenuOptions<optionCount, optionLength> & menuEntries);
361
362 protected:
363 __FlashStringHelper const * templateString;
365
366 // Must be implemented in UI submodule
367 void onPageChange();
368 };
369
370 class FlashTemplateMenu : public MenuBase
371 {
372 public:
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);
383
384 protected:
385 __FlashStringHelper const * templateString;
386 char const * const * entries;
387
388 // Must be implemented in UI submodule
389 void onPageChange();
390 };
391
392 template <typename T,
393 OSCR::Util::if_is_integer_t<T> Enable = true>
394 class IntegerTemplateMenu : public MenuBase
395 {
396 public:
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);
407
408 protected:
409 __FlashStringHelper const * templateString;
410 T const * entries;
411
412 // Must be implemented in UI submodule
413 void onPageChange();
414 };
415
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);
419
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);
429
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);
439
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);
450
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);
453
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);
457
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);
461
463 template class IntegerTemplateMenu<uint8_t>;
464 template class IntegerTemplateMenu<uint16_t>;
466
473 template<uint8_t optionCount, uint8_t optionLength>
474 extern uint8_t menu(__FlashStringHelper const * menuTitle, MenuOptions<optionCount, optionLength> & menuEntries);
475
476 template<uint8_t optionCount, uint8_t optionLength>
477 extern uint8_t menu(char const * menuTitle, MenuOptions<optionCount, optionLength> & menuEntries);
478
480 template class MenuOptionsMenu< 7, 20>;
481 template class MenuOptionsMenu<10, 20>;
483
487 extern void printHeader(char const * title);
488 extern void printHeader(__FlashStringHelper const * title);
489
493 extern void printNotificationHeader(char const * title);
494 extern void printNotificationHeader(__FlashStringHelper const * title);
495
499 extern void printErrorHeader(char const * title);
500 extern void printErrorHeader(__FlashStringHelper const * title);
501
505 extern void printFatalErrorHeader(char const * title);
506 extern void printFatalErrorHeader(__FlashStringHelper const * title);
507
513 template <bool prfx = true,
514 typename T,
515 OSCR::Util::if_is_any_unsigned_t<T> Enable = true>
516 extern void printHex(T number);
517
523 template <bool prfx = true,
524 typename T,
525 OSCR::Util::if_is_any_unsigned_t<T> Enable = true>
526 extern void printHexLine(T number);
527
535 template <bool sync = false,
536 typename T,
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>
539 extern void print(T string);
540
548 template <bool sync = false,
549 typename T,
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>
552 extern void printLine(T string);
553
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>
564 inline void printSync(T string)
565 {
566 OSCR::UI::print<true>(string);
567 }
568
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>
579 inline void printLineSync(T string)
580 {
582 }
583
589 template <bool sync = false>
590 extern void printLine(void);
591
597 inline void printLineSync(void)
598 {
600 }
601
610 template <bool sync = false,
611 typename Tint,
612 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value, bool> Enable = true>
613 extern void print(Tint number, int base = DEC);
614
623 template <bool sync = false,
624 typename Tint,
625 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value, bool> Enable = true>
626 extern void printLine(Tint number, int base = DEC);
627
636 template <bool sync = false,
637 typename Tint,
638 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value, bool> Enable = true>
639 inline void printSync(Tint number, int base = DEC)
640 {
641 OSCR::UI::print<true>(number, base);
642 }
643
652 template <bool sync = false,
653 typename Tint,
654 OSCR::Util::enable_if_t<OSCR::Util::is_integer<Tint>::value, bool> Enable = true>
655 extern void printLineSync(Tint number, int base = DEC)
656 {
657 OSCR::UI::printLine<true>(number, base);
658 }
659
671 //inline void print(double number, int digits = 1) = delete;
672 //inline void printSync(double number, int digits = 1) = delete;
673
685 //inline void printLine(double number, int digits = 1) = delete;
686 //inline void printLineSync(double number, int digits = 1) = delete;
687
694 extern void setLineRel(int8_t numLines);
695
701 extern void gotoLast();
702
709 extern void gotoLine(uint8_t lineNumber);
710
718 extern void gotoLineBottom(uint8_t lineNumber);
719
727 extern bool overlapsCurrentLine(uint8_t lineNumber);
728
736 extern bool overlapsCurrentLineBottom(uint8_t lineNumber);
737
745 extern void _notificationFormat();
746
753 extern void _notification(void);
754
761 extern void _errorFormat();
762
769 extern void _error();
770
777 extern void _fatalErrorFormat();
778
785 [[ noreturn ]] extern void _fatalError();
786
790 extern void notification(void);
791
799 template <typename T,
800 OSCR::Util::enable_if_t<!(OSCR::Util::is_number<T>::value), bool> Enable = true>
801 extern void notification(T message);
802
806 extern void error(void);
807
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);
818
822 extern void fatalError(void);
823
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);
836
842 [[ noreturn ]] extern void ncFatalErrorStorage();
843
849 [[ noreturn ]] extern void fatalErrorStorage();
850
856 [[ noreturn ]] extern void fatalErrorBufferOverflow();
857
863 [[ noreturn ]] extern void fatalErrorNameOverflow();
864
870 [[ noreturn ]] extern void fatalErrorNoBuffer();
871
877 [[ noreturn ]] extern void fatalErrorInvalidData();
878
882 namespace ProgressBar
883 {
887 extern __constinit uint32_t current;
888
892 extern __constinit uint32_t total;
893
899 extern void init(uint32_t maxProgress);
900
910 extern void init(uint32_t maxProgress, uint8_t lineOffset);
911
917 extern void advance(uint32_t steps = 1);
918
922 extern void finish();
923
927 extern void render(bool end = false);
928 }
929 }
930}
931
932#endif /* OSCR_INTERFACES_H_ */
FlashTemplateMenu(char const *menuTitle, __FlashStringHelper const *templateStr, char const *const menuEntries[], uint8_t entryCount)
Create a menu interface from an array of choices using a template.
Definition interfaces.cpp:328
Definition interfaces.h:395
IntegerTemplateMenu(char const *menuTitle, __FlashStringHelper const *templateStr, T const *menuEntries, uint8_t entryCount)
Create a menu interface from an array of choices using a template.
Definition interfaces.cpp:346
Menu(char const *menuTitle, char const *const menuEntries[], uint8_t entryCount)
Create a menu interface from an array of choices.
Definition interfaces.cpp:300
Definition interfaces.h:351
MenuOptionsMenu(char const *menuTitle, MenuOptions< optionCount, optionLength > &menuEntries)
Create a menu interface from an array of choices.
Definition interfaces.cpp:365
uint16_t select()
Definition ascii.cpp:153
void render()
Definition ascii.cpp:135
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
void print(T string)
uint8_t const kDisplayHeight
Display height in pixels (0 = unsupported).
void printLine(void)
UserInput checkButton()
Definition ascii.cpp:65
void clearLine()
void _errorFormat()
Definition ascii.cpp:242
MenuMode
Definition Types.h:168
void drowse()
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 _notification(void)
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
Data struct for Menu instances.
Definition interfaces.h:79