You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.8 KiB
168 lines
4.8 KiB
2 years ago
|
/*
|
||
|
* EEZ Modular Firmware
|
||
|
* Copyright (C) 2015-present, Envox d.o.o.
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation, either version 3 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#include <eez/conf.h>
|
||
|
|
||
|
#if OPTION_TOUCH_CALIBRATION
|
||
|
|
||
|
#include <eez/core/os.h>
|
||
|
#include <eez/core/sound.h>
|
||
|
|
||
|
#include <eez/gui/gui.h>
|
||
|
#include <eez/gui/touch_filter.h>
|
||
|
|
||
|
#include <eez/gui/touch_calibration.h>
|
||
|
|
||
|
#define CONF_GUI_TOUCH_CALIBRATION_M 17
|
||
|
#define TOUCH_POINT_ACTIVATION_THRESHOLD 200
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
namespace eez {
|
||
|
namespace gui {
|
||
|
|
||
|
static AppContext *g_appContext;
|
||
|
|
||
|
static uint32_t g_pointStartTime;
|
||
|
|
||
|
static struct {
|
||
|
int x;
|
||
|
int y;
|
||
|
} g_points[3];
|
||
|
static int g_currentPoint;
|
||
|
|
||
|
bool isTouchCalibrated() {
|
||
|
#if defined(SKIP_TOUCH_CALIBRATION) || defined(EEZ_PLATFORM_STM32F469I_DISCO)
|
||
|
return true;
|
||
|
#else
|
||
|
bool success;
|
||
|
|
||
|
int16_t touchScreenCalTlx;
|
||
|
int16_t touchScreenCalTly;
|
||
|
int16_t touchScreenCalBrx;
|
||
|
int16_t touchScreenCalBry;
|
||
|
int16_t touchScreenCalTrx;
|
||
|
int16_t touchScreenCalTry;
|
||
|
|
||
|
g_hooks.getTouchScreenCalibrationParams(
|
||
|
touchScreenCalTlx, touchScreenCalTly,
|
||
|
touchScreenCalBrx, touchScreenCalBry,
|
||
|
touchScreenCalTrx, touchScreenCalTry
|
||
|
);
|
||
|
|
||
|
success = touch::calibrateTransform(
|
||
|
touchScreenCalTlx, touchScreenCalTly,
|
||
|
touchScreenCalBrx, touchScreenCalBry,
|
||
|
touchScreenCalTrx, touchScreenCalTry,
|
||
|
CONF_GUI_TOUCH_CALIBRATION_M, display::getDisplayWidth(), display::getDisplayHeight());
|
||
|
return success;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void startCalibration() {
|
||
|
touch::resetTransformCalibration();
|
||
|
g_currentPoint = 0;
|
||
|
g_pointStartTime = millis();
|
||
|
}
|
||
|
|
||
|
void enterTouchCalibration(AppContext *appContext) {
|
||
|
g_appContext = appContext;
|
||
|
g_hooks.onEnterTouchCalibration();
|
||
|
startCalibration();
|
||
|
}
|
||
|
|
||
|
void touchCalibrationDialogYes() {
|
||
|
g_hooks.setTouchScreenCalibrationParams(g_points[0].x, g_points[0].y, g_points[1].x, g_points[1].y, g_points[2].x, g_points[2].y);
|
||
|
g_hooks.onTouchCalibrationOk();
|
||
|
}
|
||
|
|
||
|
void touchCalibrationDialogNo() {
|
||
|
startCalibration();
|
||
|
}
|
||
|
|
||
|
void touchCalibrationDialogCancel() {
|
||
|
g_hooks.onTouchCalibrationCancel();
|
||
|
}
|
||
|
|
||
|
void selectTouchCalibrationPoint(Event &touchEvent) {
|
||
|
g_points[g_currentPoint].x = touchEvent.x;
|
||
|
g_points[g_currentPoint].y = touchEvent.y;
|
||
|
|
||
|
g_currentPoint++;
|
||
|
g_pointStartTime = millis();
|
||
|
|
||
|
if (g_currentPoint == 3) {
|
||
|
g_currentPoint = 0;
|
||
|
|
||
|
bool success = touch::calibrateTransform(
|
||
|
g_points[0].x, g_points[0].y, g_points[1].x, g_points[1].y, g_points[2].x,
|
||
|
g_points[2].y, CONF_GUI_TOUCH_CALIBRATION_M, display::getDisplayWidth(), display::getDisplayHeight());
|
||
|
|
||
|
if (success) {
|
||
|
g_hooks.onTouchCalibrationConfirm();
|
||
|
} else {
|
||
|
startCalibration();
|
||
|
g_appContext->errorMessage("Received data is invalid due to\nimprecise pointing or\ncommunication problem!", true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool isTouchPointActivated() {
|
||
|
return millis() - g_pointStartTime > TOUCH_POINT_ACTIVATION_THRESHOLD;
|
||
|
}
|
||
|
|
||
|
void findActiveWidget() {
|
||
|
if (g_activeWidget) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#if OPTION_TOUCH_CALIBRATION
|
||
|
const WidgetCursor& widgetCursor = g_widgetCursor;
|
||
|
if (widgetCursor.appContext->getActivePageId() == PAGE_ID_TOUCH_CALIBRATION) {
|
||
|
if (widgetCursor.widget->type == WIDGET_TYPE_TEXT) {
|
||
|
g_activeWidget = widgetCursor;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void onTouchCalibrationPageTouch(const WidgetCursor &foundWidget, Event &touchEvent) {
|
||
|
if (touchEvent.type == EVENT_TYPE_TOUCH_DOWN) {
|
||
|
g_pointStartTime = millis();
|
||
|
} else if (touchEvent.type == EVENT_TYPE_TOUCH_MOVE) {
|
||
|
if (!g_activeWidget && isTouchPointActivated()) {
|
||
|
forEachWidget(findActiveWidget);
|
||
|
}
|
||
|
} else if (touchEvent.type == EVENT_TYPE_TOUCH_UP) {
|
||
|
if (isTouchPointActivated()) {
|
||
|
g_activeWidget = 0;
|
||
|
selectTouchCalibrationPoint(touchEvent);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void data_touch_calibration_point(DataOperationEnum operation, const WidgetCursor& widgetCursor, Value &value) {
|
||
|
if (operation == DATA_OPERATION_GET) {
|
||
|
value = Value(g_currentPoint);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} // namespace gui
|
||
|
} // namespace eez
|
||
|
|
||
|
#endif
|