diff --git a/lib/boatData/GwBoatData.cpp b/lib/boatData/GwBoatData.cpp index f808cd9..8ecba94 100644 --- a/lib/boatData/GwBoatData.cpp +++ b/lib/boatData/GwBoatData.cpp @@ -17,6 +17,8 @@ template GwBoatItem *GwBoatData::getOrCreate(T initial, GwBoatItemNa if (it != values.end()) { int expectedType=GwBoatItemTypes::getType(initial); if (expectedType != it->second->getCurrentType()){ + LOG_DEBUG(GwLog::DEBUG,"invalid type for boat item %s, expected %d, got %d", + name.c_str(),expectedType,it->second->getCurrentType()); return NULL; } return (GwBoatItem*)(it->second); @@ -26,6 +28,8 @@ template GwBoatItem *GwBoatData::getOrCreate(T initial, GwBoatItemNa provider->getInvalidTime(), &values); rt->update(initial); + LOG_DEBUG(GwLog::LOG,"creating boatItem %s, type %d", + name.c_str(),rt->getCurrentType()); return rt; } template bool GwBoatData::update(T value,int source,GwBoatItemNameProvider *provider){ diff --git a/lib/boatData/GwBoatData.h b/lib/boatData/GwBoatData.h index cf70dd7..1bfdc50 100644 --- a/lib/boatData/GwBoatData.h +++ b/lib/boatData/GwBoatData.h @@ -80,7 +80,7 @@ template class GwBoatItem : public GwBoatItemBase{ public: GwBoatItem(int type,String name,String formatInfo,unsigned long invalidTime=INVALID_TIME,GwBoatItemMap *map=NULL): GwBoatItemBase(name,formatInfo,invalidTime){ - type=type; + this->type=type; if (map){ (*map)[name]=this; } @@ -93,7 +93,7 @@ template class GwBoatItem : public GwBoatItemBase{ //priority handling //sources with lower ids will win //and we will not overwrite their value - if (lastUpdateSource < source){ + if (lastUpdateSource < source && lastUpdateSource >= 0){ return false; } } diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 7074ccf..61053fd 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -105,6 +105,10 @@ private: return false; return item->update(value,sourceId); } + bool updateDouble(GwXDRFoundMapping * mapping, double &value){ + if (mapping->empty) return false; + return boatData->update(value,sourceId,mapping); + } unsigned long LastPosSend; unsigned long NextRMCSend; @@ -1187,7 +1191,7 @@ private: return; } GwXDRFoundMapping mapping=xdrMappings->getMapping(XDRTEMP,(int)TemperatureSource,0,TemperatureInstance); - if (mapping.empty) return; + if (! updateDouble(&mapping,Temperature)) return; LOG_DEBUG(GwLog::DEBUG+1,"found temperature mapping %s",mapping.definition->toString().c_str()); addToXdr(mapping.buildXdrEntry(Temperature)); finalizeXdr(); @@ -1204,7 +1208,7 @@ private: return; } GwXDRFoundMapping mapping=xdrMappings->getMapping(XDRHUMIDITY,(int)HumiditySource,0,HumidityInstance); - if (mapping.empty) return; + if (! updateDouble(&mapping,ActualHumidity)) return; LOG_DEBUG(GwLog::DEBUG+1,"found humidity mapping %s",mapping.definition->toString().c_str()); addToXdr(mapping.buildXdrEntry(ActualHumidity)); finalizeXdr(); @@ -1221,8 +1225,7 @@ private: return; } GwXDRFoundMapping mapping=xdrMappings->getMapping(XDRPRESSURE,(int)PressureSource,0,PressureInstance); - if (mapping.empty) return; - if (! boatData->update(ActualPressure,sourceId,&mapping)) return; + if (! updateDouble(&mapping,ActualPressure)) return; LOG_DEBUG(GwLog::DEBUG+1,"found pressure mapping %s",mapping.definition->toString().c_str()); addToXdr(mapping.buildXdrEntry(ActualPressure)); finalizeXdr(); diff --git a/lib/xdrmappings/GwXDRMappings.cpp b/lib/xdrmappings/GwXDRMappings.cpp index 6ae224c..8b460c4 100644 --- a/lib/xdrmappings/GwXDRMappings.cpp +++ b/lib/xdrmappings/GwXDRMappings.cpp @@ -188,6 +188,10 @@ GwXDRMappingDef *GwXDRMappingDef::fromString(String s) return NULL; } } + if (rt->direction == GwXDRMappingDef::M_DISABLED || rt->xdrName == ""){ + delete rt; + return NULL; + } return rt; } String GwXDRMappingDef::getTransducerName(int instance) diff --git a/lib/xdrmappings/GwXDRMappings.h b/lib/xdrmappings/GwXDRMappings.h index 8dffacc..9b79181 100644 --- a/lib/xdrmappings/GwXDRMappings.h +++ b/lib/xdrmappings/GwXDRMappings.h @@ -166,7 +166,7 @@ class GwXDRFoundMapping : public GwBoatItemNameProvider{ String buildXdrEntry(double value); //boat Data info virtual String getBoatItemName(){ - return getTransducerName(); + return String("xdr")+getTransducerName(); }; virtual String getBoatItemFormat(){ return "formatXdr"+type->xdrunit; //TODO: use the type def for the correct format diff --git a/web/index.css b/web/index.css index 67fd23a..0b8ce2f 100644 --- a/web/index.css +++ b/web/index.css @@ -242,7 +242,7 @@ body{ } .dash { - width: 6em; + width: 6.5em; height: 4em; display: flex; flex-direction: column; diff --git a/web/index.js b/web/index.js index 0f67327..2b76e50 100644 --- a/web/index.js +++ b/web/index.js @@ -1025,6 +1025,15 @@ let valueFormatters = { u:'m' } } +function resizeFont(el,reset,maxIt){ + if (maxIt === undefined) maxIt=10; + if (! el) return; + if (reset) el.style.fontSize=''; + while (el.scrollWidth > el.clientWidth && maxIt){ + let next=parseFloat(window.getComputedStyle(el).fontSize)*0.9; + el.style.fontSize=next+"px"; + } +} function createDashboardItem(name, def, parent) { let frame = addEl('div', 'dash', parent); let title = addEl('span', 'dashTitle', frame, name); @@ -1035,7 +1044,11 @@ function createDashboardItem(name, def, parent) { let footer = addEl('div','footer',frame); let src= addEl('span','source',footer); src.setAttribute('id','source_'+name); - addEl('span','unit',footer,fmt?fmt.u:''); + let u=fmt?fmt.u:''; + if (! fmt && def.format.match(/formatXdr/)){ + u=def.format.replace(/formatXdr/,''); + } + addEl('span','unit',footer,u); return value; } function createDashboard() { @@ -1057,9 +1070,14 @@ function sourceName(v){ return "---"; } function updateDashboard(data) { + let frame = document.getElementById('dashboardPage'); for (let n in data) { let de = document.getElementById('data_' + n); + if (! de && frame){ + de=createDashboardItem(n,data[n],frame); + } if (de) { + let newContent='----'; if (data[n].valid) { let formatter; if (data[n].format && data[n].format != "NULL") { @@ -1067,26 +1085,38 @@ function updateDashboard(data) { formatter = valueFormatters[key]; } if (formatter) { - de.textContent = formatter.f(data[n].value); + newContent = formatter.f(data[n].value); } else { let v = parseFloat(data[n].value); if (!isNaN(v)) { v = v.toFixed(3) - de.textContent = v; + newContent = v; } else { - de.textContent = data[n].value; + newContent = data[n].value; } } } - else de.textContent = "---"; + else newContent = "---"; + if (newContent !== de.textContent){ + de.textContent=newContent; + resizeFont(de,true); + } } let src=document.getElementById('source_'+n); if (src){ src.textContent=sourceName(data[n].source); } } + forEl('.dashValue',function(el){ + let id=el.getAttribute('id'); + if (id){ + if (! data[id.replace(/^data_/,'')]){ + el.parentElement.remove(); + } + } + }); } window.setInterval(update, 1000);