1
0
mirror of https://github.com/thooge/esp32-nmea2000-obp60.git synced 2025-12-13 05:53:06 +01:00

intermediate: udp reader

This commit is contained in:
andreas
2024-11-08 21:00:25 +01:00
parent b0d5e27b5a
commit 82f5e17987
10 changed files with 406 additions and 24 deletions

View File

@@ -691,6 +691,7 @@
"label": "TCP port",
"type": "number",
"default": "10110",
"check":"checkPort",
"description": "the TCP port we listen on",
"category": "TCP server"
},
@@ -766,8 +767,12 @@
"label": "remote port",
"type": "number",
"default": "10110",
"check":"checkPort",
"description": "the TCP port we connect to",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "remoteAddress",
@@ -776,7 +781,10 @@
"default": "",
"check": "checkIpAddress",
"description": "the IP address we connect to in the form 192.168.1.2\nor an MDNS name like ESP32NMEA2K.local",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "sendTCL",
@@ -784,7 +792,10 @@
"type": "boolean",
"default": "true",
"description": "send out NMEA data to remote TCP server",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "readTCL",
@@ -792,7 +803,10 @@
"type": "boolean",
"default": "true",
"description": "receive NMEA data from remote TCP server",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "tclToN2k",
@@ -800,7 +814,10 @@
"type": "boolean",
"default": "true",
"description": "convert NMEA0183 from remote TCP server to NMEA2000",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "tclReadFilter",
@@ -808,7 +825,10 @@
"type": "filter",
"default": "",
"description": "filter for NMEA0183 data when reading from remote TCP server\nselect aison|aisoff, set a whitelist or a blacklist with NMEA sentences like RMC,RMB",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "tclWriteFilter",
@@ -816,7 +836,10 @@
"type": "filter",
"default": "",
"description": "filter for NMEA0183 data when writing to remote TCP server\nselect aison|aisoff, set a whitelist or a blacklist with NMEA sentences like RMC,RMB",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "tclSeasmart",
@@ -824,7 +847,10 @@
"type": "boolean",
"default": "false",
"description": "send NMEA2000 as seasmart to remote TCP server",
"category": "TCP client"
"category": "TCP client",
"condition":{
"tclEnabled":"true"
}
},
{
"name": "udpwEnabled",
@@ -840,7 +866,11 @@
"type": "number",
"default": "10110",
"description": "the UDP port we send to",
"category": "UDP writer"
"check":"checkPort",
"category": "UDP writer",
"condition":{
"udpwEnabled":"true"
}
},
{
"name": "udpwType",
@@ -857,7 +887,10 @@
{"l":"mc-ap","v":"5"},
{"l":"mc-cli","v":"6"}
],
"category": "UDP writer"
"category": "UDP writer",
"condition":{
"udpwEnabled":"true"
}
},
{
"name": "udpwAddress",
@@ -868,7 +901,8 @@
"description": "the IP address we connect to in the form 192.168.1.2",
"category": "UDP writer",
"condition":{
"udpwType":["3"]
"udpwType":["3"],
"udpwEnabled":"true"
}
},
{
@@ -880,7 +914,8 @@
"description": "the multicast address we send to 224.0.0.0...239.255.255.255",
"category": "UDP writer",
"condition":{
"udpwType":["4","5","6"]
"udpwType":["4","5","6"],
"udpwEnabled":"true"
}
},
{
@@ -889,7 +924,10 @@
"type": "filter",
"default": "",
"description": "filter for NMEA0183 data when writing to remote UDP server\nselect aison|aisoff, set a whitelist or a blacklist with NMEA sentences like RMC,RMB",
"category": "UDP writer"
"category": "UDP writer",
"condition":{
"udpwEnabled":"true"
}
},
{
"name": "udpwSeasmart",
@@ -897,7 +935,84 @@
"type": "boolean",
"default": "false",
"description": "send NMEA2000 as seasmart to remote UDP server",
"category": "UDP writer"
"category": "UDP writer",
"condition":{
"udpwEnabled":"true"
}
},
{
"name": "udprEnabled",
"label": "enable",
"type": "boolean",
"default": "false",
"description":"enable the UDP reader",
"category":"UDP reader"
},
{
"name": "udprPort",
"label": "local port",
"type": "number",
"default": "10110",
"check":"checkPort",
"description": "the UDP port we listen on",
"category": "UDP reader",
"condition":{
"udprEnabled":"true"
}
},
{
"name": "udprType",
"label": "local address type",
"type": "list",
"default": "0",
"description": "to which networks/addresses do we listen\nall: listen on AP and wifi client network\nap: listen in access point network only\ncli: listen in wifi client network\nmc-all: receive multicast from AP and wifi client network\nmc-ap:receive multicast from AP network\nmc-cli: receive muticast wifi client network",
"list":[
{"l":"all","v":"0"},
{"l":"ap","v":"1"},
{"l":"cli","v":"2"},
{"l":"mc-all","v":"4"},
{"l":"mc-ap","v":"5"},
{"l":"mc-cli","v":"6"}
],
"category": "UDP reader",
"condition":{
"udprEnabled":"true"
}
},
{
"name": "udprToN2k",
"label": "to NMEA2000",
"type": "boolean",
"default": "true",
"description": "convert NMEA0183 from UDP to NMEA2000",
"category": "UDP reader",
"condition":{
"udprEnabled":"true"
}
},
{
"name": "udprMC",
"label": "multicast address",
"type": "string",
"default": "224.0.0.1",
"check": "checkMCAddress",
"description": "the multicast address we listen on 224.0.0.0...239.255.255.255",
"category": "UDP reader",
"condition":{
"udprType":["4","5","6"],
"udprEnabled":"true"
}
},
{
"name": "udprReadFilter",
"label": "NMEA read Filter",
"type": "filter",
"default": "",
"description": "filter for NMEA0183 data when receiving\nselect aison|aisoff, set a whitelist or a blacklist with NMEA sentences like RMC,RMB",
"category": "UDP reader",
"condition":{
"udprEnabled":"true"
}
},
{
"name": "wifiClient",

View File

@@ -181,6 +181,12 @@
}
}
checkers.checkPort=function(v,allValues,def){
let parsed=parseInt(v);
if (isNaN(parsed)) return "must be a number";
if (parsed <1 || parsed >= 65536) return "port must be in the range 1..65536";
}
checkers.checkSystemName=function(v) {
//2...32 characters for ssid
let allowed = v.replace(/[^a-zA-Z0-9]*/g, '');
@@ -213,13 +219,20 @@
}
checkers.checkIpAddress=function(v, allValues, def) {
if (allValues.tclEnabled != "true") return;
if (!v) return "cannot be empty";
if (!v.match(/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/)
&& !v.match(/.*\.local/))
return "must be either in the form 192.168.1.1 or xxx.local";
}
checkers.checkMCAddress=function(v, allValues, def) {
if (!v) return "cannot be empty";
if (!v.match(/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/))
return "must be in the form 224.0.0.1";
let parts=v.split(".");
let o1=parseInt(v[0]);
if (o1 < 224 || o1 > 239) return "mulicast address must be in the range 224.0.0.0 to 239.255.255.255"
}
checkers.checkXDR=function(v, allValues) {
if (!v) return;
let parts = v.split(',');
@@ -264,21 +277,22 @@
continue;
}
let check = v.getAttribute('data-check');
if (check) {
if (check && conditionOk(name)) {
let cfgDef=getConfigDefition(name);
let checkFunction=checkers[check];
if (typeof (checkFunction) === 'function') {
if (! loggedChecks[check]){
loggedChecks[check]=true;
//console.log("check:"+check);
}
let res = checkFunction(v.value, allValues, getConfigDefition(name));
let res = checkFunction(v.value, allValues, cfgDef);
if (res) {
let value = v.value;
if (v.type === 'password') value = "******";
let label = v.getAttribute('data-label');
if (!label) label = v.getAttribute('name');
v.classList.add("error");
alert("invalid config for " + label + "(" + value + "):\n" + res);
alert("invalid config for "+cfgDef.category+":" + label + "(" + value + "):\n" + res);
return;
}
}
@@ -472,10 +486,10 @@
if (!(condition instanceof Array)) condition = [condition];
return condition;
}
function checkCondition(element) {
let name = element.getAttribute('name');
function conditionOk(name){
let condition = getConditions(name);
if (!condition) return;
if (!condition) return true;
let visible = false;
if (!condition instanceof Array) condition = [condition];
condition.forEach(function (cel) {
@@ -493,7 +507,13 @@
}
}
if (lvis) visible = true;
});
});
return visible;
}
function checkCondition(element) {
let name = element.getAttribute('name');
let visible=conditionOk(name);
let row = closestParent(element, 'row');
if (!row) return;
if (visible) row.classList.remove('hidden');