Skip to content

Commit c041cb3

Browse files
authored
Merge pull request #128 from sarfata/feature/usb-interface
Make KBox repeat all NMEA/NMEA2000 messages to USB port
2 parents 19bc52b + 8dbd45d commit c041cb3

23 files changed

+254
-407
lines changed

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ logs:
3535
logs-n2kanalyzer:
3636
miniterm.py --rts 0 $(PORT) 115200 | grep 'TX: $$PCDIN' |perl -pe 's/.*TX: //' |analyzer -json
3737

38+
nmeainterface:
39+
miniterm.py --rts 0 $(PORT) 38400
40+
3841
reboot:
3942
tools/kbox.py --port $(PORT) reboot
4043

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,12 @@ been possible!**
192192

193193
## Changelog
194194

195+
* 2018 04 23 - v1.2.3
196+
* Repeat all NMEA and NMEA2000 data to the computer when the serial port is
197+
opened at 38400 bauds.
198+
* Do not lock up when connected to a Raspberry Pi (was bug #68).
199+
* Publish internal sensors data to serial outputs.
200+
* Save all NMEA and NMEA2000 messages to the SDCard again.
195201
* 2018 02 16 - v1.2.2
196202
* Go back to older version of ESP8266 framework (2.3 via framework 1.5) to
197203
get rid of random crashes. Still need to investigate more but we do not

src/common/signalk/KMessage.cpp

-34
This file was deleted.

src/common/signalk/KMessage.h

-105
This file was deleted.

src/common/signalk/KMessageNMEAVisitor.cpp

-44
This file was deleted.

src/common/signalk/KMessageNMEAVisitor.h

-49
This file was deleted.

src/common/signalk/SKNMEA2000Output.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
THE SOFTWARE.
2929
*/
3030

31+
#pragma once
32+
3133
class tN2kMsg;
3234

3335
class SKNMEA2000Output {

src/common/signalk/SKNMEASentence.h

+5
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,15 @@
3131
#pragma once
3232

3333
#include <WString.h>
34+
#include "common/nmea/nmea.h"
3435

3536
// FIXME: We should have a better representation of a NMEASentence that does
3637
// not depend on dynamic memory or Arduino strings.
3738
class SKNMEASentence : public String {
3839
public:
3940
SKNMEASentence(const String &s) : String(s) {};
41+
42+
bool isValid() const {
43+
return nmea_is_valid(this->c_str());
44+
}
4045
};

src/esp/comms/KommandHandlerNMEA.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ bool KommandHandlerNMEA::handleKommand(KommandReader &kreader, SlipStream &reply
4040

4141
if (nmeaSentence) {
4242
_netServer.writeAll((const uint8_t*)nmeaSentence, strlen(nmeaSentence));
43+
_netServer.writeAll((const uint8_t*)"\r\n", 3);
4344
}
4445

4546
return true;

src/host/main.cpp

+10-13
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ TaskManager taskManager;
5050
SKHub skHub;
5151
KBoxConfig config;
5252

53-
USBService usbService(gc);
53+
USBService usbService(gc, skHub);
5454

5555
void setup() {
5656
// Enable float in printf:
@@ -112,18 +112,20 @@ void setup() {
112112

113113
NMEA2000Service *n2kService = new NMEA2000Service(config.nmea2000Config,
114114
skHub);
115-
n2kService->connectTo(*wifi);
115+
n2kService->addSentenceRepeater(*wifi);
116+
n2kService->addSentenceRepeater(usbService);
116117

117118
SerialService *reader1 = new SerialService(config.serial1Config, skHub, NMEA1_SERIAL);
118119
SerialService *reader2 = new SerialService(config.serial2Config, skHub, NMEA2_SERIAL);
119-
reader1->connectTo(*wifi);
120-
reader2->connectTo(*wifi);
120+
reader1->addRepeater(*wifi);
121+
reader2->addRepeater(*wifi);
122+
reader1->addRepeater(usbService);
123+
reader2->addRepeater(usbService);
121124

122125
SDCardTask *sdcardTask = new SDCardTask();
123-
124-
reader1->connectTo(*sdcardTask);
125-
reader2->connectTo(*sdcardTask);
126-
n2kService->connectTo(*sdcardTask);
126+
reader1->addRepeater(*sdcardTask);
127+
reader2->addRepeater(*sdcardTask);
128+
n2kService->addSentenceRepeater(*sdcardTask);
127129

128130
// Add all the tasks
129131
taskManager.addTask(&mfd);
@@ -163,11 +165,6 @@ void setup() {
163165
// (like logging to nmea2 output), the kbox setup might have messed
164166
// up the debug configuration.
165167
DEBUG("setup done");
166-
167-
Serial.setTimeout(0);
168-
Serial1.setTimeout(0);
169-
Serial2.setTimeout(0);
170-
Serial3.setTimeout(0);
171168
}
172169

173170
void loop() {

src/host/services/BarometerService.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@
2626

2727
#include <Adafruit_BMP280.h>
2828
#include "common/os/Task.h"
29-
#include "common/signalk/KMessage.h"
3029
#include "common/signalk/SKHub.h"
3130

32-
class BarometerService : public Task, public KGenerator {
31+
class BarometerService : public Task {
3332
private:
3433
SKHub& _skHub;
3534
int status = -1;

src/host/services/NMEA2000Service.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ void NMEA2000Service::publishN2kMessage(const tN2kMsg& msg) {
4444
KBoxMetrics.event(KBoxEventNMEA2000MessageReceived);
4545

4646
DEBUG("Received N2K Message with pgn: %i", msg.PGN);
47-
NMEA2000Message m(msg, now());
48-
sendMessage(m);
47+
48+
for (auto it = _sentenceRepeaters.begin(); it != _sentenceRepeaters.end(); it++) {
49+
(*it)->write(msg);
50+
}
4951

5052
SKNMEA2000Parser p;
5153
//FIXME: Get the time properly here!
52-
const SKUpdate &update = p.parse(SKSourceInputNMEA2000, msg, SKTime(0));
54+
uint32_t ts = millis();
55+
const SKUpdate &update = p.parse(SKSourceInputNMEA2000, msg, SKTime(ts / 1000, ts % 1000));
5356
if (update.getSize() > 0) {
5457
_hub.publish(update);
5558
}
@@ -186,3 +189,7 @@ void NMEA2000Service::saveNMEA2000Parameters() {
186189
}
187190
}
188191
}
192+
193+
void NMEA2000Service::addSentenceRepeater(SKNMEA2000Output &repeater) {
194+
_sentenceRepeaters.add(&repeater);
195+
}

0 commit comments

Comments
 (0)