Skip to content

Commit b588930

Browse files
author
dave
committed
#74 #55 finishing off the scroll, rgb and sub menu refactoring.
1 parent 04d9426 commit b588930

File tree

9 files changed

+138
-6
lines changed

9 files changed

+138
-6
lines changed

src/BaseRenderers.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,25 @@
1010
#include "BaseRenderers.h"
1111
#include "BaseDialog.h"
1212

13-
MenuRenderer* MenuRenderer::theInstance = NULL;
13+
MenuRenderer* MenuRenderer::theInstance = nullptr;
14+
15+
class RenderingMenuMgrObserver : public MenuManagerObserver {
16+
public:
17+
void structureHasChanged() override {
18+
auto myRenderer = MenuRenderer::getInstance();
19+
if(myRenderer->getRendererType() == RENDERER_TYPE_BASE) {
20+
serdebugF("Completely invalidate the display");
21+
reinterpret_cast<BaseMenuRenderer*>(myRenderer)->invalidateAll();
22+
}
23+
}
24+
25+
bool menuEditStarting(MenuItem *item) override {
26+
return true;
27+
}
28+
29+
void menuEditEnded(MenuItem *item) override {}
30+
} menuMgrListener;
31+
1432

1533
BaseMenuRenderer::BaseMenuRenderer(int bufferSize) : MenuRenderer(RENDERER_TYPE_BASE, bufferSize) {
1634
ticksToReset = 0;
@@ -35,6 +53,7 @@ void BaseMenuRenderer::initialise() {
3553
resetToDefault();
3654

3755
taskManager.scheduleFixedRate(SCREEN_DRAW_INTERVAL, this);
56+
menuMgr.addChangeNotification(&menuMgrListener);
3857
}
3958

4059
bool BaseMenuRenderer::tryTakeSelectIfNeeded(int currentReading, RenderPressMode pressType) {

src/BaseRenderers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,11 @@ class BaseMenuRenderer : public MenuRenderer, Executable {
393393
*/
394394
void menuValueToText(MenuItem* item, MenuDrawJustification justification);
395395

396+
/**
397+
* Completely invalidate all drawing and instigate a complete redraw of all elements.
398+
*/
399+
void invalidateAll() { redrawMode = MENUDRAW_COMPLETE_REDRAW; }
400+
396401
protected:
397402
/**
398403
* set up a countdown to default back to the submenu

src/MessageProcessors.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,16 @@ bool processValueChangeField(FieldAndValue* field, MessageProcessorInfo* info) {
178178
numItem->setLargeNumberFromString(field->value);
179179
serdebugF2("Large num change: ", field->value);
180180
}
181+
else if(info->value.item->getMenuType() == MENUTYPE_COLOR_VALUE) {
182+
auto rgb = reinterpret_cast<Rgb32MenuItem*>(info->value.item);
183+
rgb->setColorData(RgbColor32(field->value));
184+
serdebugF4("RGB change ", rgb->getUnderlying()->red, rgb->getUnderlying()->green, rgb->getUnderlying()->blue );
185+
}
186+
else if(info->value.item->getMenuType() == MENUTYPE_SCROLLER_VALUE) {
187+
auto sc = reinterpret_cast<ScrollChoiceMenuItem*>(info->value.item);
188+
sc->setFromRemote(field->value);
189+
serdebugF2("Scroller change ", sc->getCurrentValue());
190+
}
181191
return true;
182192
}
183193

src/RemoteConnector.cpp

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "BaseDialog.h"
2525
#include "BaseRenderers.h"
2626
#include "EditableLargeNumberMenuItem.h"
27+
#include "ScrollChoiceMenuItem.h"
2728

2829
const char PGM_TCM pmemBootStartText[] = "START";
2930
const char PGM_TCM pmemBootEndText[] = "END";
@@ -324,6 +325,12 @@ void TagValueRemoteConnector::nextBootstrap() {
324325
case MENUTYPE_ACTION_VALUE:
325326
encodeActionMenu(parentId, (ActionMenuItem*)bootItem);
326327
break;
328+
case MENUTYPE_COLOR_VALUE:
329+
encodeColorMenuItem(parentId, reinterpret_cast<Rgb32MenuItem*>(bootItem));
330+
break;
331+
case MENUTYPE_SCROLLER_VALUE:
332+
encodeScrollMenuItem(parentId, reinterpret_cast<ScrollChoiceMenuItem*>(bootItem));
333+
break;
327334
default:
328335
break;
329336
}
@@ -413,6 +420,31 @@ void TagValueRemoteConnector::encodeAnalogItem(int parentId, AnalogMenuItem* ite
413420
transport->endMsg();
414421
}
415422

423+
void TagValueRemoteConnector::encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem) {
424+
if(!prepareWriteMsg(MSG_BOOT_SCROLL_CHOICE)) return;
425+
encodeBaseMenuFields(id, pItem);
426+
transport->writeFieldInt(FIELD_NO_CHOICES, pItem->getNumberOfRows());
427+
transport->writeFieldInt(FIELD_WIDTH, pItem->getItemWidth());
428+
transport->writeFieldInt(FIELD_EDIT_MODE, pItem->getMemMode());
429+
430+
char sz[32];
431+
pItem->copyTransportText(sz, sizeof(sz));
432+
433+
transport->writeField(FIELD_CURRENT_VAL, sz);
434+
435+
transport->endMsg();
436+
}
437+
438+
void TagValueRemoteConnector::encodeColorMenuItem(int id, Rgb32MenuItem *pItem) {
439+
if(!prepareWriteMsg(MSG_BOOT_RGB_COLOR)) return;
440+
encodeBaseMenuFields(id, pItem);
441+
transport->writeFieldInt(FIELD_ALPHA, pItem->isAlphaInUse());
442+
char sz[12];
443+
pItem->getUnderlying()->asHtmlString(sz, sizeof sz, true);
444+
transport->writeField(FIELD_CURRENT_VAL, sz);
445+
transport->endMsg();
446+
}
447+
416448
void TagValueRemoteConnector::encodeLargeNumberMenuItem(int parentId, EditableLargeNumberMenuItem* item) {
417449
if (!prepareWriteMsg(MSG_BOOT_LARGENUM)) return;
418450
encodeBaseMenuFields(parentId, item);
@@ -545,7 +577,8 @@ void TagValueRemoteConnector::encodeActionMenu(int parentId, ActionMenuItem* ite
545577
}
546578

547579
void TagValueRemoteConnector::encodeChangeValue(MenuItem* theItem) {
548-
if(!prepareWriteMsg(MSG_CHANGE_INT)) return;
580+
char sz[32];
581+
if(!prepareWriteMsg(MSG_CHANGE_INT)) return;
549582
transport->writeFieldInt(FIELD_ID, theItem->getId());
550583
switch(theItem->getMenuType()) {
551584
case MENUTYPE_ENUM_VALUE:
@@ -558,8 +591,21 @@ void TagValueRemoteConnector::encodeChangeValue(MenuItem* theItem) {
558591
case MENUTYPE_TIME:
559592
case MENUTYPE_DATE:
560593
case MENUTYPE_LARGENUM_VALUE:
594+
case MENUTYPE_COLOR_VALUE: {
595+
auto rgb = reinterpret_cast<Rgb32MenuItem*>(theItem);
596+
rgb->getUnderlying()->asHtmlString(sz, sizeof sz, true);
597+
transport->writeField(FIELD_CURRENT_VAL, sz);
598+
transport->writeFieldInt(FIELD_CHANGE_TYPE, CHANGE_ABSOLUTE);
599+
break;
600+
}
601+
case MENUTYPE_SCROLLER_VALUE: {
602+
auto sc = reinterpret_cast<ScrollChoiceMenuItem*>(theItem);
603+
sc->copyTransportText(sz, sizeof sz);
604+
transport->writeField(FIELD_CURRENT_VAL, sz);
605+
transport->writeFieldInt(FIELD_CHANGE_TYPE, CHANGE_ABSOLUTE);
606+
break;
607+
}
561608
case MENUTYPE_TEXT_VALUE: {
562-
char sz[20];
563609
((RuntimeMenuItem*)theItem)->copyValue(sz, sizeof(sz));
564610
transport->writeField(FIELD_CURRENT_VAL, sz);
565611
transport->writeFieldInt(FIELD_CHANGE_TYPE, CHANGE_ABSOLUTE); // menu host always sends absolute!

src/RemoteConnector.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "RuntimeMenuItem.h"
1919
#include "MessageProcessors.h"
2020
#include "MenuIterator.h"
21+
#include "ScrollChoiceMenuItem.h"
2122

2223
#define TAG_VAL_PROTOCOL 0x01
2324
#define START_OF_MESSAGE 0x01
@@ -327,7 +328,21 @@ class TagValueRemoteConnector {
327328
*/
328329
void encodeAcknowledgement(uint32_t correlation, AckResponseStatus status);
329330

330-
/**
331+
/**
332+
* Encodes a color RGB to the remote as a boot command.
333+
* @param id the parent ID
334+
* @param pItem the item to be transferred
335+
*/
336+
void encodeColorMenuItem(int id, Rgb32MenuItem *pItem);
337+
338+
/**
339+
* Encodes a scroll choice to the remote as a boot command
340+
* @param id parent id
341+
* @param pItem the item to be sent
342+
*/
343+
void encodeScrollMenuItem(int id, ScrollChoiceMenuItem *pItem);
344+
345+
/**
331346
* Called frequently to perform all functions, this is arranged interally by
332347
* registering a taskManager task.
333348
*/

src/RemoteTypes.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ enum AckResponseStatus {
4343
/**
4444
* Converts a message field as two separate entities into a single word.
4545
*/
46-
#define msgFieldToWord(a,b) ( (((uint16_t)a)<<8) | ((uint16_t)b) )
46+
#define msgFieldToWord(a,b) ( (((uint16_t)(a))<<8U) | ((uint16_t)(b)) )
4747

4848
/*
4949
* Definitions for an unknown field key or part thereof.
@@ -81,6 +81,10 @@ enum AckResponseStatus {
8181
#define MSG_BOOT_LARGENUM msgFieldToWord('B', 'N')
8282
/** Message type definition for floating point bootstrap message */
8383
#define MSG_BOOT_FLOAT msgFieldToWord('B','F')
84+
/** Message type definition for RGB color bootstrap message */
85+
#define MSG_BOOT_RGB_COLOR msgFieldToWord('B', 'R')
86+
/** Message type definition for scroll bootstrap message */
87+
#define MSG_BOOT_SCROLL_CHOICE msgFieldToWord('B', 'Z')
8488
/** Message type definition for remote status bootstrap message */
8589
#define MSG_BOOT_REMOTE msgFieldToWord('B','R')
8690
/** Message type definition for ip address field bootstrap */
@@ -124,6 +128,8 @@ enum AckResponseStatus {
124128
#define FIELD_BUFFER msgFieldToWord('B', 'U')
125129
#define FIELD_MODE msgFieldToWord('M', 'O')
126130
#define FIELD_EDIT_MODE msgFieldToWord('E', 'M')
131+
#define FIELD_ALPHA msgFieldToWord('R', 'A')
132+
#define FIELD_WIDTH msgFieldToWord('W', 'I')
127133

128134
#define FIELD_PREPEND_CHOICE 'C'
129135
#define FIELD_PREPEND_NAMECHOICE 'c'

src/ScrollChoiceMenuItem.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ void ScrollChoiceMenuItem::valueAtPosition(char *buffer, size_t bufferSize, int
8282
}
8383
}
8484

85+
void ScrollChoiceMenuItem::copyTransportText(char *buffer, size_t bufferSize) {
86+
ltoaClrBuff(buffer, getCurrentValue(), 3, NOT_PADDED, bufferSize);
87+
appendChar(buffer, '-', bufferSize);
88+
size_t len = strlen(buffer);
89+
copyValue(&buffer[len], (int)(bufferSize - len));
90+
buffer[bufferSize - 1] = 0;
91+
}
92+
93+
long parseIntUntilSeparator(const char* ptr, int& offset);
94+
95+
void ScrollChoiceMenuItem::setFromRemote(const char *buffer) {
96+
int pos = 0;
97+
setCurrentValue((int)parseIntUntilSeparator(buffer, pos));
98+
}
99+
85100
int enumItemRenderFn(RuntimeMenuItem *item, uint8_t row, RenderFnMode mode, char *buffer, int bufferSize) {
86101
if (item->getMenuType() != MENUTYPE_SCROLLER_VALUE) return 0;
87102
auto scrollItem = reinterpret_cast<ScrollChoiceMenuItem*>(item);

src/ScrollChoiceMenuItem.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,16 @@ class ScrollChoiceMenuItem : public RuntimeMenuItem {
106106

107107
int getItemWidth() const { return itemSize; }
108108

109+
EnumMemMode getMemMode() const { return memMode; }
110+
109111
/**
110112
* @return integer of the current choice
111113
*/
112114
int getCurrentValue() { return itemPosition; }
115+
116+
void copyTransportText(char *string, size_t i);
117+
118+
void setFromRemote(const char* buffer);
113119
};
114120

115121
/**
@@ -193,7 +199,11 @@ class Rgb32MenuItem : public EditableMultiPartMenuItem<RgbColor32> {
193199
* copy the color data provided as the latest
194200
* @param other the new color data
195201
*/
196-
void setColorData(const RgbColor32& other) { data = other; }
202+
void setColorData(const RgbColor32& other) {
203+
data = other;
204+
setSendRemoteNeededAll();
205+
setChanged(true);
206+
}
197207

198208
/**
199209
* @return true if the alpha channel is in use for this menuitem, otherwise false.

tests/tcMenuCoreTests/ScrollChoiceMenuItemTests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ test(testValueAtPositionEeeprom) {
6868

6969
choice.valueAtPosition(buffer, sizeof buffer, 2);
7070
assertStringCaseEqual("", buffer);
71+
72+
choice.copyTransportText(buffer, sizeof buffer);
73+
assertStringCaseEqual("0-computer12", buffer);
7174
}
7275

7376
bool renderingInvoked = false;
@@ -116,6 +119,9 @@ test(testValueAtPositionCustom) {
116119
choice.setCurrentValue(1);
117120
assertTrue(renderingInvoked);
118121
assertEqual(1, choice.getCurrentValue());
122+
123+
choice.copyTransportText(buffer, sizeof buffer);
124+
assertStringCaseEqual("1-1", buffer);
119125
}
120126

121127
int colorCbCount = 0;

0 commit comments

Comments
 (0)