From 87ab75e52870c16216f3ab10a32674bec9c8928d Mon Sep 17 00:00:00 2001 From: wellenvogel Date: Mon, 22 Nov 2021 21:19:35 +0100 Subject: [PATCH] show unmapped xdr records, allow to add them --- web/index.css | 5 ++- web/index.js | 89 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/web/index.css b/web/index.css index 6829bfe..67521ba 100644 --- a/web/index.css +++ b/web/index.css @@ -146,7 +146,10 @@ body{ .xdrexample { max-width: 16em; overflow: auto; -} + } + button.addunassigned { + margin-left: 1em; + } .msgDetails .value { width: 5em; text-align: right; diff --git a/web/index.js b/web/index.js index a4dda81..eb31b7b 100644 --- a/web/index.js +++ b/web/index.js @@ -236,8 +236,8 @@ function checkChange(el, row) { } } } -let configDefinitions; -let xdrConfig; +let configDefinitions={}; +let xdrConfig={}; function createInput(configItem, frame,clazz) { let el; if (configItem.type === 'boolean' || configItem.type === 'list') { @@ -309,25 +309,32 @@ function getXdrCategories(){ } return rt; } -function getXdrSelectors(category){ - category=parseInt(category); +function getXdrCategoryName(cid){ + category=parseInt(cid); for (let c in xdrConfig){ let base=xdrConfig[c]; if (parseInt(base.id) == category){ - return base.selector || []; + return c; } } - return []; +} +function getXdrCategory(cid){ + category=parseInt(cid); + for (let c in xdrConfig){ + let base=xdrConfig[c]; + if (parseInt(base.id) == category){ + return base; + } + } + return {}; +} +function getXdrSelectors(category){ + let base=getXdrCategory(category); + return base.selector || []; } function getXdrFields(category){ - category=parseInt(category); - for (let c in xdrConfig){ - let base=xdrConfig[c]; - if (parseInt(base.id) == category){ - return base.fields || []; - } - } - return []; + let base=getXdrCategory(category); + return base.fields || []; } function createXdrLine(parent,label){ @@ -565,6 +572,60 @@ function findFreeXdr(data){ }); } +function convertUnassigned(value){ + let rt={}; + value=parseInt(value); + if (isNaN(value)) return; + //see GwXDRMappings::addUnknown + let instance=value & 0x1ff; + value = value >> 9; + let field=value & 0x7f; + value = value >> 7; + let selector=value & 0x7f; + value = value >> 7; + let cid=value & 0x7f; + let category=getXdrCategory(cid); + let cname=getXdrCategoryName(cid); + if (! cname) return rt; + let fieldName=""; + (category.fields || []).forEach(function(f){ + if (parseInt(f.v) == field) fieldName=f.l; + }); + let selectorName=selector+""; + (category.selector ||[]).forEach(function(s){ + if (parseInt(s.v) == selector) selectorName=s.l; + }); + rt.l=cname+","+selectorName+","+fieldName+","+instance; + rt.v=cid+",1,"+selector+","+field+",1,"+instance+","; + return rt; +} + +function unassignedAdd(ev) { + let dv = ev.target.getAttribute('data-value'); + if (dv) { + findFreeXdr(dv); + hideOverlay(); + } +} +function loadUnassigned(){ + getText("/api/xdrUnmapped") + .then(function(txt){ + let ot=""; + txt.split('\n').forEach(function(line){ + let cv=convertUnassigned(line); + if (!cv || !cv.l) return; + ot+='
'+ + cv.l+''+ + '
'; + }) + showOverlay(ot,true); + forEl('.addunassigned',function(bt){ + bt.onclick=unassignedAdd; + }); + }) +} function toggleClass(el,id,classList){ let nc=classList[id]; let rt=false;