mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 11:46:31 +00:00
Merge remote-tracking branch 'Tasmota/development' into development
This commit is contained in:
commit
4cfe35aea8
4
.github/workflows/Tasmota_build.yml
vendored
4
.github/workflows/Tasmota_build.yml
vendored
@ -1382,7 +1382,7 @@ jobs:
|
|||||||
mkdir -p ./firmware/tasmota/languages
|
mkdir -p ./firmware/tasmota/languages
|
||||||
mkdir -p ./firmware/tasmota32/languages
|
mkdir -p ./firmware/tasmota32/languages
|
||||||
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
|
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
|
||||||
mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/
|
mkdir -p ./firmware/tasmota32/Odroid_go_and_core2_needed_files/
|
||||||
mkdir -p ./firmware/map
|
mkdir -p ./firmware/map
|
||||||
[ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/
|
[ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/
|
||||||
[ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/
|
[ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/
|
||||||
@ -1403,7 +1403,7 @@ jobs:
|
|||||||
[ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/
|
[ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/
|
||||||
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/
|
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/
|
||||||
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
|
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
|
||||||
[ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/
|
[ ! -f ./tools/Esptool/Odroid_go_and_core2/*.* ] || mv ./tools/Esptool/Odroid_go_and_core2/*.* ./firmware/tasmota32/Odroid_go_and_core2_needed_files/
|
||||||
[ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md
|
[ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md
|
||||||
- name: Commit files # transfer the new binaries back into the repository
|
- name: Commit files # transfer the new binaries back into the repository
|
||||||
run: |
|
run: |
|
||||||
|
4
.github/workflows/Tasmota_build_master.yml
vendored
4
.github/workflows/Tasmota_build_master.yml
vendored
@ -1382,7 +1382,7 @@ jobs:
|
|||||||
mkdir -p ./firmware/tasmota/languages
|
mkdir -p ./firmware/tasmota/languages
|
||||||
mkdir -p ./firmware/tasmota32/languages
|
mkdir -p ./firmware/tasmota32/languages
|
||||||
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
|
mkdir -p ./firmware/tasmota32/ESP32_needed_files/
|
||||||
mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/
|
mkdir -p ./firmware/tasmota32/Odroid_go_and_core2_needed_files/
|
||||||
mkdir -p ./firmware/map
|
mkdir -p ./firmware/map
|
||||||
[ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/
|
[ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/
|
||||||
[ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/
|
[ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/
|
||||||
@ -1403,7 +1403,7 @@ jobs:
|
|||||||
[ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/
|
[ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/
|
||||||
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/
|
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/
|
||||||
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
|
[ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/
|
||||||
[ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/
|
[ ! -f ./tools/Esptool/Odroid_go_and_core2/*.* ] || mv ./tools/Esptool/Odroid_go_and_core2/*.* ./firmware/tasmota32/Odroid_go_and_core2_needed_files/
|
||||||
[ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md
|
[ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md
|
||||||
- name: Commit files # transfer the new binaries back into the repository
|
- name: Commit files # transfer the new binaries back into the repository
|
||||||
run: |
|
run: |
|
||||||
|
@ -8,6 +8,9 @@ All notable changes to this project will be documented in this file.
|
|||||||
- Optional GUI file editor enabled with define ``GUI_EDIT_FILE`` by barbudor (#11668)
|
- Optional GUI file editor enabled with define ``GUI_EDIT_FILE`` by barbudor (#11668)
|
||||||
- Initial support for universal display driver UDisplay by Gerhard Mutz. Enable by selecting any GPIO as ``Option A3`` (#11665)
|
- Initial support for universal display driver UDisplay by Gerhard Mutz. Enable by selecting any GPIO as ``Option A3`` (#11665)
|
||||||
|
|
||||||
|
### Breaking Changed
|
||||||
|
- ESP32 partition layout changed to accomodate more file space on most and more code space on core2 and odroid-go (#11746)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- In tasmota-sensors.bin enabled support for VL53L0X and disabled TSL2561 (#11711)
|
- In tasmota-sensors.bin enabled support for VL53L0X and disabled TSL2561 (#11711)
|
||||||
- Add HLW8012/BL0937 average pulse calculation by Alex Lovett (#11722)
|
- Add HLW8012/BL0937 average pulse calculation by Alex Lovett (#11722)
|
||||||
|
@ -108,6 +108,9 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
|
|||||||
- ESP32 support for secondary I2C controller
|
- ESP32 support for secondary I2C controller
|
||||||
- ESP32 support for internal Hall Effect sensor connected to both GPIO36 and GPIO39 only
|
- ESP32 support for internal Hall Effect sensor connected to both GPIO36 and GPIO39 only
|
||||||
|
|
||||||
|
### Breaking Changed
|
||||||
|
- ESP32 partition layout changed to accomodate more file space on most and more code space on core2 and odroid-go [#11746](https://github.com/arendst/Tasmota/issues/11746)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- TasmotaSerial library from v3.2.0 to v3.3.0
|
- TasmotaSerial library from v3.2.0 to v3.3.0
|
||||||
- PubSubClient library from EspEasy v2.7.12 to Tasmota v2.8.12
|
- PubSubClient library from EspEasy v2.7.12 to Tasmota v2.8.12
|
||||||
|
29
boards/esp32c3.json
Normal file
29
boards/esp32c3.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32c3_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"f_cpu": "160000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "dio",
|
||||||
|
"mcu": "esp32c3",
|
||||||
|
"variant": "esp32c3"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"frameworks": [
|
||||||
|
"arduino"
|
||||||
|
],
|
||||||
|
"name": "Espressif ESP32-C3",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-idf/en/latest",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
32
boards/esp8266_1M.json
Normal file
32
boards/esp8266_1M.json
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "eagle.flash.1m.ld"
|
||||||
|
},
|
||||||
|
"core": "esp8266",
|
||||||
|
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP01",
|
||||||
|
"f_cpu": "80000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"flash_mode": "dout",
|
||||||
|
"mcu": "esp8266",
|
||||||
|
"variant": "generic"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"esp8266-rtos-sdk",
|
||||||
|
"esp8266-nonos-sdk"
|
||||||
|
],
|
||||||
|
"name": "Espressif Generic ESP8266 ESP-01 1M",
|
||||||
|
"upload": {
|
||||||
|
"maximum_ram_size": 81920,
|
||||||
|
"maximum_size": 1048576,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"resetmethod": "ck",
|
||||||
|
"speed": 115200
|
||||||
|
},
|
||||||
|
"url": "http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
@ -126,7 +126,7 @@ void * __va_cur_ptr4(va_list &va) {
|
|||||||
// >>> Reading a_ptr=0x3FFFFD70 *a_ptr=6
|
// >>> Reading a_ptr=0x3FFFFD70 *a_ptr=6
|
||||||
// >>> Reading a_ptr=0x3FFFFD74 *a_ptr=7
|
// >>> Reading a_ptr=0x3FFFFD74 *a_ptr=7
|
||||||
// >>> Reading a_ptr=0x3FFFFD78 *a_ptr=8
|
// >>> Reading a_ptr=0x3FFFFD78 *a_ptr=8
|
||||||
#elif defined(__RISC_V__)
|
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3 RISC_V
|
||||||
// #define __va_argsiz_tas(t) (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
// #define __va_argsiz_tas(t) (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
|
||||||
#define va_cur_ptr4(va,T) ( (T*) __va_cur_ptr4(va) )
|
#define va_cur_ptr4(va,T) ( (T*) __va_cur_ptr4(va) )
|
||||||
void * __va_cur_ptr4(va_list &va) {
|
void * __va_cur_ptr4(va_list &va) {
|
||||||
|
@ -42,6 +42,8 @@ TasmotaSerial *tms_obj_list[16];
|
|||||||
static int tasmota_serial_index = 2; // Allow UART2 and UART1 only
|
static int tasmota_serial_index = 2; // Allow UART2 and UART1 only
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
||||||
static int tasmota_serial_index = 1; // Allow UART1 only
|
static int tasmota_serial_index = 1; // Allow UART1 only
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
|
||||||
|
static int tasmota_serial_index = 1; // Allow UART1 only
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
|
||||||
#include <SPI.h>
|
|
||||||
#include "uDisplay.h"
|
#include "uDisplay.h"
|
||||||
|
|
||||||
#define UDSP_DEBUG
|
#define UDSP_DEBUG
|
||||||
@ -42,6 +40,14 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
|||||||
sa_mode = 16;
|
sa_mode = 16;
|
||||||
saw_3 = 0xff;
|
saw_3 = 0xff;
|
||||||
dim_op = 0xff;
|
dim_op = 0xff;
|
||||||
|
dsp_off = 0xff;
|
||||||
|
dsp_on = 0xff;
|
||||||
|
lutpsize = 0;
|
||||||
|
lutfsize = 0;
|
||||||
|
lutptime = 35;
|
||||||
|
lutftime = 350;
|
||||||
|
lut3time = 10;
|
||||||
|
ep_mode = 0;
|
||||||
startline = 0xA1;
|
startline = 0xA1;
|
||||||
uint8_t section = 0;
|
uint8_t section = 0;
|
||||||
dsp_ncmds = 0;
|
dsp_ncmds = 0;
|
||||||
@ -174,10 +180,20 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
|||||||
rot_t[3] = next_hex(&lp1);
|
rot_t[3] = next_hex(&lp1);
|
||||||
break;
|
break;
|
||||||
case 'A':
|
case 'A':
|
||||||
saw_1 = next_hex(&lp1);
|
if (interface == _UDSP_I2C) {
|
||||||
saw_2 = next_hex(&lp1);
|
saw_1 = next_hex(&lp1);
|
||||||
saw_3 = next_hex(&lp1);
|
i2c_page_start = next_hex(&lp1);
|
||||||
sa_mode = next_val(&lp1);
|
i2c_page_end = next_hex(&lp1);
|
||||||
|
saw_2 = next_hex(&lp1);
|
||||||
|
i2c_col_start = next_hex(&lp1);
|
||||||
|
i2c_col_end = next_hex(&lp1);
|
||||||
|
saw_3 = next_hex(&lp1);
|
||||||
|
} else {
|
||||||
|
saw_1 = next_hex(&lp1);
|
||||||
|
saw_2 = next_hex(&lp1);
|
||||||
|
saw_3 = next_hex(&lp1);
|
||||||
|
sa_mode = next_val(&lp1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
col_mode = next_val(&lp1);
|
col_mode = next_val(&lp1);
|
||||||
@ -189,6 +205,31 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
|||||||
case 'D':
|
case 'D':
|
||||||
dim_op = next_hex(&lp1);
|
dim_op = next_hex(&lp1);
|
||||||
break;
|
break;
|
||||||
|
case 'L':
|
||||||
|
while (1) {
|
||||||
|
if (!str2c(&lp1, ibuff, sizeof(ibuff))) {
|
||||||
|
lut_full[lutfsize++] = strtol(ibuff, 0, 16);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (lutfsize >= sizeof(lut_full)) break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
while (1) {
|
||||||
|
if (!str2c(&lp1, ibuff, sizeof(ibuff))) {
|
||||||
|
lut_partial[lutpsize++] = strtol(ibuff, 0, 16);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (lutpsize >= sizeof(lut_partial)) break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
lutftime = next_val(&lp1);
|
||||||
|
lutptime = next_val(&lp1);
|
||||||
|
lut3time = next_val(&lp1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,26 +241,54 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
|||||||
lp++;
|
lp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lutfsize && lutpsize) {
|
||||||
|
ep_mode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef UDSP_DEBUG
|
#ifdef UDSP_DEBUG
|
||||||
Serial.printf("Nr. : %d\n", spi_nr);
|
|
||||||
Serial.printf("CS : %d\n", spi_cs);
|
|
||||||
Serial.printf("CLK : %d\n", spi_clk);
|
|
||||||
Serial.printf("MOSI: %d\n", spi_mosi);
|
|
||||||
Serial.printf("DC : %d\n", spi_dc);
|
|
||||||
Serial.printf("BPAN: %d\n", bpanel);
|
|
||||||
Serial.printf("RES : %d\n", reset);
|
|
||||||
Serial.printf("MISO: %d\n", spi_miso);
|
|
||||||
Serial.printf("SPED: %d\n", spi_speed*1000000);
|
|
||||||
Serial.printf("Pixels: %d\n", col_mode);
|
|
||||||
Serial.printf("SaMode: %d\n", sa_mode);
|
|
||||||
|
|
||||||
|
Serial.printf("xs : %d\n", gxs);
|
||||||
|
Serial.printf("ys : %d\n", gys);
|
||||||
|
Serial.printf("bpp: %d\n", bpp);
|
||||||
|
|
||||||
Serial.printf("opts: %02x,%02x,%02x\n", saw_3, dim_op, startline);
|
if (interface == _UDSP_SPI) {
|
||||||
|
Serial.printf("Nr. : %d\n", spi_nr);
|
||||||
|
Serial.printf("CS : %d\n", spi_cs);
|
||||||
|
Serial.printf("CLK : %d\n", spi_clk);
|
||||||
|
Serial.printf("MOSI: %d\n", spi_mosi);
|
||||||
|
Serial.printf("DC : %d\n", spi_dc);
|
||||||
|
Serial.printf("BPAN: %d\n", bpanel);
|
||||||
|
Serial.printf("RES : %d\n", reset);
|
||||||
|
Serial.printf("MISO: %d\n", spi_miso);
|
||||||
|
Serial.printf("SPED: %d\n", spi_speed*1000000);
|
||||||
|
Serial.printf("Pixels: %d\n", col_mode);
|
||||||
|
Serial.printf("SaMode: %d\n", sa_mode);
|
||||||
|
|
||||||
Serial.printf("SetAddr : %x,%x,%x\n", saw_1, saw_2, saw_3);
|
Serial.printf("opts: %02x,%02x,%02x\n", saw_3, dim_op, startline);
|
||||||
|
|
||||||
Serial.printf("Rot 0: %x,%x - %d - %d\n", madctrl, rot[0], x_addr_offs[0], y_addr_offs[0]);
|
Serial.printf("SetAddr : %x,%x,%x\n", saw_1, saw_2, saw_3);
|
||||||
|
|
||||||
|
Serial.printf("Rot 0: %x,%x - %d - %d\n", madctrl, rot[0], x_addr_offs[0], y_addr_offs[0]);
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
Serial.printf("LUT_Partial : %d\n", lutpsize);
|
||||||
|
Serial.printf("LUT_Full : %d\n", lutfsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (interface == _UDSP_I2C) {
|
||||||
|
Serial.printf("Addr : %02x\n", i2caddr);
|
||||||
|
Serial.printf("SCL : %d\n", i2c_scl);
|
||||||
|
Serial.printf("SDA : %d\n", i2c_sda);
|
||||||
|
|
||||||
|
Serial.printf("SPA : %x\n", saw_1);
|
||||||
|
Serial.printf("pa_sta: %x\n", i2c_page_start);
|
||||||
|
Serial.printf("pa_end: %x\n", i2c_page_end);
|
||||||
|
Serial.printf("SCA : %x\n", saw_2);
|
||||||
|
Serial.printf("ca_sta: %x\n", i2c_col_start);
|
||||||
|
Serial.printf("pa_end: %x\n", i2c_col_end);
|
||||||
|
Serial.printf("WRA : %x\n", saw_3);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,26 +306,46 @@ Renderer *uDisplay::Init(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (interface == _UDSP_I2C) {
|
if (interface == _UDSP_I2C) {
|
||||||
Wire.begin(i2c_sda, i2c_scl);
|
wire = &Wire;
|
||||||
|
wire->begin(i2c_sda, i2c_scl);
|
||||||
if (bpp < 16) {
|
if (bpp < 16) {
|
||||||
if (buffer) free(buffer);
|
if (buffer) free(buffer);
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
buffer = (uint8_t*)calloc((width()*height()*bpp)/8, 1);
|
buffer = (uint8_t*)calloc((gxs * gys * bpp) / 8, 1);
|
||||||
#else
|
#else
|
||||||
if (psramFound()) {
|
if (psramFound()) {
|
||||||
buffer = (uint8_t*)heap_caps_malloc((width()*height()*bpp)/8, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
buffer = (uint8_t*)heap_caps_malloc((gxs * gys * bpp) / 8, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
} else {
|
} else {
|
||||||
buffer = (uint8_t*)calloc((width()*height()*bpp)/8, 1);
|
buffer = (uint8_t*)calloc((gxs * gys * bpp) / 8, 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef UDSP_DEBUG
|
||||||
|
Serial.printf("I2C cmds: %d\n", dsp_ncmds);
|
||||||
|
#endif
|
||||||
for (uint32_t cnt = 0; cnt < dsp_ncmds; cnt++) {
|
for (uint32_t cnt = 0; cnt < dsp_ncmds; cnt++) {
|
||||||
i2c_command(dsp_cmds[cnt]);
|
i2c_command(dsp_cmds[cnt]);
|
||||||
|
#ifdef UDSP_DEBUG
|
||||||
|
Serial.printf("cmd = %x\n", dsp_cmds[cnt]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (interface == _UDSP_SPI) {
|
if (interface == _UDSP_SPI) {
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
#ifdef ESP8266
|
||||||
|
buffer = (uint8_t*)calloc((gxs * gys * bpp) / 8, 1);
|
||||||
|
#else
|
||||||
|
if (psramFound()) {
|
||||||
|
buffer = (uint8_t*)heap_caps_malloc((gxs * gys * bpp) / 8, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
|
} else {
|
||||||
|
buffer = (uint8_t*)calloc((gxs * gys * bpp) / 8, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (bpanel >= 0) {
|
if (bpanel >= 0) {
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
ledcSetup(ESP32_PWM_CHANNEL, 4000, 8);
|
ledcSetup(ESP32_PWM_CHANNEL, 4000, 8);
|
||||||
@ -285,8 +374,6 @@ Renderer *uDisplay::Init(void) {
|
|||||||
digitalWrite(spi_clk, LOW);
|
digitalWrite(spi_clk, LOW);
|
||||||
pinMode(spi_mosi, OUTPUT);
|
pinMode(spi_mosi, OUTPUT);
|
||||||
digitalWrite(spi_mosi, LOW);
|
digitalWrite(spi_mosi, LOW);
|
||||||
pinMode(spi_dc, OUTPUT);
|
|
||||||
digitalWrite(spi_dc, LOW);
|
|
||||||
}
|
}
|
||||||
#endif // ESP8266
|
#endif // ESP8266
|
||||||
|
|
||||||
@ -302,8 +389,6 @@ Renderer *uDisplay::Init(void) {
|
|||||||
digitalWrite(spi_clk, LOW);
|
digitalWrite(spi_clk, LOW);
|
||||||
pinMode(spi_mosi, OUTPUT);
|
pinMode(spi_mosi, OUTPUT);
|
||||||
digitalWrite(spi_mosi, LOW);
|
digitalWrite(spi_mosi, LOW);
|
||||||
pinMode(spi_dc, OUTPUT);
|
|
||||||
digitalWrite(spi_dc, LOW);
|
|
||||||
}
|
}
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
|
||||||
@ -321,7 +406,7 @@ Renderer *uDisplay::Init(void) {
|
|||||||
|
|
||||||
uint8_t args = dsp_cmds[index++];
|
uint8_t args = dsp_cmds[index++];
|
||||||
#ifdef UDSP_DEBUG
|
#ifdef UDSP_DEBUG
|
||||||
Serial.printf("cmd, args %x, %d ", iob, args&0x1f);
|
Serial.printf("cmd, args %02x, %d ", iob, args&0x1f);
|
||||||
#endif
|
#endif
|
||||||
for (uint32_t cnt = 0; cnt < (args & 0x1f); cnt++) {
|
for (uint32_t cnt = 0; cnt < (args & 0x1f); cnt++) {
|
||||||
iob = dsp_cmds[index++];
|
iob = dsp_cmds[index++];
|
||||||
@ -343,10 +428,35 @@ Renderer *uDisplay::Init(void) {
|
|||||||
SPI_END_TRANSACTION
|
SPI_END_TRANSACTION
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// must init luts on epaper
|
||||||
|
if (ep_mode) {
|
||||||
|
Init_EPD(DISPLAY_INIT_FULL);
|
||||||
|
Init_EPD(DISPLAY_INIT_PARTIAL);
|
||||||
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uDisplay::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) {
|
|
||||||
|
void uDisplay::DisplayInit(int8_t p, int8_t size, int8_t rot, int8_t font) {
|
||||||
|
if (p !=DISPLAY_INIT_MODE && ep_mode) {
|
||||||
|
if (p == DISPLAY_INIT_PARTIAL) {
|
||||||
|
if (lutpsize) {
|
||||||
|
SetLut(lut_partial);
|
||||||
|
Updateframe_EPD();
|
||||||
|
delay(lutptime * 10);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (p == DISPLAY_INIT_FULL) {
|
||||||
|
if (lutfsize) {
|
||||||
|
SetLut(lut_full);
|
||||||
|
Updateframe_EPD();
|
||||||
|
delay(lutftime * 10);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
setRotation(rot);
|
setRotation(rot);
|
||||||
invertDisplay(false);
|
invertDisplay(false);
|
||||||
setTextWrap(false);
|
setTextWrap(false);
|
||||||
@ -357,6 +467,11 @@ void uDisplay::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) {
|
|||||||
setCursor(0,0);
|
setCursor(0,0);
|
||||||
fillScreen(bg_col);
|
fillScreen(bg_col);
|
||||||
Updateframe();
|
Updateframe();
|
||||||
|
|
||||||
|
#ifdef UDSP_DEBUG
|
||||||
|
Serial.printf("Dsp Init complete \n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void uDisplay::spi_command(uint8_t val) {
|
void uDisplay::spi_command(uint8_t val) {
|
||||||
@ -444,25 +559,59 @@ void uDisplay::spi_command_one(uint8_t val) {
|
|||||||
|
|
||||||
void uDisplay::i2c_command(uint8_t val) {
|
void uDisplay::i2c_command(uint8_t val) {
|
||||||
//Serial.printf("%02x\n",val );
|
//Serial.printf("%02x\n",val );
|
||||||
Wire.beginTransmission(i2caddr);
|
wire->beginTransmission(i2caddr);
|
||||||
Wire.write(0);
|
wire->write(0);
|
||||||
Wire.write(val);
|
wire->write(val);
|
||||||
Wire.endTransmission();
|
wire->endTransmission();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define WIRE_MAX 32
|
||||||
|
|
||||||
void uDisplay::Updateframe(void) {
|
void uDisplay::Updateframe(void) {
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
Updateframe_EPD();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (interface == _UDSP_I2C) {
|
if (interface == _UDSP_I2C) {
|
||||||
i2c_command(saw_1 | 0x0); // low col = 0
|
|
||||||
i2c_command(saw_2 | 0x0); // hi col = 0
|
#if 0
|
||||||
i2c_command(saw_3 | 0x0); // line #0
|
i2c_command(saw_1);
|
||||||
|
i2c_command(i2c_page_start);
|
||||||
|
i2c_command(i2c_page_end);
|
||||||
|
i2c_command(saw_2);
|
||||||
|
i2c_command(i2c_col_start);
|
||||||
|
i2c_command(i2c_col_end);
|
||||||
|
|
||||||
|
uint16_t count = gxs * ((gys + 7) / 8);
|
||||||
|
uint8_t *ptr = buffer;
|
||||||
|
wire->beginTransmission(i2caddr);
|
||||||
|
i2c_command(saw_3);
|
||||||
|
uint8_t bytesOut = 1;
|
||||||
|
while (count--) {
|
||||||
|
if (bytesOut >= WIRE_MAX) {
|
||||||
|
wire->endTransmission();
|
||||||
|
wire->beginTransmission(i2caddr);
|
||||||
|
i2c_command(saw_3);
|
||||||
|
bytesOut = 1;
|
||||||
|
}
|
||||||
|
i2c_command(*ptr++);
|
||||||
|
bytesOut++;
|
||||||
|
}
|
||||||
|
wire->endTransmission();
|
||||||
|
#else
|
||||||
|
|
||||||
|
i2c_command(saw_1 | 0x0); // set low col = 0, 0x00
|
||||||
|
i2c_command(i2c_page_start | 0x0); // set hi col = 0, 0x10
|
||||||
|
i2c_command(i2c_page_end | 0x0); // set startline line #0, 0x40
|
||||||
|
|
||||||
uint8_t ys = gys >> 3;
|
uint8_t ys = gys >> 3;
|
||||||
uint8_t xs = gxs >> 3;
|
uint8_t xs = gxs >> 3;
|
||||||
//uint8_t xs = 132 >> 3;
|
//uint8_t xs = 132 >> 3;
|
||||||
uint8_t m_row = 0;
|
uint8_t m_row = saw_2;
|
||||||
uint8_t m_col = 2;
|
uint8_t m_col = i2c_col_start;
|
||||||
|
|
||||||
uint16_t p = 0;
|
uint16_t p = 0;
|
||||||
|
|
||||||
@ -470,24 +619,32 @@ void uDisplay::Updateframe(void) {
|
|||||||
|
|
||||||
for ( i = 0; i < ys; i++) {
|
for ( i = 0; i < ys; i++) {
|
||||||
// send a bunch of data in one xmission
|
// send a bunch of data in one xmission
|
||||||
i2c_command(0xB0 + i + m_row);//set page address
|
i2c_command(0xB0 + i + m_row); //set page address
|
||||||
i2c_command(m_col & 0xf);//set lower column address
|
i2c_command(m_col & 0xf); //set lower column address
|
||||||
i2c_command(0x10 | (m_col >> 4));//set higher column address
|
i2c_command(0x10 | (m_col >> 4)); //set higher column address
|
||||||
|
|
||||||
for( j = 0; j < 8; j++){
|
for ( j = 0; j < 8; j++) {
|
||||||
Wire.beginTransmission(i2caddr);
|
wire->beginTransmission(i2caddr);
|
||||||
Wire.write(0x40);
|
wire->write(0x40);
|
||||||
for ( k = 0; k < xs; k++, p++) {
|
for ( k = 0; k < xs; k++, p++) {
|
||||||
Wire.write(buffer[p]);
|
wire->write(buffer[p]);
|
||||||
}
|
}
|
||||||
Wire.endTransmission();
|
wire->endTransmission();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uDisplay::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
void uDisplay::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
drawFastVLine_EPD(x, y, h, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (interface != _UDSP_SPI) {
|
if (interface != _UDSP_SPI) {
|
||||||
Renderer::drawFastVLine(x, y, h, color);
|
Renderer::drawFastVLine(x, y, h, color);
|
||||||
return;
|
return;
|
||||||
@ -528,6 +685,12 @@ void uDisplay::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
|||||||
|
|
||||||
void uDisplay::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
|
void uDisplay::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
|
||||||
|
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
drawFastHLine_EPD(x, y, w, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (interface != _UDSP_SPI) {
|
if (interface != _UDSP_SPI) {
|
||||||
Renderer::drawFastHLine(x, y, w, color);
|
Renderer::drawFastHLine(x, y, w, color);
|
||||||
return;
|
return;
|
||||||
@ -575,6 +738,12 @@ void uDisplay::fillScreen(uint16_t color) {
|
|||||||
// fill a rectangle
|
// fill a rectangle
|
||||||
void uDisplay::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
|
void uDisplay::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
|
||||||
|
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
fillRect_EPD(x, y, w, h, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (interface != _UDSP_SPI) {
|
if (interface != _UDSP_SPI) {
|
||||||
Renderer::fillRect(x, y, w, h, color);
|
Renderer::fillRect(x, y, w, h, color);
|
||||||
return;
|
return;
|
||||||
@ -646,6 +815,9 @@ for(y=h; y>0; y--) {
|
|||||||
|
|
||||||
|
|
||||||
void uDisplay::Splash(void) {
|
void uDisplay::Splash(void) {
|
||||||
|
if (ep_mode) {
|
||||||
|
delay(lut3time * 10);
|
||||||
|
}
|
||||||
setTextFont(splash_font);
|
setTextFont(splash_font);
|
||||||
setTextSize(splash_size);
|
setTextSize(splash_size);
|
||||||
DrawStringAt(splash_xp, splash_yp, dname, fg_col, 0);
|
DrawStringAt(splash_xp, splash_yp, dname, fg_col, 0);
|
||||||
@ -670,7 +842,7 @@ void uDisplay::setAddrWindow_int(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
|
|||||||
x += x_addr_offs[cur_rot];
|
x += x_addr_offs[cur_rot];
|
||||||
y += y_addr_offs[cur_rot];
|
y += y_addr_offs[cur_rot];
|
||||||
|
|
||||||
if (sa_mode == 16) {
|
if (sa_mode != 8) {
|
||||||
uint32_t xa = ((uint32_t)x << 16) | (x+w-1);
|
uint32_t xa = ((uint32_t)x << 16) | (x+w-1);
|
||||||
uint32_t ya = ((uint32_t)y << 16) | (y+h-1);
|
uint32_t ya = ((uint32_t)y << 16) | (y+h-1);
|
||||||
|
|
||||||
@ -735,11 +907,19 @@ void uDisplay::WriteColor(uint16_t color) {
|
|||||||
|
|
||||||
void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||||
|
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
drawPixel_EPD(x, y, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (interface != _UDSP_SPI) {
|
if (interface != _UDSP_SPI) {
|
||||||
Renderer::drawPixel(x, y, color);
|
Renderer::drawPixel(x, y, color);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return;
|
if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return;
|
||||||
|
|
||||||
|
|
||||||
@ -763,7 +943,13 @@ void uDisplay::setRotation(uint8_t rotation) {
|
|||||||
Renderer::setRotation(cur_rot);
|
Renderer::setRotation(cur_rot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interface == _UDSP_SPI) {
|
if (interface == _UDSP_SPI) {
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
Renderer::setRotation(cur_rot);
|
||||||
|
return;
|
||||||
|
}
|
||||||
SPI_BEGIN_TRANSACTION
|
SPI_BEGIN_TRANSACTION
|
||||||
SPI_CS_LOW
|
SPI_CS_LOW
|
||||||
spi_command(madctrl);
|
spi_command(madctrl);
|
||||||
@ -801,6 +987,10 @@ void udisp_bpwr(uint8_t on);
|
|||||||
|
|
||||||
void uDisplay::DisplayOnff(int8_t on) {
|
void uDisplay::DisplayOnff(int8_t on) {
|
||||||
|
|
||||||
|
if (ep_mode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
udisp_bpwr(on);
|
udisp_bpwr(on);
|
||||||
|
|
||||||
if (interface == _UDSP_I2C) {
|
if (interface == _UDSP_I2C) {
|
||||||
@ -811,7 +1001,7 @@ void uDisplay::DisplayOnff(int8_t on) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (on) {
|
if (on) {
|
||||||
spi_command_one(dsp_on);
|
if (dsp_on != 0xff) spi_command_one(dsp_on);
|
||||||
if (bpanel >= 0) {
|
if (bpanel >= 0) {
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
|
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
|
||||||
@ -821,7 +1011,7 @@ void uDisplay::DisplayOnff(int8_t on) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
spi_command_one(dsp_off);
|
if (dsp_off != 0xff) spi_command_one(dsp_off);
|
||||||
if (bpanel >= 0) {
|
if (bpanel >= 0) {
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
ledcWrite(ESP32_PWM_CHANNEL, 0);
|
ledcWrite(ESP32_PWM_CHANNEL, 0);
|
||||||
@ -834,10 +1024,24 @@ void uDisplay::DisplayOnff(int8_t on) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void uDisplay::invertDisplay(boolean i) {
|
void uDisplay::invertDisplay(boolean i) {
|
||||||
if (i) {
|
|
||||||
spi_command_one(inv_on);
|
if (ep_mode) {
|
||||||
} else {
|
return;
|
||||||
spi_command_one(inv_off);
|
}
|
||||||
|
|
||||||
|
if (interface == _UDSP_SPI) {
|
||||||
|
if (i) {
|
||||||
|
spi_command_one(inv_on);
|
||||||
|
} else {
|
||||||
|
spi_command_one(inv_off);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (interface == _UDSP_I2C) {
|
||||||
|
if (i) {
|
||||||
|
i2c_command(inv_on);
|
||||||
|
} else {
|
||||||
|
i2c_command(inv_off);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -845,22 +1049,30 @@ void udisp_dimm(uint8_t dim);
|
|||||||
|
|
||||||
void uDisplay::dim(uint8_t dim) {
|
void uDisplay::dim(uint8_t dim) {
|
||||||
dimmer = dim;
|
dimmer = dim;
|
||||||
if (dimmer > 15) dimmer = 15;
|
|
||||||
dimmer = ((float)dimmer / 15.0) * 255.0;
|
if (ep_mode) {
|
||||||
#ifdef ESP32
|
return;
|
||||||
if (bpanel >= 0) {
|
|
||||||
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
|
|
||||||
} else {
|
|
||||||
udisp_dimm(dim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (interface == _UDSP_SPI) {
|
||||||
|
if (dimmer > 15) dimmer = 15;
|
||||||
|
dimmer = ((float)dimmer / 15.0) * 255.0;
|
||||||
|
#ifdef ESP32
|
||||||
|
if (bpanel >= 0) {
|
||||||
|
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
|
||||||
|
} else {
|
||||||
|
udisp_dimm(dim);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (dim_op != 0xff) {
|
|
||||||
SPI_BEGIN_TRANSACTION
|
if (dim_op != 0xff) {
|
||||||
SPI_CS_LOW
|
SPI_BEGIN_TRANSACTION
|
||||||
spi_command(dim_op);
|
SPI_CS_LOW
|
||||||
spi_data8(dim);
|
spi_command(dim_op);
|
||||||
SPI_CS_HIGH
|
spi_data8(dim);
|
||||||
SPI_END_TRANSACTION
|
SPI_CS_HIGH
|
||||||
|
SPI_END_TRANSACTION
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1033,3 +1245,249 @@ void USECACHE uDisplay::write32(uint32_t val) {
|
|||||||
GPIO_SET(spi_clk);
|
GPIO_SET(spi_clk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// epaper section
|
||||||
|
|
||||||
|
// EPD2IN9 commands
|
||||||
|
#define DRIVER_OUTPUT_CONTROL 0x01
|
||||||
|
#define BOOSTER_SOFT_START_CONTROL 0x0C
|
||||||
|
#define GATE_SCAN_START_POSITION 0x0F
|
||||||
|
#define DEEP_SLEEP_MODE 0x10
|
||||||
|
#define DATA_ENTRY_MODE_SETTING 0x11
|
||||||
|
#define SW_RESET 0x12
|
||||||
|
#define TEMPERATURE_SENSOR_CONTROL 0x1A
|
||||||
|
#define MASTER_ACTIVATION 0x20
|
||||||
|
#define DISPLAY_UPDATE_CONTROL_1 0x21
|
||||||
|
#define DISPLAY_UPDATE_CONTROL_2 0x22
|
||||||
|
#define WRITE_RAM 0x24
|
||||||
|
#define WRITE_VCOM_REGISTER 0x2C
|
||||||
|
#define WRITE_LUT_REGISTER 0x32
|
||||||
|
#define SET_DUMMY_LINE_PERIOD 0x3A
|
||||||
|
#define SET_GATE_TIME 0x3B
|
||||||
|
#define BORDER_WAVEFORM_CONTROL 0x3C
|
||||||
|
#define SET_RAM_X_ADDRESS_START_END_POSITION 0x44
|
||||||
|
#define SET_RAM_Y_ADDRESS_START_END_POSITION 0x45
|
||||||
|
#define SET_RAM_X_ADDRESS_COUNTER 0x4E
|
||||||
|
#define SET_RAM_Y_ADDRESS_COUNTER 0x4F
|
||||||
|
#define TERMINATE_FRAME_READ_WRITE 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
void uDisplay::spi_data8_EPD(uint8_t val) {
|
||||||
|
SPI_BEGIN_TRANSACTION
|
||||||
|
SPI_CS_LOW
|
||||||
|
spi_data8(val);
|
||||||
|
SPI_CS_HIGH
|
||||||
|
SPI_END_TRANSACTION
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::spi_command_EPD(uint8_t val) {
|
||||||
|
SPI_BEGIN_TRANSACTION
|
||||||
|
SPI_CS_LOW
|
||||||
|
spi_command(val);
|
||||||
|
SPI_CS_HIGH
|
||||||
|
SPI_END_TRANSACTION
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::Init_EPD(int8_t p) {
|
||||||
|
if (p == DISPLAY_INIT_PARTIAL) {
|
||||||
|
SetLut(lut_partial);
|
||||||
|
} else {
|
||||||
|
SetLut(lut_full);
|
||||||
|
}
|
||||||
|
ClearFrameMemory(0xFF);
|
||||||
|
Updateframe_EPD();
|
||||||
|
if (p == DISPLAY_INIT_PARTIAL) {
|
||||||
|
delay(lutptime * 10);
|
||||||
|
} else {
|
||||||
|
delay(lutftime * 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::ClearFrameMemory(unsigned char color) {
|
||||||
|
SetMemoryArea(0, 0, gxs - 1, gys - 1);
|
||||||
|
SetMemoryPointer(0, 0);
|
||||||
|
spi_command_EPD(WRITE_RAM);
|
||||||
|
/* send the color data */
|
||||||
|
for (int i = 0; i < gxs / 8 * gys; i++) {
|
||||||
|
spi_data8_EPD(color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::SetLut(const unsigned char* lut) {
|
||||||
|
spi_command_EPD(WRITE_LUT_REGISTER);
|
||||||
|
/* the length of look-up table is 30 bytes */
|
||||||
|
for (int i = 0; i < lutfsize; i++) {
|
||||||
|
spi_data8_EPD(lut[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::Updateframe_EPD(void) {
|
||||||
|
SetFrameMemory(buffer, 0, 0, gxs, gys);
|
||||||
|
DisplayFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::DisplayFrame(void) {
|
||||||
|
spi_command_EPD(DISPLAY_UPDATE_CONTROL_2);
|
||||||
|
spi_data8_EPD(0xC4);
|
||||||
|
spi_command_EPD(MASTER_ACTIVATION);
|
||||||
|
spi_data8_EPD(TERMINATE_FRAME_READ_WRITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::SetMemoryArea(int x_start, int y_start, int x_end, int y_end) {
|
||||||
|
spi_command_EPD(SET_RAM_X_ADDRESS_START_END_POSITION);
|
||||||
|
/* x point must be the multiple of 8 or the last 3 bits will be ignored */
|
||||||
|
spi_data8_EPD((x_start >> 3) & 0xFF);
|
||||||
|
spi_data8_EPD((x_end >> 3) & 0xFF);
|
||||||
|
spi_command_EPD(SET_RAM_Y_ADDRESS_START_END_POSITION);
|
||||||
|
spi_data8_EPD(y_start & 0xFF);
|
||||||
|
spi_data8_EPD((y_start >> 8) & 0xFF);
|
||||||
|
spi_data8_EPD(y_end & 0xFF);
|
||||||
|
spi_data8_EPD((y_end >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::SetFrameMemory(const unsigned char* image_buffer) {
|
||||||
|
SetMemoryArea(0, 0, gxs - 1, gys - 1);
|
||||||
|
SetMemoryPointer(0, 0);
|
||||||
|
spi_command_EPD(WRITE_RAM);
|
||||||
|
/* send the image data */
|
||||||
|
for (int i = 0; i < gxs / 8 * gys; i++) {
|
||||||
|
spi_data8_EPD(image_buffer[i] ^ 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::SetMemoryPointer(int x, int y) {
|
||||||
|
spi_command_EPD(SET_RAM_X_ADDRESS_COUNTER);
|
||||||
|
/* x point must be the multiple of 8 or the last 3 bits will be ignored */
|
||||||
|
spi_data8_EPD((x >> 3) & 0xFF);
|
||||||
|
spi_command_EPD(SET_RAM_Y_ADDRESS_COUNTER);
|
||||||
|
spi_data8_EPD(y & 0xFF);
|
||||||
|
spi_data8_EPD((y >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::SetFrameMemory(
|
||||||
|
const unsigned char* image_buffer,
|
||||||
|
uint16_t x,
|
||||||
|
uint16_t y,
|
||||||
|
uint16_t image_width,
|
||||||
|
uint16_t image_height
|
||||||
|
) {
|
||||||
|
uint16_t x_end;
|
||||||
|
uint16_t y_end;
|
||||||
|
|
||||||
|
if (
|
||||||
|
image_buffer == NULL ||
|
||||||
|
x < 0 || image_width < 0 ||
|
||||||
|
y < 0 || image_height < 0
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* x point must be the multiple of 8 or the last 3 bits will be ignored */
|
||||||
|
x &= 0xFFF8;
|
||||||
|
image_width &= 0xFFF8;
|
||||||
|
if (x + image_width >= gxs) {
|
||||||
|
x_end = gxs - 1;
|
||||||
|
} else {
|
||||||
|
x_end = x + image_width - 1;
|
||||||
|
}
|
||||||
|
if (y + image_height >= gys) {
|
||||||
|
y_end = gys - 1;
|
||||||
|
} else {
|
||||||
|
y_end = y + image_height - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!x && !y && image_width == gxs && image_height == gys) {
|
||||||
|
SetFrameMemory(image_buffer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMemoryArea(x, y, x_end, y_end);
|
||||||
|
SetMemoryPointer(x, y);
|
||||||
|
spi_command_EPD(WRITE_RAM);
|
||||||
|
/* send the image data */
|
||||||
|
for (uint16_t j = 0; j < y_end - y + 1; j++) {
|
||||||
|
for (uint16_t i = 0; i < (x_end - x + 1) / 8; i++) {
|
||||||
|
spi_data8_EPD(image_buffer[i + j * (image_width / 8)]^0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IF_INVERT_COLOR 1
|
||||||
|
#define renderer_swap(a, b) { int16_t t = a; a = b; b = t; }
|
||||||
|
/**
|
||||||
|
* @brief: this draws a pixel by absolute coordinates.
|
||||||
|
* this function won't be affected by the rotate parameter.
|
||||||
|
* we must use this for epaper because these displays have a strange and different bit pattern
|
||||||
|
*/
|
||||||
|
void uDisplay::DrawAbsolutePixel(int x, int y, int16_t color) {
|
||||||
|
|
||||||
|
int16_t w = width(), h = height();
|
||||||
|
if (cur_rot == 1 || cur_rot == 3) {
|
||||||
|
renderer_swap(w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x < 0 || x >= w || y < 0 || y >= h) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (IF_INVERT_COLOR) {
|
||||||
|
if (color) {
|
||||||
|
buffer[(x + y * w) / 8] |= 0x80 >> (x % 8);
|
||||||
|
} else {
|
||||||
|
buffer[(x + y * w) / 8] &= ~(0x80 >> (x % 8));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (color) {
|
||||||
|
buffer[(x + y * w) / 8] &= ~(0x80 >> (x % 8));
|
||||||
|
} else {
|
||||||
|
buffer[(x + y * w) / 8] |= 0x80 >> (x % 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uDisplay::drawPixel_EPD(int16_t x, int16_t y, uint16_t color) {
|
||||||
|
if (!buffer) return;
|
||||||
|
if ((x < 0) || (x >= width()) || (y < 0) || (y >= height()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// check rotation, move pixel around if necessary
|
||||||
|
switch (cur_rot) {
|
||||||
|
case 1:
|
||||||
|
renderer_swap(x, y);
|
||||||
|
x = gxs - x - 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
x = gxs - x - 1;
|
||||||
|
y = gys - y - 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
renderer_swap(x, y);
|
||||||
|
y = gys - y - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// x is which column
|
||||||
|
DrawAbsolutePixel(x, y, color);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void uDisplay::fillRect_EPD(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
|
||||||
|
for (uint32_t yp = y; yp < y + h; yp++) {
|
||||||
|
for (uint32_t xp = x; xp < x + w; xp++) {
|
||||||
|
drawPixel_EPD(xp , yp , color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void uDisplay::drawFastVLine_EPD(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
||||||
|
while (h--) {
|
||||||
|
drawPixel_EPD(x , y , color);
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void uDisplay::drawFastHLine_EPD(int16_t x, int16_t y, int16_t w, uint16_t color) {
|
||||||
|
while (w--) {
|
||||||
|
drawPixel_EPD(x , y , color);
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
#include <renderer.h>
|
#include <renderer.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
#define _UDSP_I2C 1
|
#define _UDSP_I2C 1
|
||||||
#define _UDSP_SPI 2
|
#define _UDSP_SPI 2
|
||||||
@ -10,6 +12,10 @@
|
|||||||
#define UDISP1_WHITE 1
|
#define UDISP1_WHITE 1
|
||||||
#define UDISP1_BLACK 0
|
#define UDISP1_BLACK 0
|
||||||
|
|
||||||
|
#define DISPLAY_INIT_MODE 0
|
||||||
|
#define DISPLAY_INIT_PARTIAL 1
|
||||||
|
#define DISPLAY_INIT_FULL 2
|
||||||
|
|
||||||
enum uColorType { uCOLOR_BW, uCOLOR_COLOR };
|
enum uColorType { uCOLOR_BW, uCOLOR_COLOR };
|
||||||
|
|
||||||
// Color definitions
|
// Color definitions
|
||||||
@ -93,7 +99,22 @@ class uDisplay : public Renderer {
|
|||||||
void write32(uint32_t val);
|
void write32(uint32_t val);
|
||||||
void spi_data9(uint8_t d, uint8_t dc);
|
void spi_data9(uint8_t d, uint8_t dc);
|
||||||
void WriteColor(uint16_t color);
|
void WriteColor(uint16_t color);
|
||||||
|
void SetLut(const unsigned char* lut);
|
||||||
|
void DisplayFrame(void);
|
||||||
|
void Updateframe_EPD();
|
||||||
|
void SetFrameMemory(const unsigned char* image_buffer);
|
||||||
|
void SetFrameMemory(const unsigned char* image_buffer, uint16_t x, uint16_t y, uint16_t image_width, uint16_t image_height);
|
||||||
|
void SetMemoryArea(int x_start, int y_start, int x_end, int y_end);
|
||||||
|
void SetMemoryPointer(int x, int y);
|
||||||
|
void DrawAbsolutePixel(int x, int y, int16_t color);
|
||||||
|
void drawPixel_EPD(int16_t x, int16_t y, uint16_t color);
|
||||||
|
void fillRect_EPD(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
|
||||||
|
void drawFastVLine_EPD(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
|
void drawFastHLine_EPD(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
void Init_EPD(int8_t p);
|
||||||
|
void spi_command_EPD(uint8_t val);
|
||||||
|
void spi_data8_EPD(uint8_t val);
|
||||||
|
void ClearFrameMemory(unsigned char color);
|
||||||
uint8_t strlen_ln(char *str);
|
uint8_t strlen_ln(char *str);
|
||||||
int32_t next_val(char **sp);
|
int32_t next_val(char **sp);
|
||||||
uint32_t next_hex(char **sp);
|
uint32_t next_hex(char **sp);
|
||||||
@ -103,7 +124,12 @@ class uDisplay : public Renderer {
|
|||||||
uint8_t interface;
|
uint8_t interface;
|
||||||
uint8_t i2caddr;
|
uint8_t i2caddr;
|
||||||
int8_t i2c_scl;
|
int8_t i2c_scl;
|
||||||
|
TwoWire *wire;
|
||||||
int8_t i2c_sda;
|
int8_t i2c_sda;
|
||||||
|
uint8_t i2c_col_start;
|
||||||
|
uint8_t i2c_col_end;
|
||||||
|
uint8_t i2c_page_start;
|
||||||
|
uint8_t i2c_page_end;
|
||||||
int8_t reset;
|
int8_t reset;
|
||||||
uint8_t dsp_cmds[128];
|
uint8_t dsp_cmds[128];
|
||||||
uint8_t dsp_ncmds;
|
uint8_t dsp_ncmds;
|
||||||
@ -144,6 +170,14 @@ class uDisplay : public Renderer {
|
|||||||
uint8_t inv_off;
|
uint8_t inv_off;
|
||||||
uint8_t sa_mode;
|
uint8_t sa_mode;
|
||||||
uint8_t dim_op;
|
uint8_t dim_op;
|
||||||
|
uint8_t lutfsize;
|
||||||
|
uint8_t lutpsize;
|
||||||
|
uint16_t lutftime;
|
||||||
|
uint16_t lutptime;
|
||||||
|
uint16_t lut3time;
|
||||||
|
uint8_t ep_mode;
|
||||||
|
uint8_t lut_full[64];
|
||||||
|
uint8_t lut_partial[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#include "esp32/rom/rtc.h"
|
#include "esp32/rom/rtc.h"
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
||||||
#include "esp32s2/rom/rtc.h"
|
#include "esp32s2/rom/rtc.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
|
||||||
|
#include "esp32c3/rom/rtc.h"
|
||||||
#else
|
#else
|
||||||
#error Target CONFIG_IDF_TARGET is not supported
|
#error Target CONFIG_IDF_TARGET is not supported
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,12 +26,9 @@ extra_configs = platformio_tasmota32.ini
|
|||||||
|
|
||||||
[common]
|
[common]
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board = esp01_1m
|
|
||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
custom_unpack_dir = unpacked_littlefs
|
custom_unpack_dir = unpacked_littlefs
|
||||||
board_build.flash_mode = dout
|
board_build.flash_mode = dout
|
||||||
board_build.ldscript = eagle.flash.1m.ld
|
|
||||||
|
|
||||||
platform = ${core.platform}
|
platform = ${core.platform}
|
||||||
platform_packages = ${core.platform_packages}
|
platform_packages = ${core.platform_packages}
|
||||||
build_unflags = ${core.build_unflags}
|
build_unflags = ${core.build_unflags}
|
||||||
@ -89,6 +86,7 @@ build_flags = -DCORE_DEBUG_LEVEL=0
|
|||||||
|
|
||||||
|
|
||||||
[esp82xx_defaults]
|
[esp82xx_defaults]
|
||||||
|
board = esp8266_1M
|
||||||
build_flags = ${esp_defaults.build_flags}
|
build_flags = ${esp_defaults.build_flags}
|
||||||
-DNDEBUG
|
-DNDEBUG
|
||||||
-DFP_IN_IROM
|
-DFP_IN_IROM
|
||||||
|
@ -35,6 +35,7 @@ default_envs =
|
|||||||
; tasmota32-ir
|
; tasmota32-ir
|
||||||
; tasmota32-ircustom
|
; tasmota32-ircustom
|
||||||
; tasmota32solo1
|
; tasmota32solo1
|
||||||
|
; tasmota32c3
|
||||||
; tasmota32s2
|
; tasmota32s2
|
||||||
; tasmota32-odroidgo
|
; tasmota32-odroidgo
|
||||||
; tasmota32-core2
|
; tasmota32-core2
|
||||||
@ -175,15 +176,38 @@ build_flags = ${common32.build_flags}
|
|||||||
extends = env:tasmota32_base
|
extends = env:tasmota32_base
|
||||||
board = esp32s2
|
board = esp32s2
|
||||||
board_build.flash_mode = qio
|
board_build.flash_mode = qio
|
||||||
platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/arduino-esp32/releases/download/esp32-2.0.0-pre/esp32-2.0.0-pre.zip
|
platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/v.2.0.0.pre/framework-arduinoespressif32-master-cf457d412.tar.gz
|
||||||
platformio/tool-mklittlefs @ ~1.203.200522
|
platformio/tool-mklittlefs @ ~1.203.200522
|
||||||
platformio/tool-esptoolpy @ ~1.30000.0
|
platformio/tool-esptoolpy @ ~1.30000.0
|
||||||
build_unflags = ${esp32_defaults.build_unflags}
|
build_unflags = ${esp32_defaults.build_unflags}
|
||||||
build_flags = ${common32.build_flags}
|
build_flags = ${common32.build_flags} -DFIRMWARE_LITE
|
||||||
|
lib_extra_dirs = lib/libesp32
|
||||||
|
lib_ignore =
|
||||||
|
NimBLE-Arduino
|
||||||
|
Micro-RTSP
|
||||||
|
ESP32-HomeKit
|
||||||
|
|
||||||
|
|
||||||
|
; *** EXPERIMENTAL Tasmota version for ESP32-C3
|
||||||
|
[env:tasmota32c3]
|
||||||
|
extends = env:tasmota32_base
|
||||||
|
board = esp32c3
|
||||||
|
platform = https://github.com/Jason2866/platform-espressif32.git#feature/arduino-c3
|
||||||
|
platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/v.2.0.0.pre/framework-arduinoespressif32-master-cf457d412.tar.gz
|
||||||
|
; needed toolchain for Windows
|
||||||
|
toolchain-riscv32 @ https://github.com/Jason2866/platform-espressif32/releases/download/8.4.0/riscv32-esp-elf-gcc8_4_0-crosstool-ng-1.24.0-123-g64eb9ff-win32.zip
|
||||||
|
; needed toolchain for Linux
|
||||||
|
;toolchain-riscv32 @ https://github.com/Jason2866/platform-espressif32/releases/download/8.4.0/riscv32-esp-elf-gcc8_4_0-crosstool-ng-1.24.0-123-g64eb9ff-linux-amd64.tar.gz
|
||||||
|
; needed toolchain for MacOS
|
||||||
|
;toolchain-riscv32 @ https://github.com/Jason2866/platform-espressif32/releases/download/8.4.0/riscv32-esp-elf-gcc8_4_0-crosstool-ng-1.24.0-123-g64eb9ff-macos.tar.gz
|
||||||
|
platformio/tool-mklittlefs @ ~1.203.200522
|
||||||
|
build_unflags = ${esp32_defaults.build_unflags} -mtarget-align
|
||||||
|
build_flags = ${esp32_defaults.build_flags} -DFIRMWARE_LITE
|
||||||
|
;-DESP32_STAGE=true
|
||||||
|
lib_extra_dirs = lib/libesp32
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
NimBLE-Arduino
|
NimBLE-Arduino
|
||||||
Micro-RTSP
|
Micro-RTSP
|
||||||
ESP32 Ethernet
|
|
||||||
|
|
||||||
; *** EXPERIMENTAL Tasmota version for Arduino ESP32 IDF4.4. Linking not working.
|
; *** EXPERIMENTAL Tasmota version for Arduino ESP32 IDF4.4. Linking not working.
|
||||||
[env:tasmota32idf4]
|
[env:tasmota32idf4]
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
; *** expect the unexpected. Some features not working!!! ***
|
; *** expect the unexpected. Some features not working!!! ***
|
||||||
|
|
||||||
[common32]
|
[common32]
|
||||||
|
framework = ${common.framework}
|
||||||
platform = ${core32.platform}
|
platform = ${core32.platform}
|
||||||
platform_packages = ${core32.platform_packages}
|
platform_packages = ${core32.platform_packages}
|
||||||
build_unflags = ${core32.build_unflags}
|
build_unflags = ${core32.build_unflags}
|
||||||
@ -9,7 +10,6 @@ build_flags = ${core32.build_flags}
|
|||||||
board = esp32dev
|
board = esp32dev
|
||||||
board_build.filesystem = ${common.board_build.filesystem}
|
board_build.filesystem = ${common.board_build.filesystem}
|
||||||
custom_unpack_dir = ${common.custom_unpack_dir}
|
custom_unpack_dir = ${common.custom_unpack_dir}
|
||||||
board_build.ldscript = esp32_out.ld
|
|
||||||
board_build.partitions = esp32_partition_app1856k_spiffs320k.csv
|
board_build.partitions = esp32_partition_app1856k_spiffs320k.csv
|
||||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||||
board_build.f_flash = ${common.board_build.f_flash}
|
board_build.f_flash = ${common.board_build.f_flash}
|
||||||
|
@ -2,9 +2,8 @@
|
|||||||
platform = ${common.platform}
|
platform = ${common.platform}
|
||||||
platform_packages = ${common.platform_packages}
|
platform_packages = ${common.platform_packages}
|
||||||
framework = ${common.framework}
|
framework = ${common.framework}
|
||||||
board = ${common.board}
|
board = ${esp82xx_defaults.board}
|
||||||
board_build.filesystem = ${common.board_build.filesystem}
|
board_build.filesystem = ${common.board_build.filesystem}
|
||||||
board_build.ldscript = ${common.board_build.ldscript}
|
|
||||||
board_build.flash_mode = ${common.board_build.flash_mode}
|
board_build.flash_mode = ${common.board_build.flash_mode}
|
||||||
board_build.f_flash = ${common.board_build.f_flash}
|
board_build.f_flash = ${common.board_build.f_flash}
|
||||||
board_build.f_cpu = ${common.board_build.f_cpu}
|
board_build.f_cpu = ${common.board_build.f_cpu}
|
||||||
|
@ -3,7 +3,6 @@ framework = ${common.framework}
|
|||||||
platform = ${common32.platform}
|
platform = ${common32.platform}
|
||||||
platform_packages = ${common32.platform_packages}
|
platform_packages = ${common32.platform_packages}
|
||||||
board = ${common32.board}
|
board = ${common32.board}
|
||||||
board_build.ldscript = ${common32.board_build.ldscript}
|
|
||||||
board_build.partitions = ${common32.board_build.partitions}
|
board_build.partitions = ${common32.board_build.partitions}
|
||||||
board_build.flash_mode = ${common32.board_build.flash_mode}
|
board_build.flash_mode = ${common32.board_build.flash_mode}
|
||||||
board_build.f_flash = ${common32.board_build.f_flash}
|
board_build.f_flash = ${common32.board_build.f_flash}
|
||||||
|
@ -25,10 +25,11 @@ E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F
|
|||||||
29,80
|
29,80
|
||||||
:o,28
|
:o,28
|
||||||
:O,29
|
:O,29
|
||||||
:A,2A,2B,2C
|
:A,2A,2B,2C,16
|
||||||
:R,36
|
:R,36
|
||||||
:0,48,00,00,00
|
:0,48,00,00,00
|
||||||
:1,28,00,00,01
|
:1,28,00,00,01
|
||||||
:2,88,00,00,02
|
:2,88,00,00,02
|
||||||
:3,E8,00,00,02
|
:3,E8,00,00,03
|
||||||
|
:i,20,21
|
||||||
#
|
#
|
||||||
|
@ -26,11 +26,12 @@ E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F
|
|||||||
29,80
|
29,80
|
||||||
:o,28
|
:o,28
|
||||||
:O,29
|
:O,29
|
||||||
:A,2A,2B,2C
|
:A,2A,2B,2C,16
|
||||||
:R,36
|
:R,36
|
||||||
:0,08,00,00,00
|
:0,08,00,00,00
|
||||||
:1,A8,00,00,01
|
:1,A8,00,00,01
|
||||||
:2,C8,00,00,02
|
:2,C8,00,00,02
|
||||||
:3,68,00,00,03
|
:3,68,00,00,03
|
||||||
|
:i,21,20
|
||||||
:TI2,38,22,21
|
:TI2,38,22,21
|
||||||
#
|
#
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
:H,ILI9488,480,320,16,SPI,1,*,*,*,*,*,*,-1,10
|
:H,ILI9488,480,320,16,SPI,1,*,*,*,*,*,*,*,10
|
||||||
:S,2,1,1,0,40,20
|
:S,2,1,1,0,40,20
|
||||||
:I
|
:I
|
||||||
E0,0F,00,03,09,08,16,0A,3F,78,4C,09,0A,08,16,1A,0F
|
E0,0F,00,03,09,08,16,0A,3F,78,4C,09,0A,08,16,1A,0F
|
||||||
@ -18,7 +18,7 @@ F7,4,A9,51,2C,82
|
|||||||
29,0
|
29,0
|
||||||
:o,28
|
:o,28
|
||||||
:O,29
|
:O,29
|
||||||
:A,2A,2B,2C
|
:A,2A,2B,2C,16
|
||||||
:R,36
|
:R,36
|
||||||
;:0,48,00,00,00
|
;:0,48,00,00,00
|
||||||
:0,28,00,00,01
|
:0,28,00,00,01
|
||||||
@ -26,5 +26,6 @@ F7,4,A9,51,2C,82
|
|||||||
:2,E8,00,00,03
|
:2,E8,00,00,03
|
||||||
:3,88,00,00,02
|
:3,88,00,00,02
|
||||||
:P,18
|
:P,18
|
||||||
:TI1,38,4,5
|
:i,20,21
|
||||||
|
:TI1,38,*,*
|
||||||
#
|
#
|
||||||
|
24
tasmota/displaydesc/SD1306_desc.txt
Normal file
24
tasmota/displaydesc/SD1306_desc.txt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
:H,SD1306,128,64,1,I2C,3c,*,*,*
|
||||||
|
:S,0,2,1,0,30,20
|
||||||
|
:I
|
||||||
|
AE
|
||||||
|
D5,80
|
||||||
|
A8,3f
|
||||||
|
D3,00
|
||||||
|
40
|
||||||
|
8D,14
|
||||||
|
20,00
|
||||||
|
A1
|
||||||
|
C8
|
||||||
|
DA,12
|
||||||
|
81,9F
|
||||||
|
D9F1
|
||||||
|
DB,40
|
||||||
|
A4
|
||||||
|
A6
|
||||||
|
AF
|
||||||
|
:o,AE
|
||||||
|
:O,AF
|
||||||
|
:A,00,10,40,00,00
|
||||||
|
:i,A6,A7
|
||||||
|
#
|
@ -19,5 +19,6 @@ A6
|
|||||||
AF
|
AF
|
||||||
:o,AE
|
:o,AE
|
||||||
:O,AF
|
:O,AF
|
||||||
:A,00,10,40
|
:A,00,10,40,00,02
|
||||||
|
:i,A6,A7
|
||||||
#
|
#
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
:H,SSD1351,128,128,16,SPI,1,*,*,*,-1,-1,-1,-1,10
|
:H,SSD1351,128,128,16,SPI,1,*,*,*,*,*,*,*,10
|
||||||
:S,1,1,1,0,40,10
|
:S,1,1,1,0,40,10
|
||||||
:I
|
:I
|
||||||
FD,1,12
|
FD,1,12
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
:H,ST7789,240,240,16,SPI,1,*,*,*,*,*,-1,-1,40
|
:H,ST7789,240,240,16,SPI,1,*,*,*,*,*,*,*,40
|
||||||
:S,2,1,3,0,80,30
|
:S,2,1,3,0,80,30
|
||||||
:I
|
:I
|
||||||
01,A0
|
01,A0
|
||||||
@ -17,5 +17,6 @@
|
|||||||
:1,A0,50,00,01
|
:1,A0,50,00,01
|
||||||
:2,00,00,00,02
|
:2,00,00,00,02
|
||||||
:3,60,00,00,03
|
:3,60,00,00,03
|
||||||
|
i:20,21
|
||||||
:TI2,38,32,23
|
:TI2,38,32,23
|
||||||
#
|
#
|
||||||
|
17
tasmota/displaydesc/WS_epaper29_desc.txt
Normal file
17
tasmota/displaydesc/WS_epaper29_desc.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
H,E-PAPER-29,128,296,1,SPI,1,*,*,*,*,*,*,*,10
|
||||||
|
:S,1,1,1,0,10,10
|
||||||
|
:I
|
||||||
|
01,3,27,01,00
|
||||||
|
0C,3,D7,D6,9D
|
||||||
|
2C,1,A8
|
||||||
|
3A,1,1A
|
||||||
|
3B,1,08
|
||||||
|
11,1,03
|
||||||
|
:L
|
||||||
|
02,02,01,11,12,12,22,22,66,69,69,59,58,99,99
|
||||||
|
88,00,00,00,00,F8,B4,13,51,35,51,51,19,01,00
|
||||||
|
:l
|
||||||
|
10,18,18,08,18,18,08,00,00,00,00,00,00,00,00
|
||||||
|
00,00,00,00,00,13,14,44,12,00,00,00,00,00,00
|
||||||
|
:T,350,35,10
|
||||||
|
#
|
19
tasmota/displaydesc/readme.md
Normal file
19
tasmota/displaydesc/readme.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Display Descriptor files for use with universal display driver.
|
||||||
|
2 (3) options to select a display driver
|
||||||
|
|
||||||
|
1. file system driven if UFILESYSTEM is in place (preferred option for normal use)
|
||||||
|
to select a display rename the file to "dispdesc.txt" and put into flash file system.
|
||||||
|
2. scripter driven as a special section >d in scripter.
|
||||||
|
copy the file to a script section >d and place a ->displayreinit cmd into the >B section
|
||||||
|
(preferred for developing or modifying display driver)
|
||||||
|
3. rule buffer 3 driven
|
||||||
|
copy descriptor to rule buffer number 3 but do not enable rule 3
|
||||||
|
(descriptor may not contain ANY spaces in this mode)
|
||||||
|
(4.) compile the descriptor into driver.
|
||||||
|
convert the file to a const char array and place into source xdsp_universal.ino
|
||||||
|
and replace the example array there + #define DSP_ROM_DESC
|
||||||
|
|
||||||
|
for further info about display descriptors read the tasmota docs display part.
|
||||||
|
|
||||||
|
the current files define the standard resolutions. if you change the resolution settings
|
||||||
|
sometimes you also have to change some register values in the init or address map section
|
@ -256,7 +256,7 @@
|
|||||||
#define D_CONFIGURATION "Einstellungen"
|
#define D_CONFIGURATION "Einstellungen"
|
||||||
#define D_INFORMATION "Informationen"
|
#define D_INFORMATION "Informationen"
|
||||||
#define D_FIRMWARE_UPGRADE "Firmware Update"
|
#define D_FIRMWARE_UPGRADE "Firmware Update"
|
||||||
#define D_MANAGEMENT "Consoles"
|
#define D_MANAGEMENT "Konsolen"
|
||||||
#define D_CONSOLE "Konsole"
|
#define D_CONSOLE "Konsole"
|
||||||
#define D_CONFIRM_RESTART "Wirklich neustarten?"
|
#define D_CONFIRM_RESTART "Wirklich neustarten?"
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
es-ES.h - localization for Spanish - Spain for Tasmota (translation also valid for all latinamerica)
|
es-ES.h - localization for Spanish - Spain for Tasmota (International Spanish valid for all latinamerica)
|
||||||
|
|
||||||
Copyright (C) 2021 Adrian Scillato
|
Copyright (C) 2021 Adrian Scillato
|
||||||
|
|
||||||
@ -28,7 +28,7 @@
|
|||||||
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
|
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
|
||||||
* Use online command Prefix to translate cmnd, stat and tele.
|
* Use online command Prefix to translate cmnd, stat and tele.
|
||||||
*
|
*
|
||||||
* Updated until v9.3.1.2
|
* Updated until v9.3.1.3
|
||||||
\*********************************************************************/
|
\*********************************************************************/
|
||||||
|
|
||||||
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||||
@ -256,7 +256,7 @@
|
|||||||
#define D_CONFIGURATION "Configuración"
|
#define D_CONFIGURATION "Configuración"
|
||||||
#define D_INFORMATION "Información"
|
#define D_INFORMATION "Información"
|
||||||
#define D_FIRMWARE_UPGRADE "Actualizar Firmware"
|
#define D_FIRMWARE_UPGRADE "Actualizar Firmware"
|
||||||
#define D_MANAGEMENT "Consoles"
|
#define D_MANAGEMENT "Consolas"
|
||||||
#define D_CONSOLE "Consola"
|
#define D_CONSOLE "Consola"
|
||||||
#define D_CONFIRM_RESTART "Confirmar Reinicio"
|
#define D_CONFIRM_RESTART "Confirmar Reinicio"
|
||||||
|
|
||||||
@ -926,9 +926,9 @@
|
|||||||
#define D_MANAGE_FILE_SYSTEM "Explorar Archivos"
|
#define D_MANAGE_FILE_SYSTEM "Explorar Archivos"
|
||||||
#define D_FS_SIZE "Tamaño"
|
#define D_FS_SIZE "Tamaño"
|
||||||
#define D_FS_FREE "Libre"
|
#define D_FS_FREE "Libre"
|
||||||
#define D_NEW_FILE "newfile.txt"
|
#define D_NEW_FILE "nuevo.txt"
|
||||||
#define D_CREATE_NEW_FILE "Create and edit new file"
|
#define D_CREATE_NEW_FILE "Crear y editar un archivo nuevo"
|
||||||
#define D_EDIT_FILE "Edit File"
|
#define D_EDIT_FILE "Editar Archivo"
|
||||||
|
|
||||||
//xsns_67_as3935.ino
|
//xsns_67_as3935.ino
|
||||||
#define D_AS3935_GAIN "Ganancia:"
|
#define D_AS3935_GAIN "Ganancia:"
|
||||||
@ -946,7 +946,7 @@
|
|||||||
#define D_AS3935_DISTDET "Perturbancia detectada"
|
#define D_AS3935_DISTDET "Perturbancia detectada"
|
||||||
#define D_AS3935_INTNOEV "Interrupción sin evento!"
|
#define D_AS3935_INTNOEV "Interrupción sin evento!"
|
||||||
#define D_AS3935_FLICKER "IRQ flicker!"
|
#define D_AS3935_FLICKER "IRQ flicker!"
|
||||||
#define D_AS3935_POWEROFF "Power Off"
|
#define D_AS3935_POWEROFF "Apagado"
|
||||||
#define D_AS3935_NOMESS "Escuchando..."
|
#define D_AS3935_NOMESS "Escuchando..."
|
||||||
#define D_AS3935_ON "Encendido"
|
#define D_AS3935_ON "Encendido"
|
||||||
#define D_AS3935_OFF "Apagado"
|
#define D_AS3935_OFF "Apagado"
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
|
* Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
|
||||||
* Use online command Prefix to translate cmnd, stat and tele.
|
* Use online command Prefix to translate cmnd, stat and tele.
|
||||||
*
|
*
|
||||||
* Updated until v9.3.1.3 - Last update 14.04.2021
|
* Updated until v9.3.1.3 - Last update 16.04.2021
|
||||||
\*********************************************************************/
|
\*********************************************************************/
|
||||||
|
|
||||||
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English)
|
||||||
@ -256,7 +256,7 @@
|
|||||||
#define D_CONFIGURATION "Impostazioni"
|
#define D_CONFIGURATION "Impostazioni"
|
||||||
#define D_INFORMATION "Informazioni"
|
#define D_INFORMATION "Informazioni"
|
||||||
#define D_FIRMWARE_UPGRADE "Aggiorna firmware"
|
#define D_FIRMWARE_UPGRADE "Aggiorna firmware"
|
||||||
#define D_MANAGEMENT "Consoles"
|
#define D_MANAGEMENT "Console"
|
||||||
#define D_CONSOLE "Console"
|
#define D_CONSOLE "Console"
|
||||||
#define D_CONFIRM_RESTART "Conferma riavvio"
|
#define D_CONFIRM_RESTART "Conferma riavvio"
|
||||||
|
|
||||||
@ -268,8 +268,8 @@
|
|||||||
#define D_CONFIGURE_OTHER "Altre impostazioni"
|
#define D_CONFIGURE_OTHER "Altre impostazioni"
|
||||||
#define D_CONFIRM_RESET_CONFIGURATION "Conferma ripristino impostazioni"
|
#define D_CONFIRM_RESET_CONFIGURATION "Conferma ripristino impostazioni"
|
||||||
#define D_RESET_CONFIGURATION "Impostazioni predefinite"
|
#define D_RESET_CONFIGURATION "Impostazioni predefinite"
|
||||||
#define D_BACKUP_CONFIGURATION "Backup impostazioni"
|
#define D_BACKUP_CONFIGURATION "Salva impostazioni"
|
||||||
#define D_RESTORE_CONFIGURATION "Ripristino impostazioni"
|
#define D_RESTORE_CONFIGURATION "Carica impostazioni"
|
||||||
#define D_MAIN_MENU "Menu principale"
|
#define D_MAIN_MENU "Menu principale"
|
||||||
|
|
||||||
#define D_MODULE_PARAMETERS "Parametri modulo"
|
#define D_MODULE_PARAMETERS "Parametri modulo"
|
||||||
|
@ -78,6 +78,27 @@ void *special_realloc(void *ptr, size_t size) {
|
|||||||
return realloc(ptr, size);
|
return realloc(ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String GetDeviceHardware(void) {
|
||||||
|
char buff[10];
|
||||||
|
// esptool.py get_efuses
|
||||||
|
uint32_t efuse1 = *(uint32_t*)(0x3FF00050);
|
||||||
|
uint32_t efuse2 = *(uint32_t*)(0x3FF00054);
|
||||||
|
// uint32_t efuse3 = *(uint32_t*)(0x3FF00058);
|
||||||
|
// uint32_t efuse4 = *(uint32_t*)(0x3FF0005C);
|
||||||
|
|
||||||
|
bool is_8285 = ( (efuse1 & (1 << 4)) || (efuse2 & (1 << 16)) );
|
||||||
|
if (is_8285 && (ESP.getFlashChipRealSize() > 1048576)) {
|
||||||
|
is_8285 = false; // ESP8285 can only have 1M flash
|
||||||
|
}
|
||||||
|
if (is_8285) {
|
||||||
|
strcpy_P(buff, PSTR("ESP8285"));
|
||||||
|
} else {
|
||||||
|
strcpy_P(buff, PSTR("ESP8266EX"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(buff);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
@ -96,6 +117,8 @@ void *special_realloc(void *ptr, size_t size) {
|
|||||||
#include "esp32/rom/rtc.h"
|
#include "esp32/rom/rtc.h"
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
||||||
#include "esp32s2/rom/rtc.h"
|
#include "esp32s2/rom/rtc.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
|
||||||
|
#include "esp32c3/rom/rtc.h"
|
||||||
#else
|
#else
|
||||||
#error Target CONFIG_IDF_TARGET is not supported
|
#error Target CONFIG_IDF_TARGET is not supported
|
||||||
#endif
|
#endif
|
||||||
@ -221,6 +244,8 @@ extern "C" {
|
|||||||
#include "esp32/rom/spi_flash.h"
|
#include "esp32/rom/spi_flash.h"
|
||||||
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
||||||
#include "esp32s2/rom/spi_flash.h"
|
#include "esp32s2/rom/spi_flash.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
|
||||||
|
#include "esp32c3/rom/spi_flash.h"
|
||||||
#else
|
#else
|
||||||
#error Target CONFIG_IDF_TARGET is not supported
|
#error Target CONFIG_IDF_TARGET is not supported
|
||||||
#endif
|
#endif
|
||||||
@ -476,43 +501,158 @@ float CpuTemperature(void) {
|
|||||||
return ConvertTemp(temperatureRead());
|
return ConvertTemp(temperatureRead());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32S2
|
||||||
|
#include "esp32s2/esp_efuse.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32S3
|
||||||
|
#include "esp32s3/esp_efuse.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||||
|
#include "esp32c3/esp_efuse.h"
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
String GetDeviceHardware(void) {
|
||||||
|
/*
|
||||||
|
Source: esp-idf esp_system.h and esptool
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CHIP_ESP32 = 1, //!< ESP32
|
||||||
|
CHIP_ESP32S2 = 2, //!< ESP32-S2
|
||||||
|
CHIP_ESP32S3 = 4, //!< ESP32-S3
|
||||||
|
CHIP_ESP32C3 = 5, //!< ESP32-C3
|
||||||
|
} esp_chip_model_t;
|
||||||
|
|
||||||
|
// Chip feature flags, used in esp_chip_info_t
|
||||||
|
#define CHIP_FEATURE_EMB_FLASH BIT(0) //!< Chip has embedded flash memory
|
||||||
|
#define CHIP_FEATURE_WIFI_BGN BIT(1) //!< Chip has 2.4GHz WiFi
|
||||||
|
#define CHIP_FEATURE_BLE BIT(4) //!< Chip has Bluetooth LE
|
||||||
|
#define CHIP_FEATURE_BT BIT(5) //!< Chip has Bluetooth Classic
|
||||||
|
|
||||||
|
// The structure represents information about the chip
|
||||||
|
typedef struct {
|
||||||
|
esp_chip_model_t model; //!< chip model, one of esp_chip_model_t
|
||||||
|
uint32_t features; //!< bit mask of CHIP_FEATURE_x feature flags
|
||||||
|
uint8_t cores; //!< number of CPU cores
|
||||||
|
uint8_t revision; //!< chip revision number
|
||||||
|
} esp_chip_info_t;
|
||||||
|
|
||||||
|
*/
|
||||||
|
esp_chip_info_t chip_info;
|
||||||
|
esp_chip_info(&chip_info);
|
||||||
|
|
||||||
|
uint32_t chip_model = chip_info.model;
|
||||||
|
uint32_t chip_revision = chip_info.revision;
|
||||||
|
// uint32_t chip_revision = ESP.getChipRevision();
|
||||||
|
bool rev3 = (3 == chip_revision);
|
||||||
|
// bool single_core = (1 == ESP.getChipCores());
|
||||||
|
bool single_core = (1 == chip_info.cores);
|
||||||
|
|
||||||
|
if (chip_model < 2) { // ESP32
|
||||||
|
#ifdef CONFIG_IDF_TARGET_ESP32
|
||||||
|
/* esptool:
|
||||||
|
def get_pkg_version(self):
|
||||||
|
word3 = self.read_efuse(3)
|
||||||
|
pkg_version = (word3 >> 9) & 0x07
|
||||||
|
pkg_version += ((word3 >> 2) & 0x1) << 3
|
||||||
|
return pkg_version
|
||||||
|
*/
|
||||||
|
uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG);
|
||||||
|
uint32_t pkg_version = chip_ver & 0x7;
|
||||||
|
|
||||||
|
switch (pkg_version) {
|
||||||
|
case 0:
|
||||||
|
if (single_core) { return F("ESP32-S0WDQ6"); }
|
||||||
|
else { return F("ESP32-D0WDQ6"); }
|
||||||
|
case 1:
|
||||||
|
if (single_core) { return F("ESP32-S0WD"); }
|
||||||
|
else { return F("ESP32-D0WD"); }
|
||||||
|
case 2: return F("ESP32-D2WD");
|
||||||
|
case 4: return F("ESP32-U4WDH");
|
||||||
|
case 5:
|
||||||
|
if (rev3) { return F("ESP32-PICO-V3"); }
|
||||||
|
else { return F("ESP32-PICO-D4"); }
|
||||||
|
case 6: return F("ESP32-PICO-V3-02");
|
||||||
|
}
|
||||||
|
#endif // CONFIG_IDF_TARGET_ESP32
|
||||||
|
return F("ESP32");
|
||||||
|
}
|
||||||
|
else if (2 == chip_model) { // ESP32-S2
|
||||||
|
#ifdef CONFIG_IDF_TARGET_ESP32S2
|
||||||
|
/* esptool:
|
||||||
|
def get_pkg_version(self):
|
||||||
|
num_word = 3
|
||||||
|
block1_addr = self.EFUSE_BASE + 0x044
|
||||||
|
word3 = self.read_reg(block1_addr + (4 * num_word))
|
||||||
|
pkg_version = (word3 >> 21) & 0x0F
|
||||||
|
return pkg_version
|
||||||
|
*/
|
||||||
|
uint32_t chip_ver = REG_GET_FIELD(EFUSE_RD_MAC_SPI_SYS_3_REG, EFUSE_PKG_VERSION);
|
||||||
|
uint32_t pkg_version = chip_ver & 0x7;
|
||||||
|
// uint32_t pkg_version = esp_efuse_get_pkg_ver();
|
||||||
|
|
||||||
|
switch (pkg_version) {
|
||||||
|
case 0: return F("ESP32-S2");
|
||||||
|
case 1: return F("ESP32-S2FH16");
|
||||||
|
case 2: return F("ESP32-S2FH32");
|
||||||
|
}
|
||||||
|
#endif // CONFIG_IDF_TARGET_ESP32S2
|
||||||
|
return F("ESP32-S2");
|
||||||
|
}
|
||||||
|
else if (4 == chip_model) { // ESP32-S3
|
||||||
|
return F("ESP32-S3");
|
||||||
|
}
|
||||||
|
else if (5 == chip_model) { // ESP32-C3
|
||||||
|
#ifdef CONFIG_IDF_TARGET_ESP32C3
|
||||||
|
/* esptool:
|
||||||
|
def get_pkg_version(self):
|
||||||
|
num_word = 3
|
||||||
|
block1_addr = self.EFUSE_BASE + 0x044
|
||||||
|
word3 = self.read_reg(block1_addr + (4 * num_word))
|
||||||
|
pkg_version = (word3 >> 21) & 0x0F
|
||||||
|
return pkg_version
|
||||||
|
*/
|
||||||
|
uint32_t chip_ver = REG_GET_FIELD(EFUSE_RD_MAC_SPI_SYS_3_REG, EFUSE_PKG_VERSION);
|
||||||
|
uint32_t pkg_version = chip_ver & 0x7;
|
||||||
|
// uint32_t pkg_version = esp_efuse_get_pkg_ver();
|
||||||
|
|
||||||
|
switch (pkg_version) {
|
||||||
|
case 0: return F("ESP32-C3");
|
||||||
|
}
|
||||||
|
#endif // CONFIG_IDF_TARGET_ESP32C3
|
||||||
|
return F("ESP32-C3");
|
||||||
|
}
|
||||||
|
else if (6 == chip_model) { // ESP32-S3(beta3)
|
||||||
|
return F("ESP32-S3(beta3)");
|
||||||
|
}
|
||||||
|
else if (7 == chip_model) { // ESP32-C6
|
||||||
|
#ifdef CONFIG_IDF_TARGET_ESP32C6
|
||||||
|
/* esptool:
|
||||||
|
def get_pkg_version(self):
|
||||||
|
num_word = 3
|
||||||
|
block1_addr = self.EFUSE_BASE + 0x044
|
||||||
|
word3 = self.read_reg(block1_addr + (4 * num_word))
|
||||||
|
pkg_version = (word3 >> 21) & 0x0F
|
||||||
|
return pkg_version
|
||||||
|
*/
|
||||||
|
uint32_t chip_ver = REG_GET_FIELD(EFUSE_RD_MAC_SPI_SYS_3_REG, EFUSE_PKG_VERSION);
|
||||||
|
uint32_t pkg_version = chip_ver & 0x7;
|
||||||
|
// uint32_t pkg_version = esp_efuse_get_pkg_ver();
|
||||||
|
|
||||||
|
switch (pkg_version) {
|
||||||
|
case 0: return F("ESP32-C6");
|
||||||
|
}
|
||||||
|
#endif // CONFIG_IDF_TARGET_ESP32C6
|
||||||
|
return F("ESP32-C6");
|
||||||
|
}
|
||||||
|
return F("ESP32");
|
||||||
|
}
|
||||||
|
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* ESP Support
|
* ESP Support
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
||||||
String GetDeviceHardware(void) {
|
|
||||||
char buff[10];
|
|
||||||
#ifdef ESP8266
|
|
||||||
// esptool.py get_efuses
|
|
||||||
uint32_t efuse1 = *(uint32_t*)(0x3FF00050);
|
|
||||||
uint32_t efuse2 = *(uint32_t*)(0x3FF00054);
|
|
||||||
// uint32_t efuse3 = *(uint32_t*)(0x3FF00058);
|
|
||||||
// uint32_t efuse4 = *(uint32_t*)(0x3FF0005C);
|
|
||||||
|
|
||||||
bool is_8285 = ( (efuse1 & (1 << 4)) || (efuse2 & (1 << 16)) );
|
|
||||||
if (is_8285 && (ESP.getFlashChipRealSize() > 1048576)) {
|
|
||||||
is_8285 = false; // ESP8285 can only have 1M flash
|
|
||||||
}
|
|
||||||
if (is_8285) {
|
|
||||||
strcpy_P(buff, PSTR("ESP8285"));
|
|
||||||
} else {
|
|
||||||
strcpy_P(buff, PSTR("ESP8266EX"));
|
|
||||||
}
|
|
||||||
#endif // ESP8266
|
|
||||||
|
|
||||||
#ifdef ESP32
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
|
|
||||||
strcpy_P(buff, PSTR("ESP32-S2"));
|
|
||||||
#else
|
|
||||||
strcpy_P(buff, PSTR("ESP32"));
|
|
||||||
#endif // CONFIG_IDF_TARGET_ESP32S2
|
|
||||||
#endif // ESP32
|
|
||||||
|
|
||||||
return String(buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ESP_getFreeHeap1024(void) {
|
uint32_t ESP_getFreeHeap1024(void) {
|
||||||
return ESP_getFreeHeap() / 1024;
|
return ESP_getFreeHeap() / 1024;
|
||||||
}
|
}
|
||||||
|
@ -87,8 +87,10 @@ const uint16_t VL53L0X_MAX_SENSORS = 8; // Max number of VL53L0X sensors
|
|||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
const uint8_t MAX_I2C = 2; // Max number of I2C controllers (ESP32 = 2)
|
const uint8_t MAX_I2C = 2; // Max number of I2C controllers (ESP32 = 2)
|
||||||
|
const uint8_t MAX_SPI = 2; // Max number of Hardware SPI controllers (ESP32 = 2)
|
||||||
#else
|
#else
|
||||||
const uint8_t MAX_I2C = 0; // Max number of I2C controllers (ESP8266 = 0, no choice)
|
const uint8_t MAX_I2C = 0; // Max number of I2C controllers (ESP8266 = 0, no choice)
|
||||||
|
const uint8_t MAX_SPI = 0; // Max number of Hardware SPI controllers (ESP8266 = 0, no choice)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Changes to the following MAX_ defines need to be in line with enum SettingsTextIndex
|
// Changes to the following MAX_ defines need to be in line with enum SettingsTextIndex
|
||||||
|
@ -407,11 +407,11 @@ const uint16_t kGpioNiceList[] PROGMEM = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SPI
|
#ifdef USE_SPI
|
||||||
AGPIO(GPIO_SPI_MISO), // SPI MISO
|
AGPIO(GPIO_SPI_MISO) + MAX_SPI, // SPI MISO
|
||||||
AGPIO(GPIO_SPI_MOSI), // SPI MOSI
|
AGPIO(GPIO_SPI_MOSI) + MAX_SPI, // SPI MOSI
|
||||||
AGPIO(GPIO_SPI_CLK), // SPI Clk
|
AGPIO(GPIO_SPI_CLK) + MAX_SPI, // SPI Clk
|
||||||
AGPIO(GPIO_SPI_CS), // SPI Chip Select
|
AGPIO(GPIO_SPI_CS) + MAX_SPI, // SPI Chip Select
|
||||||
AGPIO(GPIO_SPI_DC), // SPI Data Direction
|
AGPIO(GPIO_SPI_DC) + MAX_SPI, // SPI Data Direction
|
||||||
#ifdef USE_NRF24
|
#ifdef USE_NRF24
|
||||||
AGPIO(GPIO_NRF24_CS),
|
AGPIO(GPIO_NRF24_CS),
|
||||||
AGPIO(GPIO_NRF24_DC),
|
AGPIO(GPIO_NRF24_DC),
|
||||||
|
@ -20,9 +20,6 @@
|
|||||||
#ifndef _USER_CONFIG_OVERRIDE_H_
|
#ifndef _USER_CONFIG_OVERRIDE_H_
|
||||||
#define _USER_CONFIG_OVERRIDE_H_
|
#define _USER_CONFIG_OVERRIDE_H_
|
||||||
|
|
||||||
// force the compiler to show a warning to confirm that this file is included
|
|
||||||
#warning **** user_config_override.h: Using Settings from this File ****
|
|
||||||
|
|
||||||
/*****************************************************************************************************\
|
/*****************************************************************************************************\
|
||||||
* USAGE:
|
* USAGE:
|
||||||
* To modify the stock configuration without changing the my_user_config.h file:
|
* To modify the stock configuration without changing the my_user_config.h file:
|
||||||
|
@ -2359,7 +2359,7 @@ void HandleInformation(void)
|
|||||||
#endif // USE_DISCOVERY
|
#endif // USE_DISCOVERY
|
||||||
|
|
||||||
WSContentSend_P(PSTR("}1}2 ")); // Empty line
|
WSContentSend_P(PSTR("}1}2 ")); // Empty line
|
||||||
WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d"), ESP_getChipId());
|
WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardware().c_str());
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP.getFlashChipId());
|
WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP.getFlashChipId());
|
||||||
#endif
|
#endif
|
||||||
|
@ -588,15 +588,15 @@ const char UFS_FORM_SDC_HREFedit[] PROGMEM =
|
|||||||
"<a href=ufse?file=%s/%s>📝</a>"; // 📝
|
"<a href=ufse?file=%s/%s>📝</a>"; // 📝
|
||||||
|
|
||||||
const char HTTP_EDITOR_FORM_START[] PROGMEM =
|
const char HTTP_EDITOR_FORM_START[] PROGMEM =
|
||||||
"<fieldset><legend><b> " D_EDIT_FILE " </b></legend>"
|
"<fieldset><legend><b> " D_EDIT_FILE " </b></legend>"
|
||||||
"<form>"
|
"<form>"
|
||||||
"<label for='name'>" D_FILE ":</label><input type='text' id='name' name='name' value='%s'><br><hr width='98%%'>"
|
"<label for='name'>" D_FILE ":</label><input type='text' id='name' name='name' value='%s'><br><hr width='98%%'>"
|
||||||
"<textarea id='content' name='content' rows='8' cols='80' style='font-size: 12pt'>";
|
"<textarea id='content' name='content' rows='8' cols='80' style='font-size: 12pt'>";
|
||||||
|
|
||||||
const char HTTP_EDITOR_FORM_END[] PROGMEM =
|
const char HTTP_EDITOR_FORM_END[] PROGMEM =
|
||||||
"</textarea>"
|
"</textarea>"
|
||||||
"<button name='save' type='submit' formmethod='post' formenctype='multipart/form-data' formaction='/ufse' class='button bgrn'>" D_SAVE "</button>"
|
"<button name='save' type='submit' formmethod='post' formenctype='multipart/form-data' formaction='/ufse' class='button bgrn'>" D_SAVE "</button>"
|
||||||
"</form></fieldset>";
|
"</form></fieldset>";
|
||||||
|
|
||||||
#endif // #ifdef GUI_EDIT_FILE
|
#endif // #ifdef GUI_EDIT_FILE
|
||||||
|
|
||||||
@ -905,7 +905,6 @@ void UfsUploadFileClose(void) {
|
|||||||
ufs_upload_file.close();
|
ufs_upload_file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//******************************************************************************************
|
//******************************************************************************************
|
||||||
// File Editor
|
// File Editor
|
||||||
//******************************************************************************************
|
//******************************************************************************************
|
||||||
@ -917,45 +916,44 @@ void UfsEditor(void) {
|
|||||||
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor GET"));
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor GET"));
|
||||||
|
|
||||||
String fname;
|
char fname_input[UFS_FILENAME_SIZE];
|
||||||
if (Webserver->hasArg(F("file"))) {
|
if (Webserver->hasArg(F("file"))) {
|
||||||
fname = Webserver->arg(F("file"));
|
WebGetArg(PSTR("file"), fname_input, sizeof(fname_input));
|
||||||
|
} else {
|
||||||
|
snprintf_P(fname_input, sizeof(fname_input), PSTR(D_NEW_FILE));
|
||||||
}
|
}
|
||||||
else {
|
char fname[UFS_FILENAME_SIZE];
|
||||||
fname = D_NEW_FILE;
|
UfsFilename(fname, fname_input); // Trim spaces and add slash
|
||||||
}
|
|
||||||
if (fname[0] != '/') fname = "/" +fname;
|
|
||||||
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file=%s, ffs_type=%d, TfsFileExist=%d"), fname.c_str(), ffs_type, TfsFileExists(fname.c_str()));
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file=%s, ffs_type=%d, TfsFileExist=%d"), fname, ffs_type, TfsFileExists(fname));
|
||||||
|
|
||||||
WSContentStart_P(PSTR(D_EDIT_FILE));
|
WSContentStart_P(PSTR(D_EDIT_FILE));
|
||||||
WSContentSendStyle();
|
WSContentSendStyle();
|
||||||
WSContentSend_P(HTTP_EDITOR_FORM_START, fname.c_str());
|
char *bfname = fname +1;
|
||||||
|
WSContentSend_P(HTTP_EDITOR_FORM_START, bfname); // Skip leading slash
|
||||||
|
|
||||||
if (ffs_type && TfsFileExists(fname.c_str())) {
|
if (ffs_type && TfsFileExists(fname)) {
|
||||||
File fp = ffsp->open(fname.c_str(), "r");
|
File fp = ffsp->open(fname, "r");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file open failed"));
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file open failed"));
|
||||||
WSContentSend_P(D_NEW_FILE);
|
WSContentSend_P(D_NEW_FILE);
|
||||||
|
} else {
|
||||||
|
uint8_t *buf = (uint8_t*)malloc(FILE_BUFFER_SIZE+1);
|
||||||
|
size_t filelen = fp.size();
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file len=%d"), filelen);
|
||||||
|
while (filelen > 0) {
|
||||||
|
size_t l = fp.read(buf, FILE_BUFFER_SIZE);
|
||||||
|
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("UFS: UfsEditor: read=%d"), l);
|
||||||
|
if (l < 0) { break; }
|
||||||
|
buf[l] = '\0';
|
||||||
|
WSContentSend_P((const char*)buf);
|
||||||
|
filelen -= l;
|
||||||
|
}
|
||||||
|
fp.close();
|
||||||
|
free(buf);
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: read done"));
|
||||||
}
|
}
|
||||||
else {
|
} else {
|
||||||
uint8_t *buf = (uint8_t*)malloc(FILE_BUFFER_SIZE+1);
|
|
||||||
size_t filelen = fp.size();
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file len=%d"), filelen);
|
|
||||||
while ( filelen > 0 ) {
|
|
||||||
size_t l = fp.read(buf, FILE_BUFFER_SIZE);
|
|
||||||
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("UFS: UfsEditor: read=%d"), l);
|
|
||||||
if (l < 0) break;
|
|
||||||
buf[l] = '\0';
|
|
||||||
WSContentSend_P((const char*)buf);
|
|
||||||
filelen -= l;
|
|
||||||
}
|
|
||||||
fp.close();
|
|
||||||
free(buf);
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: read done"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WSContentSend_P(D_NEW_FILE);
|
WSContentSend_P(D_NEW_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -974,8 +972,12 @@ void UfsEditorUpload(void) {
|
|||||||
WSSend(400, CT_PLAIN, F("400: Bad request - no filename"));
|
WSSend(400, CT_PLAIN, F("400: Bad request - no filename"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String name = Webserver->arg("name");
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file '%s'"), name.c_str());
|
char fname_input[UFS_FILENAME_SIZE];
|
||||||
|
WebGetArg(PSTR("name"), fname_input, sizeof(fname_input));
|
||||||
|
char fname[UFS_FILENAME_SIZE];
|
||||||
|
UfsFilename(fname, fname_input); // Trim spaces and add slash
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: UfsEditor: file '%s'"), fname);
|
||||||
|
|
||||||
if (!Webserver->hasArg("content")) {
|
if (!Webserver->hasArg("content")) {
|
||||||
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: file upload - no content"));
|
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: file upload - no content"));
|
||||||
@ -991,10 +993,10 @@ void UfsEditorUpload(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
File fp = ffsp->open(name.c_str(), "w");
|
File fp = ffsp->open(fname, "w");
|
||||||
if(!fp) {
|
if (!fp) {
|
||||||
Web.upload_error = 1;
|
Web.upload_error = 1;
|
||||||
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: 400: invalid file name '%s'"), name.c_str());
|
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: 400: invalid file name '%s'"), fname);
|
||||||
WSSend(400, CT_PLAIN, F("400: bad request - invalid filename"));
|
WSSend(400, CT_PLAIN, F("400: bad request - invalid filename"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1005,7 +1007,7 @@ void UfsEditorUpload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!fp.print(content)) {
|
if (!fp.print(content)) {
|
||||||
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: write error on '%s'"), name.c_str());
|
AddLog(LOG_LEVEL_ERROR, PSTR("UFS: UfsEditor: write error on '%s'"), fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
fp.close();
|
fp.close();
|
||||||
@ -1014,7 +1016,7 @@ void UfsEditorUpload(void) {
|
|||||||
Webserver->send(303);
|
Webserver->send(303);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // #ifdef GUI_EDIT_FILE
|
#endif // GUI_EDIT_FILE
|
||||||
|
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ extern "C" {
|
|||||||
|
|
||||||
if (Light.device > 0) {
|
if (Light.device > 0) {
|
||||||
// we have a light
|
// we have a light
|
||||||
|
|
||||||
uint8_t channels[LST_MAX];
|
uint8_t channels[LST_MAX];
|
||||||
char s_rgb[8] = {0}; // RGB raw levels
|
char s_rgb[8] = {0}; // RGB raw levels
|
||||||
light_controller.calcLevels(channels);
|
light_controller.calcLevels(channels);
|
||||||
@ -207,7 +207,7 @@ extern "C" {
|
|||||||
// channels
|
// channels
|
||||||
if (map_find(vm, "channels")) {
|
if (map_find(vm, "channels")) {
|
||||||
if (be_isinstance(vm, -1)) {
|
if (be_isinstance(vm, -1)) {
|
||||||
be_getbuiltin(vm, "list"); // add "list" class
|
be_getbuiltin(vm, "list"); // add "list" class
|
||||||
if (be_isderived(vm, -2)) {
|
if (be_isderived(vm, -2)) {
|
||||||
be_pop(vm, 1); // remove "list" class from top
|
be_pop(vm, 1); // remove "list" class from top
|
||||||
int32_t list_size = get_list_size(vm);
|
int32_t list_size = get_list_size(vm);
|
||||||
@ -303,9 +303,9 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
int32_t l_getlight(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
int32_t l_getlight(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
||||||
int32_t l_setlight(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
int32_t l_setlight(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
||||||
int32_t gamma8(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
int32_t l_gamma8(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
||||||
int32_t gamma10(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
int32_t l_gamma10(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
||||||
int32_t reverse_gamma10(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
int32_t l_rev_gamma10(struct bvm *vm) __attribute__ ((weak, alias ("b_light_missing")));
|
||||||
#endif // #ifdef USE_LIGHT
|
#endif // #ifdef USE_LIGHT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,8 @@ const char DSP_SAMPLE_DESC[] PROGMEM =
|
|||||||
":o,AE\n"
|
":o,AE\n"
|
||||||
// switch display on
|
// switch display on
|
||||||
":O,AF\n"
|
":O,AF\n"
|
||||||
":A,00,10,40\n"
|
":A,00,10,40,00,02\n"
|
||||||
|
":i,A6,A7\n"
|
||||||
"#\n";
|
"#\n";
|
||||||
|
|
||||||
#endif // DSP_ROM_DESC
|
#endif // DSP_ROM_DESC
|
||||||
@ -117,6 +118,24 @@ char *fbuff;
|
|||||||
}
|
}
|
||||||
#endif // USE_SCRIPT
|
#endif // USE_SCRIPT
|
||||||
|
|
||||||
|
#ifdef USE_RULES
|
||||||
|
if (!bitRead(Settings.rule_enabled, 2) && !ddesc) {
|
||||||
|
// only if rule3 is not enabled for rules
|
||||||
|
char *cp = Settings.rules[2];
|
||||||
|
while (*cp == ' ') cp++;
|
||||||
|
memcpy(fbuff, cp, DISPDESC_SIZE - 1);
|
||||||
|
if (fbuff[0] == ':' && fbuff[1] == 'H') {
|
||||||
|
// assume display descriptor, replace space with line feed
|
||||||
|
for (uint32_t cnt = 0; cnt < DISPDESC_SIZE; cnt++) {
|
||||||
|
if (fbuff[cnt] == ' ') fbuff[cnt] = '\n';
|
||||||
|
}
|
||||||
|
ddesc = fbuff;
|
||||||
|
AddLog(LOG_LEVEL_INFO, PSTR("DSP: Rule 3 descriptor used"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // USE_RULES
|
||||||
|
|
||||||
|
|
||||||
#ifdef DSP_ROM_DESC
|
#ifdef DSP_ROM_DESC
|
||||||
if (!ddesc) {
|
if (!ddesc) {
|
||||||
@ -176,17 +195,16 @@ char *fbuff;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// init renderer
|
|
||||||
if (udisp) delete udisp;
|
|
||||||
udisp = new uDisplay(ddesc);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
File fp;
|
File fp;
|
||||||
fp = ffsp->open("/dump.txt", "w");
|
fp = ffsp->open("/dump.txt", "w");
|
||||||
fp.write((uint8_t*)ddesc, DISPDESC_SIZE);
|
fp.write((uint8_t*)ddesc, DISPDESC_SIZE);
|
||||||
fp.close();
|
fp.close();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// init renderer
|
||||||
|
if (udisp) delete udisp;
|
||||||
|
udisp = new uDisplay(ddesc);
|
||||||
|
|
||||||
// checck for touch option TI1 or TI2
|
// checck for touch option TI1 or TI2
|
||||||
#ifdef USE_FT5206
|
#ifdef USE_FT5206
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user