mirror of
https://github.com/UtilitechAS/amsreader-firmware.git
synced 2026-01-14 07:49:01 +00:00
Configurable buffer size and patch of GUI dependencies
This commit is contained in:
parent
ca1c237776
commit
e629bb0d68
@ -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;
|
||||
|
||||
@ -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() {
|
||||
|
||||
18
lib/SvelteUi/app/dist/index.js
vendored
18
lib/SvelteUi/app/dist/index.js
vendored
File diff suppressed because one or more lines are too long
1328
lib/SvelteUi/app/package-lock.json
generated
1328
lib/SvelteUi/app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -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">
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
"b": %d,
|
||||
"p": %d,
|
||||
"i": %s,
|
||||
"s": %d,
|
||||
"d": %d,
|
||||
"f": %d,
|
||||
"r": %d,
|
||||
|
||||
@ -843,6 +843,7 @@ void AmsWebServer::configurationJson() {
|
||||
meterConfig->baud,
|
||||
meterConfig->parity,
|
||||
meterConfig->invert ? "true" : "false",
|
||||
meterConfig->bufferSize * 64,
|
||||
meterConfig->distributionSystem,
|
||||
meterConfig->mainFuse,
|
||||
meterConfig->productionCapacity,
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user