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)
#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_BITMASK(pin) (pin)
#define IO_REG_TYPE uint32_t
@ -156,7 +159,7 @@
static inline __attribute__((always_inline))
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;
#else // plain ESP32
if ( pin < 32 )
@ -171,7 +174,7 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin)
static inline __attribute__((always_inline))
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);
#else // plain ESP32
if ( pin < 32 )
@ -184,7 +187,7 @@ void directWriteLow(IO_REG_TYPE pin)
static inline __attribute__((always_inline))
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);
#else // plain ESP32
if ( pin < 32 )
@ -197,7 +200,7 @@ void directWriteHigh(IO_REG_TYPE pin)
static inline __attribute__((always_inline))
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));
#else
if ( digitalPinIsValid(pin) )
@ -223,7 +226,7 @@ void directModeInput(IO_REG_TYPE pin)
static inline __attribute__((always_inline))
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));
#else
if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs

View File

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

View File

@ -31,7 +31,8 @@
/* #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
* 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
@ -49,6 +50,8 @@
#define DS18X20_MAX_SENSORS 8
#endif
#define DS18X20_ALIAS_LEN 17
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
@ -62,7 +65,7 @@ struct {
uint8_t valid;
int8_t pins_id;
#ifdef DS18x20_USE_ID_ALIAS
uint8_t alias;
char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1);
#endif // DS18x20_USE_ID_ALIAS
} 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];
}
#ifdef DS18x20_USE_ID_ALIAS
ds18x20_sensor[DS18X20Data.sensors].alias=0;
ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0';
#endif
ds18x20_sensor[DS18X20Data.sensors].pins_id = pins;
DS18X20Data.sensors++;
@ -472,24 +475,28 @@ void Ds18x20Name(uint8_t sensor) {
}
}
GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types);
if (DS18X20Data.sensors > 1) {
#ifdef DS18x20_USE_ID_AS_NAME
char address[17];
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
}
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#else
uint8_t print_ind = sensor +1;
#ifdef DS18x20_USE_ID_ALIAS
if (ds18x20_sensor[sensor].alias) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens"));
print_ind = ds18x20_sensor[sensor].alias;
}
#endif
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind);
#endif
char address[17];
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
}
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#elif defined(DS18x20_USE_ID_ALIAS)
if (ds18x20_sensor[sensor].alias[0] != '0') {
if (isdigit(ds18x20_sensor[sensor].alias[0])) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias));
} else {
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
}
/********************************************************************************************/
@ -574,25 +581,26 @@ void (* const DSCommand[])(void) PROGMEM = {
&CmndDSAlias };
void CmndDSAlias(void) {
uint8_t tmp;
uint8_t sensor=255;
char argument[XdrvMailbox.data_len];
char Argument1[XdrvMailbox.data_len];
char Argument2[XdrvMailbox.data_len];
char address[17];
if (ArgC()==2) {
tmp=atoi(ArgV(argument, 2));
ArgV(argument,1);
ArgV(Argument1, 1);
ArgV(Argument2, 2);
TrimSpace(Argument2);
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
for (uint32_t j = 0; j < 8; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]);
}
if (!strncmp(argument,address,12)) {
ds18x20_sensor[i].alias=tmp;
if (!strncmp(Argument1, address, 12) && Argument2[0]) {
snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2);
break;
}
}
}
Response_P(PSTR("{"));
for (uint32_t i = 0; i < DS18X20Data.sensors; 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
}
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("}"));
}

View File

@ -29,8 +29,9 @@
/* #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
* Result in JSON: "DS18Alias_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2)
* add 8 bytes used memory
* Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2)
* 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
@ -46,6 +47,8 @@
#define DS18X20_MAX_SENSORS 8
#endif
#define DS18X20_ALIAS_LEN 17
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
@ -61,7 +64,7 @@ struct {
uint8_t valid;
int8_t pins_id;
#ifdef DS18x20_USE_ID_ALIAS
uint8_t alias;
char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1);
#endif //DS18x20_USE_ID_ALIAS
} 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] == MAX31850_CHIPID))) {
#ifdef DS18x20_USE_ID_ALIAS
ds18x20_sensor[num_sensors].alias=0;
ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0';
#endif
ds18x20_sensor[num_sensors].pins_id = pins;
num_sensors++;
@ -214,24 +217,28 @@ void Ds18x20Name(uint8_t sensor) {
}
}
GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types);
if (DS18X20Data.sensors > 1) {
#ifdef DS18x20_USE_ID_AS_NAME
char address[17];
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
}
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#else
uint8_t print_ind = sensor +1;
#ifdef DS18x20_USE_ID_ALIAS
if (ds18x20_sensor[sensor].alias) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens"));
print_ind = ds18x20_sensor[sensor].alias;
}
#endif
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind);
#endif
char address[17];
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
}
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address);
#elif defined(DS18x20_USE_ID_ALIAS)
if (ds18x20_sensor[sensor].alias[0] != '0') {
if (isdigit(ds18x20_sensor[sensor].alias[0])) {
snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias));
} else {
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
}
/********************************************************************************************/
@ -317,25 +324,26 @@ void (* const DSCommand[])(void) PROGMEM = {
&CmndDSAlias };
void CmndDSAlias(void) {
uint8_t tmp;
uint8_t sensor=255;
char argument[XdrvMailbox.data_len];
char Argument1[XdrvMailbox.data_len];
char Argument2[XdrvMailbox.data_len];
char address[17];
if (ArgC()==2) {
tmp=atoi(ArgV(argument, 2));
ArgV(argument,1);
ArgV(Argument1, 1);
ArgV(Argument2, 2);
TrimSpace(Argument2);
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
for (uint32_t j = 0; j < 8; j++) {
sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]);
}
if (!strncmp(argument,address,12)) {
ds18x20_sensor[i].alias=tmp;
if (!strncmp(Argument1, address, 12) && Argument2[0]) {
snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2);
break;
}
}
}
Response_P(PSTR("{"));
for (uint32_t i = 0; i < DS18X20Data.sensors; 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
}
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("}"));
}