tcMenu
Loading...
Searching...
No Matches
MenuItems.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry).
3 * This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4 */
5
13
14#ifndef _MENUITEMS_h
15#define _MENUITEMS_h
16
17#define INFO_LOCATION_PGM true
18#define INFO_LOCATION_RAM false
19
20#include <PlatformDetermination.h>
21#include <IoAbstraction.h>
22
24#define MAXIMUM_ID_ALLOWED 32000
25
26typedef uint16_t menuid_t;
27
29#define INVALID_MENU_ID 0xffff
30
32#ifndef NAME_SIZE_T
33#define NAME_SIZE_T 20
34#endif // NAME_SIZE_T
35
37#ifndef UNIT_SIZE_T
38#define UNIT_SIZE_T 5
39#endif // NAME_SIZE_T
40
42#define NO_CALLBACK NULL
43
45typedef void (*MenuCallbackFn)(int id);
46
51struct AnyMenuInfo {
53 char name[NAME_SIZE_T];
55 menuid_t id;
57 uint16_t eepromAddr;
59 uint16_t maxValue;
62};
63
73 char name[NAME_SIZE_T];
75 menuid_t id;
77 uint16_t eepromAddr;
79 uint16_t maxValue;
82
87 int16_t offset;
94 uint16_t divisor;
98 char unitName[UNIT_SIZE_T];
99};
100
110 char name[NAME_SIZE_T];
112 menuid_t id;
114 uint16_t eepromAddr;
116 uint16_t maxValue;
119
128 const char * const *menuItems;
129};
130
144
153 char name[NAME_SIZE_T];
155 menuid_t id;
157 uint16_t eepromAddr;
159 uint16_t maxValue;
162
168};
169
177
184 char name[NAME_SIZE_T];
186 menuid_t id;
188 uint16_t eepromAddr;
193};
194
196 AnyMenuInfo anyInfo;
197 AnalogMenuInfo analogInfo;
198 EnumMenuInfo enumInfo;
199 BooleanMenuInfo booleanInfo;
200 SubMenuInfo subInfo;
201 FloatMenuInfo floatInfo;
202};
203
236
237#define MENUITEM_ALL_REMOTES 0xFC00
238#define MENUITEM_ALL_CHANGE 0x0003
239
288
312
313// forward reference
314class RuntimeMenuItem;
315
327typedef int(*RuntimeRenderingFn)(RuntimeMenuItem* item, uint8_t row, RenderFnMode mode, char* buffer, int bufferSize);
328
338class MenuItem {
339protected:
340 uint16_t flags;
341 MenuItem* next;
343 const AnyMenuInfo *info = nullptr;
344 RuntimeRenderingFn renderFn = nullptr;
345 MenuType menuType;
346public:
347
353 uint8_t copyNameToBuffer(char* sz, int size) const { return copyNameToBuffer(sz, 0, size);}
354
362 uint8_t copyNameToBuffer(char* sz, int offset, int size) const;
364 menuid_t getId() const;
366 uint16_t getMaximumValue() const;
368 uint16_t getEepromPosition() const;
370 MenuType getMenuType() const { return menuType; }
372 void triggerCallback() const;
373
374 bool isInfoProgMem() const { return bitRead(flags, MENUITEM_INFO_STRUCT_PGM); }
375
378 void setChanged(bool changed);
380 void setChanged(int num, bool changed) { bitWrite(flags, (num & 3), changed); }
382 bool isChanged(int num = 0) const { return bitRead(flags, (num & 3)); }
384 bool isSendRemoteNeeded(uint8_t remoteNo) const;
390 void setSendRemoteNeeded(uint8_t remoteNo, bool needed);
391
393 void setReadOnly(bool active) { bitWrite(flags, MENUITEM_READONLY, active); }
395 bool isReadOnly() const { return bitRead(flags, MENUITEM_READONLY); }
396
398 void setLocalOnly(bool localOnly) { bitWrite(flags, MENUITEM_LOCAL_ONLY, localOnly); }
400 bool isLocalOnly() const { return bitRead(flags, MENUITEM_LOCAL_ONLY); }
401
403 void setSecured(bool secured) { bitWrite(flags, MENUITEM_PIN_SECURED, secured); }
405 bool isSecured() const { return bitRead(flags, MENUITEM_PIN_SECURED); }
406
408 void setVisible(bool visible) { bitWrite(flags, MENUITEM_PIN_VISIBLE, visible); }
410 bool isVisible() const { return bitRead(flags, MENUITEM_PIN_VISIBLE); }
411
413 MenuItem* getNext() const { return next; }
415 void setNext(MenuItem* pNext) { this->next = pNext; }
416
420 void changeOccurred(bool silent);
421protected:
425 MenuItem(MenuType menuType, const AnyMenuInfo* menuInfo, MenuItem* next, bool infoProgMem);
426
427};
428
433class ValueMenuItem : public MenuItem {
434protected:
435 uint16_t currentValue;
436
438 ValueMenuItem(MenuType menuType, const AnyMenuInfo* info, uint16_t defaultVal, MenuItem* next, bool infoPgm)
439 : MenuItem(menuType, info, next, infoPgm) {
440 this->currentValue = defaultVal;
441 }
442public:
444 void setCurrentValue(uint16_t val, bool silent = false);
445
447 uint16_t getCurrentValue() const { return currentValue; }
448};
449
454struct WholeAndFraction {
455public:
456 WholeAndFraction() {
457 this->whole = this->fraction = this->negative = 0;
458 }
459
460 WholeAndFraction(const WholeAndFraction& that) {
461 this->whole = that.whole;
462 this->fraction = that.fraction;
463 this->negative = that.negative;
464 }
465
466 WholeAndFraction(uint16_t whole, uint16_t fract, bool negative) {
467 this->whole = whole;
468 this->fraction = fract;
469 this->negative = negative;
470 }
471 uint32_t whole: 15;
472 uint32_t fraction: 16;
473 uint32_t negative: 1;
474};
475
486private:
487 int8_t step = 1;
488public:
496 AnalogMenuItem(const AnalogMenuInfo* info, uint16_t defaultVal, MenuItem* next = nullptr, bool infoInPgm = INFO_LOCATION_PGM)
497 : ValueMenuItem(MENUTYPE_INT_VALUE, (const AnyMenuInfo*)info, defaultVal, next, infoInPgm) {;}
498
500 int getOffset() const;
501
503 int getStep() const { return step; }
504
506 void setStep(int newStep) { step = newStep; }
507
509 uint16_t getDivisor() const;
510
512 int unitNameLength() const;
513
515 void copyUnitToBuffer(char* unitBuff, uint8_t size = 5) const;
516
522 void copyValue(char* buffer, uint8_t bufferSize) const;
523
524
530 float getAsFloatingPointValue() const;
531
536 void setFromFloatingPointValue(float value);
537
538 int getIntValueIncludingOffset() { return (int)currentValue + (int)getOffset(); }
539
545 WholeAndFraction getWholeAndFraction() const;
546
552 void setFromWholeAndFraction(WholeAndFraction wf);
553
557 uint8_t getDecimalPlacesForDivisor() const;
558
562 uint16_t getActualDecimalDivisor() const;
563};
564
576public:
584 EnumMenuItem(const EnumMenuInfo *info, uint8_t defaultVal, MenuItem* next = nullptr, bool infoInPgm = INFO_LOCATION_PGM)
585 : ValueMenuItem(MENUTYPE_ENUM_VALUE, (const AnyMenuInfo*)info, defaultVal, next, infoInPgm) {;}
586
592 void copyEnumStrToBuffer(char* buffer, int size, int idx) const;
593
598 int getLengthOfEnumStr(int idx) const;
599};
600
607public:
615 BooleanMenuItem(const BooleanMenuInfo* info, bool defaultVal, MenuItem* next = nullptr, bool infoInPgm = INFO_LOCATION_PGM)
616 : ValueMenuItem(MENUTYPE_BOOLEAN_VALUE, (const AnyMenuInfo*)info, defaultVal, next, infoInPgm) {;}
617
622
624 bool getBoolean() const {return currentValue != 0;}
626 void setBoolean(bool b, bool silent = false) {setCurrentValue(b, silent);}
627};
628
634class FloatMenuItem : public MenuItem {
635private:
636 float currValue;
637public:
645 FloatMenuItem(const FloatMenuInfo* info, MenuItem* next, bool infoInPgm = INFO_LOCATION_PGM)
646 : MenuItem(MENUTYPE_FLOAT_VALUE, (const AnyMenuInfo*)info, next, infoInPgm) { currValue = 0; }
647
656 FloatMenuItem(const FloatMenuInfo* info, float current, MenuItem* next, bool infoInPgm = INFO_LOCATION_PGM)
657 : MenuItem(MENUTYPE_FLOAT_VALUE, (const AnyMenuInfo*)info, next, infoInPgm) { currValue = current; }
658
662 int getDecimalPlaces() const;
663
667 void setFloatValue(float newVal, bool silent = false);
668
672 float getFloatValue() const { return currValue; }
673};
674
675
681class ActionMenuItem : public MenuItem {
682public:
689 ActionMenuItem(const AnyMenuInfo* info, MenuItem* next, bool infoInProgmem = INFO_LOCATION_PGM)
690 : MenuItem(MENUTYPE_ACTION_VALUE, info, next, infoInProgmem) {;}
691};
692
693// forward reference
694class RuntimeMenuItem;
695
702void copyMenuItemValue(const MenuItem* item, char* buffer, size_t bufferSize, bool active = false);
703
711void copyMenuItemNameAndValue(const MenuItem* item, char* buffer, size_t bufferSize, char additionalSep = ':', bool active = false);
712
717void copyMenuItemValueDefault(const MenuItem* item, char* buffer, size_t bufferSize, const char* defValue, bool active = false);
718
722inline bool isMenuBasedOnValueItem(const MenuItem* item) {
723 if(item == nullptr) return false;
724 auto ty = uint8_t(item->getMenuType());
726}
727
731inline bool isMenuRuntime(const MenuItem* t) {
732 return t && (uint8_t(t->getMenuType()) >= uint8_t(MENUTYPE_RUNTIME_VALUE));
733}
734
738inline bool isMenuRuntimeMultiEdit(const MenuItem* t) {
739 return t && (uint8_t(t->getMenuType()) >= uint8_t(MENUTYPE_TEXT_VALUE));
740}
741
747inline const RuntimeMenuItem* asRuntimeItem(const MenuItem* i) {
748 return reinterpret_cast<const RuntimeMenuItem*>(i);
749}
750
751#endif
const char *const * menuItems
Definition MenuItems.h:128
MenuCallbackFn callback
Definition MenuItems.h:118
uint16_t eepromAddr
Definition MenuItems.h:77
bool isMenuRuntime(const MenuItem *t)
Definition MenuItems.h:731
uint16_t maxValue
Definition MenuItems.h:79
void copyMenuItemNameAndValue(const MenuItem *item, char *buffer, size_t bufferSize, char additionalSep=':', bool active=false)
Definition MenuItems.cpp:320
uint16_t eepromAddr
Definition MenuItems.h:57
char name[NAME_SIZE_T]
Definition MenuItems.h:110
uint16_t eepromAddr
Definition MenuItems.h:114
uint16_t eepromAddr
Definition MenuItems.h:157
uint16_t numDecimalPlaces
Definition MenuItems.h:190
menuid_t id
Definition MenuItems.h:186
char unitName[UNIT_SIZE_T]
Definition MenuItems.h:98
uint16_t eepromAddr
Definition MenuItems.h:188
uint16_t maxValue
Definition MenuItems.h:59
menuid_t id
Definition MenuItems.h:112
AnyMenuInfo SubMenuInfo
Definition MenuItems.h:176
MenuCallbackFn callback
Definition MenuItems.h:161
MenuCallbackFn callback
Definition MenuItems.h:81
RenderFnMode
Definition MenuItems.h:292
@ RENDERFN_EEPROM_POS
Definition MenuItems.h:298
@ RENDERFN_INVOKE
Definition MenuItems.h:300
@ RENDERFN_NAME
Definition MenuItems.h:296
@ RENDERFN_ACTIVATE
Definition MenuItems.h:302
@ RENDERFN_GETRANGE
Definition MenuItems.h:306
@ RENDERFN_GETPART
Definition MenuItems.h:308
@ RENDERFN_VALUE
Definition MenuItems.h:294
@ RENDERFN_SET_VALUE
Definition MenuItems.h:304
@ RENDERFN_SET_TEXT_VALUE
Definition MenuItems.h:310
MenuCallbackFn callback
Definition MenuItems.h:192
uint16_t maxValue
Definition MenuItems.h:159
const RuntimeMenuItem * asRuntimeItem(const MenuItem *i)
Definition MenuItems.h:747
menuid_t id
Definition MenuItems.h:55
char name[NAME_SIZE_T]
Definition MenuItems.h:53
void copyMenuItemValue(const MenuItem *item, char *buffer, size_t bufferSize, bool active=false)
Definition MenuItems.cpp:332
menuid_t id
Definition MenuItems.h:75
MenuCallbackFn callback
Definition MenuItems.h:61
void copyMenuItemValueDefault(const MenuItem *item, char *buffer, size_t bufferSize, const char *defValue, bool active=false)
Definition MenuItems.cpp:387
char name[NAME_SIZE_T]
Definition MenuItems.h:153
menuid_t id
Definition MenuItems.h:155
char name[NAME_SIZE_T]
Definition MenuItems.h:73
bool isMenuRuntimeMultiEdit(const MenuItem *t)
Definition MenuItems.h:738
int(* RuntimeRenderingFn)(RuntimeMenuItem *item, uint8_t row, RenderFnMode mode, char *buffer, int bufferSize)
Definition MenuItems.h:327
char name[NAME_SIZE_T]
Definition MenuItems.h:184
Flags
Definition MenuItems.h:207
@ MENUITEM_REMOTE_SEND5
Definition MenuItems.h:234
@ MENUITEM_REMOTE_SEND4
Definition MenuItems.h:232
@ MENUITEM_INFO_STRUCT_PGM
Definition MenuItems.h:221
@ MENUITEM_REMOTE_SEND2
Definition MenuItems.h:228
@ MENUITEM_READONLY
Definition MenuItems.h:213
@ MENUITEM_PIN_VISIBLE
Definition MenuItems.h:219
@ MENUITEM_CHANGED_1
Definition MenuItems.h:211
@ MENUITEM_LOCAL_ONLY
Definition MenuItems.h:215
@ MENUITEM_REMOTE_SEND1
Definition MenuItems.h:226
@ MENUITEM_PIN_SECURED
Definition MenuItems.h:217
@ MENUITEM_CHANGED
Definition MenuItems.h:209
@ MENUITEM_REMOTE_SEND3
Definition MenuItems.h:230
@ MENUITEM_REMOTE_SEND0
Definition MenuItems.h:224
uint16_t divisor
Definition MenuItems.h:94
void(* MenuCallbackFn)(int id)
Definition MenuItems.h:45
int16_t offset
Definition MenuItems.h:87
bool isMenuBasedOnValueItem(const MenuItem *item)
Definition MenuItems.h:722
BooleanNaming naming
Definition MenuItems.h:167
BooleanNaming
Definition MenuItems.h:134
@ NAMING_ON_OFF
Definition MenuItems.h:138
@ NAMING_TRUE_FALSE
Definition MenuItems.h:136
@ NAMING_CHECKBOX
Definition MenuItems.h:142
@ NAMING_YES_NO
Definition MenuItems.h:140
MenuType
Definition MenuItems.h:247
@ MENUTYPE_DIALOG_BUTTON
Definition MenuItems.h:273
@ MENUTYPE_COLOR_VALUE
Definition MenuItems.h:286
@ MENUTYPE_IPADDRESS
Definition MenuItems.h:278
@ MENUTYPE_DATE
Definition MenuItems.h:282
@ MENUTYPE_INT_VALUE
Definition MenuItems.h:249
@ MENUTYPE_ENUM_VALUE
Definition MenuItems.h:251
@ MENUTYPE_SUB_VALUE
Definition MenuItems.h:269
@ MENUTYPE_TIME
Definition MenuItems.h:280
@ MENUTYPE_SCROLLER_VALUE
Definition MenuItems.h:267
@ MENUTYPE_FLOAT_VALUE
Definition MenuItems.h:255
@ MENUTYPE_BOOLEAN_VALUE
Definition MenuItems.h:253
@ MENUTYPE_TEXT_VALUE
Definition MenuItems.h:276
@ MENUTYPE_TITLE_ITEM
Definition MenuItems.h:271
@ MENUTYPE_ACTION_VALUE
Definition MenuItems.h:257
@ MENUTYPE_RUNTIME_LIST
Definition MenuItems.h:261
@ MENUTYPE_BACK_VALUE
Definition MenuItems.h:263
@ MENUTYPE_RUNTIME_VALUE
Definition MenuItems.h:259
@ MENUTYPE_ACTIVATE_SUBMENU
Definition MenuItems.h:265
@ MENUTYPE_LARGENUM_VALUE
Definition MenuItems.h:284
uint16_t maxValue
Definition MenuItems.h:116
Definition MenuItems.h:71
Definition MenuItems.h:51
Definition MenuItems.h:151
Definition MenuItems.h:108
Definition MenuItems.h:182
Definition MenuItems.h:195
ActionMenuItem(const AnyMenuInfo *info, MenuItem *next, bool infoInProgmem=INFO_LOCATION_PGM)
Definition MenuItems.h:689
WholeAndFraction getWholeAndFraction() const
Definition MenuItems.cpp:207
void setFromFloatingPointValue(float value)
Definition MenuItems.cpp:243
AnalogMenuItem(const AnalogMenuInfo *info, uint16_t defaultVal, MenuItem *next=nullptr, bool infoInPgm=INFO_LOCATION_PGM)
Definition MenuItems.h:496
void copyValue(char *buffer, uint8_t bufferSize) const
Definition MenuItems.cpp:175
void setFromWholeAndFraction(WholeAndFraction wf)
Definition MenuItems.cpp:226
float getAsFloatingPointValue() const
Definition MenuItems.cpp:191
int getOffset() const
Definition MenuItems.cpp:262
int unitNameLength() const
Definition MenuItems.cpp:272
void setStep(int newStep)
Definition MenuItems.h:506
uint16_t getActualDecimalDivisor() const
Definition MenuItems.cpp:201
uint8_t getDecimalPlacesForDivisor() const
Definition MenuItems.cpp:255
void copyUnitToBuffer(char *unitBuff, uint8_t size=5) const
Definition MenuItems.cpp:277
int getStep() const
Definition MenuItems.h:503
uint16_t getDivisor() const
Definition MenuItems.cpp:267
bool getBoolean() const
Definition MenuItems.h:624
BooleanMenuItem(const BooleanMenuInfo *info, bool defaultVal, MenuItem *next=nullptr, bool infoInPgm=INFO_LOCATION_PGM)
Definition MenuItems.h:615
BooleanNaming getBooleanNaming() const
Definition MenuItems.cpp:288
void setBoolean(bool b, bool silent=false)
Definition MenuItems.h:626
int getLengthOfEnumStr(int idx) const
Definition MenuItems.cpp:141
void copyEnumStrToBuffer(char *buffer, int size, int idx) const
Definition MenuItems.cpp:129
EnumMenuItem(const EnumMenuInfo *info, uint8_t defaultVal, MenuItem *next=nullptr, bool infoInPgm=INFO_LOCATION_PGM)
Definition MenuItems.h:584
void setFloatValue(float newVal, bool silent=false)
Definition MenuItems.cpp:293
int getDecimalPlaces() const
Definition MenuItems.cpp:300
FloatMenuItem(const FloatMenuInfo *info, MenuItem *next, bool infoInPgm=INFO_LOCATION_PGM)
Definition MenuItems.h:645
float getFloatValue() const
Definition MenuItems.h:672
FloatMenuItem(const FloatMenuInfo *info, float current, MenuItem *next, bool infoInPgm=INFO_LOCATION_PGM)
Definition MenuItems.h:656
Definition MenuItems.h:338
bool isReadOnly() const
Definition MenuItems.h:395
void setChanged(bool changed)
Definition MenuItems.cpp:112
bool isLocalOnly() const
Definition MenuItems.h:400
void setLocalOnly(bool localOnly)
Definition MenuItems.h:398
void changeOccurred(bool silent)
Definition MenuItems.cpp:99
menuid_t getId() const
Definition MenuItems.cpp:81
MenuItem(MenuType menuType, const AnyMenuInfo *menuInfo, MenuItem *next, bool infoProgMem)
Definition MenuItems.cpp:12
void setReadOnly(bool active)
Definition MenuItems.h:393
void setChanged(int num, bool changed)
Definition MenuItems.h:380
const AnyMenuInfo * info
Definition MenuItems.h:343
MenuItem * getNext() const
Definition MenuItems.h:413
bool isSendRemoteNeeded(uint8_t remoteNo) const
Definition MenuItems.cpp:22
uint8_t copyNameToBuffer(char *sz, int size) const
Definition MenuItems.h:353
MenuType getMenuType() const
Definition MenuItems.h:370
void setNext(MenuItem *pNext)
Definition MenuItems.h:415
bool isVisible() const
Definition MenuItems.h:410
void setSendRemoteNeeded(uint8_t remoteNo, bool needed)
Definition MenuItems.cpp:26
bool isChanged(int num=0) const
Definition MenuItems.h:382
uint16_t getEepromPosition() const
Definition MenuItems.cpp:105
void setVisible(bool visible)
Definition MenuItems.h:408
uint16_t getMaximumValue() const
Definition MenuItems.cpp:90
void triggerCallback() const
Definition MenuItems.cpp:41
void setSendRemoteNeededAll()
Definition MenuItems.cpp:30
void setSecured(bool secured)
Definition MenuItems.h:403
bool isSecured() const
Definition MenuItems.h:405
void clearSendRemoteNeededAll()
Definition MenuItems.cpp:37
Definition RuntimeMenuItem.h:75
ValueMenuItem(MenuType menuType, const AnyMenuInfo *info, uint16_t defaultVal, MenuItem *next, bool infoPgm)
Definition MenuItems.h:438
void setCurrentValue(uint16_t val, bool silent=false)
Definition MenuItems.cpp:305
uint16_t getCurrentValue() const
Definition MenuItems.h:447