Skip to content

Commit ded2121

Browse files
committed
#176 move most core english language strings into language dependant header. #177 improvements to touch calibration.
1 parent 309196b commit ded2121

13 files changed

+395
-76
lines changed

src/BaseDialog.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
#include <RemoteConnector.h>
1111
#include <BaseDialog.h>
1212
#include <SwitchInput.h>
13+
#include "lang/language_select.h"
1314

1415
using namespace tcgfx;
1516

16-
const char buttonOK[] PROGMEM = "ok";
17-
const char buttonCancel[] PROGMEM = "cancel";
18-
const char buttonClose[] PROGMEM = "close";
19-
const char buttonAccept[] PROGMEM = "accept";
17+
const char buttonOK[] PROGMEM = TXT_DIALOG_OK;
18+
const char buttonCancel[] PROGMEM = TXT_DIALOG_CANCEL;
19+
const char buttonClose[] PROGMEM = TXT_DIALOG_CLOSE;
20+
const char buttonAccept[] PROGMEM = TXT_DIALOG_ACCEPT;
2021
const char* standardDialogButton[] = { buttonOK, buttonAccept, buttonCancel, buttonClose };
2122

2223
BaseDialog::BaseDialog() : header{0}, headerPgm(nullptr) {

src/BaseRenderers.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,11 @@ BaseMenuRenderer::BaseMenuRenderer(int bufferSize, RendererType rType) : MenuRen
4040
lastOffset = 0;
4141
resetValInTicks = 30 * TC_DISPLAY_UPDATES_PER_SECOND;
4242
renderCallback = nullptr;
43-
resetCallback = nullptr;
4443
renderFnPressType = RPRESS_NONE;
4544
redrawMode = MENUDRAW_COMPLETE_REDRAW;
4645
this->lastOffset = 0;
4746
this->firstWidget = nullptr;
4847
this->dialog = nullptr;
49-
isCustomDrawing = false;
5048
displayTakenMode = NOT_TAKEN_OVER;
5149
updatesPerSecond = TC_DISPLAY_UPDATES_PER_SECOND;
5250
MenuRenderer::theInstance = this;
@@ -112,14 +110,9 @@ void BaseMenuRenderer::resetToDefault() {
112110

113111
// once the menu has been reset, if the reset callback is present
114112
// then we call it.
115-
if(resetCallback) {
116-
if(isCustomDrawing) {
117-
customDrawing->reset();
118-
}
119-
else {
120-
resetCallback();
121-
}
122-
};
113+
if(customDrawing) {
114+
customDrawing->reset();
115+
}
123116
}
124117

125118
void BaseMenuRenderer::countdownToDefaulting() {
@@ -137,7 +130,7 @@ void BaseMenuRenderer::countdownToDefaulting() {
137130
}
138131

139132
void BaseMenuRenderer::takeOverDisplay(RendererCallbackFn displayFn) {
140-
if(displayFn == nullptr && isCustomDrawing == false) return;
133+
if(displayFn == nullptr && customDrawing != nullptr) return;
141134
// when we set this, we are stopping tcMenu rendering and letting this take over
142135
renderFnPressType = RPRESS_NONE;
143136
displayTakenMode = displayFn ? TAKEN_OVER_FN : START_CUSTOM_DRAW;

src/BaseRenderers.h

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,19 @@ class CustomDrawing {
9999
*/
100100
typedef void (*ResetCallbackFn)();
101101

102+
/**
103+
* This class provides the reset callback in a functional way without the need for custom drawing class.
104+
* It simply calls the provided reset function on reset.
105+
*/
106+
class ResetCallbackFunctionCustomDraw : public CustomDrawing {
107+
ResetCallbackFn resetFn;
108+
public:
109+
ResetCallbackFunctionCustomDraw(ResetCallbackFn fn): resetFn(fn) {}
110+
void started(BaseMenuRenderer *currentRenderer) override { }
111+
void reset() override {resetFn();}
112+
void renderLoop(unsigned int currentValue, RenderPressMode userClick) override {}
113+
};
114+
102115
/**
103116
* Title widgets allow for drawing small graphics in the title area, for example connectivity status
104117
* of the wifi network, if a remote connection to the menu is active. They are in a linked list so
@@ -276,11 +289,7 @@ class BaseMenuRenderer : public MenuRenderer, Executable {
276289
uint16_t resetValInTicks;
277290
MenuRedrawState redrawMode;
278291
TitleWidget* firstWidget;
279-
union {
280-
ResetCallbackFn resetCallback;
281-
CustomDrawing *customDrawing;
282-
};
283-
bool isCustomDrawing;
292+
CustomDrawing *customDrawing;
284293
DisplayTakeoverMode displayTakenMode;
285294
BaseDialog* dialog;
286295

@@ -342,8 +351,7 @@ class BaseMenuRenderer : public MenuRenderer, Executable {
342351
* and that will be notified of both reset events and take over display events.
343352
*/
344353
void setResetCallback(ResetCallbackFn resetFn) {
345-
isCustomDrawing = false;
346-
resetCallback = resetFn;
354+
customDrawing = new ResetCallbackFunctionCustomDraw(resetFn);
347355
}
348356

349357
/**
@@ -353,10 +361,16 @@ class BaseMenuRenderer : public MenuRenderer, Executable {
353361
* display is first taken over, followed by renderLoop until it's given back.
354362
*/
355363
void setCustomDrawingHandler(CustomDrawing* customDrawingParam) {
356-
isCustomDrawing= true;
357364
customDrawing = customDrawingParam;
358365
}
359366

367+
/**
368+
* @return the current custom drawing set on this renderer, it could be nullptr if never set.
369+
*/
370+
CustomDrawing* getCurrentCustomDrawing() {
371+
return customDrawing;
372+
}
373+
360374
/**
361375
* Called by taskManager when we are scheduled
362376
*/

src/MenuItems.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "tcMenu.h"
77
#include "MenuItems.h"
88
#include "RuntimeMenuItem.h"
9+
#include "lang/language_select.h"
910
#include "graphics/RuntimeTitleMenuItem.h"
1011

1112
MenuItem::MenuItem(MenuType menuType, const AnyMenuInfo* menuInfo, MenuItem* next, bool infoProgmem) {
@@ -297,12 +298,12 @@ void ValueMenuItem::setCurrentValue(uint16_t val, bool silent) {
297298
changeOccurred(silent);
298299
}
299300

300-
const char ON_STR[] PGM_TCM = "ON";
301-
const char OFF_STR[] PGM_TCM = "OFF";
302-
const char YES_STR[] PGM_TCM = "YES";
303-
const char NO_STR[] PGM_TCM = "NO";
304-
const char TRUE_STR[] PGM_TCM = "TRUE";
305-
const char FALSE_STR[] PGM_TCM= "FALSE";
301+
const char ON_STR[] PGM_TCM = TXT_BOOL_ON_TEXT;
302+
const char OFF_STR[] PGM_TCM = TXT_BOOL_OFF_TEXT;
303+
const char YES_STR[] PGM_TCM = TXT_BOOL_YES_TEXT;
304+
const char NO_STR[] PGM_TCM = TXT_BOOL_NO_TEXT;
305+
const char TRUE_STR[] PGM_TCM = TXT_BOOL_TRUE_TEXT;
306+
const char FALSE_STR[] PGM_TCM= TXT_BOOL_FALSE_TEXT;
306307

307308
void copyMenuItemNameAndValue(const MenuItem* item, char* buffer, size_t bufferSize, char additionalSep) {
308309
item->copyNameToBuffer(buffer, bufferSize);

src/RemoteConnector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <PlatformDetermination.h>
1010
#include "tcMenuVersion.h"
11+
#include "lang/language_select.h"
1112
#ifdef IOA_USE_MBED
1213
#include "tcUtil.h"
1314
#endif
@@ -101,8 +102,7 @@ void TagValueRemoteConnector::provideAuthentication(const char* auth) {
101102
}
102103
}
103104

104-
const char headerPairingText[] PROGMEM = "Pairing waiting";
105-
const char headerPairingDone[] PROGMEM = "Pairing complete";
105+
const char headerPairingText[] PROGMEM = TXT_PAIRING_TEXT;
106106
const char* lastUuid;
107107

108108
void onPairingFinished(ButtonType ty, void* voidConnector) {

src/RemoteMenuItem.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99
#include "RemoteConnector.h"
1010
#include "tcUtil.h"
1111
#include "BaseDialog.h"
12+
#include "lang/language_select.h"
1213

13-
const char REMOVE_CONN_HDR_PGM[] PROGMEM = "Close Connection";
14+
const char REMOVE_CONN_HDR_PGM[] PROGMEM = TXT_CLOSE_CONNECTION;
15+
const char AUTH_REMOVE_KEY[] PROGMEM = TXT_AUTH_REMOVE;
16+
const char AUTH_REMOVE_ALL_KEYS[] PROGMEM = TXT_AUTH_REMOVE_ALL_KEYS;
17+
const char AUTH_EMPTY_KEY[] PROGMEM = TXT_AUTH_EMPTY_KEY;
1418

1519
// called when the close connection dialog completes.
1620
void onRemoteInfoDialogComplete(ButtonType btn, void* data) {
@@ -112,10 +116,6 @@ EepromAuthenticatorManager *EepromAuthenticationInfoMenuItem::getAuthManager() {
112116
return nullptr;
113117
}
114118

115-
const char AUTH_REMOVE_KEY[] PROGMEM = "Remove";
116-
const char AUTH_REMOVE_ALL_KEYS[] PROGMEM = "Remove ALL keys?";
117-
const char AUTH_EMPTY_KEY[] PROGMEM = "EmptyKey";
118-
119119
void onAuthenticateRemoveKeysDlgComplete(ButtonType btn, void* data) {
120120
if (btn == BTNTYPE_OK) {
121121
auto* mgr = reinterpret_cast<EepromAuthenticatorManager*>(menuMgr.getAuthenticator());

src/SecuredMenuPopup.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
#include "SecuredMenuPopup.h"
77
#include "tcMenu.h"
88
#include "BaseDialog.h"
9+
#include "lang/language_select.h"
910

10-
const char pgmProceedText[] PROGMEM = "Proceed";
11-
const char pgmCancelText[] PROGMEM = "Cancel";
12-
const char pgmHeaderNotAuth[] PROGMEM = "Pin incorrect";
11+
const char pgmProceedText[] PROGMEM = TXT_SECURE_MENU_PROCEED;
12+
const char pgmCancelText[] PROGMEM = TXT_SECURE_MENU_CANCEL;
13+
const char pgmHeaderNotAuth[] PROGMEM = TXT_SECURE_PIN_WRONG;
1314

1415
RENDERING_CALLBACK_NAME_INVOKE(fnpopupPasswordRtCall, textItemRenderFn, "Password", -1, NULL)
1516
RENDERING_CALLBACK_NAME_INVOKE(fnpopupSubmenuSecured, backSubItemRenderFn, "Enter PIN", -1, NULL)

src/extras/DrawableTouchCalibrator.cpp

Lines changed: 91 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55

66
#include "DrawableTouchCalibrator.h"
77
#include <BaseDialog.h>
8+
#include "../lang/language_select.h"
89

910
using namespace tcextras;
1011
using namespace tcgfx;
12+
using namespace iotouch;
1113

1214
#define TOUCH_BLACK RGB(0,0,0)
1315
#define TOUCH_ORANGE RGB(255, 69, 0)
1416
#define TOUCH_YELLOW RGB(255, 255, 0)
1517

16-
void TouchScreenCalibrator::started(BaseMenuRenderer *currentRenderer) {
18+
void IoaTouchScreenCalibrator::started(BaseMenuRenderer *currentRenderer) {
1719
if (currentRenderer->getRendererType() != RENDER_TYPE_CONFIGURABLE) {
1820
giveItBack();
1921
}
@@ -22,48 +24,118 @@ void TouchScreenCalibrator::started(BaseMenuRenderer *currentRenderer) {
2224
drawable->setDrawColor(TOUCH_BLACK);
2325
drawable->drawBox(Coord(0, 0), drawable->getDisplayDimensions(), true);
2426
drawable->endDraw();
25-
takeOverCount = 0;
2627
}
2728

28-
void TouchScreenCalibrator::renderLoop(unsigned int currentValue, RenderPressMode userClick) {
29+
void IoaTouchScreenCalibrator::renderLoop(unsigned int currentValue, RenderPressMode userClick) {
2930

30-
// If the dialog is in use then we leave this loop immediately to give it priority.
31-
// As of 2.1 onwards this behaviour is up to you, you can choose to have higher priority than dialogs.
32-
if (renderer->getDialog() != nullptr && renderer->getDialog()->isInUse()) {
33-
giveItBack();
34-
return;
35-
}
31+
iotouch::TouchState touchState = touchScreen->getLastTouchState();
32+
if(touchState != iotouch::TOUCHED && touchState != iotouch::HELD) return;
3633

3734
drawable->startDraw();
3835
drawable->setDrawColor(TOUCH_BLACK);
3936
drawable->drawCircle(Coord(oldX, oldY), 10, true);
4037

41-
drawable->drawBox(Coord(0, 0), Coord(drawable->getDisplayDimensions().x, 45), true);
38+
Coord dims = drawable->getDisplayDimensions();
39+
drawable->drawBox(Coord(0, 50), Coord(dims.x, 45), true);
4240
drawable->setColors(TOUCH_ORANGE, TOUCH_BLACK);
43-
drawable->drawText(Coord(0, 2), nullptr, 0, "Calibrate screen");
44-
4541
char sz[40];
42+
strncpy_P(sz, TXT_TOUCH_CONFIGURE, sizeof(sz));
43+
auto titleConfig = renderer->getGraphicsPropertiesFactory().configFor(nullptr, tcgfx::ItemDisplayProperties::COMPTYPE_TITLE);
44+
drawable->drawText(Coord(0, 45), titleConfig->getFont(), titleConfig->getFontMagnification(), sz);
45+
4646
strcpy(sz, "x: ");
4747
fastftoa(sz, touchScreen->getLastX(), 3, sizeof sz);
4848
strcat(sz, ", y: ");
4949
fastftoa(sz, touchScreen->getLastY(), 3, sizeof sz);
5050
strcat(sz, ", z: ");
51-
fastltoa(sz, touchScreen->getLastTouchState(), 1, NOT_PADDED, sizeof sz);
51+
fastltoa(sz, touchState, 1, NOT_PADDED, sizeof sz);
52+
53+
int buttonSize = 40;
54+
int16_t rightCorner = dims.x - buttonSize;
55+
56+
drawable->setDrawColor(TOUCH_YELLOW);
57+
drawable->drawBox(Coord(0, 0), Coord(buttonSize, buttonSize), true);
58+
drawable->drawBox(Coord(dims.x - buttonSize, 0), Coord(buttonSize, buttonSize), true);
59+
drawable->drawBox(Coord(dims.x - buttonSize, rightCorner), Coord(buttonSize, buttonSize), true);
60+
drawable->setDrawColor(TOUCH_ORANGE);
61+
drawable->drawBox(Coord(0, rightCorner), Coord(buttonSize, buttonSize), true);
62+
drawable->drawText(Coord(0, dims.y - 5), titleConfig->getFont(), titleConfig->getFontMagnification(), "[X]");
5263

5364
drawable->setColors(TOUCH_YELLOW, TOUCH_BLACK);
5465
drawable->drawText(Coord(0, 22), nullptr, 0, sz);
5566

56-
oldX = int(touchScreen->getLastX() * (float) drawable->getDisplayDimensions().x);
57-
oldY = int(touchScreen->getLastY() * (float) drawable->getDisplayDimensions().y);
67+
oldX = int(touchScreen->getLastX() * (float) dims.x);
68+
oldY = int(touchScreen->getLastY() * (float) dims.y);
5869
drawable->setDrawColor(TOUCH_YELLOW);
5970
drawable->drawCircle(Coord(oldX, oldY), 10, true);
71+
drawable->endDraw();
6072

61-
if (oldX < 40 && oldY < 40 && touchScreen->getLastTouchState() == iotouch::HELD) {
62-
giveItBack();
73+
if(oldY < buttonSize) {
74+
// top
75+
if(oldX < buttonSize) {
76+
calibrationHandler.setCalibrationValues(touchScreen->getLastX(), calibrationHandler.getMaxX(),
77+
touchScreen->getLastY(), calibrationHandler.getMaxY());
78+
} else if(oldX > rightCorner) {
79+
calibrationHandler.setCalibrationValues(calibrationHandler.getMinX(), touchScreen->getLastX(),
80+
touchScreen->getLastY(), calibrationHandler.getMaxY());
81+
}
82+
83+
} else if(oldY > (dims.y - buttonSize)) {
84+
// bottom
85+
if(oldX < buttonSize) {
86+
// bottom left - exit
87+
saveCalibration();
88+
giveItBack();
89+
}
90+
else if(oldX > rightCorner) {
91+
calibrationHandler.setCalibrationValues(calibrationHandler.getMinX(), touchScreen->getLastX(),
92+
calibrationHandler.getMinY(), touchScreen->getLastY());
93+
}
6394
}
95+
6496
}
6597

66-
void TouchScreenCalibrator::giveItBack() {
98+
void IoaTouchScreenCalibrator::giveItBack() {
6799
renderer->giveBackDisplay();
68-
if(calibrationCompletedHandler) calibrationCompletedHandler();
100+
renderer->setCustomDrawingHandler(lastDrawing);
101+
lastDrawing = nullptr;
102+
if(screenPrep != nullptr) screenPrep(true);
103+
}
104+
105+
void IoaTouchScreenCalibrator::reCalibrateNow() {
106+
if(screenPrep != nullptr) screenPrep(true);
107+
lastDrawing = renderer->getCurrentCustomDrawing();
108+
renderer->setCustomDrawingHandler(this);
109+
renderer->takeOverDisplay();
110+
}
111+
112+
float fltFromU32(uint32_t val) {
113+
return float(val) / 100000.0F;
114+
}
115+
116+
uint32_t fltToU32(float val) {
117+
return uint32_t(val * 100000.0F);
118+
}
119+
120+
void IoaTouchScreenCalibrator::saveCalibration() {
121+
serlogF2(SER_TCMENU_INFO, "Saving IOA touch calibration at ", romPos);
122+
EepromAbstraction *rom = menuMgr.getEepromAbstraction();
123+
rom->write16(romPos, calibrationMagicIoa);
124+
rom->write32(romPos + 2, fltToU32(calibrationHandler.getMinX()));
125+
rom->write32(romPos + 6, fltToU32(calibrationHandler.getMaxX()));
126+
rom->write32(romPos + 10, fltToU32(calibrationHandler.getMinY()));
127+
rom->write32(romPos + 14, fltToU32(calibrationHandler.getMaxY()));
128+
serlogF2(SER_TCMENU_INFO, "Saved touch data ", rom->hasErrorOccurred());
129+
}
130+
131+
bool IoaTouchScreenCalibrator::loadCalibration() {
132+
serlogF2(SER_TCMENU_INFO, "Loading IOA touch calibration at ", romPos);
133+
EepromAbstraction *rom = menuMgr.getEepromAbstraction();
134+
if(rom->read16(romPos) != calibrationMagicIoa) return false;
135+
calibrationHandler.setCalibrationValues(
136+
fltFromU32(rom->read32(romPos + 2)), fltFromU32(rom->read32(romPos + 6)),
137+
fltFromU32(rom->read32(romPos + 10)), fltFromU32(rom->read32(romPos + 14)));
138+
if(rom->hasErrorOccurred()) return false;
139+
140+
serlogF(SER_TCMENU_INFO, "Loaded calibration OK");
69141
}

0 commit comments

Comments
 (0)