Ajout prise en charge ESP-Display

This commit is contained in:
Serge NOEL
2025-12-01 13:53:54 +01:00
parent bcd88909b7
commit ae375b8fe2
26 changed files with 3945 additions and 1017 deletions

188
include/TouchscreenUI.h Normal file
View File

@@ -0,0 +1,188 @@
/**
* @file TouchscreenUI.h
* @brief Touchscreen user interface for locomotive test bench
*
* Provides a graphical interface on the ILI9341 TFT display with touch controls for:
* - Power ON/OFF button
* - DCC/Analog mode switching
* - Speed slider (0-100%)
* - 2-rail/3-rail configuration selector
* - Direction control
* - Status display
*
* @author Locomotive Test Bench Project
* @date 2025
*/
#ifndef TOUCHSCREEN_UI_H
#define TOUCHSCREEN_UI_H
#include <Arduino.h>
#include <TFT_eSPI.h>
#include <XPT2046_Touchscreen.h>
#include "Config.h"
#include "MotorController.h"
#include "DCCGenerator.h"
#include "RelayController.h"
// Touch calibration values for ESP32-2432S028R
#define TS_MIN_X 200
#define TS_MAX_X 3700
#define TS_MIN_Y 200
#define TS_MAX_Y 3750
// UI Colors
#define COLOR_BG 0x0000 // Black
#define COLOR_PANEL 0x2945 // Dark gray
#define COLOR_TEXT 0xFFFF // White
#define COLOR_POWER_ON 0x07E0 // Green
#define COLOR_POWER_OFF 0xF800 // Red
#define COLOR_DCC 0x07FF // Cyan
#define COLOR_ANALOG 0xFFE0 // Yellow
#define COLOR_SLIDER 0x435C // Gray
#define COLOR_SLIDER_ACTIVE 0x07E0 // Green
#define COLOR_BUTTON 0x4A49 // Button gray
#define COLOR_BUTTON_ACTIVE 0x2124 // Darker gray
#define COLOR_FUNCTION_OFF 0x31A6 // Dark blue-gray
#define COLOR_FUNCTION_ON 0xFD20 // Orange
/**
* @struct Button
* @brief Simple button structure for touch areas
*/
struct Button {
int16_t x, y, w, h;
String label;
uint16_t color;
bool visible;
};
/**
* @class TouchscreenUI
* @brief Manages touchscreen display and user interactions
*
* Provides complete UI for controlling the locomotive test bench,
* handling touch events, updating displays, and coordinating with
* motor controller, DCC generator, and relay controller.
*/
class TouchscreenUI {
public:
/**
* @brief Constructor
* @param cfg Pointer to configuration object
* @param motor Pointer to motor controller
* @param dcc Pointer to DCC generator
* @param relay Pointer to relay controller
*/
TouchscreenUI(Config* cfg, MotorController* motor, DCCGenerator* dcc, RelayController* relay);
/**
* @brief Initialize touchscreen and display
*
* Sets up TFT display, touch controller, and draws initial UI.
*/
void begin();
/**
* @brief Update UI and handle touch events
*
* Must be called regularly from main loop.
* Handles touch detection, UI updates, and state changes.
*/
void update();
/**
* @brief Force full screen redraw
*/
void redraw();
/**
* @brief Get power state
* @return true if power is ON
*/
bool isPowerOn() { return powerOn; }
private:
TFT_eSPI tft;
XPT2046_Touchscreen touch;
Config* config;
MotorController* motorController;
DCCGenerator* dccGenerator;
RelayController* relayController;
bool powerOn;
uint8_t lastSpeed;
bool lastDirection;
bool lastIsDCC;
bool lastIs3Rail;
uint32_t lastDccFunctions;
// Programming screen state
bool programmingMode;
uint16_t cvNumber;
uint8_t cvValue;
uint16_t newAddress;
uint8_t keypadMode; // 0=address, 1=CV number, 2=CV value
// UI element positions
Button btnPower;
Button btnMode;
Button btnRails;
Button btnDirection;
Button btnDccAddress;
// DCC function buttons (F0-F12)
#define NUM_FUNCTIONS 13
Button btnFunctions[NUM_FUNCTIONS];
// Programming mode buttons
Button btnProgramming;
Button btnProgBack;
Button btnFactoryReset;
Button btnSetAddress;
Button btnReadCV;
Button btnWriteCV;
// Numeric keypad (0-9, backspace, enter)
#define NUM_KEYPAD_BUTTONS 12
Button btnKeypad[NUM_KEYPAD_BUTTONS];
// Slider position and state
int16_t sliderX, sliderY, sliderW, sliderH;
int16_t sliderKnobX;
bool sliderPressed;
// Private methods
void drawUI();
void drawPowerButton();
void drawModeButton();
void drawRailsButton();
void drawDirectionButton();
void drawSpeedSlider();
void drawStatusBar();
void drawDccFunctions();
void drawDccAddressButton();
void drawProgrammingScreen();
void drawNumericKeypad();
void drawProgrammingStatus();
void handleTouch(int16_t x, int16_t y);
void updatePowerState(bool state);
void updateMode(bool isDCC);
void updateRailMode(bool is3Rail);
void updateDirection();
void updateSpeed(uint8_t newSpeed);
void toggleDccFunction(uint8_t function);
void enterProgrammingMode();
void exitProgrammingMode();
void handleKeypadPress(uint8_t key);
void performFactoryReset();
void performSetAddress();
void performReadCV();
void performWriteCV();
int16_t mapTouch(int16_t value, int16_t inMin, int16_t inMax, int16_t outMin, int16_t outMax);
};
#endif // TOUCHSCREEN_UI_H