Skip to content

Commit

Permalink
Merge pull request #128 from sarfata/feature/usb-interface
Browse files Browse the repository at this point in the history
Make KBox repeat all NMEA/NMEA2000 messages to USB port
  • Loading branch information
sarfata authored Apr 23, 2018
2 parents 19bc52b + 8dbd45d commit c041cb3
Show file tree
Hide file tree
Showing 23 changed files with 254 additions and 407 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ logs:
logs-n2kanalyzer:
miniterm.py --rts 0 $(PORT) 115200 | grep 'TX: $$PCDIN' |perl -pe 's/.*TX: //' |analyzer -json

nmeainterface:
miniterm.py --rts 0 $(PORT) 38400

reboot:
tools/kbox.py --port $(PORT) reboot

Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,12 @@ been possible!**

## Changelog

* 2018 04 23 - v1.2.3
* Repeat all NMEA and NMEA2000 data to the computer when the serial port is
opened at 38400 bauds.
* Do not lock up when connected to a Raspberry Pi (was bug #68).
* Publish internal sensors data to serial outputs.
* Save all NMEA and NMEA2000 messages to the SDCard again.
* 2018 02 16 - v1.2.2
* Go back to older version of ESP8266 framework (2.3 via framework 1.5) to
get rid of random crashes. Still need to investigate more but we do not
Expand Down
34 changes: 0 additions & 34 deletions src/common/signalk/KMessage.cpp

This file was deleted.

105 changes: 0 additions & 105 deletions src/common/signalk/KMessage.h

This file was deleted.

44 changes: 0 additions & 44 deletions src/common/signalk/KMessageNMEAVisitor.cpp

This file was deleted.

49 changes: 0 additions & 49 deletions src/common/signalk/KMessageNMEAVisitor.h

This file was deleted.

2 changes: 2 additions & 0 deletions src/common/signalk/SKNMEA2000Output.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
THE SOFTWARE.
*/

#pragma once

class tN2kMsg;

class SKNMEA2000Output {
Expand Down
5 changes: 5 additions & 0 deletions src/common/signalk/SKNMEASentence.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,15 @@
#pragma once

#include <WString.h>
#include "common/nmea/nmea.h"

// FIXME: We should have a better representation of a NMEASentence that does
// not depend on dynamic memory or Arduino strings.
class SKNMEASentence : public String {
public:
SKNMEASentence(const String &s) : String(s) {};

bool isValid() const {
return nmea_is_valid(this->c_str());
}
};
1 change: 1 addition & 0 deletions src/esp/comms/KommandHandlerNMEA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ bool KommandHandlerNMEA::handleKommand(KommandReader &kreader, SlipStream &reply

if (nmeaSentence) {
_netServer.writeAll((const uint8_t*)nmeaSentence, strlen(nmeaSentence));
_netServer.writeAll((const uint8_t*)"\r\n", 3);
}

return true;
Expand Down
23 changes: 10 additions & 13 deletions src/host/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ TaskManager taskManager;
SKHub skHub;
KBoxConfig config;

USBService usbService(gc);
USBService usbService(gc, skHub);

void setup() {
// Enable float in printf:
Expand Down Expand Up @@ -112,18 +112,20 @@ void setup() {

NMEA2000Service *n2kService = new NMEA2000Service(config.nmea2000Config,
skHub);
n2kService->connectTo(*wifi);
n2kService->addSentenceRepeater(*wifi);
n2kService->addSentenceRepeater(usbService);

SerialService *reader1 = new SerialService(config.serial1Config, skHub, NMEA1_SERIAL);
SerialService *reader2 = new SerialService(config.serial2Config, skHub, NMEA2_SERIAL);
reader1->connectTo(*wifi);
reader2->connectTo(*wifi);
reader1->addRepeater(*wifi);
reader2->addRepeater(*wifi);
reader1->addRepeater(usbService);
reader2->addRepeater(usbService);

SDCardTask *sdcardTask = new SDCardTask();

reader1->connectTo(*sdcardTask);
reader2->connectTo(*sdcardTask);
n2kService->connectTo(*sdcardTask);
reader1->addRepeater(*sdcardTask);
reader2->addRepeater(*sdcardTask);
n2kService->addSentenceRepeater(*sdcardTask);

// Add all the tasks
taskManager.addTask(&mfd);
Expand Down Expand Up @@ -163,11 +165,6 @@ void setup() {
// (like logging to nmea2 output), the kbox setup might have messed
// up the debug configuration.
DEBUG("setup done");

Serial.setTimeout(0);
Serial1.setTimeout(0);
Serial2.setTimeout(0);
Serial3.setTimeout(0);
}

void loop() {
Expand Down
3 changes: 1 addition & 2 deletions src/host/services/BarometerService.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,9 @@

#include <Adafruit_BMP280.h>
#include "common/os/Task.h"
#include "common/signalk/KMessage.h"
#include "common/signalk/SKHub.h"

class BarometerService : public Task, public KGenerator {
class BarometerService : public Task {
private:
SKHub& _skHub;
int status = -1;
Expand Down
13 changes: 10 additions & 3 deletions src/host/services/NMEA2000Service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,15 @@ void NMEA2000Service::publishN2kMessage(const tN2kMsg& msg) {
KBoxMetrics.event(KBoxEventNMEA2000MessageReceived);

DEBUG("Received N2K Message with pgn: %i", msg.PGN);
NMEA2000Message m(msg, now());
sendMessage(m);

for (auto it = _sentenceRepeaters.begin(); it != _sentenceRepeaters.end(); it++) {
(*it)->write(msg);
}

SKNMEA2000Parser p;
//FIXME: Get the time properly here!
const SKUpdate &update = p.parse(SKSourceInputNMEA2000, msg, SKTime(0));
uint32_t ts = millis();
const SKUpdate &update = p.parse(SKSourceInputNMEA2000, msg, SKTime(ts / 1000, ts % 1000));
if (update.getSize() > 0) {
_hub.publish(update);
}
Expand Down Expand Up @@ -186,3 +189,7 @@ void NMEA2000Service::saveNMEA2000Parameters() {
}
}
}

void NMEA2000Service::addSentenceRepeater(SKNMEA2000Output &repeater) {
_sentenceRepeaters.add(&repeater);
}
Loading

0 comments on commit c041cb3

Please sign in to comment.