diff --git a/lib/config/GWConfig.cpp b/lib/config/GWConfig.cpp index c6c8532..d8da398 100644 --- a/lib/config/GWConfig.cpp +++ b/lib/config/GWConfig.cpp @@ -114,6 +114,16 @@ int GwConfigHandler::getInt(const String name,int defaultv) const{ if (!i) return defaultv; return i->asInt(); } +void GwConfigHandler::stopChanges(){ + allowChanges=false; +} +bool GwConfigHandler::setValue(String name,String value){ + if (! allowChanges) return false; + GwConfigInterface *i=getConfigItem(name,false); + if (!i) return false; + i->value=value; + return true; +} void GwNmeaFilter::handleToken(String token, int index){ switch(index){ diff --git a/lib/config/GWConfig.h b/lib/config/GWConfig.h index 3de56b0..1319f48 100644 --- a/lib/config/GWConfig.h +++ b/lib/config/GWConfig.h @@ -14,11 +14,13 @@ class GwConfigHandler: public GwConfigDefinitions{ GwLog *logger; typedef std::map StringMap; StringMap changedValues; + boolean allowChanges=true; public: public: GwConfigHandler(GwLog *logger); bool loadConfig(); bool saveConfig(); + void stopChanges(); bool updateValue(String name, String value); bool reset(bool save); String toString() const; @@ -27,6 +29,12 @@ class GwConfigHandler: public GwConfigDefinitions{ bool getBool(const String name,bool defaultv=false) const ; int getInt(const String name,int defaultv=0) const; GwConfigInterface * getConfigItem(const String name, bool dummy=false) const; + /** + * change the value of a config item + * will become a noop after stopChanges has been called + * !use with care! no checks of the value + */ + bool setValue(String name, String value); private: }; #endif \ No newline at end of file diff --git a/lib/exampletask/GwExampleTask.cpp b/lib/exampletask/GwExampleTask.cpp index 18c4a77..88d9cc0 100644 --- a/lib/exampletask/GwExampleTask.cpp +++ b/lib/exampletask/GwExampleTask.cpp @@ -10,6 +10,13 @@ */ void exampleInit(GwApi *api){ api->getLogger()->logDebug(GwLog::LOG,"example init running"); + //this example is a more or less useless example how you could set some + //config value to a fixed value + //you can only set config values within the init function + //you could also compute this value from some own configuration + //for this example it would make a lot of sense to declare a capability + //to hide this config item from the UI - see header file + api->getConfig()->setValue(api->getConfig()->minXdrInterval,"50"); } #define INVALID_COORD -99999 class GetBoatDataRequest: public GwMessage{ @@ -84,6 +91,7 @@ void exampleTask(GwApi *api){ bool hasPosition=false; bool hasPosition2=false; LOG_DEBUG(GwLog::DEBUG,"example switch ist %s",exampleSwitch?"true":"false"); + LOG_DEBUG(GwLog::DEBUG,"minXdrInterval=%d",api->getConfig()->getInt(api->getConfig()->minXdrInterval)); GwApi::BoatValue *longitude=new GwApi::BoatValue(F("Longitude")); GwApi::BoatValue *latitude=new GwApi::BoatValue(F("Latitude")); GwApi::BoatValue *testValue=new GwApi::BoatValue(boatItemName); diff --git a/lib/exampletask/GwExampleTask.h b/lib/exampletask/GwExampleTask.h index 4fa5a90..b759c93 100644 --- a/lib/exampletask/GwExampleTask.h +++ b/lib/exampletask/GwExampleTask.h @@ -43,4 +43,7 @@ DECLARE_INITFUNCTION(exampleInit); //elements when this capability is set correctly DECLARE_CAPABILITY(testboard,true); DECLARE_CAPABILITY(testboard2,true); +//hide some config value +//just set HIDE + the name of the config item to true +DECLARE_CAPABILITY(HIDEminXdrInterval,true); #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0bbe859..3d9175b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -599,6 +599,10 @@ void setup() { logger.prefix="FALLBACK:"; #endif userCodeHandler.startInitTasks(MIN_USER_TASK); + config.stopChanges(); + //maybe the user code changed the level + level=config.getInt(config.logLevel,LOGLEVEL); + logger.setLevel(level); gwWifi.setup(); MDNS.begin(config.getConfigItem(config.systemName)->asCString()); channels.begin(fallbackSerial); @@ -682,7 +686,7 @@ void setup() { NMEA2000.SetProductInformation("1", // Manufacturer's Model serial code 100, // Manufacturer's product code systemName->asCString(), // Manufacturer's Model ID - VERSION, // Manufacturer's Software version code + FIRMWARE_TYPE, // Manufacturer's Software version code VERSION, // Manufacturer's Model version, N2K_LOAD_LEVEL, 0xffff, //Version diff --git a/web/index.js b/web/index.js index 0724ae8..7990241 100644 --- a/web/index.js +++ b/web/index.js @@ -953,17 +953,23 @@ function createConfigDefinitions(parent, capabilities, defs,includeXdr) { category = item.category; } let showItem=true; - if (item.capabilities !== undefined) { - for (let capability in item.capabilities) { - let values = item.capabilities[capability]; - let found = false; - if (! (values instanceof Array)) values=[values]; - values.forEach(function (v) { + let itemCapabilities=item.capabilities||{}; + itemCapabilities['HIDE'+item.name]=null; + for (let capability in itemCapabilities) { + let values = itemCapabilities[capability]; + let found = false; + if (! (values instanceof Array)) values=[values]; + values.forEach(function (v) { + if ( v === null){ + if (capabilities[capability] === undefined) found=true; + } + else{ if (capabilities[capability] == v) found = true; - }); - if (!found) showItem=false; - } + } + }); + if (!found) showItem=false; } + if (showItem) { currentCategoryPopulated=true; let row = addEl('div', 'row', categoryEl);