Configurable buffer size and patch of GUI dependencies

This commit is contained in:
Gunnar Skjold 2023-07-02 13:43:45 +02:00
parent ca1c237776
commit e629bb0d68
10 changed files with 812 additions and 621 deletions

View File

@ -84,7 +84,8 @@ struct MeterConfig {
uint32_t accumulatedMultiplier;
uint8_t source;
uint8_t parser;
}; // 61
uint8_t bufferSize;
}; // 62
struct MeterConfig100 {
uint32_t baud;

View File

@ -213,6 +213,7 @@ bool AmsConfiguration::getMeterConfig(MeterConfig& config) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.get(CONFIG_METER_START, config);
EEPROM.end();
if(config.bufferSize < 1 || config.bufferSize > 64) config.bufferSize = 4;
return true;
} else {
clearMeter(config);
@ -231,6 +232,7 @@ bool AmsConfiguration::setMeterConfig(MeterConfig& config) {
meterChanged |= config.productionCapacity != existing.productionCapacity;
meterChanged |= strcmp((char*) config.encryptionKey, (char*) existing.encryptionKey);
meterChanged |= strcmp((char*) config.authenticationKey, (char*) existing.authenticationKey);
meterChanged |= config.bufferSize != existing.bufferSize;
} else {
meterChanged = true;
}
@ -256,6 +258,7 @@ void AmsConfiguration::clearMeter(MeterConfig& config) {
config.accumulatedMultiplier = 0;
config.source = 1; // Serial
config.parser = 0; // Auto
config.bufferSize = 1; // 64 bytes
}
bool AmsConfiguration::isMeterChanged() {

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -290,25 +290,33 @@
<a href="{wiki('Meter-configuration')}" target="_blank" class="float-right"><HelpIcon/></a>
<input type="hidden" name="m" value="true"/>
<div class="my-1">
<span>Serial configuration</span>
<div class="flex">
<select name="mb" bind:value={configuration.m.b} class="in-f">
<span class="float-right">Buffer size</span>
<span>Serial conf.</span>
<label class="mt-2 ml-3 whitespace-nowrap"><input name="mi" value="true" bind:checked={configuration.m.i} type="checkbox" class="rounded mb-1"/> inverted</label>
<div class="flex w-full">
<select name="mb" bind:value={configuration.m.b} class="in-f tr w-1/2">
<option value={0} disabled={configuration.m.b != 0}>Autodetect</option>
{#each [24,48,96,192,384,576,1152] as b}
<option value={b*100}>{b*100}</option>
{/each}
</select>
<select name="mp" bind:value={configuration.m.p} class="in-l" disabled={configuration.m.b == 0}>
<select name="mp" bind:value={configuration.m.p} class="in-m" disabled={configuration.m.b == 0}>
<option value={0} disabled={configuration.m.b != 0}>-</option>
<option value={2}>7N1</option>
<option value={3}>8N1</option>
<option value={10}>7E1</option>
<option value={11}>8E1</option>
</select>
<label class="mt-2 ml-3 whitespace-nowrap"><input name="mi" value="true" bind:checked={configuration.m.i} type="checkbox" class="rounded mb-1"/> inverted</label>
<select name="ms" bind:value={configuration.m.s} class="in-l tr w-1/2">
{#each [64,256,512,1024,1536,2048,3072,4096] as b}
<option value={b}>{b}</option>
{/each}
</select>
</div>
</div>
<div class="my-1">
Buffer size<br/>
</div>
<div class="my-1">
Voltage<br/>
<select name="md" bind:value={configuration.m.d} class="in-s">

View File

@ -17,18 +17,18 @@ export default defineConfig({
plugins: [svelte()],
server: {
proxy: {
"/data.json": "http://192.168.28.100",
"/energyprice.json": "http://192.168.28.100",
"/dayplot.json": "http://192.168.28.100",
"/monthplot.json": "http://192.168.28.100",
"/temperature.json": "http://192.168.28.100",
"/sysinfo.json": "http://192.168.28.100",
"/configuration.json": "http://192.168.28.100",
"/tariff.json": "http://192.168.28.100",
"/save": "http://192.168.28.100",
"/reboot": "http://192.168.28.100",
"/configfile": "http://192.168.28.100",
"/upgrade": "http://192.168.28.100"
"/data.json": "http://192.168.233.244",
"/energyprice.json": "http://192.168.233.244",
"/dayplot.json": "http://192.168.233.244",
"/monthplot.json": "http://192.168.233.244",
"/temperature.json": "http://192.168.233.244",
"/sysinfo.json": "http://192.168.233.244",
"/configuration.json": "http://192.168.233.244",
"/tariff.json": "http://192.168.233.244",
"/save": "http://192.168.233.244",
"/reboot": "http://192.168.233.244",
"/configfile": "http://192.168.233.244",
"/upgrade": "http://192.168.233.244"
}
}
})

View File

@ -2,6 +2,7 @@
"b": %d,
"p": %d,
"i": %s,
"s": %d,
"d": %d,
"f": %d,
"r": %d,

View File

@ -843,6 +843,7 @@ void AmsWebServer::configurationJson() {
meterConfig->baud,
meterConfig->parity,
meterConfig->invert ? "true" : "false",
meterConfig->bufferSize * 64,
meterConfig->distributionSystem,
meterConfig->mainFuse,
meterConfig->productionCapacity,

View File

@ -110,7 +110,6 @@ AmsMqttHandler* mqttHandler = NULL;
Stream *hanSerial;
SoftwareSerial *swSerial = NULL;
HardwareSerial *hwSerial = NULL;
size_t rxBufferSize = 128;
uint8_t rxBufferErrors = 0;
GpioConfig gpioConfig;
@ -135,6 +134,10 @@ LLCParser *llcParser = NULL;
DLMSParser *dlmsParser = NULL;
DSMRParser *dsmrParser = NULL;
bool maxDetectPayloadDetectDone = false;
uint8_t maxDetectedPayloadSize = 64;
void configFileParse();
void swapWifiMode();
@ -677,6 +680,15 @@ void handleSystem(unsigned long now) {
}
#endif
}
// After one hour, adjust buffer size to match the largest payload
if(!maxDetectPayloadDetectDone && now > 3600000) {
if(maxDetectedPayloadSize * 1.5 > meterConfig.bufferSize * 64) {
meterConfig.bufferSize = min((double) 64, ceil((maxDetectedPayloadSize * 1.5) / 64));
config.setMeterConfig(meterConfig);
}
maxDetectPayloadDetectDone = true;
}
}
void handleTemperature(unsigned long now) {
@ -791,16 +803,13 @@ void handleButton(unsigned long now) {
void rxerr(int err) {
if(err == 0) return;
switch(err) {
case 1:
debugD_P(PSTR("Serial break"));
return;
case 2:
debugE_P(PSTR("Serial buffer overflow"));
rxBufferErrors++;
if(rxBufferErrors > 3 && rxBufferSize < MAX_RX_BUFFER_SIZE) {
rxBufferSize += 128;
debugI_P(PSTR("Increasing RX buffer to %d bytes"), rxBufferSize);
config.setMeterChanged();
if(rxBufferErrors > 3 && meterConfig.bufferSize < 64) {
meterConfig.bufferSize += 2;
debugI_P(PSTR("Increasing RX buffer to %d bytes"), meterConfig.bufferSize * 64);
config.setMeterConfig(meterConfig);
rxBufferErrors = 0;
}
break;
@ -861,6 +870,8 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal,
return;
}
if(meterConfig.bufferSize < 1) meterConfig.bufferSize = 1;
if(hwSerial != NULL) {
debugD_P(PSTR("Hardware serial"));
Serial.flush();
@ -883,9 +894,9 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal,
serialConfig = SERIAL_8E1;
break;
}
if(rxBufferSize < 256) rxBufferSize = 256; // 64 is default for software serial, 256 for hardware
if(meterConfig.bufferSize < 4) meterConfig.bufferSize = 4; // 64 bytes (1) is default for software serial, 256 bytes (4) for hardware
hwSerial->setRxBufferSize(rxBufferSize);
hwSerial->setRxBufferSize(64 * meterConfig.bufferSize);
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3)
hwSerial->begin(baud, serialConfig, -1, -1, invert);
uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
@ -940,7 +951,7 @@ void setupHanPort(GpioConfig& gpioConfig, uint32_t baud, uint8_t parityOrdinal,
break;
}
swSerial->begin(baud, serialConfig, pin, -1, invert, rxBufferSize);
swSerial->begin(baud, serialConfig, pin, -1, invert, meterConfig.bufferSize * 64);
hanSerial = swSerial;
Serial.end();
@ -1145,6 +1156,7 @@ bool readHanPort() {
AmsData* data = NULL;
char* payload = ((char *) (hanBuffer)) + pos;
if(maxDetectedPayloadSize < pos) maxDetectedPayloadSize = pos;
if(ctx.type == DATA_TAG_DLMS) {
// If MQTT bytestream payload is selected (mqttHandler == NULL), send the payload to MQTT
if(mqttEnabled && mqtt != NULL && mqttHandler == NULL) {

View File

@ -6,7 +6,6 @@
#define INVALID_BUTTON_PIN 0xFFFFFFFF
#define MAX_PEM_SIZE 4096
#define MAX_RX_BUFFER_SIZE 1024
#define METER_SOURCE_NONE 0
#define METER_SOURCE_SERIAL 1