diff --git a/lib/converterlist/ConverterList.h b/lib/converterlist/ConverterList.h index ac0d5d0..afd776e 100644 --- a/lib/converterlist/ConverterList.h +++ b/lib/converterlist/ConverterList.h @@ -13,7 +13,8 @@ public: typedef void (*LConverter)(const Msg &msg, T *); private: - double dummy; + String keyList; + bool keyListFilled=false; class ConverterEntry { public: @@ -44,7 +45,7 @@ private: typedef std::map ConverterMap; ConverterMap converters; -public: + public: /** * register a converter * each of the converter functions must be registered in the constructor @@ -54,70 +55,82 @@ public: unsigned long *lpgn=new unsigned long[1]{pgn}; ConverterEntry e(1,lpgn, converter); converters[String(pgn)] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, LConverter converter) { unsigned long *lpgn=new unsigned long[1]{pgn}; ConverterEntry e(1,lpgn, converter); converters[String(pgn)] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, String sentence, Converter converter) { unsigned long *lpgn=new unsigned long[1]{pgn}; ConverterEntry e(1,lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, String sentence, LConverter converter) { unsigned long *lpgn=new unsigned long[1]{pgn}; ConverterEntry e(1,lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(int num,unsigned long *lpgn, String sentence, Converter converter) { ConverterEntry e(num,lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(int num,unsigned long *lpgn, String sentence, LConverter converter) { ConverterEntry e(num,lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, String sentence, Converter converter) { unsigned long *lpgn=new unsigned long[2]{pgn,pgn2}; ConverterEntry e(2, lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, String sentence, LConverter converter) { unsigned long *lpgn=new unsigned long[2]{pgn,pgn2}; ConverterEntry e(2, lpgn, converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, unsigned long pgn3,String sentence, Converter converter) { unsigned long *lpgn=new unsigned long[3]{pgn,pgn2,pgn3}; ConverterEntry e(3, lpgn,converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, unsigned long pgn3,String sentence, LConverter converter) { unsigned long *lpgn=new unsigned long[3]{pgn,pgn2,pgn3}; ConverterEntry e(3, lpgn,converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, unsigned long pgn3,unsigned long pgn4,String sentence, Converter converter) { unsigned long *lpgn=new unsigned long[4]{pgn,pgn2,pgn3,pgn4}; ConverterEntry e(4, lpgn,converter); converters[sentence] = e; + keyListFilled=false; } void registerConverter(unsigned long pgn, unsigned long pgn2, unsigned long pgn3,unsigned long pgn4,String sentence, LConverter converter) { unsigned long *lpgn=new unsigned long[4]{pgn,pgn2,pgn3,pgn4}; ConverterEntry e(4, lpgn,converter); converters[sentence] = e; + keyListFilled=false; } bool handleMessage(String code, const Msg &msg, T *base) @@ -182,5 +195,18 @@ public: json[prefix][String(it->first)] = it->second.count; } } + String handledKeys(){ + if (! keyListFilled){ + keyList=String(); + bool first=true; + for (auto it=converters.begin();it != converters.end();it++){ + if (! first) keyList.concat(','); + first=false; + keyList.concat(it->first); + } + keyListFilled=true; + } + return keyList; + } }; #endif \ No newline at end of file diff --git a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp index f54db57..741df73 100644 --- a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp +++ b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp @@ -402,6 +402,9 @@ public: virtual int numConverters(){ return converters.numConverters(); } + virtual String handledKeys(){ + return converters.handledKeys(); + } NMEA0183DataToN2KFunctions(GwLog *logger, GwBoatData *boatData, N2kSender callback) : NMEA0183DataToN2K(logger, boatData, callback) diff --git a/lib/nmea0183ton2k/NMEA0183DataToN2K.h b/lib/nmea0183ton2k/NMEA0183DataToN2K.h index b2df5f1..bb6255e 100644 --- a/lib/nmea0183ton2k/NMEA0183DataToN2K.h +++ b/lib/nmea0183ton2k/NMEA0183DataToN2K.h @@ -16,6 +16,7 @@ class NMEA0183DataToN2K{ virtual bool parseAndSend(const char *buffer, int sourceId); virtual unsigned long *handledPgns()=0; virtual int numConverters()=0; + virtual String handledKeys()=0; static NMEA0183DataToN2K* create(GwLog *logger,GwBoatData *boatData,N2kSender callback); }; #endif \ No newline at end of file diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 53d687d..04b2860 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -92,6 +92,9 @@ private: logger->logString("CONV: # %d handled PGNS", converters.numConverters()); return converters.handledPgns(); } + virtual String handledKeys(){ + return converters.handledKeys(); + } virtual void HandleMsg(const tN2kMsg &N2kMsg) { String key=String(N2kMsg.PGN); diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.h b/lib/nmea2kto0183/N2kDataToNMEA0183.h index 6b2f221..339d32a 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.h +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.h @@ -51,5 +51,6 @@ public: virtual unsigned long* handledPgns()=0; virtual int numPgns()=0; virtual void toJson(JsonDocument &json)=0; + virtual String handledKeys()=0; }; #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3558505..821c49f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#define VERSION "0.5.1" +#define VERSION "0.5.2" // #define GW_MESSAGE_DEBUG_ENABLED // #define FALLBACK_SERIAL @@ -189,6 +189,21 @@ class CapabilitiesRequest : public GwRequestMessage{ serializeJson(json,result); } }; +class ConverterInfoRequest : public GwRequestMessage{ + public: + ConverterInfoRequest() : GwRequestMessage(F("application/json"),F("converterInfo")){}; + protected: + virtual void processRequest(){ + DynamicJsonDocument json(512); + String keys=toN2KConverter->handledKeys(); + logger.logDebug(GwLog::DEBUG,"handled nmea0183: %s",keys.c_str()); + json["nmea0183"]=keys; + keys=nmea0183Converter->handledKeys(); + logger.logDebug(GwLog::DEBUG,"handled nmea2000: %s",keys.c_str()); + json["nmea2000"]=keys; + serializeJson(json,result); + } +}; class ConfigRequest : public GwRequestMessage { public: @@ -346,6 +361,9 @@ void setup() { webserver.registerMainHandler("/api/capabilities", [](AsyncWebServerRequest *request)->GwRequestMessage *{ return new CapabilitiesRequest(); }); + webserver.registerMainHandler("/api/converterInfo", [](AsyncWebServerRequest *request)->GwRequestMessage *{ + return new ConverterInfoRequest(); + }); webserver.registerMainHandler("/api/status", [](AsyncWebServerRequest *request)->GwRequestMessage * { return new StatusRequest(); }); webserver.registerMainHandler("/api/config", [](AsyncWebServerRequest *request)->GwRequestMessage * diff --git a/web/index.html b/web/index.html index 6df2586..4ab47bd 100644 --- a/web/index.html +++ b/web/index.html @@ -146,9 +146,16 @@ } } } - function showOverlay(text){ + function showOverlay(text,isHtml){ let el=document.getElementById('overlayContent'); - el.textContent=text; + if (isHtml){ + el.innerHTML=text; + el.classList.remove("text"); + } + else{ + el.textContent=text; + el.classList.add("text"); + } let container=document.getElementById('overlayContainer'); container.classList.remove('hidden'); } @@ -282,7 +289,10 @@ labelEl.classList.add('label'); labelEl.textContent = label; row.appendChild(labelEl); - let valueEl = createInput(item,row); + let valueFrame=document.createElement("div"); + valueFrame.classList.add("value"); + row.appendChild(valueFrame); + let valueEl = createInput(item,valueFrame); if (!valueEl) return; valueEl.setAttribute('data-default', item.default); valueEl.addEventListener('change', function (ev) { @@ -290,6 +300,9 @@ checkChange(el,row); }) if (item.check) valueEl.setAttribute('data-check', item.check); + let btContainer=document.createElement("div"); + btContainer.classList.add("buttonContainer"); + row.appendChild(btContainer); let bt = document.createElement('button'); bt.classList.add('defaultButton'); bt.setAttribute('data-default', item.default); @@ -299,14 +312,14 @@ valueEl.dispatchEvent(changeEvent); }) bt.textContent = "X"; - row.appendChild(bt); + btContainer.appendChild(bt); bt = document.createElement('button'); bt.classList.add('infoButton'); bt.addEventListener('click', function (ev) { showOverlay(item.description); }); bt.textContent = "?"; - row.appendChild(bt); + btContainer.appendChild(bt); frame.appendChild(row); }) resetForm(); @@ -314,6 +327,18 @@ }) .catch(function (err) { alert("unable to load config: " + err) }) } + function converterInfo(){ + getJson("api/converterInfo").then(function(json){ + let text="

Converted entities

"; + text+="

NMEA0183 to NMEA2000:
"; + text+=" "+(json.nmea0183||"").replace(/,/g,", "); + text+="

"; + text+="

NMEA2000 to NMEA0183:
"; + text+=" "+(json.nmea2000||"").replace(/,/g,", "); + text+="

"; + showOverlay(text,true); + }); + } window.setInterval(update,1000); window.addEventListener('load',function(){ let buttons=document.querySelectorAll('button'); @@ -348,6 +373,11 @@ span.label { display: inline-block; opacity: 0.6; } +.value { + width: 19em; + display: flex; + flex-direction: row; +} span#connected { display: inline-block; background-color: red; @@ -360,6 +390,9 @@ span#connected.ok{ } .row { margin: 0.5em; + display: flex; + flex-direction: row; + flex-wrap: wrap; } .filter { display: inline-block; @@ -394,10 +427,14 @@ div#overlay { margin: auto; background-color: white; padding: 0.5em; + max-width: 100%; + box-sizing: border-box; } div#overlayContent { padding: 0.5em; - white-space: pre; +} +div#overlayContent.text{ + white-space: pre; } .overlayButtons { border-top: 1px solid grey; @@ -414,6 +451,7 @@ div#overlayContent {
VERSION --- +
connected