This commit is contained in:
fvanroie 2025-03-17 19:59:15 +01:00
commit 4c04b93ea0
36 changed files with 15175 additions and 121 deletions

View File

@ -14,8 +14,8 @@ on:
jobs: jobs:
build_esp32: build_esp32:
#runs-on: ubuntu-latest runs-on: ubuntu-latest
runs-on: ubuntu-24.04 #runs-on: ubuntu-24.04
strategy: strategy:
fail-fast: false fail-fast: false

162
data/ru_RU.json Normal file
View File

@ -0,0 +1,162 @@
{
"en": {
"language": "Русский",
"home": {
"title": "Главное меню",
"btn": "Главное меню",
"nav": "Домой"
},
"save": "Сохранить настройки",
"user": "Имя пользователя",
"pass": "Пароль",
"hasp": {
"title": "Оформление",
"btn": "Настройка оформления",
"theme": "Тема интерфейса",
"color1": "Основной цвет",
"color2": "Вторичный цвет",
"pages": "Начальный макет",
"font": "Шрифт по умолчанию",
"startpage": "Стартовая страница",
"startdim": "Ярокость при запуске"
},
"screenshot": {
"title": "Скриншот",
"btn": "Скриншот",
"nav": "Скиншот",
"prev": "Предыдущая страница",
"next": "Следующая страница",
"refresh": "Обновить"
},
"info": {
"title": "Информация",
"btn": "Информация",
"nav": "Информация"
},
"config": {
"title": "Настройки",
"btn": "Настройки",
"nav": "Настройки"
},
"ota": {
"title": "Обновление прошивки",
"btn": "Обновление прошивки",
"nav": "Прошивка",
"submit": "Обновление прошивки",
"file": "Файл прошивки",
"url": "URL прошивки",
"redirect": "Разрешить редиректы",
"never": "Никогда",
"strict": "Строго",
"always": "Всегда"
},
"editor": {
"title": "Редактор файлов",
"btn": "Редактор файлов",
"nav": "Редактор файлов"
},
"reset": {
"title": "Сброс на заводские настройки",
"btn": "Сброс на заводские настройки",
"warning": "Предупреждение",
"message": "Этот процесс вернет все настройки к значениям по умолчанию. Внутренняя флэш-память будет очищена и устройство перезапустится. Возможно, вам придется подключиться к точке доступа Wi-Fi, отображаемой на панели, чтобы перенастроить устройство перед повторным доступом к нему.",
"fileloss": "ВСЕ ФАЙЛЫ БУДУТ ПОТЕРЯНЫ!"
},
"reboot": {
"title": "Перезагрузка...",
"btn": "Перезагрузка",
"nav": "Перезагрузка",
"message": "Устройство перезагружается."
},
"about": {
"credits": "Based on the previous work of the following open source developers:",
"copyright": "Copyright ",
"rights": "All rights reserved.",
"clause1": "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
"clause2": "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
"clause3": "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
"mit": "Лицензия MIT",
"bsd": "Лицезия BSD",
"freebsd": "Лицензия FreeBSD",
"apache2": "Лицензия Apache2"
},
"wifi": {
"title": "Настройка WiFi",
"btn": "Настройка WiFi",
"ssid": "SSID"
},
"wg": {
"title": "Настройки WireGuard",
"btn": "Настройки WireGuard",
"vpnip": "VPN IP",
"privkey": "Private Key",
"host": "Remote IP",
"port": "Remote Port",
"pubkey": "Remote Public Key"
},
"mqtt": {
"title": "Настройки MQTT",
"btn": "Настройки MQTT",
"name": "Имя хоста",
"group": "Имя группы",
"host": "Брокер",
"port": "Порт",
"node_t": "Node Topic",
"group_t": "Group Topic",
"broadcast_t": "Broadcast Topic",
"hass_t": "HA LWT Topic"
},
"http": {
"title": "Настройки HTTP",
"btn": "Настройки HTTP"
},
"ftp": {
"title": "Настройки FTP",
"btn": "Настройкаи FTP",
"port": "FTP порт",
"pasv": "Пароль"
},
"gui": {
"title": "Настройки экрана",
"btn": "Настройки экрана",
"antiburn": "Прдеотвращение выгорания",
"calibrate": "Калибровка"
},
"gpio": "Настройки GPIO",
"debug": {
"title": "Настройки отладки",
"btn": "Настройки отладки",
"baud": "Baudrate",
"tele": "Tele период",
"ansi": "Использовать кодировку ANSI",
"host": "Сервер Syslog",
"port": "Порт Syslog",
"ietf": "IETF (RFC 5424)",
"bsd": "BSD (RFC 3164)",
"log": "Объект"
},
"time": {
"title": "Настройки времени",
"btn": "Настройки времени",
"region": "Регион",
"zone": "Часовой пояс",
"tz": "Часовой пояс",
"ntp": "Сервер NTP"
},
"region": {
"etc": "Прочие ",
"continents": "Континент ",
"af": "Африка ",
"as": "Азия ",
"au": "Австралия ",
"aq": "Антарктика ",
"eu": "Европа ",
"na": "Северная Америка ",
"sa": "Южна Америка ",
"islands": "Острова ",
"at": "Атлантический океан ",
"in": "Индийский океан ",
"pa": "Тихий океан "
}
}
}

24
lib/cst816t/LICENSE Normal file
View File

@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>

145
lib/cst816t/README.md Normal file
View File

@ -0,0 +1,145 @@
# cst816t capacitive touch ic
[![cst816t touch screen](extras/P169H002-CTP-small.jpg)](https://github.com/koendv/cst816t/raw/master/extras/P169H002-CTP.jpg)
This is an Arduino library for the cst816t capacitive touch ic. The cst816t capacitive touch ic is able to decode clicks, double clicks, swipes and long press in hardware. Tested on stm32duino.
The cst816t runs on voltages from 1.8V to 3.3V. Do not connect the cst816t to 5V arduinos such as Arduino UNO. Connecting the cst816t to 5V will probably damage the device.
Hardware requirements:
- power supply 2.8V to 3.6V
- power supply ripple <= 50mv;
- logic level 1.8V to 3.3V
- i2c rate 10Khz to 400Khz
## Use
Code for the cst816t consists of a setup, done once, and a loop, done repeatedly.
## Setup
The cst816t touch sensor needs an I2C bus, a reset pin and a interrupt pin:
```
#include <Wire.h>
#include "cst816t.h"
TwoWire Wire2(TP_SDA, TP_SCL);
cst816t touchpad(Wire2, TP_RST, TP_IRQ);
```
The ic can run in four modes: touch, change, fast, motion.
### mode touch
```
void setup() {
touchpad.begin(mode_touch);
}
```
In mode _touch_, if a finger touches the display the ic sends an interrupt every 10ms. After receiving the interrupt, you can read updated touch coordinates and finger count. All processing is done on the mcu.
### mode change
```
void setup() {
touchpad.begin(mode_change);
}
```
In mode _change_ the ic sends an interrupt when the finger changes position. Compared to mode touch, the number of interrupts is more moderate.
### mode fast
```
void setup() {
touchpad.begin(mode_fast);
}
```
In mode _fast_ the ic sends an interrupt when the finger has completed one of the following movements: single click, swipe up, swipe down, swipe left, swipe right.
Touch response is fast because there is no need to wait to distinguish between single click, double click and long press.
### mode motion
```
void setup() {
touchpad.begin(mode_motion);
}
```
In mode _motion_ the ic sends an interrupt when the finger has completed the following movements: single click, **double click**, swipe up, swipe down, swipe left, swipe right, **long press**. All processing is done in the cst816 touch ic. The processing in the mcu is minimal.
## Loop
Test repeatedly if there is an update from the touch panel. If there is an update from the touch panel, read gesture, (x, y) coordinates, and number of fingers touching the display.
```
void loop() {
if (touchpad.available()) {
switch (touchpad.gesture_id) {
case GESTURE_NONE:
Serial.print("NONE");
break;
case GESTURE_SWIPE_DOWN:
Serial.print("SWIPE DOWN");
break;
case GESTURE_SWIPE_UP:
Serial.print("SWIPE UP");
break;
case GESTURE_SWIPE_LEFT:
Serial.print("SWIPE LEFT");
break;
case GESTURE_SWIPE_RIGHT:
Serial.print("SWIPE RIGHT");
break;
case GESTURE_SINGLE_CLICK:
Serial.print("SINGLE CLICK");
break;
case GESTURE_DOUBLE_CLICK:
Serial.print("DOUBLE CLICK");
break;
case GESTURE_LONG_PRESS:
Serial.print("LONG PRESS");
break;
default:
Serial.print("UNKNOWN ");
break;
}
Serial.print("at (");
Serial.print(touchpad.x);
Serial.print(", ");
Serial.print(touchpad.y);
Serial.print(") fingers: ");
Serial.println(touchpad.finger_num);
}
}
```
## Examples
The library comes with three example Arduino sketches: touchme, smartwatch, and lvgl. To compile the examples, use [stm32duino](https://github.com/stm32duino/Arduino_Core_STM32/wiki).
### touchme
A simple sketch that uses the CST816T touch sensor. When the display is touched, the (x, y) coordinates and the action - click or swipe - are printed on the serial port.
### smartwatch
A small Arduino sketch for the [P169H002-CTP](https://www.google.com/search?q=P169H002-CTP) smartwatch display. The P169H002-CTP is a 1.69 inch 240x280 lcd display with an ST7789 lcd driver and a CST816T touch sensor. The sketch prints a text - "click" or "swipe" - on the spot where the display is touched.
### lvgl
[LVGL](http://www.lvgl.io) (Light and Versatile Graphics Library) is a graphics library for embedded systems. An Arduino sketch is given which draws a button on a P169H002-CTP display.
This lvgl example uses the Adafruit GFX library. For improved speed, you may wish to check if there is a library that is more optimized for the processor you use.
## Links
Arduino libraries for ST7789 tft driver:
- [Adafruit ST7789](https://github.com/adafruit/Adafruit-ST7735-Library/)
- [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI)
- [ST7789-STM32](https://github.com/Floyd-Fish/ST7789-STM32)
- [ST7789-STM32-uGUI](https://github.com/deividAlfa/ST7789-STM32-uGUI)
[Schematic](extras/Schematic_drawing_2023-06-21.pdf
) for the P169H002-CTP display. VCC = 3.3V. The ambient light sensor is used to set display intensity.
The P169H002-CTP display is available from [Aliexpress](https://www.aliexpress.com/item/1005005238299349.html).

View File

@ -0,0 +1,128 @@
/* lvgl demo on P169H002-CTP display */
#include <SPI.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <Wire.h>
#include "cst816t.h" // capacitive touch
/* Note: in lv_conf.h: set lv_tick to Arduino millis() */
#include <lvgl.h>
// display
#define TFT_X 240
#define TFT_Y 280
#define TFT_CS PB1
#define TFT_RST PA4
#define TFT_DC PB0
#define TFT_MOSI PB15
#define TFT_SCLK PB13
#define TFT_LED PA8
// touch
#define TP_SDA PB11
#define TP_SCL PB10
#define TP_RST PA15
#define TP_IRQ PB3
TwoWire Wire2(TP_SDA, TP_SCL);
cst816t touchpad(Wire2, TP_RST, TP_IRQ);
SPIClass SPI_1(PB15, PB14, PB13);
Adafruit_ST7789 tft = Adafruit_ST7789(&SPI_1, TFT_CS, TFT_DC, TFT_RST);
static lv_disp_draw_buf_t disp_buf;
static lv_color_t buf_1[TFT_X * 10];
static lv_color_t buf_2[TFT_X * 10];
static lv_disp_drv_t disp_drv;
static lv_indev_drv_t indev_drv;
/* lvgl display output */
/* Using Adafruit display driver. Depending upon architecture, other drivers may be faster. */
void disp_flush_cb(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) {
uint32_t w = 1 + area->x2 - area->x1;
uint32_t h = 1 + area->y2 - area->y1;
uint32_t len = w * h;
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.writePixels(&color_p->full, len);
tft.endWrite();
lv_disp_flush_ready(disp_drv);
}
/* lvgl touchpad input */
void touchpad_input_read(lv_indev_drv_t* drv, lv_indev_data_t* data) {
static uint32_t tp_x = 0;
static uint32_t tp_y = 0;
static uint32_t tp_fingers = 0;
if (touchpad.available()) {
tp_x = touchpad.x;
tp_y = touchpad.y;
tp_fingers = touchpad.finger_num;
}
data->point.x = tp_x;
data->point.y = tp_y;
if (tp_fingers != 0) data->state = LV_INDEV_STATE_PRESSED;
else data->state = LV_INDEV_STATE_RELEASED;
}
/* lvgl button callback */
void btn_event_cb(lv_event_t* e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t* btn = lv_event_get_target(e);
if (code == LV_EVENT_CLICKED) {
static uint8_t cnt = 0;
cnt++;
/*Get the first child of the button which is the label and change its text*/
lv_obj_t* label = lv_obj_get_child(btn, 0);
lv_label_set_text_fmt(label, "Button %d", cnt);
}
}
void setup() {
Serial.begin(9600);
Serial.println("boot");
analogWriteResolution(8);
analogWrite(TFT_LED, 127); // display backlight at 50%
tft.init(240, 280); // Init ST7789 280x240
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setRotation(2);
touchpad.begin(mode_change);
/* display */
lv_init();
lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, TFT_X * 10);
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &disp_buf;
disp_drv.flush_cb = disp_flush_cb;
disp_drv.hor_res = TFT_X;
disp_drv.ver_res = TFT_Y;
lv_disp_t* disp;
disp = lv_disp_drv_register(&disp_drv);
/* touchpad */
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touchpad_input_read;
lv_indev_t* my_indev = lv_indev_drv_register(&indev_drv);
/* button */
lv_obj_t* btn = lv_btn_create(lv_scr_act());
lv_obj_center(btn);
lv_obj_set_size(btn, 120, 50);
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t* label = lv_label_create(btn);
lv_label_set_text(label, "Button");
lv_obj_center(label);
}
void loop() {
lv_timer_handler();
}

View File

@ -0,0 +1,87 @@
/*
demo of P168H002-CTP display.
*/
#include <SPI.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <Wire.h>
#include "cst816t.h" // capacitive touch
// display
#define TFT_X 240
#define TFT_Y 280
#define TFT_CS PB1
#define TFT_RST PA4
#define TFT_DC PB0
#define TFT_MOSI PB15
#define TFT_SCLK PB13
#define TFT_LED PA8
// touch
#define TP_SDA PB11
#define TP_SCL PB10
#define TP_RST PA15
#define TP_IRQ PB3
TwoWire Wire2(TP_SDA, TP_SCL);
cst816t touchpad(Wire2, TP_RST, TP_IRQ);
SPIClass SPI_1(PB15, PB14, PB13);
Adafruit_ST7789 tft = Adafruit_ST7789(&SPI_1, TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(9600);
Serial.println("boot");
analogWriteResolution(8);
analogWrite(TFT_LED, 127); // display backlight at 50%
tft.init(240, 280); // Init ST7789 280x240
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(0);
tft.setRotation(2);
touchpad.begin(mode_motion);
tft.setCursor(TFT_X / 2, TFT_Y / 2);
tft.println(touchpad.version());
}
void loop() {
if (touchpad.available()) {
tft.setCursor(touchpad.x, touchpad.y);
tft.fillScreen(ST77XX_BLACK);
switch (touchpad.gesture_id) {
case GESTURE_NONE:
tft.print("NONE");
break;
case GESTURE_SWIPE_DOWN:
tft.print("SWIPE DOWN");
break;
case GESTURE_SWIPE_UP:
tft.print("SWIPE UP");
break;
case GESTURE_SWIPE_LEFT:
tft.print("SWIPE LEFT");
break;
case GESTURE_SWIPE_RIGHT:
tft.print("SWIPE RIGHT");
break;
case GESTURE_SINGLE_CLICK:
tft.print("SINGLE CLICK");
break;
case GESTURE_DOUBLE_CLICK:
tft.print("DOUBLE CLICK");
break;
case GESTURE_LONG_PRESS:
tft.print("LONG PRESS");
break;
default:
tft.print("?");
break;
}
}
}

View File

@ -0,0 +1,23 @@
/* demo for the CST816T capacitive touch ic */
#include <Wire.h>
#include "cst816t.h"
#define TP_SDA PB11
#define TP_SCL PB10
#define TP_RST PA15
#define TP_IRQ PB3
TwoWire Wire2(TP_SDA, TP_SCL);
cst816t touchpad(Wire2, TP_RST, TP_IRQ);
void setup() {
// decode everything: single click, double click, long press, swipe up, swipe down, swipe left, swipe right
touchpad.begin(mode_motion);
Serial.println(touchpad.version());
}
void loop() {
if (touchpad.available())
Serial.println(touchpad.state());
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,11 @@
name=cst816t
version=1.5.1
author=koendv
maintainer=koendv
sentence=cst816t capacitive touch screen
paragraph=An Arduino library for the cst816t capacitive touch screen IC
category=Other
url=https://github.com/koendv/cst816t
architectures=*
includes=cst816t.h

203
lib/cst816t/src/cst816t.cpp Normal file
View File

@ -0,0 +1,203 @@
/* CST816T capacitive touch-screen driver.
Koen De Vleeschauwer, 2023
Literature:
DS-CST816T-V2.2.pdf datasheet
AN-CST816T-v1.pdf register description
CST78XX-V1.0.pdf firmware upgrade how-to
*/
#include "cst816t.h"
#include <stdint.h>
#define CST816T_ADDRESS 0x15
#define REG_GESTURE_ID 0x01
#define REG_FINGER_NUM 0x02
#define REG_XPOS_H 0x03
#define REG_XPOS_L 0x04
#define REG_YPOS_H 0x05
#define REG_YPOS_L 0x06
#define REG_CHIP_ID 0xA7
#define REG_PROJ_ID 0xA8
#define REG_FW_VERSION 0xA9
#define REG_FACTORY_ID 0xAA
#define REG_SLEEP_MODE 0xE5
#define REG_IRQ_CTL 0xFA
#define REG_LONG_PRESS_TICK 0xEB
#define REG_MOTION_MASK 0xEC
#define REG_DIS_AUTOSLEEP 0xFE
#define MOTION_MASK_CONTINUOUS_LEFT_RIGHT 0b100
#define MOTION_MASK_CONTINUOUS_UP_DOWN 0b010
#define MOTION_MASK_DOUBLE_CLICK 0b001
#define IRQ_EN_TOUCH 0x40
#define IRQ_EN_CHANGE 0x20
#define IRQ_EN_MOTION 0x10
#define IRQ_EN_LONGPRESS 0x01
static bool tp_event = false;
static void tp_isr() {
tp_event = true;
}
cst816t::cst816t(TwoWire &_wire, int8_t _rst, int8_t _irq)
: wire(_wire) {
rst = _rst;
irq = _irq;
chip_id = 0;
firmware_version = 0;
tp_event = false;
gesture_id = 0;
finger_num = 0;
x = 0;
y = 0;
}
bool cst816t::begin(touchpad_mode tp_mode) {
uint8_t dta[4];
pinMode(irq, INPUT);
if (rst >= 0) {
pinMode(rst, OUTPUT);
digitalWrite(rst, HIGH);
delay(100);
digitalWrite(rst, LOW);
delay(10);
digitalWrite(rst, HIGH);
delay(100);
}
wire.begin();
if (i2c_read(CST816T_ADDRESS, REG_CHIP_ID, dta, sizeof(dta))) {
Serial.println("i2c error");
return false; // Sikertelen inicializálás
}
chip_id = dta[0];
firmware_version = dta[3];
uint8_t irq_en = 0x0;
uint8_t motion_mask = 0x0;
switch (tp_mode) {
case mode_touch:
irq_en = IRQ_EN_TOUCH;
break;
case mode_change:
irq_en = IRQ_EN_CHANGE;
break;
case mode_fast:
irq_en = IRQ_EN_MOTION;
break;
case mode_motion:
irq_en = IRQ_EN_MOTION | IRQ_EN_LONGPRESS;
motion_mask = MOTION_MASK_DOUBLE_CLICK;
break;
default:
return false; // Érvénytelen mód esetén sikertelen inicializálás
}
if (i2c_write(CST816T_ADDRESS, REG_IRQ_CTL, &irq_en, 1) ||
i2c_write(CST816T_ADDRESS, REG_MOTION_MASK, &motion_mask, 1)) {
Serial.println("i2c write error");
return false;
}
attachInterrupt(digitalPinToInterrupt(irq), tp_isr, FALLING);
// Disable auto sleep
uint8_t dis_auto_sleep = 0xFF;
if (i2c_write(CST816T_ADDRESS, REG_DIS_AUTOSLEEP, &dis_auto_sleep, 1)) {
Serial.println("Failed to disable auto sleep");
return false;
}
return true; // Sikeres inicializálás
}
bool cst816t::available() {
uint8_t dta[6];
if (tp_event && !i2c_read(CST816T_ADDRESS, REG_GESTURE_ID, dta, sizeof(dta))) {
tp_event = false;
gesture_id = dta[0];
finger_num = dta[1];
x = (((uint16_t)dta[2] & 0x0f) << 8) | (uint16_t)dta[3];
y = (((uint16_t)dta[4] & 0x0f) << 8) | (uint16_t)dta[5];
return true;
}
return false;
}
uint8_t cst816t::i2c_read(uint16_t addr, uint8_t reg_addr, uint8_t *reg_data, uint32_t length) {
wire.beginTransmission(addr);
wire.write(reg_addr);
if (wire.endTransmission(true)) return -1;
wire.requestFrom((uint8_t)addr, (size_t)length, (bool)true);
for (int i = 0; i < length; i++) {
*reg_data++ = wire.read();
}
return 0;
}
uint8_t cst816t::i2c_write(uint8_t addr, uint8_t reg_addr, const uint8_t *reg_data, uint32_t length) {
wire.beginTransmission(addr);
wire.write(reg_addr);
for (int i = 0; i < length; i++) {
wire.write(*reg_data++);
}
if (wire.endTransmission(true)) return -1;
return 0;
}
String cst816t::version() {
String tp_version;
switch (chip_id) {
case CHIPID_CST716: tp_version = "CST716"; break;
case CHIPID_CST816S: tp_version = "CST816S"; break;
case CHIPID_CST816T: tp_version = "CST816T"; break;
case CHIPID_CST816D: tp_version = "CST816D"; break;
default:
tp_version = "? 0x" + String(chip_id, HEX);
break;
}
tp_version += " firmware " + String(firmware_version);
return tp_version;
}
String cst816t::state() {
String s;
switch (gesture_id) {
case GESTURE_NONE:
s = "NONE";
break;
case GESTURE_SWIPE_DOWN:
s = "SWIPE DOWN";
break;
case GESTURE_SWIPE_UP:
s = "SWIPE UP";
break;
case GESTURE_SWIPE_LEFT:
s = "SWIPE LEFT";
break;
case GESTURE_SWIPE_RIGHT:
s = "SWIPE RIGHT";
break;
case GESTURE_SINGLE_CLICK:
s = "SINGLE CLICK";
break;
case GESTURE_DOUBLE_CLICK:
s = "DOUBLE CLICK";
break;
case GESTURE_LONG_PRESS:
s = "LONG PRESS";
break;
default:
s = "UNKNOWN 0x";
s += String(gesture_id, HEX);
break;
}
s += '\t' + String(x) + '\t' + String(y);
return s;
}

56
lib/cst816t/src/cst816t.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef _CST816T_H_
#define _CST816T_H_
#include <Arduino.h>
#include <Wire.h>
#include <stdint.h>
#define CHIPID_CST716 0x20
#define CHIPID_CST816S 0xB4
#define CHIPID_CST816T 0xB5
#define CHIPID_CST816D 0xB6
#define GESTURE_NONE 0x00
#define GESTURE_SWIPE_UP 0x01
#define GESTURE_SWIPE_DOWN 0x02
#define GESTURE_SWIPE_LEFT 0x03
#define GESTURE_SWIPE_RIGHT 0x04
#define GESTURE_SINGLE_CLICK 0x05
#define GESTURE_DOUBLE_CLICK 0x0B
#define GESTURE_LONG_PRESS 0x0C
enum touchpad_mode {
mode_touch,
mode_change,
mode_fast,
mode_motion
};
class cst816t {
public:
cst816t(TwoWire &_wire, int8_t _rst, int8_t _irq);
/*
mode_touch: interrupt every 10ms when a touch is detected
mode_change: interrupt when a touch change is detected
mode_fast: interrupt when a click or swipe is detected
mode_motion: interrupt when a click, swipe, double click, or long press is detected
*/
bool begin(touchpad_mode tp_mode = mode_change);
bool available();
String version();
String state();
uint8_t chip_id;
uint8_t firmware_version;
uint8_t gesture_id;
uint8_t finger_num;
uint16_t x;
uint16_t y;
private:
TwoWire& wire;
int8_t rst;
int8_t irq;
uint8_t i2c_read(uint16_t addr, uint8_t reg_addr, uint8_t *reg_data, uint32_t length);
uint8_t i2c_write(uint8_t addr, uint8_t reg_addr, const uint8_t *reg_data, uint32_t length);
};
#endif

View File

@ -82,6 +82,8 @@ extra_default_envs =
; yeacreate-nscreen32 ; yeacreate-nscreen32
; wz2432r028 ; wz2432r028
; ws_esp32_s3_touch_lcd_4p3 ; ws_esp32_s3_touch_lcd_4p3
; ttgo-t-display-s3_st7789_16MB
; ttgo-t-display-s3_st7789_touch_16MB
;endregion ;endregion
;region -- Define your local COM ports for each environment --- ;region -- Define your local COM ports for each environment ---

View File

@ -451,6 +451,11 @@ long Esp32Device::get_uptime()
#elif defined(M5STACK) || defined(M5STACKLGFX) #elif defined(M5STACK) || defined(M5STACKLGFX)
#warning Building for M5Stack core2 #warning Building for M5Stack core2
#include "dev/esp32/m5stackcore2.h" #include "dev/esp32/m5stackcore2.h"
#elif defined(TWATCH)
#warning Building for TTGo T-Watch
#include "dev/esp32/twatch.h"
#else #else
dev::Esp32Device haspDevice; dev::Esp32Device haspDevice;
#endif #endif

View File

@ -86,6 +86,8 @@ class Esp32Device : public BaseDevice {
#elif defined(M5STACK) || defined (M5STACKLGFX) #elif defined(M5STACK) || defined (M5STACKLGFX)
// #warning Building for M5Stack core2 // #warning Building for M5Stack core2
#include "m5stackcore2.h" #include "m5stackcore2.h"
#elif defined(TWATCH)
#include "twatch.h"
#else #else
using dev::Esp32Device; using dev::Esp32Device;
extern dev::Esp32Device haspDevice; extern dev::Esp32Device haspDevice;

39
src/dev/esp32/twatch.cpp Normal file
View File

@ -0,0 +1,39 @@
#include "twatch.h"
#if defined(TWATCH)
#include "Wire.h"
#include "dev/esp32/esp32.h"
/*
* This covers the TWatch 2019 and 2020 PMIC. Only the init function is implemented
* because the TWatch 2020 v1 variant has not just the backlight connected to LDO2,
* but also the power for the display controller. This shouldn't get regulated down
* or be switched off (since the latter would require display being re-inited) so we
* don't let the user switch it off.
*
* This *could* get fixed, by detecting hardware type and changing behaviour, but
* this device isn't particularly common and OpenHASP probably isn't the proper tool
* for this hardware. It's nice to have some support though.
*/
namespace dev {
void TWatch::init(void) {
Wire.begin();
Wire.beginTransmission(53);
Wire.write(0x12);
Wire.write(0b00000110); // Enable LDO2, DC-DC3, disable others
Wire.endTransmission();
// Section set LDO2 to 3.3V
uint8_t ldo_ctrl = ~0;
Wire.beginTransmission(53);
Wire.write(0x28);
Wire.write(ldo_ctrl);
Wire.endTransmission();
}
}
dev::TWatch haspDevice;
#endif

20
src/dev/esp32/twatch.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef HASP_DEVICE_TWATCH
#define HASP_DEVICE_TWATCH
#if defined(TWATCH)
#include "esp32.h"
namespace dev {
class TWatch : public Esp32Device {
public:
void init() override;
};
}
using dev::TWatch;
extern dev::TWatch haspDevice;
#endif
#endif

View File

@ -380,6 +380,32 @@ lgfx::ITouch* _init_touch(Preferences* preferences)
} }
#endif #endif
#if TOUCH_DRIVER == 0x0820
{ // タッチスクリーン制御の設定を行います。(必要なければ削除)
auto touch = new lgfx::Touch_FT5x06();
auto cfg = touch->config();
cfg.x_min = 0; // The minimum X value obtained from the touchscreen (raw value).
cfg.x_max = TFT_WIDTH - 1; // The maximum X value obtained from the touchscreen (raw value).
cfg.y_min = 0; // The minimum Y value obtained from the touchscreen (raw value).
cfg.y_max = TFT_HEIGHT - 1; // The maximum Y value obtained from the touchscreen (raw value).
cfg.bus_shared = true; // If using a common bus with the screen, set it to true.
cfg.offset_rotation = TOUCH_OFFSET_ROTATION; // Adjustment when the display orientation does not match the touch orientation. Set in values from 0 to 7.
// I2C接続の場合
cfg.i2c_port = I2C_TOUCH_PORT; // 使用するI2Cを選択 (0 or 1)
cfg.i2c_addr = I2C_TOUCH_ADDRESS; // I2Cデバイスアドレス番号
cfg.pin_sda = TOUCH_SDA; // SDAが接続されているピン番号
cfg.pin_scl = TOUCH_SCL; // SCLが接続されているピン番号
cfg.pin_int = TOUCH_IRQ; // INTが接続されているピン番号
cfg.freq = I2C_TOUCH_FREQUENCY; // I2Cクロックを設定
touch->config(cfg);
return touch;
}
#endif
#if TOUCH_DRIVER == 0x6336 #if TOUCH_DRIVER == 0x6336
{ {
auto touch = new lgfx::Touch_FT5x06(); auto touch = new lgfx::Touch_FT5x06();

View File

@ -1,110 +1,113 @@
/* MIT License - Copyright (c) 2019-2024 Francis Van Roie /* MIT License - Copyright (c) 2019-2024 Francis Van Roie
For full license information read the LICENSE file in the project folder */ For full license information read the LICENSE file in the project folder */
#ifndef HASP_BASE_TOUCH_DRIVER_H #ifndef HASP_BASE_TOUCH_DRIVER_H
#define HASP_BASE_TOUCH_DRIVER_H #define HASP_BASE_TOUCH_DRIVER_H
#ifdef ARDUINO #ifdef ARDUINO
#include <Arduino.h> #include <Arduino.h>
#endif #endif
#include "hasplib.h" #include "hasplib.h"
#include "lvgl.h" #include "lvgl.h"
namespace dev { namespace dev {
class BaseTouch { class BaseTouch {
public: public:
void init(int w, int h) void init(int w, int h)
{} {}
// void loop() // void loop()
// {} // {}
void show_info() void show_info()
{} {}
void set_rotation(uint8_t rotation) void set_rotation(uint8_t rotation)
{} {}
void set_invert(bool invert_display) void set_invert(bool invert_display)
{} {}
IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data)
{ {
data->state = LV_INDEV_STATE_REL; data->state = LV_INDEV_STATE_REL;
return false; return false;
} }
void calibrate(uint16_t* calData) void calibrate(uint16_t* calData)
{} {}
void set_calibration(uint16_t* calData) void set_calibration(uint16_t* calData)
{} {}
bool is_driver_pin(uint8_t) bool is_driver_pin(uint8_t)
{ {
return false; return false;
} }
const char* get_touch_model() const char* get_touch_model()
{ {
return ""; return "";
} }
}; };
} // namespace dev } // namespace dev
#ifndef TOUCH_DRIVER #ifndef TOUCH_DRIVER
#define TOUCH_DRIVER -1 // No Touch #define TOUCH_DRIVER -1 // No Touch
#endif #endif
#if TOUCH_DRIVER == 0x2046 && defined(USER_SETUP_LOADED) #if TOUCH_DRIVER == 0x2046 && defined(USER_SETUP_LOADED)
#warning Building for TFT_eSPI XPT2046 #warning Building for TFT_eSPI XPT2046
//#include "touch_driver_xpt2046.h" //#include "touch_driver_xpt2046.h"
#include "touch_driver_tftespi.h" #include "touch_driver_tftespi.h"
#elif TOUCH_DRIVER == 0x2046 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) #elif TOUCH_DRIVER == 0x2046 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH)
#warning Building for LovyanGFX XPT2046 #warning Building for LovyanGFX XPT2046
#include "touch_driver_lovyangfx.h" #include "touch_driver_lovyangfx.h"
#elif TOUCH_DRIVER == 0x0911 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) #elif TOUCH_DRIVER == 0x0911 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH)
#warning Building for LovyanGFX GT911 #warning Building for LovyanGFX GT911
#include "touch_driver_lovyangfx.h" #include "touch_driver_lovyangfx.h"
#elif TOUCH_DRIVER == 0x6336 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) #elif TOUCH_DRIVER == 0x6336 && defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH)
#warning Building for LovyanGFX FT6336 #warning Building for LovyanGFX FT6336
#include "touch_driver_lovyangfx.h" #include "touch_driver_lovyangfx.h"
#elif defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH) #elif defined(LGFX_USE_V1) && defined(HASP_USE_LGFX_TOUCH)
#warning Building for LovyanGFX #warning Building for LovyanGFX
#include "touch_driver_lovyangfx.h" #include "touch_driver_lovyangfx.h"
#elif TOUCH_DRIVER == 0x5206 #elif TOUCH_DRIVER == 0x5206
#warning Building for FT5206 #warning Building for FT5206
#include "touch_driver_ft5206.h" #include "touch_driver_ft5206.h"
#elif TOUCH_DRIVER == 0x6336 #elif TOUCH_DRIVER == 0x6336
#warning Building for FT6336 #warning Building for FT6336
#include "touch_driver_ft6336u.h" #include "touch_driver_ft6336u.h"
#elif TOUCH_DRIVER == 0x0610 #elif TOUCH_DRIVER == 0x0610
#warning Building for STMPE610 #warning Building for STMPE610
#include "touch_driver_stmpe610.h" #include "touch_driver_stmpe610.h"
#elif TOUCH_DRIVER == 0x0911 #elif TOUCH_DRIVER == 0x0911
#warning Building for GT911 #warning Building for GT911
#include "touch_driver_gt911.h" #include "touch_driver_gt911.h"
#elif TOUCH_DRIVER == 0x0ADC #elif TOUCH_DRIVER == 0x0ADC
#warning Building for analog touch #warning Building for analog touch
#include "touch_driver_analog.h" #include "touch_driver_analog.h"
#elif TOUCH_DRIVER == 0x1680 #elif TOUCH_DRIVER == 0x1680
#warning Building for GSL1680 #warning Building for GSL1680
#include "touch_driver_gslx680.h" #include "touch_driver_gslx680.h"
#elif TOUCH_DRIVER == 0x2007 #elif TOUCH_DRIVER == 0x2007
#warning Building for TSC2007 #warning Building for TSC2007
#include "touch_driver_tsc2007.h" #include "touch_driver_tsc2007.h"
#elif defined(LGFX_USE_V1) #elif defined(LGFX_USE_V1)
#warning Building for LovyanGfx Touch #warning Building for LovyanGfx Touch
#include "touch_driver_lovyangfx.h" #include "touch_driver_lovyangfx.h"
#elif TOUCH_DRIVER == 0x3240 #elif TOUCH_DRIVER == 0x3240
#warning Building for CST3240 #warning Building for CST3240
#include "touch_driver_cst3240.h" #include "touch_driver_cst3240.h"
#else #elif TOUCH_DRIVER == 0x816
#warning Building for Generic Touch #warning Building for CST816S
using dev::BaseTouch; #include "touch_driver_cst816.h"
extern dev::BaseTouch haspTouch; #else
// IRAM_ATTR bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data) #warning Building for Generic Touch
// { using dev::BaseTouch;
// data->state = LV_INDEV_STATE_REL; extern dev::BaseTouch haspTouch;
// return false; // IRAM_ATTR bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data)
// } // {
#endif // data->state = LV_INDEV_STATE_REL;
// return false;
#endif // }
#endif
// #elif TOUCH_DRIVER == 0x2046B
// touched = XPT2046_getXY(&normal_x, &normal_y, true); #endif
// #elif TOUCH_DRIVER == 0x2046B
// touched = XPT2046_getXY(&normal_x, &normal_y, true);

View File

@ -0,0 +1,70 @@
/* MIT License - Copyright (c) 2019-2024 Francis Van Roie
For full license information read the LICENSE file in the project folder */
#if defined(ARDUINO) && (TOUCH_DRIVER == 0x816)
#include <Arduino.h>
#include "ArduinoLog.h"
#include "hasp_conf.h"
#include "touch_driver_cst816.h"
#include <Wire.h>
#include "cst816t.h"
#include "touch_driver.h" // base class
#include "touch_helper.h" // i2c scanner
#include "../../hasp/hasp.h" // for hasp_sleep_state
extern uint8_t hasp_sleep_state;
cst816t touchpad(Wire, TOUCH_RST, TOUCH_IRQ);
namespace dev {
IRAM_ATTR bool TouchCst816::read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data)
{
if(touchpad.available()) {
if(hasp_sleep_state != HASP_SLEEP_OFF) hasp_update_sleep_state(); // update Idle
//LOG_INFO(TAG_DRVR, "CST816 touched x:%d, y:%d", touchpad.x, touchpad.y);
#ifdef TOUCH_WIDTH
data->point.x = map(touchpad.x, 0, TOUCH_WIDTH - 1, 0, TFT_WIDTH - 1);
#else
data->point.x = touchpad.x;
#endif
#ifdef TOUCH_HEIGHT
data->point.y = map(touchpad.y, 0, TOUCH_HEIGHT - 1, 0, TFT_HEIGHT - 1);
#else
data->point.y = touchpad.y;
#endif
data->state = LV_INDEV_STATE_PR;
hasp_set_sleep_offset(0); // Reset the offset
} else {
data->state = LV_INDEV_STATE_REL;
}
/*Return `false` because we are not buffering and no more data to read*/
return false;
}
void TouchCst816::init(int w, int h)
{
Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY);
if(touchpad.begin(mode_touch) == true) {
LOG_INFO(TAG_DRVR, "CST816 %s (170X320)", D_SERVICE_STARTED);
} else {
LOG_WARNING(TAG_DRVR, "CST816 %s", D_SERVICE_START_FAILED);
}
Wire.begin(TOUCH_SDA, TOUCH_SCL, (uint32_t)I2C_TOUCH_FREQUENCY);
touch_scan(Wire); // The address could change during begin, so scan afterwards
}
} // namespace dev
dev::TouchCst816 haspTouch;
#endif // ARDUINO

View File

@ -0,0 +1,27 @@
/* MIT License - Copyright (c) 2019-2024 Francis Van Roie
For full license information read the LICENSE file in the project folder */
#ifndef HASP_CST816_TOUCH_DRIVER_H
#define HASP_CST816_TOUCH_DRIVER_H
#ifdef ARDUINO
#include "lvgl.h"
#include "touch_driver.h"
namespace dev {
class TouchCst816 : public BaseTouch {
public:
IRAM_ATTR bool read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data);
void init(int w, int h);
};
} // namespace dev
using dev::TouchCst816;
extern dev::TouchCst816 haspTouch;
#endif // ARDUINO
#endif // HASP_CST816_TOUCH_DRIVER_H

View File

@ -29,8 +29,7 @@ bool touch_read(lv_indev_drv_t* indev_driver, lv_indev_data_t* data)
data->state = LV_INDEV_STATE_REL; data->state = LV_INDEV_STATE_REL;
// while touched, but the state is released => read next point // while touched, but the state is released => read next point
while(data->state == LV_INDEV_STATE_REL && stmpe610_touchpanel.touched()) { while(data->state == LV_INDEV_STATE_REL && !stmpe610_touchpanel.bufferEmpty()) {
TS_Point point = stmpe610_touchpanel.getPoint(); TS_Point point = stmpe610_touchpanel.getPoint();
Log.trace(TAG_DRVR, F("STMPE610: x=%i y=%i z=%i"), point.x, point.y, point.z); Log.trace(TAG_DRVR, F("STMPE610: x=%i y=%i z=%i"), point.x, point.y, point.z);

242
src/lang/ru_RU.h Normal file
View File

@ -0,0 +1,242 @@
// This translation file is maintained on https://crowdin.com/project/openhasp/
// Do not edit directly!
#ifndef HASP_LANG_RU_RU_H
#define HASP_LANG_RU_RU_H
#define D_ISO_LANG_CODE "ru-RU"
#define D_USERNAME "Имя пользователя:"
#define D_PASSWORD "Пароль:"
#define D_SSID "Ssid:"
#define D_YES "Да"
#define D_NO "Нет"
#define D_ERROR_OUT_OF_MEMORY "Не хватает памяти"
#define D_ERROR_UNKNOWN "Неизвестная ошибка"
#define D_CONFIG_NOT_CHANGED "Настройки не изменены"
#define D_CONFIG_CHANGED "Настройки изменены"
#define D_CONFIG_LOADED "Настройки загружены"
#define D_FILE_LOADING "Загружается %s"
#define D_FILE_LOADED "Загружено %s"
#define D_FILE_LOAD_FAILED "Ошибка загрузки %s"
#define D_FILE_SAVING "Сохранение %s"
#define D_FILE_SAVED "Сохранено %s"
#define D_FILE_SAVE_FAILED "Ошибка сохранения %s"
#define D_FILE_NOT_FOUND "Файл не найден"
#define D_FILE_SIZE_BYTES "байт"
#define D_FILE_SIZE_KILOBYTES "KiB"
#define D_FILE_SIZE_MEGABYTES "MiB"
#define D_FILE_SIZE_GIGABYTES "GiB"
#define D_FILE_SIZE_TERABYTES "TiB"
#define D_FILE_SIZE_DIVIDER 1024 // kibi or kilo bytes
#define D_DECIMAL_POINT "." // decimal comma or point
#define D_SERVICE_STARTING "Запуск..."
#define D_SERVICE_STARTED "Запущено"
#define D_SERVICE_START_FAILED "Ошибка запуска"
#define D_SERVICE_STOPPED "Остановлено"
#define D_SERVICE_DISABLED "Отключено"
#define D_SERVICE_CONNECTED "Подключен"
#define D_SERVICE_DISCONNECTED "Отключен"
#define D_SETTING_ENABLED "Включено"
#define D_SETTING_DISABLED "Выключено"
#define D_SETTING_DEFAULT "По умолчанию"
#define D_NETWORK_IP_ADDRESS_RECEIVED "Получен IP адрес %s"
#define D_NETWORK_ONLINE "онлайн"
#define D_NETWORK_OFFLINE "оффлайн"
#define D_NETWORK_CONNECTION_FAILED "Ошибка подключения"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Ошибка авторизации"
#define D_MQTT_DEFAULT_NAME "plate_%s"
#define D_MQTT_CONNECTING "Подключение..."
#define D_MQTT_CONNECTED "Подключен к брокеру %s с clientID %s"
#define D_MQTT_NOT_CONNECTED "Не подключен ???"
#define D_MQTT_DISCONNECTING "Отключение..."
#define D_MQTT_DISCONNECTED "Отключен"
#define D_MQTT_RECONNECTING "Отключен от брокера, переподключение..."
#define D_MQTT_NOT_CONFIGURED "Брокер не настроен"
#define D_MQTT_STARTED "Запущен: %d байт"
#define D_MQTT_FAILED "Не удалось:"
#define D_MQTT_INVALID_TOPIC "Сообщение имеет недопустимую тему"
#define D_MQTT_SUBSCRIBED "Подписан на %s"
#define D_MQTT_NOT_SUBSCRIBED "Не удалось подписаться на %s"
#define D_MQTT_HA_AUTO_DISCOVERY "Зарегистрирован в HA auto-discovery"
#define D_MQTT_PAYLOAD_TOO_LONG "Пейлоад слишком длинный(%u байт)"
#define D_TELNET_CLOSING_CONNECTION "Закрытие сессии от %s"
#define D_TELNET_CLIENT_LOGIN_FROM "Клиент авторизовался от %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Клиент подключился от %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Клиент НЕ подключен"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Неверная попытка входа в систему %s"
#define D_TELNET_STARTED "Telnet консоль запущена"
#define D_TELNET_FAILED "Ошибка запуска telnet консоли"
#define D_TELNET_CLIENT_CONNECTED "Клиент подключен"
#define D_TELNET_CLIENT_REJECTED "Клиент отклонен"
#define D_HASP_INVALID_PAGE "Неверная страница %u"
#define D_HASP_INVALID_LAYER "Невозможно очистить системный уровень"
#define D_HASP_CHANGE_PAGE "Изменение страницы на %u"
#define D_HASP_CLEAR_PAGE "Очистка страницы %u"
#define D_OBJECT_DELETED "Объект удален"
#define D_OBJECT_UNKNOWN "Неизвестный объект"
#define D_OBJECT_MISMATCH "Объекты НЕ совпадают!"
#define D_OBJECT_LOST "Потерянный объект!"
#define D_OBJECT_CREATE_FAILED "Ошибка создания объета с id %u"
#define D_OBJECT_PAGE_UNKNOWN "Страница с ID %u не определена"
#define D_OBJECT_EVENT_UNKNOWN "Неизвестное событие %d"
#define D_ATTRIBUTE_UNKNOWN "Неизвестное свойство %s"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
#define D_ATTRIBUTE_OBSOLETE "%s это устарело"
#define D_ATTRIBUTE_INSTEAD ", используйте %s вместо него"
#define D_ATTRIBUTE_READ_ONLY "%s только для чтения"
#define D_ATTRIBUTE_PAGE_METHOD_INVALID "Невозможно вызвать %s на странице"
#define D_ATTRIBUTE_ALIGN_INVALID "Недопустимое свойство выравнивания: %s"
#define D_ATTRIBUTE_COLOR_INVALID "Недопустимое свойство цвета: %s"
#define D_ATTRIBUTE_LONG_MODE_INVALID "Недопустимый режим длины: %s"
#define D_OOBE_SSID_VALIDATED "SSID %s подтвержден"
#define D_OOBE_AUTO_CALIBRATE "Автокалибровка включена"
#define D_OOBE_CALIBRATED "Уже откалиброван"
#define D_DISPATCH_COMMAND_NOT_FOUND "Команда '%s' не найдена"
#define D_DISPATCH_INVALID_PAGE "Неверная страница %s"
#define D_DISPATCH_REBOOT "Перезагружаем устройство!"
#define D_JSON_FAILED "Парсинг JSON не удался:"
#define D_JSONL_FAILED "JSONL ошибка парсинга на строке %u"
#define D_JSONL_SUCCEEDED "Jsonl полностью прочтен"
#define D_OTA_CHECK_UPDATE "Проверяем URL с обновлением: %s"
#define D_OTA_CHECK_COMPLETE "Проверка обновлений завершена"
#define D_OTA_CHECK_FAILED "Ошибка проверки обновлений: %s"
#define D_OTA_UPDATE_FIRMWARE "OTA обновление прошивки"
#define D_OTA_UPDATE_COMPLETE "OTA обновление завершено"
#define D_OTA_UPDATE_APPLY "Установка прошивки и перезагрузка"
#define D_OTA_UPDATE_FAILED "Ошибка OTA обновления"
#define D_OTA_UPDATING_FIRMWARE "Обновление прошивка..."
#define D_OTA_UPDATING_FILESYSTEM "Обновление файловой системы..."
#define D_HTTP_HASP_DESIGN "HASP оформление"
#define D_HTTP_INFORMATION "Информация"
#define D_HTTP_HTTP_SETTINGS "Настройки HTTP"
#define D_HTTP_FTP_SETTINGS "Настройки FTP"
#define D_HTTP_WIFI_SETTINGS "Настройки Wifi"
#define D_HTTP_WIREGUARD_SETTINGS "Настройки WireGuard"
#define D_HTTP_MQTT_SETTINGS "Настройки MQTT"
#define D_HTTP_GPIO_SETTINGS "Настройки GPIO"
#define D_HTTP_MDNS_SETTINGS "Настройки mDNS"
#define D_HTTP_TELNET_SETTINGS "Настройки Telnet"
#define D_HTTP_DEBUG_SETTINGS "Настройки отладки"
#define D_HTTP_GUI_SETTINGS "Настройки дисплея"
#define D_HTTP_SAVE_SETTINGS "Сохранить настройки"
#define D_HTTP_UPLOAD_FILE "Загрузить файл"
#define D_HTTP_ERASE_DEVICE "Сброс всех настроек"
#define D_HTTP_ADD_GPIO "Добавить новый пин"
#define D_HTTP_BACK "Назад"
#define D_HTTP_REFRESH "Обновить"
#define D_HTTP_PREV_PAGE "Предыдущая страница"
#define D_HTTP_NEXT_PAGE "Следующая страница"
#define D_HTTP_CALIBRATE "Калибровка"
#define D_HTTP_ANTIBURN "Запуск Anti Burn-in"
#define D_HTTP_SCREENSHOT "Скриншот"
#define D_HTTP_FILE_BROWSER "Файловый редактор"
#define D_HTTP_FIRMWARE_UPGRADE "Обновление прошивки"
#define D_HTTP_UPDATE_FIRMWARE "Обновление прошивки"
#define D_HTTP_FACTORY_RESET "Сброс на заводские настройки"
#define D_HTTP_MAIN_MENU "Главное меню"
#define D_HTTP_REBOOT "Перезапуск"
#define D_HTTP_CONFIGURATION "Конфигурацияя"
#define D_HTTP_CONFIG_CHANGED \
"Конфигурация изменена, пожалуйста кликните на <a href='/reboot'>Перезагрузка</a> для сохранения изменений в память устройства."
#define D_HTTP_SENDING_PAGE "Отправлена %S страница на %s"
#define D_HTTP_FOOTER "by Francis Van Roie"
#define D_INFO_VERSION "Version"
#define D_INFO_BUILD_DATETIME "Build DateTime"
#define D_INFO_ENVIRONMENT "Environment"
#define D_INFO_UPTIME "Uptime"
#define D_INFO_FREE_HEAP "Free Heap"
#define D_INFO_FREE_BLOCK "Free Block"
#define D_INFO_DEVICE_MEMORY "Device Memory"
#define D_INFO_LVGL_MEMORY "LVGL Memory"
#define D_INFO_TOTAL_MEMORY "Total"
#define D_INFO_FREE_MEMORY "Free"
#define D_INFO_FRAGMENTATION "Fragmentation"
#define D_INFO_PSRAM_FREE "PSRam Free"
#define D_INFO_PSRAM_SIZE "PSRam Size"
#define D_INFO_FLASH_SIZE "Flash Size"
#define D_INFO_SKETCH_USED "Program Size Used"
#define D_INFO_SKETCH_FREE "Program Size Free"
#define D_INFO_FS_SIZE "Filesystem Size"
#define D_INFO_FS_USED "Filesystem Used"
#define D_INFO_FS_FREE "Filesystem Free"
#define D_INFO_MODULE "Module"
#define D_INFO_MODEL "Model"
#define D_INFO_FREQUENCY "Frequency"
#define D_INFO_CORE_VERSION "Core Version"
#define D_INFO_RESET_REASON "Reset Reason"
#define D_INFO_STATUS "Status"
#define D_INFO_SERVER "Server"
#define D_INFO_USERNAME "Username"
#define D_INFO_CLIENTID "Client ID"
// #define D_INFO_CONNECTED "Connected"
// #define D_INFO_DISCONNECTED "Disconnected"
#define D_INFO_RECEIVED "Received"
#define D_INFO_PUBLISHED "Published"
#define D_INFO_FAILED "Failed"
#define D_INFO_ETHERNET "Ethernet"
#define D_INFO_WIFI "Wifi"
#define D_INFO_WIREGUARD "WireGuard"
#define D_INFO_LINK_SPEED "Link Speed"
#define D_INFO_FULL_DUPLEX "Full Duplex"
#define D_INFO_BSSID "BSSID"
#define D_INFO_SSID "SSID"
#define D_INFO_RSSI "Signal Strength"
#define D_INFO_IP_ADDRESS "IP Address"
#define D_INFO_MAC_ADDRESS "MAC Address"
#define D_INFO_GATEWAY "Gateway"
#define D_INFO_DNS_SERVER "DNS Server"
#define D_INFO_ENDPOINT_IP "Endpoint IP"
#define D_INFO_ENDPOINT_PORT "Endpoint Port"
#define D_OOBE_MSG "Тапните по акрану для настройки WiFi или подключитесь к этой Точке Доступа:"
#define D_OOBE_SCAN_TO_CONNECT "Сканируте для подключения"
#define D_WIFI_CONNECTING_TO "Подключение к %s"
#define D_WIFI_CONNECTED_TO "Подключено к %s, запрашиваем IP..."
#define D_WIFI_RSSI_EXCELLENT "Отлично"
#define D_WIFI_RSSI_GOOD "Хорошо"
#define D_WIFI_RSSI_FAIR "Нормально"
#define D_WIFI_RSSI_WEAK "Слабо"
#define D_WIFI_RSSI_BAD "Очень плохо"
#define D_WG_INITIALIZED "Инициализирован"
#define D_WG_BAD_CONFIG "Отсутствует или неверная конфигурация"
#define D_GPIO_SWITCH "Switch"
#define D_GPIO_BUTTON "Push Button"
#define D_GPIO_TOUCH "Capacitive Touch"
#define D_GPIO_LED "Led"
#define D_GPIO_LED_R "Mood Red"
#define D_GPIO_LED_G "Mood Green"
#define D_GPIO_LED_B "Mood Blue"
#define D_GPIO_POWER_RELAY "Power Relay"
#define D_GPIO_LIGHT_RELAY "Light Relay"
#define D_GPIO_PWM "PWM"
#define D_GPIO_DAC "DAC"
#define D_GPIO_SERIAL_DIMMER "Serial Dimmer"
#define D_GPIO_UNKNOWN "Unknown"
#define D_GPIO_PIN "Pin"
#define D_GPIO_GROUP "Group"
#define D_GPIO_GROUP_NONE "None"
#define D_GPIO_STATE_NORMAL "Normal"
#define D_GPIO_STATE_INVERTED "Inverted"
#endif

View File

@ -28,6 +28,7 @@ build_flags =
-D TOUCH_RST=-1 -D TOUCH_RST=-1
-D TOUCH_SDA=23 -D TOUCH_SDA=23
-D TOUCH_SCL=32 -D TOUCH_SCL=32
-D TWATCH=1
;endregion ;endregion
lib_deps = lib_deps =
@ -40,7 +41,7 @@ extends = ttgo-t-watch, flash_16mb
build_flags = build_flags =
${ttgo-t-watch.build_flags} ${ttgo-t-watch.build_flags}
-D HASP_MODEL="TTgo T-Watch 2019" -D HASP_MODEL="TTGo T-Watch 2019"
-D INVERT_COLORS=1 -D INVERT_COLORS=1
[env:ttgo-t-watch-2020] [env:ttgo-t-watch-2020]
@ -48,7 +49,7 @@ extends = ttgo-t-watch, flash_16mb
build_flags = build_flags =
${ttgo-t-watch.build_flags} ${ttgo-t-watch.build_flags}
-D HASP_MODEL="TTgo T-Watch 2020" -D HASP_MODEL="TTGo T-Watch 2020"
-D TFT_ROTATION=0 -D TFT_ROTATION=0
;-D TFT_ROTATION=2 ;-D TFT_ROTATION=2
-D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy, 2=invert x, 4=inverty -D TOUCH_OFFSET_ROTATION=4 ; 1=swap xy, 2=invert x, 4=inverty

View File

@ -0,0 +1,98 @@
;***************************************************;
; Sunton ESP32-WROOM custom dev board with ;
; - ILI9341 TFT SPI 4-WIRE ;
; - XPT2046 or CST820 touch controller ;
;***************************************************;
[sunton-esp32-2432s024]
extends = arduino_esp32_v2
board = esp32dev
build_flags =
${arduino_esp32_v2.build_flags}
${esp32.no_ps_ram}
;region -- TFT_eSPI build options ------------------------
${esp32.hspi} ; Use HSPI hardware SPI bus
-D LGFX_USE_V1=1
-D HASP_USE_LGFX_TOUCH=1
-D ILI9341_DRIVER=1
-D TFT_WIDTH=320
-D TFT_HEIGHT=240
-D TFT_CS=15 ;// Chip select control pin
-D TFT_DC=2 ;// Data Command control pin
-D TFT_RST=-1 ;// Reset pin (could connect to RST pin)
-D TFT_BCKL=27 ;None, configurable via web UI (e.g. 2 for D4)
-D SUPPORT_TRANSACTIONS
-D SPI_FREQUENCY=65000000
-D SPI_READ_FREQUENCY=20000000
-D SPI_TOUCH_FREQUENCY=2500000
;endregion
; -- Debugging options -----------------------------
; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
lib_deps =
${arduino_esp32_v2.lib_deps}
${lovyangfx.lib_deps}
[env:esp32-2432s024r_4MB]
upload_port = /dev/ttyUSB0
extends = sunton-esp32-2432s024, flash_4mb
board = esp32dev
build_flags =
${sunton-esp32-2432s024.build_flags}
${esp32.no_ps_ram}
;region -- TFT_eSPI build options ------------------------
${esp32.hspi} ; Use HSPI hardware SPI bus
;-D USER_SETUP_LOADED=1
-D TFT_RGB_ORDER=1 ; Colour order Red-Green-Blue
-D TFT_ROTATION=5 ; 0=0, 1=90, 2=180 or 3=270 degree
-D TOUCH_CS=33
-D TOUCH_SCLK=14
-D TOUCH_MOSI=13
-D TOUCH_MISO=12
-D TOUCH_DRIVER=0x2046 ; XPT2606 Resistive touch panel driver
-D TOUCH_SDA=-1
-D TOUCH_SCL=-1
-D TOUCH_IRQ=-1
-D I2C_TOUCH_PORT=0
-D I2C_TOUCH_ADDRESS=0
-D I2C_TOUCH_FREQUENCY=0
-D TOUCH_OFFSET_ROTATION=0 ;touch rotation
;endregion
; -- Debugging options -----------------------------
; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
[env:esp32-2432s024c_4MB]
upload_port = /dev/ttyUSB0
extends = sunton-esp32-2432s024, flash_4mb
board = esp32dev
build_flags =
${sunton-esp32-2432s024.build_flags}
${esp32.no_ps_ram}
;region -- TFT_eSPI build options ------------------------
${esp32.hspi} ; Use HSPI hardware SPI bus
;-D USER_SETUP_LOADED=1
-D TFT_ROTATION=4 ; 0=0, 1=90, 2=180 or 3=270 degree
-D TOUCH_DRIVER=0x0820 ; CST820 Capacitive I2C touch panel driver
-D TOUCH_SDA=33
-D TOUCH_SCL=32
-D TOUCH_IRQ=21
;-D TOUCH_IRQ=-1
-D TOUCH_RST=25
-D I2C_TOUCH_FREQUENCY=400000
-D I2C_TOUCH_PORT=1
-D I2C_TOUCH_ADDRESS=0x15 ; or 0x14
-D TOUCH_OFFSET_ROTATION=2 ;touch rotation
;endregion
; -- Debugging options -----------------------------
; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG

View File

@ -145,8 +145,8 @@ build_flags =
-D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency -D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency
-D TFT_AUTO_FLUSH=1 -D TFT_AUTO_FLUSH=1
; Touch Settings ; Touch Settings
-D TOUCH_WIDTH=480 -D TOUCH_WIDTH=800
-D TOUCH_HEIGHT=272 -D TOUCH_HEIGHT=480
-D TOUCH_DRIVER=0x911 -D TOUCH_DRIVER=0x911
-D TOUCH_SCL=20 -D TOUCH_SCL=20
-D TOUCH_SDA=19 -D TOUCH_SDA=19
@ -171,16 +171,18 @@ build_flags =
-D TFT_WIDTH=800 -D TFT_WIDTH=800
-D TFT_HEIGHT=480 -D TFT_HEIGHT=480
; Panel Settings ; Panel Settings
; see see https://github.com/wegi1/ESP32-8048S050-5INCH-LCD/blob/main/4-Driver_IC_Data_Sheet/JC8048B050N_I.pdf
-D TFT_HSYNC_POLARITY=0 -D TFT_HSYNC_POLARITY=0
-D TFT_HSYNC_FRONT_PORCH=48 ; Maximum HSYNC Front Porch -D TFT_HSYNC_FRONT_PORCH=8 ; Maximum HSYNC Front Porch
-D TFT_HSYNC_PULSE_WIDTH=4 ; Typical HSYNC Pulse Width -D TFT_HSYNC_PULSE_WIDTH=4 ; Typical HSYNC Pulse Width
-D TFT_HSYNC_BACK_PORCH=8 ; Typical HSYNC Back Porch -D TFT_HSYNC_BACK_PORCH=8 ; Typical HSYNC Back Porch
-D TFT_VSYNC_POLARITY=0 -D TFT_VSYNC_POLARITY=0
-D TFT_VSYNC_FRONT_PORCH=12 ; Maximum VSYNC Front Porch -D TFT_VSYNC_FRONT_PORCH=8 ; Maximum VSYNC Front Porch
-D TFT_VSYNC_PULSE_WIDTH=4 ; Typical VSYNC Pulse Width -D TFT_VSYNC_PULSE_WIDTH=4 ; Typical VSYNC Pulse Width
-D TFT_VSYNC_BACK_PORCH=8 ; Typical VSYNC Back Porch -D TFT_VSYNC_BACK_PORCH=8 ; Typical VSYNC Back Porch
-D TFT_PCLK_ACTIVE_NEG=1 -D TFT_PCLK_ACTIVE_NEG=1
-D TFT_PREFER_SPEED=13900000 ; 1/2 of Typical DCLK Frequency ; 13900000 fails on some boards, high values cause wifi issues
-D TFT_PREFER_SPEED=14500000 ; 1/2 of Typical DCLK Frequency
-D TFT_AUTO_FLUSH=1 -D TFT_AUTO_FLUSH=1
; Touch Settings ; Touch Settings
-D TOUCH_WIDTH=800 -D TOUCH_WIDTH=800

View File

@ -0,0 +1,77 @@
;***************************************************;
; TTGO T-Display-S3 with ST7789 ;
; - TTGO T7 S3 v1.1 Mini esp32 s3 board ;
; - ST7789 TFT ;
; - CST816S touch controller ;
;***************************************************;
[ttgo-t-display-s3_st7789]
extends = arduino_esp32s3_v2
board = lilygo-t-display-s3
board_build.arduino.memory_type = qio_opi
build_flags =
${env.build_flags}
${esp32s3.build_flags}
${esp32s3.ps_ram}
-D HASP_MODEL="TTGO T-Display S3"
;-Wno-macro-redefined
-D ARDUINO_USB_MODE=0 ; If USB MODE 1, the device will only boot when a serial port is opened.
-D ARDUINO_USB_CDC_ON_BOOT
-D USE_USB_CDC_CONSOLE
;region -- TFT_eSPI build options ------------------------
-D USER_SETUP_LOADED=1
-D ST7789_DRIVER=1
-D CGRAM_OFFSET=1 ; Library will add offsets required
; -D TFT_SDA_READ ; Read from display, it only provides an SDA pin
-D TFT_WIDTH=170
-D TFT_HEIGHT=320
; -D TFT_ROTATION=2 ; see TFT_ROTATION values
; -D TFT_INVERSION_OFF ; for normal colors
-D TFT_INVERSION_ON
-D TFT_RGB_ORDER=0 ; Colour order Blue-Green-Red
-D INVERT_COLORS=1 ; for inverted colors
-D DISABLE_ALL_LIBRARY_WARNINGS ; Disable TFTeSPI log warning
; -D INIT_SEQUENCE_3 ; Using this initialisation sequence improves the display image
-D TFT_PARALLEL_8_BIT
-D TFT_DC=7
-D TFT_RST=5
-D TFT_WR=8
-D TFT_RD=9
-D TFT_D0=39
-D TFT_D1=40
-D TFT_D2=41
-D TFT_D3=42
-D TFT_D4=45
-D TFT_D5=46
-D TFT_D6=47
-D TFT_D7=48
-D TFT_BCKL=38
; Touch Settings
-D TOUCH_DRIVER=0x816
-D TOUCH_SDA=18
-D TOUCH_SCL=17
-D TOUCH_RST=21
-D TOUCH_IRQ=16
-D I2C_TOUCH_FREQUENCY=400000
-D I2C_TOUCH_ADDRESS=0x15
; End Touch Settings
;endregion
;region -- Library options -------------------------------
lib_deps =
${env.lib_deps}
${esp32s3.lib_deps}
${arduino_esp32s3_v2.lib_deps}
${tft_espi.lib_deps}
lib_ignore =
${env.lib_ignore}
${esp32s3.lib_ignore}
${arduino_esp32s3_v2.lib_ignore}
;endregion
[env:ttgo-t-display-s3_st7789_touch_16MB]
extends = ttgo-t-display-s3_st7789, flash_16mb