add info about conversions to UI, tweak layout
This commit is contained in:
parent
4572cafa23
commit
fc57d73054
|
@ -13,7 +13,8 @@ public:
|
|||
typedef void (*LConverter)(const Msg &msg, T *);
|
||||
|
||||
private:
|
||||
double dummy;
|
||||
String keyList;
|
||||
bool keyListFilled=false;
|
||||
class ConverterEntry
|
||||
{
|
||||
public:
|
||||
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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
|
20
src/main.cpp
20
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 *
|
||||
|
|
|
@ -146,9 +146,16 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
function showOverlay(text){
|
||||
function showOverlay(text,isHtml){
|
||||
let el=document.getElementById('overlayContent');
|
||||
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="<h3>Converted entities</h3>";
|
||||
text+="<p><b>NMEA0183 to NMEA2000:</b><br/>";
|
||||
text+=" "+(json.nmea0183||"").replace(/,/g,", ");
|
||||
text+="</p>";
|
||||
text+="<p><b>NMEA2000 to NMEA0183:</b><br/>";
|
||||
text+=" "+(json.nmea2000||"").replace(/,/g,", ");
|
||||
text+="</p>";
|
||||
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,9 +427,13 @@ div#overlay {
|
|||
margin: auto;
|
||||
background-color: white;
|
||||
padding: 0.5em;
|
||||
max-width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
div#overlayContent {
|
||||
padding: 0.5em;
|
||||
}
|
||||
div#overlayContent.text{
|
||||
white-space: pre;
|
||||
}
|
||||
.overlayButtons {
|
||||
|
@ -414,6 +451,7 @@ div#overlayContent {
|
|||
<div class="row">
|
||||
<span class="label">VERSION</span>
|
||||
<span class="value" id="version">---</span>
|
||||
<button class="infoButton" id="converterInfo">?</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<span class="label">connected</span>
|
||||
|
|
Loading…
Reference in New Issue