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();