mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 11:16:34 +00:00
Merge branch 'development' into pre-release-9.3.0
This commit is contained in:
commit
5e3c1b6415
16
CHANGELOG.md
16
CHANGELOG.md
@ -3,10 +3,24 @@ All notable changes to this project will be documented in this file.
|
||||
|
||||
## [Released]
|
||||
|
||||
## [9.3.1] 20210223
|
||||
- Release Kenneth
|
||||
|
||||
## [9.3.0.1]
|
||||
### Changed
|
||||
- Remove the need to start filenames with a slash (/) in Ufs commands
|
||||
- Removed command ``VirtualCT`` as synonym for ``SetOption106`` (#11049)
|
||||
|
||||
### Fixed
|
||||
- Ili1942 driver (#11046)
|
||||
- Shutter driver (#11055)
|
||||
- ESP32 Mi32 driver (#11048)
|
||||
- TM1637 driver now needs ``TM1637 CLK`` and ``TM1637 DIO`` to enable (#11057)
|
||||
|
||||
## [9.3.0] 20210219
|
||||
- Release Kenneth
|
||||
|
||||
## [9.2.0.7]
|
||||
## [9.2.0.7] 20210219
|
||||
### Added
|
||||
- Support for Device Groups Device Map (#10898)
|
||||
- Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862)
|
||||
|
@ -78,6 +78,17 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
|
||||
|
||||
[Complete list](BUILDS.md) of available feature and sensors.
|
||||
|
||||
## Changelog v9.3.1 Kenneth
|
||||
### Changed
|
||||
- Remove the need to start filenames with a slash (/) in Ufs commands
|
||||
- Removed command ``VirtualCT`` as synonym for ``SetOption106`` [#11049](https://github.com/arendst/Tasmota/issues/11049)
|
||||
|
||||
### Fixed
|
||||
- Ili1942 driver [#11046](https://github.com/arendst/Tasmota/issues/11046)
|
||||
- Shutter driver [#11055](https://github.com/arendst/Tasmota/issues/11055)
|
||||
- ESP32 Mi32 driver [#11048](https://github.com/arendst/Tasmota/issues/11048)
|
||||
- TM1637 driver now needs ``TM1637 CLK`` and ``TM1637 DIO`` to enable [#11057](https://github.com/arendst/Tasmota/issues/11057)
|
||||
|
||||
## Changelog v9.3.0 Kenneth
|
||||
### Added
|
||||
- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311)
|
||||
@ -142,30 +153,3 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
|
||||
- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS``
|
||||
- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS``
|
||||
- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS``
|
||||
|
||||
### Changed
|
||||
- Remove support for direct migration from versions before v8.1.0 (Doris)
|
||||
- IRremoteESP8266 library from v2.7.14 to v2.7.15
|
||||
- NeoPixelBus library from v2.6.0 to v2.6.1.4
|
||||
- ILI9341 library from Adafruit_ILI9341-1.2.0-Tasmota-1.0 to ILI9341-gemu-1.0
|
||||
- Command ``Sleep 0`` removes any sleep from wifi modem except when ESP32 BLE is active
|
||||
- Logging from heap to stack freeing 700 bytes RAM
|
||||
- Disabled ``USE_LIGHT`` light support for ZBBridge saving 17.6kB [#10374](https://github.com/arendst/Tasmota/issues/10374)
|
||||
- Force initial default state ``SetOption57 1`` to scan wifi network every 44 minutes for strongest signal [#10395](https://github.com/arendst/Tasmota/issues/10395)
|
||||
- PubSubClient MQTT_SOCKET_TIMEOUT from 15 to 4 seconds
|
||||
- Domoticz fixed 2 decimals resolution by user selectable ``TempRes``, ``HumRes`` and ``PressRes`` resolutions
|
||||
- Increase number of button GPIOs from 4 to 8
|
||||
- ESP32 Increase number of switch GPIOs from 8 to 28
|
||||
- ESP32 increase number of relay GPIOs from 8 to 28
|
||||
- ESP32 Increase number of interlock groups from 4 to 14
|
||||
|
||||
### Fixed
|
||||
- Redesign syslog and mqttlog using log buffer [#10164](https://github.com/arendst/Tasmota/issues/10164)
|
||||
- Shutter stop issue [#10170](https://github.com/arendst/Tasmota/issues/10170)
|
||||
- Scripter script_sub_command [#10181](https://github.com/arendst/Tasmota/issues/10181)
|
||||
- Scripter JSON variable above 32 chars [#10193](https://github.com/arendst/Tasmota/issues/10193)
|
||||
- Shelly Dimmer power on state [#10154](https://github.com/arendst/Tasmota/issues/10154) [#10182](https://github.com/arendst/Tasmota/issues/10182)
|
||||
- Wemo emulation for single devices [#10165](https://github.com/arendst/Tasmota/issues/10165) [#10194](https://github.com/arendst/Tasmota/issues/10194)
|
||||
- ESP32 LoadStoreError when using ``#define USER_TEMPLATE`` [#9506](https://github.com/arendst/Tasmota/issues/9506)
|
||||
- Compile error when ``#ifdef USE_IR_RECEIVE`` is disabled regression from 9.1.0.2
|
||||
- Prometheus memory leak [#10221](https://github.com/arendst/Tasmota/issues/10221)
|
||||
|
@ -175,7 +175,7 @@ void ILI9341_2::writecmd(uint8_t d) {
|
||||
void ILI9341_2::init(uint16_t width, uint16_t height) {
|
||||
//sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3);
|
||||
|
||||
if (_hwspi == 2) {
|
||||
if (_hwspi >= 2) {
|
||||
iwidth = ILI9341_TFTWIDTH;
|
||||
iheight = ILI9341_TFTHEIGHT;
|
||||
} else {
|
||||
@ -187,8 +187,13 @@ void ILI9341_2::init(uint16_t width, uint16_t height) {
|
||||
|
||||
sspi2 = SPISettings(40000000, MSBFIRST, SPI_MODE0);
|
||||
|
||||
if (_hwspi==2) {
|
||||
spi2=&SPI;
|
||||
if (_hwspi >= 2) {
|
||||
spi2 = &SPI;
|
||||
#ifdef ESP32
|
||||
if (_hwspi > 2) {
|
||||
spi2->begin(_sclk, _miso, _mosi, -1);
|
||||
}
|
||||
#endif // ESP32
|
||||
} else {
|
||||
#ifdef ESP32
|
||||
if (_spibus == 2) {
|
||||
@ -406,17 +411,17 @@ void ILI9341_2::setRotation(uint8_t m) {
|
||||
_height = iheight;
|
||||
break;
|
||||
case 1:
|
||||
m = (MADCTL_MV | MADCTL_BGR);
|
||||
m = (MADCTL_MY | MADCTL_MV | MADCTL_BGR);
|
||||
_width = iheight;
|
||||
_height = iwidth;
|
||||
break;
|
||||
case 2:
|
||||
m = (MADCTL_MY | MADCTL_BGR);
|
||||
m = (MADCTL_MY | MADCTL_MX | MADCTL_BGR);
|
||||
_width = iwidth;
|
||||
_height = iheight;
|
||||
break;
|
||||
case 3:
|
||||
m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);
|
||||
m = (MADCTL_MX | MADCTL_MV | MADCTL_BGR);
|
||||
_width = iheight;
|
||||
_height = iwidth;
|
||||
break;
|
||||
@ -522,7 +527,7 @@ void ili9342_bpwr(uint8_t on);
|
||||
|
||||
void ILI9341_2::DisplayOnff(int8_t on) {
|
||||
|
||||
if (_hwspi==2) {
|
||||
if ((_hwspi >= 2) && (_bp < 0)) {
|
||||
ili9342_bpwr(on);
|
||||
}
|
||||
|
||||
@ -532,11 +537,11 @@ void ILI9341_2::DisplayOnff(int8_t on) {
|
||||
writecmd(ILI9341_2_DISPON);
|
||||
ILI9341_2_CS_HIGH
|
||||
SPI_END_TRANSACTION();
|
||||
if (_bp>=0) {
|
||||
if (_bp >= 0) {
|
||||
#ifdef ILI9341_2_DIMMER
|
||||
ledcWrite(ESP32_PWM_CHANNEL,dimmer);
|
||||
ledcWrite(ESP32_PWM_CHANNEL, dimmer);
|
||||
#else
|
||||
digitalWrite(_bp,HIGH);
|
||||
digitalWrite(_bp, HIGH);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
@ -545,20 +550,22 @@ void ILI9341_2::DisplayOnff(int8_t on) {
|
||||
writecmd(ILI9341_2_DISPOFF);
|
||||
ILI9341_2_CS_HIGH
|
||||
SPI_END_TRANSACTION();
|
||||
if (_bp>=0) {
|
||||
if (_bp >= 0) {
|
||||
#ifdef ILI9341_2_DIMMER
|
||||
ledcWrite(ESP32_PWM_CHANNEL,0);
|
||||
ledcWrite(ESP32_PWM_CHANNEL, 0);
|
||||
#else
|
||||
digitalWrite(_bp,LOW);
|
||||
digitalWrite(_bp, LOW);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ILI9341_2::invertDisplay(boolean i) {
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
ILI9341_2_CS_LOW
|
||||
writecmd(i ? ILI9341_2_INVON : ILI9341_2_INVOFF);
|
||||
ILI9341_2_CS_HIGH
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void ili9342_dimm(uint8_t dim);
|
||||
@ -572,7 +579,7 @@ void ILI9341_2::dim(uint8_t dim) {
|
||||
if (_bp>=0) {
|
||||
ledcWrite(ESP32_PWM_CHANNEL,dimmer);
|
||||
} else {
|
||||
if (_hwspi==2) {
|
||||
if (_hwspi>=2) {
|
||||
ili9342_dimm(dim);
|
||||
}
|
||||
}
|
||||
|
@ -433,7 +433,6 @@
|
||||
#define D_SO_POWERONFADE "PowerOnFade" // SO91
|
||||
#define D_SO_PWMCT "PWMCT" // SO92
|
||||
#define D_SO_WHITEBLEND "WhiteBlend" // SO105
|
||||
#define D_SO_VIRTUALCT "VirtualCT" // SO106
|
||||
#define D_CMND_CHANNEL "Channel"
|
||||
#define D_CMND_COLOR "Color"
|
||||
#define D_CMND_COLORTEMPERATURE "CT"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -637,9 +637,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -634,9 +634,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 RX"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 - RX"
|
||||
#define D_SENSOR_WE517_TX "WE517 - TX"
|
||||
#define D_SENSOR_WE517_RX "WE517 - RX"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 - CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 - DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 - STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 - CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 - DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 - CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 - DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 - STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 - SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 - DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -638,9 +638,11 @@
|
||||
#define D_SENSOR_SDM630_RX "SDM630 Rx"
|
||||
#define D_SENSOR_WE517_TX "WE517 Tx"
|
||||
#define D_SENSOR_WE517_RX "WE517 Rx"
|
||||
#define D_SENSOR_TM1638_CLK "TM16 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM16 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM16 STB"
|
||||
#define D_SENSOR_TM1637_CLK "TM1637 CLK"
|
||||
#define D_SENSOR_TM1637_DIO "TM1637 DIO"
|
||||
#define D_SENSOR_TM1638_CLK "TM1638 CLK"
|
||||
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
|
||||
#define D_SENSOR_TM1638_STB "TM1638 STB"
|
||||
#define D_SENSOR_HX711_SCK "HX711 SCK"
|
||||
#define D_SENSOR_HX711_DAT "HX711 DAT"
|
||||
#define D_SENSOR_FTC532 "FTC532"
|
||||
|
@ -149,6 +149,7 @@ enum UserSelectablePins {
|
||||
GPIO_WIEGAND_D0, GPIO_WIEGAND_D1, // Wiegand Data lines
|
||||
GPIO_NEOPOOL_TX, GPIO_NEOPOOL_RX, // Sugar Valley RS485 interface
|
||||
GPIO_SDM72_TX, GPIO_SDM72_RX, // SDM72 Serial interface
|
||||
GPIO_TM1637CLK, GPIO_TM1637DIO, // TM1637 interface
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
enum ProgramSelectablePins {
|
||||
@ -318,6 +319,7 @@ const char kSensorNames[] PROGMEM =
|
||||
D_SENSOR_WIEGAND_D0 "|" D_SENSOR_WIEGAND_D1 "|"
|
||||
D_SENSOR_NEOPOOL_TX "|" D_SENSOR_NEOPOOL_RX "|"
|
||||
D_SENSOR_SDM72_TX "|" D_SENSOR_SDM72_RX "|"
|
||||
D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|"
|
||||
;
|
||||
|
||||
const char kSensorNamesFixed[] PROGMEM =
|
||||
@ -431,9 +433,14 @@ const uint16_t kGpioNiceList[] PROGMEM = {
|
||||
AGPIO(GPIO_SSD1331_CS),
|
||||
AGPIO(GPIO_SSD1331_DC),
|
||||
#endif // USE_DISPLAY_SSD1331
|
||||
#ifdef USE_DISPLAY_TM1637
|
||||
AGPIO(GPIO_TM1637CLK),
|
||||
AGPIO(GPIO_TM1637DIO),
|
||||
#endif // USE_DISPLAY_TM1637
|
||||
AGPIO(GPIO_BACKLIGHT), // Display backlight control
|
||||
AGPIO(GPIO_OLED_RESET), // OLED Display Reset
|
||||
#endif
|
||||
#endif // USE_DISPLAY
|
||||
|
||||
#ifdef USE_MAX31865
|
||||
AGPIO(GPIO_SSPI_MAX31865_CS1) + MAX_MAX31865S,
|
||||
#endif
|
||||
|
@ -20,6 +20,6 @@
|
||||
#ifndef _TASMOTA_VERSION_H_
|
||||
#define _TASMOTA_VERSION_H_
|
||||
|
||||
const uint32_t VERSION = 0x09030000;
|
||||
const uint32_t VERSION = 0x09030100;
|
||||
|
||||
#endif // _TASMOTA_VERSION_H_
|
||||
|
@ -131,7 +131,7 @@ const uint8_t LIGHT_COLOR_SIZE = 25; // Char array scolor size
|
||||
const char kLightCommands[] PROGMEM = "|" // No prefix
|
||||
// SetOptions synonyms
|
||||
D_SO_CHANNELREMAP "|" D_SO_MULTIPWM "|" D_SO_ALEXACTRANGE "|" D_SO_POWERONFADE "|" D_SO_PWMCT "|"
|
||||
D_SO_WHITEBLEND "|" D_SO_VIRTUALCT "|"
|
||||
D_SO_WHITEBLEND "|"
|
||||
// Other commands
|
||||
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_DIMMER_RANGE "|" D_CMND_DIMMER_STEP "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
|
||||
D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|"
|
||||
@ -150,7 +150,7 @@ const char kLightCommands[] PROGMEM = "|" // No prefix
|
||||
|
||||
SO_SYNONYMS(kLightSynonyms,
|
||||
37, 68, 82, 91, 92,
|
||||
105, 106,
|
||||
105,
|
||||
);
|
||||
|
||||
void (* const LightCommand[])(void) PROGMEM = {
|
||||
|
@ -406,21 +406,16 @@ void ShutterDecellerateForStop(uint8_t i)
|
||||
case SHT_COUNTER:
|
||||
int16_t missing_steps;
|
||||
Shutter[i].accelerator = -(ShutterGlobal.open_velocity_max / (Shutter[i].motordelay>4 ? (Shutter[i].motordelay*11)/10 : 4) );
|
||||
while (Shutter[i].pwm_velocity > -2*Shutter[i].accelerator && Shutter[i].pwm_velocity > 100) {
|
||||
while (Shutter[i].pwm_velocity > -2*Shutter[i].accelerator || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].pwm_velocity > 100) ) {
|
||||
delay(50);
|
||||
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Velocity %ld, Delta %d"), Shutter[i].pwm_velocity, Shutter[i].accelerator );
|
||||
//Shutter[i].pwm_velocity = tmax(Shutter[i].pwm_velocity-Shutter[i].accelerator , 0);
|
||||
// Control will be done in RTC Ticker.
|
||||
|
||||
}
|
||||
if (ShutterGlobal.position_mode == SHT_COUNTER){
|
||||
missing_steps = ((Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) - RtcSettings.pulse_counter[i];
|
||||
//prepare for stop PWM
|
||||
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d, Counter %d, Freq %d"), missing_steps, RtcSettings.pulse_counter[i] ,Shutter[i].pwm_velocity);
|
||||
Shutter[i].accelerator = 0;
|
||||
Shutter[i].pwm_velocity = Shutter[i].pwm_velocity > 250 ? 250 : Shutter[i].pwm_velocity;
|
||||
analogWriteFreq(Shutter[i].pwm_velocity);
|
||||
analogWrite(Pin(GPIO_PWM1, i), 50);
|
||||
Shutter[i].pwm_velocity = 0;
|
||||
while (RtcSettings.pulse_counter[i] < (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) {
|
||||
}
|
||||
@ -496,7 +491,7 @@ void ShutterUpdatePosition(void)
|
||||
Shutter[i].time, toBeAcc, current_stop_way, Shutter[i].pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, Shutter[i].real_position,
|
||||
next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction);
|
||||
|
||||
if ( Shutter[i].real_position * Shutter[i].direction + 2*Shutter[i].pwm_velocity >= Shutter[i].target_position * Shutter[i].direction ) {
|
||||
if ( Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator<=100)) {
|
||||
if (Shutter[i].direction != 0) {
|
||||
Shutter[i].lastdirection = Shutter[i].direction;
|
||||
}
|
||||
|
@ -426,6 +426,14 @@ bool UfsExecuteCommandFile(const char *fname) {
|
||||
* Commands
|
||||
\*********************************************************************************************/
|
||||
|
||||
const int UFS_FILENAME_SIZE = 48;
|
||||
|
||||
char* UfsFilename(char* fname, char* fname_in) {
|
||||
fname_in = Trim(fname_in); // Remove possible leading spaces
|
||||
snprintf_P(fname, UFS_FILENAME_SIZE, PSTR("%s%s"), ('/' == fname_in[0]) ? "" : "/", fname_in);
|
||||
return fname;
|
||||
}
|
||||
|
||||
const char kUFSCommands[] PROGMEM = "Ufs|" // Prefix
|
||||
"|Type|Size|Free|Delete|Rename|Run";
|
||||
|
||||
@ -468,11 +476,13 @@ void UFSDelete(void) {
|
||||
// UfsDelete sdcard or flashfs file if only one of them available
|
||||
// UfsDelete2 flashfs file if available
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
char fname[UFS_FILENAME_SIZE];
|
||||
UfsFilename(fname, XdrvMailbox.data);
|
||||
bool result = false;
|
||||
if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) {
|
||||
result = TfsDeleteFile(XdrvMailbox.data);
|
||||
result = TfsDeleteFile(fname);
|
||||
} else {
|
||||
result = (ufs_type && ufsp->remove(XdrvMailbox.data));
|
||||
result = (ufs_type && ufsp->remove(fname));
|
||||
}
|
||||
if (!result) {
|
||||
ResponseCmndFailed();
|
||||
@ -487,13 +497,17 @@ void UFSRename(void) {
|
||||
// UfsRename2 flashfs file if available
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
bool result = false;
|
||||
const char *fname1 = strtok(XdrvMailbox.data, ",");
|
||||
const char *fname2 = strtok(nullptr, ",");
|
||||
char *fname1 = strtok(XdrvMailbox.data, ",");
|
||||
char *fname2 = strtok(nullptr, ",");
|
||||
if (fname1 && fname2) {
|
||||
char fname_old[UFS_FILENAME_SIZE];
|
||||
UfsFilename(fname_old, fname1);
|
||||
char fname_new[UFS_FILENAME_SIZE];
|
||||
UfsFilename(fname_new, fname2);
|
||||
if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) {
|
||||
result = TfsRenameFile(fname1, fname2);
|
||||
result = TfsRenameFile(fname_old, fname_new);
|
||||
} else {
|
||||
result = (ufs_type && ufsp->rename(fname1, fname2));
|
||||
result = (ufs_type && ufsp->rename(fname_old, fname_new));
|
||||
}
|
||||
}
|
||||
if (!result) {
|
||||
@ -506,7 +520,8 @@ void UFSRename(void) {
|
||||
|
||||
void UFSRun(void) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
if (UfsExecuteCommandFile(XdrvMailbox.data)) {
|
||||
char fname[UFS_FILENAME_SIZE];
|
||||
if (UfsExecuteCommandFile(UfsFilename(fname, XdrvMailbox.data))) {
|
||||
ResponseClear();
|
||||
} else {
|
||||
ResponseCmndFailed();
|
||||
|
@ -42,7 +42,7 @@ bool tft_init_done = false;
|
||||
void ILI9341_InitDriver()
|
||||
{
|
||||
|
||||
#ifdef USE_M5STACK_CORE2
|
||||
#if (defined(USE_M5STACK_CORE2) || defined(USE_M5STACK_CORE_BASIC))
|
||||
if (TasmotaGlobal.spi_enabled) {
|
||||
#else
|
||||
// There are displays without CS
|
||||
@ -65,7 +65,7 @@ void ILI9341_InitDriver()
|
||||
#ifdef USE_DISPLAY_ILI9341
|
||||
uint8_t dtype = 1;
|
||||
#else
|
||||
uint8_t dtype = 2;
|
||||
uint8_t dtype = 3; // sign ili9342 with variable spi pins
|
||||
#endif // USE_DISPLAY_ILI9341
|
||||
|
||||
// default colors
|
||||
@ -75,6 +75,9 @@ void ILI9341_InitDriver()
|
||||
#ifdef USE_M5STACK_CORE2
|
||||
// fixed pins on m5stack core2
|
||||
ili9341_2 = new ILI9341_2(5, -2, 15, -2);
|
||||
#elif defined(USE_M5STACK_CORE_BASIC)
|
||||
// int8_t cs, int8_t res, int8_t dc, int8_t bp)
|
||||
ili9341_2 = new ILI9341_2(14, 33, 27, 32);
|
||||
#else
|
||||
// check for special case with 2 SPI busses (ESP32 bitcoin)
|
||||
if (TasmotaGlobal.soft_spi_enabled) {
|
||||
|
@ -51,27 +51,27 @@
|
||||
Clears the display, command: "DisplayClear"
|
||||
|
||||
|
||||
DisplayNumber num [,position {0-(NUM_DIGITS-1))} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]]
|
||||
DisplayNumber num [,position {0-(TM1637Data.num_digits-1))} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
|
||||
|
||||
Clears and then displays number without decimal. command e.g., "DisplayNumber 1234"
|
||||
Control 'leading zeros', 'length' and 'position' with "DisplayNumber 1234, <position>, <leadingZeros>, <length>"
|
||||
'leading zeros' can be 1 or 0 (default), 'length' can be 1 to NUM_DIGITS, 'position' can be 0 (left-most) to NUM_DIGITS (right-most).
|
||||
'leading zeros' can be 1 or 0 (default), 'length' can be 1 to TM1637Data.num_digits, 'position' can be 0 (left-most) to TM1637Data.num_digits (right-most).
|
||||
See function description below for more details.
|
||||
|
||||
DisplayNumberNC num [,position {0-(NUM_DIGITS-1))} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]]
|
||||
DisplayNumberNC num [,position {0-(TM1637Data.num_digits-1))} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
|
||||
|
||||
Display integer number as above, but without clearing first. e.g., "DisplayNumberNC 1234". Usage is same as above.
|
||||
|
||||
|
||||
|
||||
DisplayFloat num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]]
|
||||
DisplayFloat num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
|
||||
|
||||
Clears and then displays float (with decimal point) command e.g., "DisplayFloat 12.34"
|
||||
See function description below for more details.
|
||||
|
||||
|
||||
|
||||
DisplayFloatNC num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]]
|
||||
DisplayFloatNC num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
|
||||
|
||||
Displays float (with decimal point) as above, but without clearing first. command e.g., "DisplayFloatNC 12.34"
|
||||
See function description below for more details.
|
||||
@ -84,24 +84,24 @@
|
||||
|
||||
|
||||
|
||||
DisplayRaw position {0-(NUM_DIGITS-1)},length {1 to NUM_DIGITS}, num1 [, num2[, num3[, num4[, ...upto NUM_DIGITS numbers]]]]]
|
||||
DisplayRaw position {0-(TM1637Data.num_digits-1)},length {1 to TM1637Data.num_digits}, num1 [, num2[, num3[, num4[, ...upto TM1637Data.num_digits numbers]]]]]
|
||||
|
||||
Takes upto NUM_DIGITS comma-separated integers (0-255) and displays raw segments. Each number represents a
|
||||
Takes upto TM1637Data.num_digits comma-separated integers (0-255) and displays raw segments. Each number represents a
|
||||
7-segment digit. Each 8-bit number represents individual segments of a digit.
|
||||
For example, the command "DisplayRaw 0, 4, 255, 255, 255, 255" would display "[8.8.8.8.]"
|
||||
|
||||
|
||||
|
||||
DisplayText text [, position {0-(NUM_DIGITS-1)} [,length {1 to NUM_DIGITS}]]
|
||||
DisplayText text [, position {0-(TM1637Data.num_digits-1)} [,length {1 to TM1637Data.num_digits}]]
|
||||
|
||||
Clears and then displays basic text. command e.g., "DisplayText ajith vasudevan"
|
||||
Control 'length' and 'position' with "DisplayText <text>, <position>, <length>"
|
||||
'length' can be 1 to NUM_DIGITS, 'position' can be 0 (left-most) to NUM_DIGITS-1 (right-most)
|
||||
'length' can be 1 to TM1637Data.num_digits, 'position' can be 0 (left-most) to TM1637Data.num_digits-1 (right-most)
|
||||
A caret(^) symbol in the text input is dispayed as the degrees(°) symbol. This is useful for displaying Temperature!
|
||||
For example, the command "DisplayText 22.5^" will display "22.5°".
|
||||
|
||||
|
||||
DisplayTextNC text [, position {0-NUM_DIGITS-1} [,length {1 to NUM_DIGITS}]]
|
||||
DisplayTextNC text [, position {0-TM1637Data.num_digits-1} [,length {1 to TM1637Data.num_digits}]]
|
||||
|
||||
Clears first, then displays text. Usage is same as above.
|
||||
|
||||
@ -134,53 +134,58 @@
|
||||
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XDSP_15 15
|
||||
#include "SevenSegmentTM1637.h"
|
||||
|
||||
SevenSegmentTM1637 *display;
|
||||
bool showClock = false;
|
||||
bool clock24 = false;
|
||||
char tm[5];
|
||||
char msg[60];
|
||||
uint32_t NUM_DIGITS = 4;
|
||||
uint32_t prev_num_digits = 4;
|
||||
bool scroll = false;
|
||||
uint32_t scrolldelay = 4;
|
||||
uint32_t scrollindex = 0;
|
||||
uint32_t iteration = 0;
|
||||
uint32_t brightness = 5;
|
||||
|
||||
#define XDSP_15 15
|
||||
|
||||
#define BRIGHTNESS_MIN 0 // Display OFF
|
||||
#define BRIGHTNESS_MAX 8
|
||||
#define CMD_MAX_LEN 55
|
||||
#define LEVEL_MIN 0
|
||||
#define LEVEL_MAX 100
|
||||
#define SCROLL_MAX_LEN 50
|
||||
#define CMD_MAX_LEN 55
|
||||
#define LEVEL_MIN 0
|
||||
#define LEVEL_MAX 100
|
||||
#define SCROLL_MAX_LEN 50
|
||||
|
||||
char scrolltext[CMD_MAX_LEN];
|
||||
#include "SevenSegmentTM1637.h"
|
||||
SevenSegmentTM1637 *display;
|
||||
|
||||
struct {
|
||||
char scroll_text[CMD_MAX_LEN];
|
||||
char msg[60];
|
||||
uint8_t num_digits = 4;
|
||||
uint8_t prev_num_digits = 4;
|
||||
uint8_t scroll_delay = 4;
|
||||
uint8_t scroll_index = 0;
|
||||
uint8_t iteration = 0;
|
||||
uint8_t brightness = 5;
|
||||
|
||||
bool scroll = false;
|
||||
bool show_clock = false;
|
||||
bool clock_24 = false;
|
||||
} TM1637Data;
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Init function
|
||||
\*********************************************************************************************/
|
||||
bool TM1637Init(void) {
|
||||
display = new SevenSegmentTM1637(Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI) );
|
||||
NUM_DIGITS = Settings.display_size > 3 ? Settings.display_size : 4;
|
||||
Settings.display_size = NUM_DIGITS;
|
||||
display->begin(NUM_DIGITS, 1);
|
||||
display->setBacklight(brightness * 10);
|
||||
clearDisplay();
|
||||
Settings.display_model = XDSP_15;
|
||||
AddLog(LOG_LEVEL_INFO, PSTR("DSP: TM1637 display driver initialized"));
|
||||
return true;
|
||||
void TM1637Init(void) {
|
||||
if (PinUsed(GPIO_TM1637CLK) && PinUsed(GPIO_TM1637DIO)) {
|
||||
display = new SevenSegmentTM1637(Pin(GPIO_TM1637CLK), Pin(GPIO_TM1637DIO) );
|
||||
if (display) {
|
||||
Settings.display_model = XDSP_15;
|
||||
|
||||
TM1637Data.num_digits = Settings.display_size > 3 ? Settings.display_size : 4;
|
||||
Settings.display_size = TM1637Data.num_digits;
|
||||
display->begin(TM1637Data.num_digits, 1);
|
||||
display->setBacklight(TM1637Data.brightness * 10);
|
||||
TM1637ClearDisplay();
|
||||
AddLog(LOG_LEVEL_INFO, PSTR("DSP: TM1637"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Displays number without decimal, with/without leading zeros, specifying start-position
|
||||
* and length, optionally skipping clearing display before displaying the number.
|
||||
* commands: DisplayNumber num [,position {0-(NUM_DIGITS-1)} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]]
|
||||
* DisplayNumberNC num [,position {0-(NUM_DIGITS-1)} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]] // "NC" --> "No Clear"
|
||||
* commands: DisplayNumber num [,position {0-(TM1637Data.num_digits-1)} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
|
||||
* DisplayNumberNC num [,position {0-(TM1637Data.num_digits-1)} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]] // "NC" --> "No Clear"
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637Number(bool clear) {
|
||||
char sNum[CMD_MAX_LEN];
|
||||
@ -210,46 +215,41 @@ bool CmndTM1637Number(bool clear) {
|
||||
}
|
||||
|
||||
|
||||
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0;
|
||||
if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: num=%d"), num);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: leadingzeros=%d"), leadingzeros);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: num %d, pos %d, lead %d, len %d"), num, position, leadingzeros, length);
|
||||
|
||||
if(clear) clearDisplay();
|
||||
if(clear) TM1637ClearDisplay();
|
||||
|
||||
char txt[30];
|
||||
snprintf_P(txt, sizeof(txt), PSTR("%d"), num);
|
||||
if(!length) length = strlen(txt);
|
||||
if((length < 0) || (length > NUM_DIGITS)) length = NUM_DIGITS;
|
||||
if((length < 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
|
||||
|
||||
char pad = (leadingzeros ? '0': ' ');
|
||||
uint32_t i = position;
|
||||
uint8_t rawBytes[1];
|
||||
rawBytes[0] = display->encode(pad);
|
||||
for(; i<position + (length - strlen(txt)); i++) {
|
||||
if(i>NUM_DIGITS) break;
|
||||
if(i>TM1637Data.num_digits) break;
|
||||
display->printRaw(rawBytes, 1, i);
|
||||
}
|
||||
|
||||
for(uint32_t j = 0; i< position + length; i++, j++) {
|
||||
if(txt[j] == 0) break;
|
||||
rawBytes[0] = display->encode(txt[j]);
|
||||
if(i>NUM_DIGITS) break;
|
||||
if(i>TM1637Data.num_digits) break;
|
||||
display->printRaw(rawBytes, 1, i);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Displays number with decimal, specifying position, precision and length,
|
||||
* optionally skipping clearing display before displaying the number.
|
||||
* commands: DisplayFloat num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]]
|
||||
* DisplayFloatNC num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]] // "NC" --> "No Clear"
|
||||
* commands: DisplayFloat num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
|
||||
* DisplayFloatNC num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]] // "NC" --> "No Clear"
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637Float(bool clear) {
|
||||
|
||||
@ -258,7 +258,7 @@ bool CmndTM1637Float(bool clear) {
|
||||
char sPosition[CMD_MAX_LEN];
|
||||
char sLength[CMD_MAX_LEN];
|
||||
uint8_t length = 0;
|
||||
uint8_t precision = NUM_DIGITS;
|
||||
uint8_t precision = TM1637Data.num_digits;
|
||||
uint8_t position = 0;
|
||||
|
||||
float fnum = 0.0f;
|
||||
@ -280,22 +280,19 @@ bool CmndTM1637Float(bool clear) {
|
||||
}
|
||||
|
||||
|
||||
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0;
|
||||
if((precision < 0) || (precision > NUM_DIGITS)) precision = NUM_DIGITS;
|
||||
if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
|
||||
if((precision < 0) || (precision > TM1637Data.num_digits)) precision = TM1637Data.num_digits;
|
||||
|
||||
if(clear) clearDisplay();
|
||||
if(clear) TM1637ClearDisplay();
|
||||
|
||||
char txt[30];
|
||||
ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), precision, &fnum);
|
||||
|
||||
if(!length) length = strlen(txt);
|
||||
if((length <= 0) || (length > NUM_DIGITS)) length = NUM_DIGITS;
|
||||
if((length <= 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: num %4_f, prec %d, len %d"), &fnum, precision, length);
|
||||
|
||||
char s[30];
|
||||
ext_snprintf_P(s, sizeof(s), PSTR("LOG: TM1637: num=%*_f"), 4, &fnum);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("%s"), s);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: precision=%d"), precision);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
|
||||
uint8_t rawBytes[1];
|
||||
for(uint32_t i=0, j=0; i<length; i++, j++) {
|
||||
if(txt[i] == 0) break;
|
||||
@ -305,7 +302,7 @@ bool CmndTM1637Float(bool clear) {
|
||||
i++;
|
||||
length++;
|
||||
}
|
||||
if((j+position) > NUM_DIGITS) break;
|
||||
if((j+position) > TM1637Data.num_digits) break;
|
||||
display->printRaw(rawBytes, 1, j+position);
|
||||
}
|
||||
|
||||
@ -318,17 +315,17 @@ bool CmndTM1637Float(bool clear) {
|
||||
// * Command: DisplayClear
|
||||
// \*********************************************************************************************/
|
||||
bool CmndTM1637Clear(void) {
|
||||
clearDisplay();
|
||||
sprintf(msg, PSTR("Cleared"));
|
||||
XdrvMailbox.data = msg;
|
||||
TM1637ClearDisplay();
|
||||
sprintf(TM1637Data.msg, PSTR("Cleared"));
|
||||
XdrvMailbox.data = TM1637Data.msg;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void clearDisplay (void) {
|
||||
void TM1637ClearDisplay (void) {
|
||||
unsigned char arr[] = {0};
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("Clearing digit %d"), NUM_DIGITS);
|
||||
for(int i=0; i<NUM_DIGITS; i++) display->printRaw(arr, 1, i);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("Clearing digit %d"), TM1637Data.num_digits);
|
||||
for(int i=0; i<TM1637Data.num_digits; i++) display->printRaw(arr, 1, i);
|
||||
}
|
||||
|
||||
|
||||
@ -338,17 +335,17 @@ void clearDisplay (void) {
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637ScrollText(void) {
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: text=%s"), XdrvMailbox.data);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Text %s"), XdrvMailbox.data);
|
||||
|
||||
if(XdrvMailbox.data_len > SCROLL_MAX_LEN) {
|
||||
snprintf(msg, sizeof(msg), PSTR("Text too long. Length should be less than %d"), SCROLL_MAX_LEN);
|
||||
XdrvMailbox.data = msg;
|
||||
snprintf(TM1637Data.msg, sizeof(TM1637Data.msg), PSTR("Text too long. Length should be less than %d"), SCROLL_MAX_LEN);
|
||||
XdrvMailbox.data = TM1637Data.msg;
|
||||
return false;
|
||||
} else {
|
||||
snprintf(scrolltext, sizeof(scrolltext), PSTR("%s"), XdrvMailbox.data);
|
||||
scrolltext[XdrvMailbox.data_len] = 0;
|
||||
scrollindex = 0;
|
||||
scroll = true;
|
||||
snprintf(TM1637Data.scroll_text, sizeof(TM1637Data.scroll_text), PSTR("%s"), XdrvMailbox.data);
|
||||
TM1637Data.scroll_text[XdrvMailbox.data_len] = 0;
|
||||
TM1637Data.scroll_index = 0;
|
||||
TM1637Data.scroll = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -361,8 +358,8 @@ bool CmndTM1637ScrollText(void) {
|
||||
* Command: DisplayScrollDelay delay {0-15} // default = 4
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637ScrollDelay(void) {
|
||||
if(scrolldelay<0) scrolldelay=0;
|
||||
scrolldelay = XdrvMailbox.payload;
|
||||
if(TM1637Data.scroll_delay<0) TM1637Data.scroll_delay=0;
|
||||
TM1637Data.scroll_delay = XdrvMailbox.payload;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -371,36 +368,31 @@ bool CmndTM1637ScrollDelay(void) {
|
||||
/*********************************************************************************************\
|
||||
* Scrolls a given string. Called every 50ms
|
||||
\*********************************************************************************************/
|
||||
void scrollText(void) {
|
||||
if(scroll) {
|
||||
iteration++;
|
||||
if(scrolldelay) iteration = iteration % scrolldelay;
|
||||
else iteration = 0;
|
||||
if(iteration) return;
|
||||
void TM1637ScrollText(void) {
|
||||
if(TM1637Data.scroll) {
|
||||
TM1637Data.iteration++;
|
||||
if(TM1637Data.scroll_delay) TM1637Data.iteration = TM1637Data.iteration % TM1637Data.scroll_delay;
|
||||
else TM1637Data.iteration = 0;
|
||||
if(TM1637Data.iteration) return;
|
||||
|
||||
if(scrollindex > strlen(scrolltext)) {
|
||||
scroll = false;
|
||||
scrollindex = 0;
|
||||
if(TM1637Data.scroll_index > strlen(TM1637Data.scroll_text)) {
|
||||
TM1637Data.scroll = false;
|
||||
TM1637Data.scroll_index = 0;
|
||||
return;
|
||||
}
|
||||
bool clr = false;
|
||||
uint8_t rawBytes[1];
|
||||
for(uint32_t i=0, j=scrollindex; i< strlen(scrolltext); i++, j++) {
|
||||
if(i > (NUM_DIGITS-1)) break;
|
||||
if(scrolltext[j] == 0) {clr = true;};
|
||||
char charToDisp = (clr ? ' ' : scrolltext[j]);
|
||||
for(uint32_t i=0, j=TM1637Data.scroll_index; i< strlen(TM1637Data.scroll_text); i++, j++) {
|
||||
if(i > (TM1637Data.num_digits-1)) break;
|
||||
if(TM1637Data.scroll_text[j] == 0) {clr = true;};
|
||||
char charToDisp = (clr ? ' ' : TM1637Data.scroll_text[j]);
|
||||
rawBytes[0] = display->encode(charToDisp);
|
||||
display->printRaw(rawBytes, 1, i);
|
||||
}
|
||||
scrollindex++;
|
||||
TM1637Data.scroll_index++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Displays a horizontal bar graph. Takes a percentage number (0-100) as input
|
||||
* Command: DisplayLevel level {0-100}
|
||||
@ -408,40 +400,39 @@ void scrollText(void) {
|
||||
bool CmndTM1637Level(void) {
|
||||
uint16_t val = XdrvMailbox.payload;
|
||||
if((val < LEVEL_MIN) || (val > LEVEL_MAX)) {
|
||||
sprintf(msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX);
|
||||
XdrvMailbox.data = msg;
|
||||
sprintf(TM1637Data.msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX);
|
||||
XdrvMailbox.data = TM1637Data.msg;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t totalBars = 2*NUM_DIGITS;
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level totalBars=%d"), totalBars);
|
||||
uint8_t totalBars = 2*TM1637Data.num_digits;
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level totalBars %d"), totalBars);
|
||||
float barsToDisplay = totalBars * val / 100.0f;
|
||||
char txt[5];
|
||||
ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), 1, &barsToDisplay);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level barsToDisplay=%s"), txt);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level barsToDisplay %s"), txt);
|
||||
char s[4];
|
||||
ext_snprintf_P(s, sizeof(s), PSTR("%*_f"), 0, &barsToDisplay);
|
||||
ext_snprintf_P(s, sizeof(s), PSTR("%0_f"), &barsToDisplay);
|
||||
uint8_t numBars = atoi(s);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level numBars=%d"), numBars);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level numBars %d"), numBars);
|
||||
|
||||
clearDisplay();
|
||||
TM1637ClearDisplay();
|
||||
uint8_t rawBytes[1];
|
||||
for(int i=1; i<=numBars; i++) {
|
||||
uint8_t digit = (i-1) / 2;
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level digit=%d"), digit);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level digit %d"), digit);
|
||||
uint8_t value = (((i%2) == 0) ? 54 : 48);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level value=%d"), value);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level value %d"), value);
|
||||
rawBytes[0] = value;
|
||||
display->printRaw(rawBytes, 1, digit);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Display arbitrary data on the display module
|
||||
* Command: DisplayRaw position {0-(NUM_DIGITS-1)},length {1 to NUM_DIGITS}, a [, b[, c[, d[...upto NUM_DIGITS]]]]
|
||||
* where a,b,c,d... are upto NUM_DIGITS numbers in the range 0-255, each number (byte)
|
||||
* Command: DisplayRaw position {0-(TM1637Data.num_digits-1)},length {1 to TM1637Data.num_digits}, a [, b[, c[, d[...upto TM1637Data.num_digits]]]]
|
||||
* where a,b,c,d... are upto TM1637Data.num_digits numbers in the range 0-255, each number (byte)
|
||||
* corresponding to a single 7-segment digit. Within each byte, bit 0 is segment A,
|
||||
* bit 1 is segment B etc. The function may either set the entire display
|
||||
* or any desired part using the length and position parameters.
|
||||
@ -492,23 +483,16 @@ bool CmndTM1637Raw(void) {
|
||||
}
|
||||
|
||||
if(!length) length = ArgC() - 2;
|
||||
if(length < 0 || length > NUM_DIGITS) length = NUM_DIGITS;
|
||||
if(position < 0 || position > (NUM_DIGITS-1)) position = 0;
|
||||
if(length < 0 || length > TM1637Data.num_digits) length = TM1637Data.num_digits;
|
||||
if(position < 0 || position > (TM1637Data.num_digits-1)) position = 0;
|
||||
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: a=%d"), DATA[0]);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: b=%d"), DATA[1]);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: c=%d"), DATA[2]);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: d=%d"), DATA[3]);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: e=%d"), DATA[4]);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: f=%d"), DATA[5]);
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: a %d, b %d, c %d, d %d, e %d, f %d, len %d, pos %d"),
|
||||
DATA[0], DATA[1], DATA[2], DATA[3], DATA[4], DATA[5], length, position);
|
||||
|
||||
uint8_t rawBytes[1];
|
||||
for(uint32_t i=position; i<position+length; i++ ) {
|
||||
if(i>(NUM_DIGITS-1)) break;
|
||||
if(i>(TM1637Data.num_digits-1)) break;
|
||||
rawBytes[0] = DATA[i-position];
|
||||
display->printRaw(rawBytes, 1, i);
|
||||
}
|
||||
@ -516,13 +500,11 @@ bool CmndTM1637Raw(void) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Display a given string.
|
||||
* Text can be placed at arbitrary location on the display using the length and
|
||||
* position parameters without affecting the rest of the display.
|
||||
* Command: DisplayText text [, position {0-(NUM_DIGITS-1)} [,length {1 to NUM_DIGITS}]]
|
||||
* Command: DisplayText text [, position {0-(TM1637Data.num_digits-1)} [,length {1 to TM1637Data.num_digits}]]
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637Text(bool clear) {
|
||||
char sString[CMD_MAX_LEN + 1];
|
||||
@ -544,21 +526,19 @@ bool CmndTM1637Text(bool clear) {
|
||||
}
|
||||
|
||||
|
||||
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0;
|
||||
if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: sString=%s"), sString);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: sString %s, pos %d, len %d"), sString, position, length);
|
||||
|
||||
if(clear) clearDisplay();
|
||||
if(clear) TM1637ClearDisplay();
|
||||
|
||||
if(!length) length = strlen(sString);
|
||||
if((length < 0) || (length > NUM_DIGITS)) length = NUM_DIGITS;
|
||||
if((length < 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
|
||||
|
||||
uint32_t i = position;
|
||||
uint8_t rawBytes[1];
|
||||
for(uint32_t j = 0; i< position + length; i++, j++) {
|
||||
if(i > (NUM_DIGITS-1)) break;
|
||||
if(i > (TM1637Data.num_digits-1)) break;
|
||||
if(sString[j] == 0) break;
|
||||
rawBytes[0] = display->encode(sString[j]);
|
||||
if(sString[j+1] == '.') {
|
||||
@ -582,18 +562,18 @@ bool CmndTM1637Brightness(void) {
|
||||
|
||||
uint16_t val = XdrvMailbox.payload;
|
||||
if(ArgC() == 0) {
|
||||
XdrvMailbox.payload = brightness;
|
||||
XdrvMailbox.payload = TM1637Data.brightness;
|
||||
return true;
|
||||
}
|
||||
|
||||
if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) {
|
||||
sprintf(msg, PSTR("Brightness should be a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX);
|
||||
XdrvMailbox.data = msg;
|
||||
sprintf(TM1637Data.msg, PSTR("Brightness should be a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX);
|
||||
XdrvMailbox.data = TM1637Data.msg;
|
||||
return false;
|
||||
}
|
||||
brightness = val;
|
||||
TM1637Data.brightness = val;
|
||||
|
||||
display->setBacklight(brightness*10);
|
||||
display->setBacklight(TM1637Data.brightness*10);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -607,17 +587,17 @@ bool CmndTM1637Brightness(void) {
|
||||
\*********************************************************************************************/
|
||||
bool CmndTM1637Clock(void) {
|
||||
|
||||
showClock = XdrvMailbox.payload;
|
||||
TM1637Data.show_clock = XdrvMailbox.payload;
|
||||
|
||||
if(ArgC() == 0) XdrvMailbox.payload = 1;
|
||||
if(XdrvMailbox.payload > 1) clock24 = true;
|
||||
else if(XdrvMailbox.payload == 1) clock24 = false;
|
||||
if(XdrvMailbox.payload > 1) TM1637Data.clock_24 = true;
|
||||
else if(XdrvMailbox.payload == 1) TM1637Data.clock_24 = false;
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: showClock=%d"), showClock);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: clock24=%d"), clock24);
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: TM1637Data.show_clock %d, TM1637Data.clock_24 %d"),
|
||||
TM1637Data.show_clock, TM1637Data.clock_24);
|
||||
|
||||
if(!showClock) {
|
||||
clearDisplay();
|
||||
if(!TM1637Data.show_clock) {
|
||||
TM1637ClearDisplay();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -626,19 +606,20 @@ bool CmndTM1637Clock(void) {
|
||||
/*********************************************************************************************\
|
||||
* refreshes the time if clock is displayed
|
||||
\*********************************************************************************************/
|
||||
void showTime() {
|
||||
void TM1637ShowTime() {
|
||||
uint8_t hr = RtcTime.hour;
|
||||
uint8_t mn = RtcTime.minute;
|
||||
// uint8_t hr = 1;
|
||||
// uint8_t mn = 0;
|
||||
char z = ' ';
|
||||
if(clock24) {
|
||||
if(TM1637Data.clock_24) {
|
||||
z = '0';
|
||||
} else {
|
||||
if(hr > 12) hr -= 12;
|
||||
if(hr == 0) hr = 12;
|
||||
}
|
||||
|
||||
char tm[5];
|
||||
if(hr < 10) {
|
||||
if(mn < 10) snprintf(tm, sizeof(tm), PSTR("%c%d0%d"), z, hr, mn);
|
||||
else snprintf(tm, sizeof(tm), PSTR("%c%d%d"), z, hr, mn);
|
||||
@ -659,20 +640,20 @@ void showTime() {
|
||||
\*********************************************************************************************/
|
||||
bool TM1637Cmd(uint8_t fn) {
|
||||
bool result = false;
|
||||
NUM_DIGITS = Settings.display_size;
|
||||
if(prev_num_digits != NUM_DIGITS) { // Cleck for change of display size, and re-init the library
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: Size changed. Re-initializing library..."));
|
||||
TM1637Data.num_digits = Settings.display_size;
|
||||
if(TM1637Data.prev_num_digits != TM1637Data.num_digits) { // Cleck for change of display size, and re-init the library
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Size changed. Re-initializing library..."));
|
||||
display = new SevenSegmentTM1637(Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI) );
|
||||
display->begin(NUM_DIGITS, 1);
|
||||
display->begin(TM1637Data.num_digits, 1);
|
||||
display->setBacklight(40);
|
||||
clearDisplay();
|
||||
prev_num_digits = NUM_DIGITS;
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: Re-initialized library"));
|
||||
TM1637ClearDisplay();
|
||||
TM1637Data.prev_num_digits = TM1637Data.num_digits;
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Re-initialized library"));
|
||||
}
|
||||
|
||||
if(XdrvMailbox.data_len > CMD_MAX_LEN) {
|
||||
sprintf(msg, PSTR("Command text too long. Please limit it to %d characters"), CMD_MAX_LEN);
|
||||
XdrvMailbox.data = msg;
|
||||
sprintf(TM1637Data.msg, PSTR("Command text too long. Please limit it to %d characters"), CMD_MAX_LEN);
|
||||
XdrvMailbox.data = TM1637Data.msg;
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -731,17 +712,17 @@ bool Xdsp15(uint8_t function)
|
||||
bool result = false;
|
||||
|
||||
if (FUNC_DISPLAY_INIT_DRIVER == function) {
|
||||
result = TM1637Init(); // init
|
||||
TM1637Init(); // init
|
||||
}
|
||||
else if (XDSP_15 == Settings.display_model) {
|
||||
switch (function) {
|
||||
case FUNC_DISPLAY_MODEL:
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_MODEL"));
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: FUNC_DISPLAY_MODEL"));
|
||||
result = true;
|
||||
break;
|
||||
case FUNC_DISPLAY_INIT:
|
||||
CmndTM1637Clear();
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_INIT"));
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: FUNC_DISPLAY_INIT"));
|
||||
break;
|
||||
case FUNC_DISPLAY_SEVENSEG_TEXT:
|
||||
case FUNC_DISPLAY_CLEAR:
|
||||
@ -759,9 +740,9 @@ bool Xdsp15(uint8_t function)
|
||||
result = TM1637Cmd(function);
|
||||
break;
|
||||
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
||||
scrollText();
|
||||
if(showClock) {
|
||||
showTime();
|
||||
TM1637ScrollText();
|
||||
if(TM1637Data.show_clock) {
|
||||
TM1637ShowTime();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
/*********************************************************************************************\
|
||||
* TM1638 8 switch, led and 7 segment
|
||||
*
|
||||
* Uses GPIO TM16 DIO, TM16 CLK and TM16 STB
|
||||
* Uses GPIO TM1638 DIO, TM1638 CLK and TM1638 STB
|
||||
\*********************************************************************************************/
|
||||
|
||||
#define XSNS_28 28
|
||||
|
@ -272,7 +272,7 @@ void RfSnsTheoV2Show(bool json)
|
||||
sensor, GetDT(rfsns_theo_v2_t1[i].time).c_str(), voltage);
|
||||
}
|
||||
} else {
|
||||
float temp = ConvertTemp((float)rfsns_theo_v2_t1[i].temp / 100)
|
||||
float temp = ConvertTemp((float)rfsns_theo_v2_t1[i].temp / 100);
|
||||
|
||||
if (json) {
|
||||
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%*_f,\"" D_JSON_ILLUMINANCE "\":%d,\"" D_JSON_VOLTAGE "\":%s}"),
|
||||
|
@ -465,6 +465,7 @@ double meter_vars[SML_MAX_VARS];
|
||||
double dvalues[MAX_DVARS];
|
||||
uint32_t dtimes[MAX_DVARS];
|
||||
uint8_t meters_used;
|
||||
uint8_t dvalid[SML_MAX_VARS];
|
||||
|
||||
struct METER_DESC const *meter_desc_p;
|
||||
const uint8_t *meter_p;
|
||||
@ -494,6 +495,7 @@ char meter_id[MAX_METERS][METER_ID_SIZE];
|
||||
uint8_t sml_send_blocks;
|
||||
uint8_t sml_100ms_cnt;
|
||||
uint8_t sml_desc_cnt;
|
||||
uint8_t sml_json_enable = 1;
|
||||
|
||||
#ifdef USE_SML_MEDIAN_FILTER
|
||||
// median filter, should be odd size
|
||||
@ -1621,6 +1623,7 @@ void SML_Decode(uint8_t index) {
|
||||
#else
|
||||
meter_vars[vindex]=dval;
|
||||
#endif
|
||||
dvalid[vindex] = 1;
|
||||
//AddLog_P(LOG_LEVEL_INFO, PSTR(">> %s"),mp);
|
||||
// get scaling factor
|
||||
double fac=CharToDouble((char*)mp);
|
||||
@ -1779,6 +1782,8 @@ void SML_Show(boolean json) {
|
||||
dtostrfd(meter_vars[index],dp,tpowstr);
|
||||
}
|
||||
|
||||
if (!dvalid[index]) nojson = 1;
|
||||
|
||||
if (json) {
|
||||
// json export
|
||||
if (index==0) {
|
||||
@ -1953,6 +1958,7 @@ void SML_Init(void) {
|
||||
|
||||
for (uint32_t cnt=0;cnt<SML_MAX_VARS;cnt++) {
|
||||
meter_vars[cnt]=0;
|
||||
dvalid[cnt]=0;
|
||||
}
|
||||
|
||||
for (uint32_t cnt=0;cnt<MAX_METERS;cnt++) {
|
||||
@ -2650,7 +2656,9 @@ bool Xsns53(byte function) {
|
||||
break;
|
||||
#endif // USE_SCRIPT
|
||||
case FUNC_JSON_APPEND:
|
||||
SML_Show(1);
|
||||
if (sml_json_enable) {
|
||||
SML_Show(1);
|
||||
}
|
||||
break;
|
||||
#ifdef USE_WEBSERVER
|
||||
case FUNC_WEB_SENSOR:
|
||||
|
@ -1941,9 +1941,21 @@ void MI32EverySecond(bool restart){
|
||||
MI32TimeoutSensors();
|
||||
|
||||
if (MI32.option.MQTTType == 0){
|
||||
// show tas style sensor MQTT
|
||||
MI32ShowSomeSensors();
|
||||
} else {
|
||||
}
|
||||
|
||||
if (MI32.option.MQTTType == 1
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||
|
||||
Settings.flag.hass_discovery
|
||||
#endif
|
||||
) {
|
||||
// these two share a counter
|
||||
// discovery only sent if hass_discovery
|
||||
MI32DiscoveryOneMISensor();
|
||||
// show independent style sensor MQTT
|
||||
// note - if !MQTTType, then this is IN ADDITION to 'normal'
|
||||
MI32ShowOneMISensor();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user