diff --git a/Readme.md b/Readme.md
index d9f8e90..dc25be7 100644
--- a/Readme.md
+++ b/Readme.md
@@ -76,13 +76,20 @@ You can find a prebuild executable in tools: [esptool.exe](tools/esptool.exe).
Just create an empty directory on your machine, download the esptool to this directory and also download the binary (xxx-all.bin) from [releases](../../releases).
Afterwards you need to install the driver for the serial port to connect your ESP32 board. For a modern windows the driver at [FTDI](https://ftdichip.com/drivers/d2xx-drivers/) should be working.
After installing the driver check with your device manager for the com port that is assigned to your connected esp device.
+
Open a command prompt and change into the directory you downloaded the esptool.exe and the firmware binary.
Flash with the command
```
esptool.exe --port COM3 write_flash 0x1000 xxxxx-xxxx-all.bin
```
Replace COM3 with the port shown in the device manager and the xxx with the name of the downloaded binary.
-If you do not want to use the command line you first need to install python3 from the [download page](https://www.python.org/downloads/windows/) - use the Windows 64 Bit installer. Install using the default settings. Afterwards download [flashtool.pyz](../../raw/master/tools/flashtool.pyz) and run it with a double click.
+
+If you do not want to use the command line there is a tool with an UI that allows you to flash the initial or update firmware.
+Just download the exe for your windows system from the [ESP32N2K-Flasher Git Repository](https://github.com/wellenvogel/esp32n2k-flasher/releases/latest).
+There is no installation needed - just start the downloaded exe.
+Some Anti Virus Software may (accidently) tag this as infected. In this case you can still install the UI in two steps:
+ * you first need to install python3 from the [download page](https://www.python.org/downloads/windows/) - use the Windows 64 Bit installer. Install using the default settings.
+* Afterwards download [flashtool.pyz](../../raw/master/tools/flashtool.pyz) and run it with a double click.
Update
@@ -131,6 +138,15 @@ For details refer to the [example description](lib/exampletask/Readme.md).
Changelog
---------
+[20220107](../../releases/tag/20220107)
+********
+* add a TCP client - you can connect to any source of NMEA data using IP address (or MDNS host name) and port
+This way you can e.g. "chain" multiple gateways
+* add receiving of Seasmart messages.
+Using this feature you can forward the data from the NMEA2000 bus via TCP to another device.
+* add some Status Info to the extension API
+* correct the display of wind direction on the data page
+
[20211218](../../releases/tag/20211218)
********
* 1st real release
diff --git a/lib/channel/GwChannelList.cpp b/lib/channel/GwChannelList.cpp
index a49ad0f..537b629 100644
--- a/lib/channel/GwChannelList.cpp
+++ b/lib/channel/GwChannelList.cpp
@@ -4,39 +4,51 @@
#include "GwSocketServer.h"
#include "GwSerial.h"
#include "GwTcpClient.h"
-class GwSerialLog : public GwLogWriter{
- static const size_t bufferSize=4096;
- char *logBuffer=NULL;
- int wp=0;
- GwSerial *writer;
- public:
- GwSerialLog(GwSerial *writer){
- this->writer=writer;
- logBuffer=new char[bufferSize];
- wp=0;
+class GwSerialLog : public GwLogWriter
+{
+ static const size_t bufferSize = 4096;
+ char *logBuffer = NULL;
+ int wp = 0;
+ GwSerial *writer;
+ bool disabled = false;
+
+public:
+ GwSerialLog(GwSerial *writer, bool disabled)
+ {
+ this->writer = writer;
+ this->disabled = disabled;
+ logBuffer = new char[bufferSize];
+ wp = 0;
}
- virtual ~GwSerialLog(){}
- virtual void write(const char *data){
- int len=strlen(data);
- if ((wp+len) >= (bufferSize-1)) return;
- strncpy(logBuffer+wp,data,len);
- wp+=len;
- logBuffer[wp]=0;
+ virtual ~GwSerialLog() {}
+ virtual void write(const char *data)
+ {
+ if (disabled)
+ return;
+ int len = strlen(data);
+ if ((wp + len) >= (bufferSize - 1))
+ return;
+ strncpy(logBuffer + wp, data, len);
+ wp += len;
+ logBuffer[wp] = 0;
}
- virtual void flush(){
- size_t handled=0;
- while (handled < wp){
- writer->flush();
- size_t rt=writer->sendToClients(logBuffer+handled,-1,true);
- handled+=rt;
+ virtual void flush()
+ {
+ size_t handled = 0;
+ if (!disabled)
+ {
+ while (handled < wp)
+ {
+ writer->flush();
+ size_t rt = writer->sendToClients(logBuffer + handled, -1, true);
+ handled += rt;
+ }
}
- wp=0;
- logBuffer[0]=0;
+ wp = 0;
+ logBuffer[0] = 0;
}
-
};
-
GwChannelList::GwChannelList(GwLog *logger, GwConfigHandler *config){
this->logger=logger;
this->config=config;
@@ -53,7 +65,7 @@ void GwChannelList::begin(bool fallbackSerial){
if (! fallbackSerial){
GwSerial *usb=new GwSerial(NULL,0,USB_CHANNEL_ID);
usb->setup(config->getInt(config->usbBaud),3,1);
- logger->setWriter(new GwSerialLog(usb));
+ logger->setWriter(new GwSerialLog(usb,config->getBool(config->usbActisense)));
logger->prefix="GWSERIAL:";
channel=new GwChannel(logger,"USB",USB_CHANNEL_ID);
channel->setImpl(usb);
diff --git a/web/index.js b/web/index.js
index eafb494..0724ae8 100644
--- a/web/index.js
+++ b/web/index.js
@@ -1224,7 +1224,7 @@ let valueFormatters = {
f: function (v) {
let x = parseFloat(v);
x = x * 180.0 / Math.PI;
- if (x > 180) x = 180 - x;
+ if (x > 180) x = -1 * (360 - x);
return x.toFixed(0);
},
u: '°'