mirror of
https://github.com/arendst/Tasmota.git
synced 2025-08-02 07:27:42 +00:00
commit
f916dbf4d6
@ -76,7 +76,7 @@ static void (*ISRList[16])() = {
|
|||||||
tms_isr_15
|
tms_isr_15
|
||||||
};
|
};
|
||||||
|
|
||||||
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode)
|
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode, int buffer_size)
|
||||||
{
|
{
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
m_hardserial = 0;
|
m_hardserial = 0;
|
||||||
@ -98,7 +98,7 @@ TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fal
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (m_rx_pin > -1) {
|
if (m_rx_pin > -1) {
|
||||||
m_buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE);
|
m_buffer = (uint8_t*)malloc(serial_buffer_size);
|
||||||
if (m_buffer == NULL) return;
|
if (m_buffer == NULL) return;
|
||||||
// Use getCycleCount() loop to get as exact timing as possible
|
// Use getCycleCount() loop to get as exact timing as possible
|
||||||
m_bit_time = ESP.getCpuFreqMHz() * 1000000 / TM_SERIAL_BAUDRATE;
|
m_bit_time = ESP.getCpuFreqMHz() * 1000000 / TM_SERIAL_BAUDRATE;
|
||||||
@ -185,7 +185,7 @@ int TasmotaSerial::read()
|
|||||||
} else {
|
} else {
|
||||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
||||||
uint8_t ch = m_buffer[m_out_pos];
|
uint8_t ch = m_buffer[m_out_pos];
|
||||||
m_out_pos = (m_out_pos +1) % TM_SERIAL_BUFFER_SIZE;
|
m_out_pos = (m_out_pos +1) % serial_buffer_size;
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,7 +196,7 @@ int TasmotaSerial::available()
|
|||||||
return Serial.available();
|
return Serial.available();
|
||||||
} else {
|
} else {
|
||||||
int avail = m_in_pos - m_out_pos;
|
int avail = m_in_pos - m_out_pos;
|
||||||
if (avail < 0) avail += TM_SERIAL_BUFFER_SIZE;
|
if (avail < 0) avail += serial_buffer_size;
|
||||||
return avail;
|
return avail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -260,7 +260,7 @@ if (!m_nwmode) {
|
|||||||
TM_SERIAL_WAIT;
|
TM_SERIAL_WAIT;
|
||||||
}
|
}
|
||||||
// Store the received value in the buffer unless we have an overflow
|
// Store the received value in the buffer unless we have an overflow
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = rec;
|
m_buffer[m_in_pos] = rec;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
@ -297,7 +297,7 @@ if (!m_nwmode) {
|
|||||||
ss_byte|=(1<<i);
|
ss_byte|=(1<<i);
|
||||||
}
|
}
|
||||||
//stobyte(0,ssp->ss_byte>>1);
|
//stobyte(0,ssp->ss_byte>>1);
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = ss_byte>>1;
|
m_buffer[m_in_pos] = ss_byte>>1;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
@ -311,7 +311,7 @@ if (!m_nwmode) {
|
|||||||
if (diff>=LASTBIT) {
|
if (diff>=LASTBIT) {
|
||||||
// bit zero was 0,
|
// bit zero was 0,
|
||||||
//stobyte(0,ssp->ss_byte>>1);
|
//stobyte(0,ssp->ss_byte>>1);
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = ss_byte>>1;
|
m_buffer[m_in_pos] = ss_byte>>1;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
class TasmotaSerial : public Stream {
|
class TasmotaSerial : public Stream {
|
||||||
public:
|
public:
|
||||||
TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0,int nwmode = 0);
|
TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0,int nwmode = 0, int buffer_size = TM_SERIAL_BUFFER_SIZE);
|
||||||
virtual ~TasmotaSerial();
|
virtual ~TasmotaSerial();
|
||||||
|
|
||||||
bool begin(long speed, int stop_bits = 1);
|
bool begin(long speed, int stop_bits = 1);
|
||||||
@ -75,6 +75,7 @@ class TasmotaSerial : public Stream {
|
|||||||
unsigned int m_in_pos;
|
unsigned int m_in_pos;
|
||||||
unsigned int m_out_pos;
|
unsigned int m_out_pos;
|
||||||
uint8_t *m_buffer;
|
uint8_t *m_buffer;
|
||||||
|
int serial_buffer_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TasmotaSerial_h
|
#endif // TasmotaSerial_h
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
|
* 6.6.0.9 20190828
|
||||||
|
* Change theoretical baudrate range to 300..19660500 bps in 300 increments (#6294)
|
||||||
|
*
|
||||||
* 6.6.0.8 20190827
|
* 6.6.0.8 20190827
|
||||||
* Add Tuya Energy monitoring by Shantur Rathore
|
* Add Tuya Energy monitoring by Shantur Rathore
|
||||||
* Add phase 1 Domoticz P1 Smart Meter support using energy sensors handled by xdrv_03_energy.ino based on an idea by pablozg
|
* Add phase 1 Domoticz P1 Smart Meter support using energy sensors handled by xdrv_03_energy.ino based on an idea by pablozg
|
||||||
|
@ -205,7 +205,7 @@ struct SYSCFG {
|
|||||||
int8_t timezone; // 016
|
int8_t timezone; // 016
|
||||||
char ota_url[101]; // 017
|
char ota_url[101]; // 017
|
||||||
char mqtt_prefix[3][11]; // 07C
|
char mqtt_prefix[3][11]; // 07C
|
||||||
uint8_t baudrate; // 09D
|
uint8_t ex_baudrate; // 09D - Free since 6.6.0.9
|
||||||
uint8_t seriallog_level; // 09E
|
uint8_t seriallog_level; // 09E
|
||||||
uint8_t sta_config; // 09F
|
uint8_t sta_config; // 09F
|
||||||
uint8_t sta_active; // 0A0
|
uint8_t sta_active; // 0A0
|
||||||
@ -288,7 +288,7 @@ struct SYSCFG {
|
|||||||
char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
|
char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
|
||||||
char switch_topic[33]; // 430
|
char switch_topic[33]; // 430
|
||||||
char serial_delimiter; // 451
|
char serial_delimiter; // 451
|
||||||
uint8_t sbaudrate; // 452
|
uint8_t ex_sbaudrate; // 452 - Free since 6.6.0.9
|
||||||
uint8_t sleep; // 453
|
uint8_t sleep; // 453
|
||||||
uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454
|
uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454
|
||||||
uint16_t domoticz_sensor_idx[MAX_DOMOTICZ_SNS_IDX]; // 45C
|
uint16_t domoticz_sensor_idx[MAX_DOMOTICZ_SNS_IDX]; // 45C
|
||||||
@ -345,11 +345,9 @@ struct SYSCFG {
|
|||||||
uint8_t web_color[18][3]; // 73E
|
uint8_t web_color[18][3]; // 73E
|
||||||
uint16_t display_width; // 774
|
uint16_t display_width; // 774
|
||||||
uint16_t display_height; // 776
|
uint16_t display_height; // 776
|
||||||
|
uint16_t baudrate; // 778
|
||||||
uint8_t free_778[4]; // 778
|
uint16_t sbaudrate; // 77A
|
||||||
|
|
||||||
EnergyUsage energy_usage; // 77C
|
EnergyUsage energy_usage; // 77C
|
||||||
|
|
||||||
// uint32_t drivers[3]; // 794 - 6.5.0.12 replaced by below three entries
|
// uint32_t drivers[3]; // 794 - 6.5.0.12 replaced by below three entries
|
||||||
uint32_t adc_param1; // 794
|
uint32_t adc_param1; // 794
|
||||||
uint32_t adc_param2; // 798
|
uint32_t adc_param2; // 798
|
||||||
|
@ -596,8 +596,8 @@ void SettingsDefaultSet2(void)
|
|||||||
// for (uint32_t i = 1; i < MAX_PULSETIMERS; i++) { Settings.pulse_timer[i] = 0; }
|
// for (uint32_t i = 1; i < MAX_PULSETIMERS; i++) { Settings.pulse_timer[i] = 0; }
|
||||||
|
|
||||||
// Serial
|
// Serial
|
||||||
Settings.baudrate = APP_BAUDRATE / 1200;
|
Settings.baudrate = APP_BAUDRATE / 300;
|
||||||
Settings.sbaudrate = SOFT_BAUDRATE / 1200;
|
Settings.sbaudrate = SOFT_BAUDRATE / 300;
|
||||||
Settings.serial_delimiter = 0xff;
|
Settings.serial_delimiter = 0xff;
|
||||||
Settings.seriallog_level = SERIAL_LOG_LEVEL;
|
Settings.seriallog_level = SERIAL_LOG_LEVEL;
|
||||||
|
|
||||||
@ -960,10 +960,10 @@ void SettingsDelta(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Settings.version < 0x050C0007) {
|
if (Settings.version < 0x050C0007) {
|
||||||
Settings.baudrate = APP_BAUDRATE / 1200;
|
Settings.baudrate = APP_BAUDRATE / 300;
|
||||||
}
|
}
|
||||||
if (Settings.version < 0x050C0008) {
|
if (Settings.version < 0x050C0008) {
|
||||||
Settings.sbaudrate = SOFT_BAUDRATE / 1200;
|
Settings.sbaudrate = SOFT_BAUDRATE / 300;
|
||||||
Settings.serial_delimiter = 0xff;
|
Settings.serial_delimiter = 0xff;
|
||||||
}
|
}
|
||||||
if (Settings.version < 0x050C000A) {
|
if (Settings.version < 0x050C000A) {
|
||||||
@ -1091,6 +1091,10 @@ void SettingsDelta(void)
|
|||||||
Settings.param[P_ENERGY_TARIFF2] = ENERGY_TARIFF2_HOUR;
|
Settings.param[P_ENERGY_TARIFF2] = ENERGY_TARIFF2_HOUR;
|
||||||
Settings.flag3.energy_weekend = ENERGY_TARIFF_WEEKEND;
|
Settings.flag3.energy_weekend = ENERGY_TARIFF_WEEKEND;
|
||||||
}
|
}
|
||||||
|
if (Settings.version < 0x06060009) {
|
||||||
|
Settings.baudrate = Settings.ex_baudrate * 4;
|
||||||
|
Settings.sbaudrate = Settings.ex_sbaudrate * 4;
|
||||||
|
}
|
||||||
|
|
||||||
Settings.version = VERSION;
|
Settings.version = VERSION;
|
||||||
SettingsSave(1);
|
SettingsSave(1);
|
||||||
|
@ -1476,7 +1476,7 @@ void setup(void)
|
|||||||
XdrvCall(FUNC_SETTINGS_OVERRIDE);
|
XdrvCall(FUNC_SETTINGS_OVERRIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
baudrate = Settings.baudrate * 1200;
|
baudrate = Settings.baudrate * 300;
|
||||||
// mdns_delayed_start = Settings.param[P_MDNS_DELAYED_START];
|
// mdns_delayed_start = Settings.param[P_MDNS_DELAYED_START];
|
||||||
seriallog_level = Settings.seriallog_level;
|
seriallog_level = Settings.seriallog_level;
|
||||||
seriallog_timer = SERIALLOG_TIMER;
|
seriallog_timer = SERIALLOG_TIMER;
|
||||||
|
@ -20,6 +20,6 @@
|
|||||||
#ifndef _SONOFF_VERSION_H_
|
#ifndef _SONOFF_VERSION_H_
|
||||||
#define _SONOFF_VERSION_H_
|
#define _SONOFF_VERSION_H_
|
||||||
|
|
||||||
const uint32_t VERSION = 0x06060008;
|
const uint32_t VERSION = 0x06060009;
|
||||||
|
|
||||||
#endif // _SONOFF_VERSION_H_
|
#endif // _SONOFF_VERSION_H_
|
||||||
|
@ -774,7 +774,7 @@ int GetStateNumber(char *state_text)
|
|||||||
|
|
||||||
void SetSerialBaudrate(int baudrate)
|
void SetSerialBaudrate(int baudrate)
|
||||||
{
|
{
|
||||||
Settings.baudrate = baudrate / 1200;
|
Settings.baudrate = baudrate / 300;
|
||||||
if (Serial.baudRate() != baudrate) {
|
if (Serial.baudRate() != baudrate) {
|
||||||
if (seriallog_level) {
|
if (seriallog_level) {
|
||||||
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SET_BAUDRATE_TO " %d"), baudrate);
|
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SET_BAUDRATE_TO " %d"), baudrate);
|
||||||
@ -793,7 +793,7 @@ void ClaimSerial(void)
|
|||||||
AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial"));
|
AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial"));
|
||||||
SetSeriallog(LOG_LEVEL_NONE);
|
SetSeriallog(LOG_LEVEL_NONE);
|
||||||
baudrate = Serial.baudRate();
|
baudrate = Serial.baudRate();
|
||||||
Settings.baudrate = baudrate / 1200;
|
Settings.baudrate = baudrate / 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialSendRaw(char *codes)
|
void SerialSendRaw(char *codes)
|
||||||
|
@ -961,12 +961,12 @@ void CmndSwitchDebounce(void)
|
|||||||
|
|
||||||
void CmndBaudrate(void)
|
void CmndBaudrate(void)
|
||||||
{
|
{
|
||||||
if (XdrvMailbox.payload > 1200) {
|
if (XdrvMailbox.payload >= 300) {
|
||||||
XdrvMailbox.payload /= 1200; // Make it a valid baudrate
|
XdrvMailbox.payload /= 300; // Make it a valid baudrate
|
||||||
baudrate = (XdrvMailbox.payload & 0xFF) * 1200;
|
baudrate = (XdrvMailbox.payload & 0xFFFF) * 300;
|
||||||
SetSerialBaudrate(baudrate);
|
SetSerialBaudrate(baudrate);
|
||||||
}
|
}
|
||||||
ResponseCmndNumber(Settings.baudrate * 1200);
|
ResponseCmndNumber(Settings.baudrate * 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmndSerialSend(void)
|
void CmndSerialSend(void)
|
||||||
|
@ -165,10 +165,12 @@ void Energy200ms(void)
|
|||||||
Settings.energy_kWhtotal += Energy.kWhtoday;
|
Settings.energy_kWhtotal += Energy.kWhtoday;
|
||||||
RtcSettings.energy_kWhtotal = Settings.energy_kWhtotal;
|
RtcSettings.energy_kWhtotal = Settings.energy_kWhtotal;
|
||||||
Energy.kWhtoday = 0;
|
Energy.kWhtoday = 0;
|
||||||
|
RtcSettings.energy_kWhtoday = 0;
|
||||||
|
|
||||||
Settings.energy_usage.usage1_kWhtotal += Energy.kWhtoday1;
|
Settings.energy_usage.usage1_kWhtotal += Energy.kWhtoday1;
|
||||||
RtcSettings.energy_usage.usage1_kWhtotal = Settings.energy_usage.usage1_kWhtotal;
|
RtcSettings.energy_usage.usage1_kWhtotal = Settings.energy_usage.usage1_kWhtotal;
|
||||||
Energy.kWhtoday1 = 0;
|
Energy.kWhtoday1 = 0;
|
||||||
|
RtcSettings.energy_usage.usage1_kWhtoday = 0;
|
||||||
|
|
||||||
Energy.kWhtoday_delta = 0;
|
Energy.kWhtoday_delta = 0;
|
||||||
Energy.period = Energy.kWhtoday;
|
Energy.period = Energy.kWhtoday;
|
||||||
|
@ -86,7 +86,7 @@ void SerialBridgeInit(void)
|
|||||||
serial_bridge_active = false;
|
serial_bridge_active = false;
|
||||||
if ((pin[GPIO_SBR_RX] < 99) && (pin[GPIO_SBR_TX] < 99)) {
|
if ((pin[GPIO_SBR_RX] < 99) && (pin[GPIO_SBR_TX] < 99)) {
|
||||||
SerialBridgeSerial = new TasmotaSerial(pin[GPIO_SBR_RX], pin[GPIO_SBR_TX]);
|
SerialBridgeSerial = new TasmotaSerial(pin[GPIO_SBR_RX], pin[GPIO_SBR_TX]);
|
||||||
if (SerialBridgeSerial->begin(Settings.sbaudrate * 1200)) { // Baud rate is stored div 1200 so it fits into one byte
|
if (SerialBridgeSerial->begin(Settings.sbaudrate * 300)) { // Baud rate is stored div 300 so it fits into 16 bits
|
||||||
if (SerialBridgeSerial->hardwareSerial()) {
|
if (SerialBridgeSerial->hardwareSerial()) {
|
||||||
ClaimSerial();
|
ClaimSerial();
|
||||||
serial_bridge_buffer = serial_in_buffer; // Use idle serial buffer to save RAM
|
serial_bridge_buffer = serial_in_buffer; // Use idle serial buffer to save RAM
|
||||||
@ -141,11 +141,12 @@ void CmndSSerialSend(void)
|
|||||||
|
|
||||||
void CmndSBaudrate(void)
|
void CmndSBaudrate(void)
|
||||||
{
|
{
|
||||||
if (XdrvMailbox.payload > 1200) {
|
if (XdrvMailbox.payload >= 300) {
|
||||||
Settings.sbaudrate /= 1200; // Make it a valid baudrate
|
XdrvMailbox.payload /= 300; // Make it a valid baudrate
|
||||||
SerialBridgeSerial->begin(Settings.sbaudrate * 1200); // Reinitialize serial port with new baud rate
|
Settings.sbaudrate = XdrvMailbox.payload;
|
||||||
|
SerialBridgeSerial->begin(Settings.sbaudrate * 300); // Reinitialize serial port with new baud rate
|
||||||
}
|
}
|
||||||
ResponseCmndNumber(Settings.sbaudrate * 1200);
|
ResponseCmndNumber(Settings.sbaudrate * 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
|
@ -422,6 +422,34 @@ void TuyaSetWifiLed(void)
|
|||||||
TuyaSendCmd(TUYA_CMD_WIFI_STATE, &wifi_state, 1);
|
TuyaSendCmd(TUYA_CMD_WIFI_STATE, &wifi_state, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_ENERGY_SENSOR
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* Energy Interface
|
||||||
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
int Xnrg08(uint8_t function)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
if (TUYA_DIMMER == my_module_type) {
|
||||||
|
if (FUNC_PRE_INIT == function) {
|
||||||
|
if (!energy_flg) {
|
||||||
|
if (Settings.param[P_TUYA_POWER_ID] != 0) {
|
||||||
|
if (Settings.param[P_TUYA_CURRENT_ID] == 0) {
|
||||||
|
Energy.current_available = false;
|
||||||
|
}
|
||||||
|
if (Settings.param[P_TUYA_VOLTAGE_ID] == 0) {
|
||||||
|
Energy.voltage_available = false;
|
||||||
|
}
|
||||||
|
energy_flg = XNRG_08;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif // USE_ENERGY_SENSOR
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
@ -463,28 +491,5 @@ bool Xdrv16(uint8_t function)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_ENERGY_SENSOR
|
|
||||||
/*********************************************************************************************\
|
|
||||||
* Energy Interface
|
|
||||||
\*********************************************************************************************/
|
|
||||||
|
|
||||||
int Xnrg08(uint8_t function)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
if (FUNC_PRE_INIT == function) {
|
|
||||||
if (Settings.param[P_TUYA_POWER_ID] != 0) {
|
|
||||||
energy_flg = XNRG_08;
|
|
||||||
}
|
|
||||||
if (Settings.param[P_TUYA_CURRENT_ID] == 0) {
|
|
||||||
Energy.current_available = false;
|
|
||||||
}
|
|
||||||
if (Settings.param[P_TUYA_VOLTAGE_ID] == 0) {
|
|
||||||
Energy.voltage_available = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif // USE_ENERGY_SENSOR
|
|
||||||
|
|
||||||
#endif // USE_TUYA_DIMMER
|
#endif // USE_TUYA_DIMMER
|
||||||
#endif // USE_LIGHT
|
#endif // USE_LIGHT
|
||||||
|
@ -406,6 +406,9 @@ uint32_t findEchoGeneration(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (0 == user_agent.length()) {
|
||||||
|
gen = 1; // if no user-agent, also revert to gen v1
|
||||||
|
}
|
||||||
|
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, D_LOG_HTTP D_HUE " User-Agent: %s, gen=%d", user_agent.c_str(), gen); // Header collection is set in xdrv_01_webserver.ino, in StartWebserver()
|
AddLog_P2(LOG_LEVEL_DEBUG_MORE, D_LOG_HTTP D_HUE " User-Agent: %s, gen=%d", user_agent.c_str(), gen); // Header collection is set in xdrv_01_webserver.ino, in StartWebserver()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user