Skip to content

Commit e60bea3

Browse files
author
dave
committed
#243 first menu created using fluent builder
1 parent d318070 commit e60bea3

9 files changed

Lines changed: 55 additions & 58 deletions

File tree

examples/arduino32/stm32DuinoOneButton/generated/SerialTransport.cpp renamed to examples/arduino32/stm32DuinoOneButton/SerialTransport.cpp

File renamed without changes.

examples/arduino32/stm32DuinoOneButton/generated/SerialTransport.h renamed to examples/arduino32/stm32DuinoOneButton/SerialTransport.h

File renamed without changes.

examples/arduino32/stm32DuinoOneButton/stm32DuinoOneButton.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// Getting started: https://tcmenu.github.io/documentation/arduino-libraries/tc-menu/tcmenu-overview-quick-start/
88
//
99

10-
#include "generated/stm32DuinoOneButton_menu.h"
10+
#include "stm32DuinoOneButton_menu.h"
1111
#include <SPI.h>
1212

1313
void setup() {

examples/arduino32/stm32DuinoOneButton/generated/stm32DuinoOneButton_menu.cpp renamed to examples/arduino32/stm32DuinoOneButton/stm32DuinoOneButton_menu.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212

1313
#include <tcMenu.h>
1414
#include "stm32DuinoOneButton_menu.h"
15-
#include "../ThemeMonoInverseBuilder.h"
15+
#include "ThemeMonoInverseBuilder.h"
1616
#include <Fonts/OpenSansRegular8pt.h>
1717

18+
#include "TcMenuBuilder.h"
19+
1820
// Global variable declarations
1921
const ConnectorLocalInfo applicationInfo = { "One Button", "4fe6e85d-2bbd-4d19-84e5-5d6746883028" };
2022
TcMenuRemoteServer remoteServer(applicationInfo);
@@ -27,26 +29,26 @@ NoInitialisationNeeded serialInitializer;
2729
SerialTagValueTransport serialTransport(&Serial);
2830
TagValueRemoteServerConnection serialConnection(serialTransport, serialInitializer);
2931

30-
// Global Menu Item declarations
31-
const char enumStrSettingsEnumProp_0[] = "Item1";
32-
const char enumStrSettingsEnumProp_1[] = "Item2";
33-
const char enumStrSettingsEnumProp_2[] = "Item3";
34-
const char* const enumStrSettingsEnumProp[] = { enumStrSettingsEnumProp_0, enumStrSettingsEnumProp_1, enumStrSettingsEnumProp_2 };
35-
const EnumMenuInfo minfoSettingsEnumProp = { "EnumProp", 24, 0xffff, 2, NO_CALLBACK, enumStrSettingsEnumProp };
36-
EnumMenuItem menuSettingsEnumProp(&minfoSettingsEnumProp, 0, nullptr, INFO_LOCATION_PGM);
37-
const AnalogMenuInfo minfoSettingsIntProp = { "IntProp", 23, 0xffff, 10, NO_CALLBACK, 0, 1, "A" };
38-
AnalogMenuItem menuSettingsIntProp(&minfoSettingsIntProp, 0, &menuSettingsEnumProp, INFO_LOCATION_PGM);
39-
const BooleanMenuInfo minfoSettingsOption = { "Option", 22, 0xffff, 1, NO_CALLBACK, NAMING_TRUE_FALSE };
40-
BooleanMenuItem menuSettingsOption(&minfoSettingsOption, false, &menuSettingsIntProp, INFO_LOCATION_PGM);
41-
const SubMenuInfo minfoSettings = { "Settings", 21, 0xffff, 0, NO_CALLBACK };
42-
BackMenuItem menuBackSettings(&minfoSettings, &menuSettingsOption, INFO_LOCATION_PGM);
43-
SubMenuItem menuSettings(&minfoSettings, &menuBackSettings, nullptr, INFO_LOCATION_PGM);
44-
const AnalogMenuInfo minfoTemp = { "Temp", 20, 0xffff, 100, NO_CALLBACK, 0, 1, "%" };
45-
AnalogMenuItem menuTemp(&minfoTemp, 0, &menuSettings, INFO_LOCATION_PGM);
46-
const AnyMenuInfo minfoPressMe = { "Press Me", 19, 0xffff, 0, onPressMe };
47-
ActionMenuItem menuPressMe(&minfoPressMe, &menuTemp, INFO_LOCATION_PGM);
32+
const char* enumSettingValues[] = { "Spanner", "Hammer", "Plane" };
33+
34+
void buildMenu(TcMenuBuilder& builder) {
35+
builder.usingDynamicEEPROMStorage()
36+
.actionItem(MENU_PRESS_ME_ID, "Press Me", NoMenuFlags, onPressMe)
37+
.analogBuilder(MENU_TEMP_ID, "Temp", DONT_SAVE, NoMenuFlags)
38+
.maxValue(100).offset(0).divisor(1).unit("%")\
39+
.endItem()
40+
.subMenu(MENU_SETTINGS_ID, "Settings", NoMenuFlags)
41+
.boolItem(MENU_SETTINGS_OPTION_ID, "Option", DONT_SAVE, NAMING_TRUE_FALSE, NoMenuFlags)
42+
.enumItem(MENU_SETTINGS_ENUM_ID, "Tooling", DONT_SAVE, enumSettingValues, 3, NoMenuFlags)
43+
.analogBuilder(MENU_SETTINGS_INT_ID, "IntProp", DONT_SAVE, NoMenuFlags)
44+
.maxValue(10).offset(0).divisor(1).unit("A").endItem()
45+
.endSub();
46+
}
4847

4948
void setupMenu() {
49+
auto builder = TcMenuBuilder(&MenuManager::ROOT);
50+
buildMenu(builder);
51+
5052
// First we set up eeprom and authentication (if needed).
5153
setSizeBasedEEPROMStorageEnabled(false);
5254
glBspRom.initialise(0);
@@ -55,7 +57,7 @@ void setupMenu() {
5557
gfx.begin();
5658
renderer.setUpdatesPerSecond(5);
5759
switches.init(internalDigitalIo(), SWITCHES_POLL_EVERYTHING, false);
58-
menuMgr.initWithoutInput(&renderer, &menuPressMe);
60+
menuMgr.initWithoutInput(&renderer, getMenuItemById(MENU_PRESS_ME_ID));
5961
oneButtonHandler.start();
6062
remoteServer.addConnection(&serialConnection);
6163
installMonoInverseTitleTheme(renderer, MenuFontDef(&OpenSansRegular8pt, 0), MenuFontDef(&OpenSansRegular8pt, 0), true, BaseGraphicalRenderer::NO_TITLE, true);

examples/arduino32/stm32DuinoOneButton/generated/stm32DuinoOneButton_menu.h renamed to examples/arduino32/stm32DuinoOneButton/stm32DuinoOneButton_menu.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,16 @@ extern const UnicodeFont OpenSansRegular8pt[];
3434
// Any externals needed by IO expanders, EEPROMs etc
3535

3636

37-
// Global Menu Item exports
38-
extern EnumMenuItem menuSettingsEnumProp;
39-
extern AnalogMenuItem menuSettingsIntProp;
40-
extern BooleanMenuItem menuSettingsOption;
41-
extern BackMenuItem menuBackSettings;
42-
extern SubMenuItem menuSettings;
43-
extern AnalogMenuItem menuTemp;
44-
extern ActionMenuItem menuPressMe;
37+
// Global Menu Item IDs
38+
#define MENU_PRESS_ME_ID 1
39+
#define MENU_TEMP_ID 2
40+
#define MENU_SETTINGS_ID 3
41+
#define MENU_SETTINGS_OPTION_ID 4
42+
#define MENU_SETTINGS_INT_ID 5
43+
#define MENU_SETTINGS_ENUM_ID 6
4544

4645
// Provide a wrapper to get hold of the root menu item and export setupMenu
47-
inline MenuItem& rootMenuItem() { return menuPressMe; }
46+
inline MenuItem& rootMenuItem() { return *getMenuItemById(MENU_PRESS_ME_ID); }
4847
void setupMenu();
4948

5049
// Callback functions must always include CALLBACK_FUNCTION after the return type

examples/arduino32/stm32DuinoOneButton/generated/tcMenuU8g2.cpp renamed to examples/arduino32/stm32DuinoOneButton/tcMenuU8g2.cpp

File renamed without changes.

examples/arduino32/stm32DuinoOneButton/generated/tcMenuU8g2.h renamed to examples/arduino32/stm32DuinoOneButton/tcMenuU8g2.h

File renamed without changes.

src/EepromItemStorage.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -285,28 +285,28 @@ void DynamicEepromStore::loadItemFromRom(EepromAbstraction* eeprom, MenuItem* ne
285285
auto menuType = nextMenuItem->getMenuType();
286286
if (menuType == MENUTYPE_TEXT_VALUE) {
287287
auto textItem = asTextItem(nextMenuItem);
288-
eeprom->readCharArrIntoMemArray(const_cast<char *>(textItem->getTextValue()), pos, textItem->textLength());
289-
textItem->cleanUpArray();
290-
textItem->setChanged(true);
288+
eeprom->readCharArrIntoMemArray(const_cast<char *>(textItem.getTextValue()), pos, textItem.textLength());
289+
textItem.cleanUpArray();
290+
textItem.setChanged(true);
291291
}
292292
else if (menuType == MENUTYPE_TIME) {
293293
auto timeItem = asTimeItem(nextMenuItem);
294-
eeprom->readIntoMemArray(reinterpret_cast<uint8_t *>(timeItem->getUnderlyingData()), pos, 4);
295-
timeItem->setChanged(true);
294+
eeprom->readIntoMemArray(reinterpret_cast<uint8_t *>(timeItem.getUnderlyingData()), pos, 4);
295+
timeItem.setChanged(true);
296296
}
297297
else if (menuType == MENUTYPE_DATE) {
298298
auto dateItem = asDateItem(nextMenuItem);
299-
eeprom->readIntoMemArray(reinterpret_cast<uint8_t *>(dateItem->getUnderlyingData()), pos, 4);
300-
dateItem->setChanged(true);
299+
eeprom->readIntoMemArray(reinterpret_cast<uint8_t *>(dateItem.getUnderlyingData()), pos, 4);
300+
dateItem.setChanged(true);
301301
}
302302
else if (menuType == MENUTYPE_IPADDRESS) {
303303
auto ipItem = asIpAddressItem(nextMenuItem);
304-
eeprom->readIntoMemArray(ipItem->getIpAddress(), pos, 4);
305-
ipItem->setChanged(true);
304+
eeprom->readIntoMemArray(ipItem.getIpAddress(), pos, 4);
305+
ipItem.setChanged(true);
306306
}
307307
else if (menuType == MENUTYPE_SCROLLER_VALUE) {
308308
auto scroller = asScrollChoiceItem(nextMenuItem);
309-
scroller->setCurrentValue(eeprom->read16(pos), true);
309+
scroller.setCurrentValue(eeprom->read16(pos), true);
310310
}
311311
else if (menuType == MENUTYPE_COLOR_VALUE) {
312312
auto rgb = reinterpret_cast<Rgb32MenuItem*>(nextMenuItem);
@@ -319,9 +319,9 @@ void DynamicEepromStore::loadItemFromRom(EepromAbstraction* eeprom, MenuItem* ne
319319
}
320320
else if (menuType == MENUTYPE_LARGENUM_VALUE) {
321321
auto numItem = asLargeNumberItem(nextMenuItem);
322-
numItem->getLargeNumber()->setNegative(eeprom->read8(pos));
323-
eeprom->readIntoMemArray(numItem->getLargeNumber()->getNumberBuffer(), pos + 1, 6);
324-
numItem->setChanged(true);
322+
numItem.getLargeNumber()->setNegative(eeprom->read8(pos));
323+
eeprom->readIntoMemArray(numItem.getLargeNumber()->getNumberBuffer(), pos + 1, 6);
324+
numItem.setChanged(true);
325325
}
326326
else if (menuType == MENUTYPE_INT_VALUE || menuType == MENUTYPE_ENUM_VALUE || menuType == MENUTYPE_BOOLEAN_VALUE) {
327327
auto intItem = reinterpret_cast<ValueMenuItem*>(nextMenuItem);
@@ -333,32 +333,32 @@ size_t DynamicEepromStore::saveItemDynamically(EepromAbstraction *eeprom, MenuIt
333333
auto menuType = nextMenuItem->getMenuType();
334334
if (menuType == MENUTYPE_TEXT_VALUE) {
335335
auto textItem = asTextItem(nextMenuItem);
336-
eeprom->write16(pos, textItem->textLength());
337-
eeprom->writeCharArrToRom(pos + 2, textItem->getTextValue(), textItem->textLength());
338-
return textItem->textLength();
336+
eeprom->write16(pos, textItem.textLength());
337+
eeprom->writeCharArrToRom(pos + 2, textItem.getTextValue(), textItem.textLength());
338+
return textItem.textLength();
339339
}
340340
else if (menuType == MENUTYPE_TIME) {
341341
auto timeItem = asTimeItem(nextMenuItem);
342342
eeprom->write16(pos, 4);
343-
eeprom->writeArrayToRom(pos + 2, reinterpret_cast<const uint8_t *>(timeItem->getUnderlyingData()), 4);
343+
eeprom->writeArrayToRom(pos + 2, reinterpret_cast<const uint8_t *>(timeItem.getUnderlyingData()), 4);
344344
return 4;
345345
}
346346
else if (menuType == MENUTYPE_DATE) {
347347
auto dateItem = asDateItem(nextMenuItem);
348348
eeprom->write16(pos, 4);
349-
eeprom->writeArrayToRom(pos + 2, reinterpret_cast<const uint8_t *>(dateItem->getUnderlyingData()), 4);
349+
eeprom->writeArrayToRom(pos + 2, reinterpret_cast<const uint8_t *>(dateItem.getUnderlyingData()), 4);
350350
return 4;
351351
}
352352
else if (menuType == MENUTYPE_IPADDRESS) {
353353
auto ipItem = asIpAddressItem(nextMenuItem);
354354
eeprom->write16(pos, 4);
355-
eeprom->writeArrayToRom(pos + 2, ipItem->getIpAddress(), 4);
355+
eeprom->writeArrayToRom(pos + 2, ipItem.getIpAddress(), 4);
356356
return 4;
357357
}
358358
else if (menuType == MENUTYPE_SCROLLER_VALUE) {
359359
auto scroller = asScrollChoiceItem(nextMenuItem);
360360
eeprom->write16(pos, 2);
361-
eeprom->write16(pos + 2, scroller->getCurrentValue());
361+
eeprom->write16(pos + 2, scroller.getCurrentValue());
362362
return 2;
363363
}
364364
else if (menuType == MENUTYPE_COLOR_VALUE) {
@@ -375,9 +375,9 @@ size_t DynamicEepromStore::saveItemDynamically(EepromAbstraction *eeprom, MenuIt
375375
else if (menuType == MENUTYPE_LARGENUM_VALUE) {
376376
auto numItem = asLargeNumberItem(nextMenuItem);
377377
eeprom->write16(pos, 8);
378-
numItem->getLargeNumber()->setNegative(eeprom->read8(pos));
379-
eeprom->readIntoMemArray(numItem->getLargeNumber()->getNumberBuffer(), pos + 1, 6);
380-
numItem->setChanged(true);
378+
numItem.getLargeNumber()->setNegative(eeprom->read8(pos));
379+
eeprom->readIntoMemArray(numItem.getLargeNumber()->getNumberBuffer(), pos + 1, 6);
380+
numItem.setChanged(true);
381381
return 8;
382382
}
383383
else if (menuType == MENUTYPE_INT_VALUE || menuType == MENUTYPE_ENUM_VALUE || menuType == MENUTYPE_BOOLEAN_VALUE) {

src/TcMenuBuilder.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
#define TCLIBRARYDEV_TCMENUBUILDER_H
44
#include "EepromAbstraction.h"
55
#include "MenuItems.h"
6+
#include "RuntimeMenuItem.h"
67

78
class TcMenuBuilder;
89
struct RgbColor32;
9-
enum MultiEditWireType : uint8_t;
10-
class IpAddressStorage;
11-
class SubMenuItem;
12-
struct TimeStorage;
13-
struct DateStorage;
1410
class MenuManager;
1511
class ScrollChoiceMenuItem;
1612

0 commit comments

Comments
 (0)