diff --git a/Readme.md b/Readme.md index 4a05c6d..ecf9abc 100644 --- a/Readme.md +++ b/Readme.md @@ -170,6 +170,12 @@ For details refer to the [example description](lib/exampletask/Readme.md). Changelog --------- +[20250305](../../releases/tag/20250305) +********* +* better handling for reconnect to a raspberry pi after reset [#102](../../issues/102) +* introduce _custom_config_, _custom_js_, _custom_css_, refer to [extending the core](lib/exampletask/Readme.md) [#100](../../pull/100) +* create VWR [#103](../../issues/103) + [20241128](../../releases/tag/20241128) ********* * additional correction for: USB connection on S3 stops [#81](../../issues/81) diff --git a/extra_script.py b/extra_script.py index ed62c64..218782f 100644 --- a/extra_script.py +++ b/extra_script.py @@ -104,8 +104,7 @@ def writeFileIfChanged(fileName,data): return True def mergeConfig(base,other): - for bdir in other: - cname=os.path.join(bdir,"config.json") + for cname in other: if os.path.exists(cname): print("merge config %s"%cname) with open(cname,'rb') as ah: @@ -151,13 +150,25 @@ def expandConfig(config): rt.append(replaceTexts(c,replace)) return rt -def generateMergedConfig(inFile,outFile,addDirs=[]): +def createUserItemList(dirs,itemName,files): + rt=[] + for d in dirs: + iname=os.path.join(d,itemName) + if os.path.exists(iname): + rt.append(iname) + for f in files: + if not os.path.exists(f): + raise Exception("user item %s not found"%f) + rt.append(f) + return rt + +def generateMergedConfig(inFile,outFile,addFiles=[]): if not os.path.exists(inFile): raise Exception("unable to read cfg file %s"%inFile) data="" with open(inFile,'rb') as ch: config=json.load(ch) - config=mergeConfig(config,addDirs) + config=mergeConfig(config,addFiles) config=expandConfig(config) data=json.dumps(config,indent=2) writeFileIfChanged(outFile,data) @@ -274,9 +285,9 @@ class Grove: def _ss(self,z=False): if z: return self.name - return self.name if self.name is not 'Z' else '' + return self.name if self.name != 'Z' else '' def _suffix(self): - return '_'+self.name if self.name is not 'Z' else '' + return '_'+self.name if self.name != 'Z' else '' def replace(self,line): if line is None: return line @@ -377,12 +388,7 @@ def getLibs(): -def joinFiles(target,pattern,dirlist): - flist=[] - for dir in dirlist: - fn=os.path.join(dir,pattern) - if os.path.exists(fn): - flist.append(fn) +def joinFiles(target,flist): current=False if os.path.exists(target): current=True @@ -453,7 +459,28 @@ def handleDeps(env): ) env.AddBuildMiddleware(injectIncludes) +def getOption(env,name,toArray=True): + try: + opt=env.GetProjectOption(name) + if toArray: + if opt is None: + return [] + if isinstance(opt,list): + return opt + return opt.split("\n" if "\n" in opt else ",") + return opt + except: + pass + if toArray: + return [] +def getFileList(files): + base=basePath() + rt=[] + for f in files: + if f is not None and f != "": + rt.append(os.path.join(base,f)) + return rt def prebuild(env): global userTaskDirs print("#prebuild running") @@ -463,14 +490,18 @@ def prebuild(env): if ldf_mode == 'off': print("##ldf off - own dependency handling") handleDeps(env) + extraConfigs=getOption(env,'custom_config',toArray=True) + extraJs=getOption(env,'custom_js',toArray=True) + extraCss=getOption(env,'custom_css',toArray=True) + userTaskDirs=getUserTaskDirs() mergedConfig=os.path.join(outPath(),os.path.basename(CFG_FILE)) - generateMergedConfig(os.path.join(basePath(),CFG_FILE),mergedConfig,userTaskDirs) + generateMergedConfig(os.path.join(basePath(),CFG_FILE),mergedConfig,createUserItemList(userTaskDirs,"config.json", getFileList(extraConfigs))) compressFile(mergedConfig,mergedConfig+".gz") generateCfg(mergedConfig,os.path.join(outPath(),CFG_INCLUDE),False) generateCfg(mergedConfig,os.path.join(outPath(),CFG_INCLUDE_IMPL),True) - joinFiles(os.path.join(outPath(),INDEXJS+".gz"),INDEXJS,["web"]+userTaskDirs) - joinFiles(os.path.join(outPath(),INDEXCSS+".gz"),INDEXCSS,["web"]+userTaskDirs) + joinFiles(os.path.join(outPath(),INDEXJS+".gz"),createUserItemList(["web"]+userTaskDirs,INDEXJS,getFileList(extraJs))) + joinFiles(os.path.join(outPath(),INDEXCSS+".gz"),createUserItemList(["web"]+userTaskDirs,INDEXCSS,getFileList(extraCss))) embedded=getEmbeddedFiles(env) filedefs=[] for ef in embedded: diff --git a/lib/exampletask/Readme.md b/lib/exampletask/Readme.md index 4c51d92..7637ecf 100644 --- a/lib/exampletask/Readme.md +++ b/lib/exampletask/Readme.md @@ -14,7 +14,7 @@ Files * [platformio.ini](platformio.ini)
This file is completely optional. You only need this if you want to - extend the base configuration - we add a dummy library here and define one additional build environment (board) + extend the base configuration - we add a dummy library here and define additional build environments (boards) * [GwExampleTask.h](GwExampleTask.h) the name of this include must match the name of the directory (ignoring case) with a "gw" in front. This file includes our special hardware definitions and registers our task at the core.
This registration can be done statically using [DECLARE_USERTASK](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/api/GwApi.h#L202) in the header file.
As an alternative we just only register an [initialization function](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.h#L19) using DECLARE_INITFUNCTION and later on register the task function itself via the [API](https://github.com/wellenvogel/esp32-nmea2000/blob/9b955d135d74937a60f2926e8bfb9395585ff8cd/lib/exampletask/GwExampleTask.cpp#L32).
@@ -28,11 +28,13 @@ Files * [GwExampleTaks.cpp](GwExampleTask.cpp) includes the implementation of our task. This tasks runs in an own thread - see the comments in the code. We can have as many cpp (and header files) as we need to structure our code. - * [config.json](config.json)
+ * [config.json](exampleConfig.json)
This file allows to add some config definitions that are needed for our task. For the possible options have a look at the global [config.json](../../web/config.json). Be careful not to overwrite config defitions from the global file. A good practice wood be to prefix the names of definitions with parts of the library name. Always put them in a separate category so that they do not interfere with the system ones. - The defined config items can later be accessed in the code (see the example in [GwExampleTask.cpp](GwExampleTask.cpp)). + The defined config items can later be accessed in the code (see the example in [GwExampleTask.cpp](GwExampleTask.cpp)).
+ + Starting from Version 20250305 you should normally not use this file name any more as those configs would be added for all build environments. Instead define a parameter _custom_config_ in your [platformio.ini](platformio.ini) for the environments you would like to add some configurations for. This parameter accepts a list of file names (relative to the project root, separated by ,). - * [index.js](index.js)
+ * [index.js](example.js)
You can add javascript code that will contribute to the UI of the system. The WebUI provides a small API that allows you to "hook" into some functions to include your own parts of the UI. This includes adding new tabs, modifying/replacing the data display items, modifying the status display or accessing the config items. For the API refer to [../../web/index.js](../../web/index.js#L2001). To start interacting just register for some events like api.EVENTS.init. You can check the capabilities you have defined to see if your task is active. @@ -46,10 +48,14 @@ Files tools/testServer.py nnn http://x.x.x.x/api ``` with nnn being the local port and x.x.x.x the address of a running system. Open `http://localhost:nnn` in your browser.
- After a change just start the compilation and reload the page. + After a change just start the compilation and reload the page.
+ + Starting from Version 20250305 you should normally not use this file name any more as those js code would be added for all build environments. Instead define a parameter _custom_js_ in your [platformio.ini](platformio.ini) for the environments you would like to add the js code for. This parameter accepts a list of file names (relative to the project root, separated by ,). This will also allow you to skip the check for capabilities in your code. * [index.css](index.css)
- You can add own css to influence the styling of the display. + You can add own css to influence the styling of the display.
+ + Starting from Version 20250305 you should normally not use this file name any more as those styles would be added for all build environments. Instead define a parameter _custom_css_ in your [platformio.ini](platformio.ini) for the environments you would like to add some styles for. This parameter accepts a list of file names (relative to the project root, separated by , or as multi line entry) Interfaces diff --git a/lib/exampletask/index.css b/lib/exampletask/example.css similarity index 100% rename from lib/exampletask/index.css rename to lib/exampletask/example.css diff --git a/lib/exampletask/index.js b/lib/exampletask/example.js similarity index 100% rename from lib/exampletask/index.js rename to lib/exampletask/example.js diff --git a/lib/exampletask/config.json b/lib/exampletask/exampleConfig.json similarity index 100% rename from lib/exampletask/config.json rename to lib/exampletask/exampleConfig.json diff --git a/lib/exampletask/platformio.ini b/lib/exampletask/platformio.ini index 096a7cd..348b36c 100644 --- a/lib/exampletask/platformio.ini +++ b/lib/exampletask/platformio.ini @@ -10,5 +10,9 @@ lib_deps = build_flags= -D BOARD_TEST ${env.build_flags} +custom_config= + lib/exampletask/exampleConfig.json +custom_js=lib/exampletask/example.js +custom_css=lib/exampletask/example.css upload_port = /dev/esp32 upload_protocol = esptool \ No newline at end of file diff --git a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp index 0560375..7b2d902 100644 --- a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp +++ b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp @@ -351,8 +351,8 @@ private: rmb.vmg ); send(n2kMsg,msg.sourceId); - SetN2kPGN129285(n2kMsg,sourceId,1,1,true,true,"default"); - AppendN2kPGN129285(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude); + SetN2kRouteWPInfo(n2kMsg,sourceId,1,1,N2kdir_forward,"default"); + AppendN2kRouteWPInfo(n2kMsg,destinationId,rmb.destID,rmb.latitude,rmb.longitude); send(n2kMsg,msg.sourceId); } } diff --git a/lib/spitask/GwSpiSensor.h b/lib/spitask/GwSpiSensor.h index 3491641..c12a410 100644 --- a/lib/spitask/GwSpiSensor.h +++ b/lib/spitask/GwSpiSensor.h @@ -112,7 +112,7 @@ class SSISensor : public SensorTemplate{ .flags = SPI_TRANS_USE_RXDATA, .cmd = 0, .addr = 0, - .length = bits+1, + .length = (size_t)bits+1, .rxlength = 0}; esp_err_t ret = spi_device_queue_trans(device->device(), &ta, portMAX_DELAY); if (ret != ESP_OK) return ret; @@ -138,4 +138,4 @@ class SSISensor : public SensorTemplate{ using SpiSensorList=SensorList; #define GWSPI1_HOST SPI2_HOST #define GWSPI2_HOST SPI3_HOST -#endif \ No newline at end of file +#endif diff --git a/src/main.cpp b/src/main.cpp index 4dff162..6daaa51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -917,7 +917,7 @@ void setup() { logger.flush(); NMEA2000.SetMode(tNMEA2000::N2km_ListenAndNode, NodeAddress); NMEA2000.SetForwardOwnMessages(false); - NMEA2000.SetHeartbeatInterval(NMEA2000_HEARTBEAT_INTERVAL); + NMEA2000.SetHeartbeatIntervalAndOffset(NMEA2000_HEARTBEAT_INTERVAL); if (sendOutN2k){ // Set the information for other bus devices, which messages we support unsigned long *pgns=toN2KConverter->handledPgns();