Merge branch 'development' into prerelease-13.1

This commit is contained in:
Theo Arends 2023-08-14 09:41:43 +02:00
commit 9671d87b19
4 changed files with 79 additions and 62 deletions

View File

@ -147,6 +147,9 @@
#elif defined(ARDUINO_ARCH_ESP32) #elif defined(ARDUINO_ARCH_ESP32)
#include <driver/rtc_io.h> #include <driver/rtc_io.h>
#if ESP_IDF_VERSION_MAJOR >= 5
#include "soc/gpio_periph.h"
#endif // ESP_IDF_VERSION_MAJOR >= 5
#define PIN_TO_BASEREG(pin) (0) #define PIN_TO_BASEREG(pin) (0)
#define PIN_TO_BITMASK(pin) (pin) #define PIN_TO_BITMASK(pin) (pin)
#define IO_REG_TYPE uint32_t #define IO_REG_TYPE uint32_t
@ -156,7 +159,7 @@
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
IO_REG_TYPE directRead(IO_REG_TYPE pin) IO_REG_TYPE directRead(IO_REG_TYPE pin)
{ {
#if CONFIG_IDF_TARGET_ESP32C3 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 // max. usable Pins are 23 for C6 (below flash pins)
return (GPIO.in.val >> pin) & 0x1; return (GPIO.in.val >> pin) & 0x1;
#else // plain ESP32 #else // plain ESP32
if ( pin < 32 ) if ( pin < 32 )
@ -171,7 +174,7 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directWriteLow(IO_REG_TYPE pin) void directWriteLow(IO_REG_TYPE pin)
{ {
#if CONFIG_IDF_TARGET_ESP32C3 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
GPIO.out_w1tc.val = ((uint32_t)1 << pin); GPIO.out_w1tc.val = ((uint32_t)1 << pin);
#else // plain ESP32 #else // plain ESP32
if ( pin < 32 ) if ( pin < 32 )
@ -184,7 +187,7 @@ void directWriteLow(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directWriteHigh(IO_REG_TYPE pin) void directWriteHigh(IO_REG_TYPE pin)
{ {
#if CONFIG_IDF_TARGET_ESP32C3 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
GPIO.out_w1ts.val = ((uint32_t)1 << pin); GPIO.out_w1ts.val = ((uint32_t)1 << pin);
#else // plain ESP32 #else // plain ESP32
if ( pin < 32 ) if ( pin < 32 )
@ -197,7 +200,7 @@ void directWriteHigh(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directModeInput(IO_REG_TYPE pin) void directModeInput(IO_REG_TYPE pin)
{ {
#if CONFIG_IDF_TARGET_ESP32C3 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); GPIO.enable_w1tc.val = ((uint32_t)1 << (pin));
#else #else
if ( digitalPinIsValid(pin) ) if ( digitalPinIsValid(pin) )
@ -223,7 +226,7 @@ void directModeInput(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directModeOutput(IO_REG_TYPE pin) void directModeOutput(IO_REG_TYPE pin)
{ {
#if CONFIG_IDF_TARGET_ESP32C3 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
GPIO.enable_w1ts.val = ((uint32_t)1 << (pin)); GPIO.enable_w1ts.val = ((uint32_t)1 << (pin));
#else #else
if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs

View File

@ -54,7 +54,6 @@ lib_ignore =
ESP Mail Client ESP Mail Client
IRremoteESP8266 IRremoteESP8266
NeoPixelBus NeoPixelBus
OneWire
MFRC522 MFRC522
universal display Library universal display Library
ESP8266Audio ESP8266Audio
@ -75,7 +74,6 @@ lib_ignore =
ESP Mail Client ESP Mail Client
IRremoteESP8266 IRremoteESP8266
NeoPixelBus NeoPixelBus
OneWire
MFRC522 MFRC522
universal display Library universal display Library
ESP8266Audio ESP8266Audio

View File

@ -31,7 +31,8 @@
/* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h /* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h
* Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255 * Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255
* Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2) * Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2)
* add 8 bytes used memory * Setting N to an alphanumeric value, the complete name is replaced with it
* Result in JSON: "Outside1":{"Id":"000003287CD8","Temperature":26.3} (example with N=Outside1)
*/ */
#define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit #define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit
@ -49,6 +50,8 @@
#define DS18X20_MAX_SENSORS 8 #define DS18X20_MAX_SENSORS 8
#endif #endif
#define DS18X20_ALIAS_LEN 17
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850"; const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID }; uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
@ -62,7 +65,7 @@ struct {
uint8_t valid; uint8_t valid;
int8_t pins_id; int8_t pins_id;
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
uint8_t alias; char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1);
#endif // DS18x20_USE_ID_ALIAS #endif // DS18x20_USE_ID_ALIAS
} ds18x20_sensor[DS18X20_MAX_SENSORS]; } ds18x20_sensor[DS18X20_MAX_SENSORS];
@ -357,7 +360,7 @@ void Ds18x20Init(void) {
ids[DS18X20Data.sensors] = ids[DS18X20Data.sensors] << 8 | ds18x20_sensor[DS18X20Data.sensors].address[j]; ids[DS18X20Data.sensors] = ids[DS18X20Data.sensors] << 8 | ds18x20_sensor[DS18X20Data.sensors].address[j];
} }
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
ds18x20_sensor[DS18X20Data.sensors].alias=0; ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0';
#endif #endif
ds18x20_sensor[DS18X20Data.sensors].pins_id = pins; ds18x20_sensor[DS18X20Data.sensors].pins_id = pins;
DS18X20Data.sensors++; DS18X20Data.sensors++;
@ -472,24 +475,28 @@ void Ds18x20Name(uint8_t sensor) {
} }
} }
GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types); GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types);
if (DS18X20Data.sensors > 1) {
#ifdef DS18x20_USE_ID_AS_NAME #ifdef DS18x20_USE_ID_AS_NAME
char address[17]; char address[17];
for (uint32_t j = 0; j < 3; j++) { for (uint32_t j = 0; j < 3; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes
} }
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#else #elif defined(DS18x20_USE_ID_ALIAS)
uint8_t print_ind = sensor +1; if (ds18x20_sensor[sensor].alias[0] != '0') {
#ifdef DS18x20_USE_ID_ALIAS if (isdigit(ds18x20_sensor[sensor].alias[0])) {
if (ds18x20_sensor[sensor].alias) { snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias));
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens")); } else {
print_ind = ds18x20_sensor[sensor].alias; snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s"), ds18x20_sensor[sensor].alias);
}
} else {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1);
}
#else // no #defines set
if (DS18X20Data.sensors > 1) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1);
} }
#endif #endif
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind);
#endif
}
} }
/********************************************************************************************/ /********************************************************************************************/
@ -574,25 +581,26 @@ void (* const DSCommand[])(void) PROGMEM = {
&CmndDSAlias }; &CmndDSAlias };
void CmndDSAlias(void) { void CmndDSAlias(void) {
uint8_t tmp; char Argument1[XdrvMailbox.data_len];
uint8_t sensor=255; char Argument2[XdrvMailbox.data_len];
char argument[XdrvMailbox.data_len];
char address[17]; char address[17];
if (ArgC()==2) { if (ArgC()==2) {
tmp=atoi(ArgV(argument, 2)); ArgV(Argument1, 1);
ArgV(argument,1); ArgV(Argument2, 2);
TrimSpace(Argument2);
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
for (uint32_t j = 0; j < 8; j++) { for (uint32_t j = 0; j < 8; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]);
} }
if (!strncmp(argument,address,12)) { if (!strncmp(Argument1, address, 12) && Argument2[0]) {
ds18x20_sensor[i].alias=tmp; snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2);
break; break;
} }
} }
} }
Response_P(PSTR("{")); Response_P(PSTR("{"));
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
Ds18x20Name(i); Ds18x20Name(i);
@ -601,7 +609,7 @@ void CmndDSAlias(void) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc
} }
ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address); ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address);
if (i < DS18X20Data.sensors-1) {ResponseAppend_P(PSTR(","));} if (i < DS18X20Data.sensors-1) ResponseAppend_P(PSTR(","));
} }
ResponseAppend_P(PSTR("}")); ResponseAppend_P(PSTR("}"));
} }

View File

@ -29,8 +29,9 @@
/* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h /* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h
* Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255 * Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255
* Result in JSON: "DS18Alias_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2) * Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2)
* add 8 bytes used memory * Setting N to an alphanumeric value, the complete name is replaced with it
* Result in JSON: "Outside1":{"Id":"000003287CD8","Temperature":26.3} (example with N=Outside1)
*/ */
#define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit #define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit
@ -46,6 +47,8 @@
#define DS18X20_MAX_SENSORS 8 #define DS18X20_MAX_SENSORS 8
#endif #endif
#define DS18X20_ALIAS_LEN 17
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850"; const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID }; uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
@ -61,7 +64,7 @@ struct {
uint8_t valid; uint8_t valid;
int8_t pins_id; int8_t pins_id;
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
uint8_t alias; char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1);
#endif //DS18x20_USE_ID_ALIAS #endif //DS18x20_USE_ID_ALIAS
} ds18x20_sensor[DS18X20_MAX_SENSORS]; } ds18x20_sensor[DS18X20_MAX_SENSORS];
@ -108,7 +111,7 @@ void Ds18x20Search(void) {
(ds18x20_sensor[num_sensors].address[0] == DS18B20_CHIPID) || (ds18x20_sensor[num_sensors].address[0] == DS18B20_CHIPID) ||
(ds18x20_sensor[num_sensors].address[0] == MAX31850_CHIPID))) { (ds18x20_sensor[num_sensors].address[0] == MAX31850_CHIPID))) {
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
ds18x20_sensor[num_sensors].alias=0; ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0';
#endif #endif
ds18x20_sensor[num_sensors].pins_id = pins; ds18x20_sensor[num_sensors].pins_id = pins;
num_sensors++; num_sensors++;
@ -214,24 +217,28 @@ void Ds18x20Name(uint8_t sensor) {
} }
} }
GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types); GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types);
if (DS18X20Data.sensors > 1) {
#ifdef DS18x20_USE_ID_AS_NAME #ifdef DS18x20_USE_ID_AS_NAME
char address[17]; char address[17];
for (uint32_t j = 0; j < 3; j++) { for (uint32_t j = 0; j < 3; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes
} }
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#else #elif defined(DS18x20_USE_ID_ALIAS)
uint8_t print_ind = sensor +1; if (ds18x20_sensor[sensor].alias[0] != '0') {
#ifdef DS18x20_USE_ID_ALIAS if (isdigit(ds18x20_sensor[sensor].alias[0])) {
if (ds18x20_sensor[sensor].alias) { snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias));
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens")); } else {
print_ind = ds18x20_sensor[sensor].alias; snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s"), ds18x20_sensor[sensor].alias);
}
} else {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1);
}
#else // no #defines set
if (DS18X20Data.sensors > 1) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1);
} }
#endif #endif
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind);
#endif
}
} }
/********************************************************************************************/ /********************************************************************************************/
@ -317,25 +324,26 @@ void (* const DSCommand[])(void) PROGMEM = {
&CmndDSAlias }; &CmndDSAlias };
void CmndDSAlias(void) { void CmndDSAlias(void) {
uint8_t tmp; char Argument1[XdrvMailbox.data_len];
uint8_t sensor=255; char Argument2[XdrvMailbox.data_len];
char argument[XdrvMailbox.data_len];
char address[17]; char address[17];
if (ArgC()==2) { if (ArgC()==2) {
tmp=atoi(ArgV(argument, 2)); ArgV(Argument1, 1);
ArgV(argument,1); ArgV(Argument2, 2);
TrimSpace(Argument2);
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
for (uint32_t j = 0; j < 8; j++) { for (uint32_t j = 0; j < 8; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]);
} }
if (!strncmp(argument,address,12)) { if (!strncmp(Argument1, address, 12) && Argument2[0]) {
ds18x20_sensor[i].alias=tmp; snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2);
break; break;
} }
} }
} }
Response_P(PSTR("{")); Response_P(PSTR("{"));
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
Ds18x20Name(i); Ds18x20Name(i);
@ -344,7 +352,7 @@ void CmndDSAlias(void) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc
} }
ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address); ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address);
if (i < DS18X20Data.sensors-1) {ResponseAppend_P(PSTR(","));} if (i < DS18X20Data.sensors-1) ResponseAppend_P(PSTR(","));
} }
ResponseAppend_P(PSTR("}")); ResponseAppend_P(PSTR("}"));
} }