From cee49405c6d83ac1864bdb0d9a749a15527f4c82 Mon Sep 17 00:00:00 2001 From: GwnDaan Date: Sun, 2 Feb 2025 23:47:08 +0100 Subject: [PATCH 1/3] feat: nmea2k speed (using CourseOverGroundSpeedOverGroundRapidUpdate) --- include/app.hpp | 5 ++++- src/app.cpp | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/app.hpp b/include/app.hpp index 2146b4a..f1b782a 100644 --- a/include/app.hpp +++ b/include/app.hpp @@ -13,6 +13,7 @@ #include "isobus/hardware_integration/can_hardware_plugin.hpp" #include "isobus/isobus/isobus_speed_distance_messages.hpp" +#include "isobus/isobus/nmea2000_message_interface.hpp" #include "settings.hpp" #include "task_controller.hpp" @@ -34,5 +35,7 @@ class Application std::shared_ptr canDriver; std::shared_ptr tcServer; - std::shared_ptr speedMessagesInterface; + std::unique_ptr speedMessagesInterface; + std::unique_ptr nmea2000MessageInterface; + std::uint8_t nmea2000SequenceIdentifier = 0; }; diff --git a/src/app.cpp b/src/app.cpp index 026ef7b..c13fb68 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -73,8 +73,11 @@ bool Application::initialize() tcServer->initialize(); // Initialize speed and distance messages - speedMessagesInterface = std::make_shared(serverCF, false, false, true, false); + speedMessagesInterface = std::make_unique(serverCF, false, false, true, false); speedMessagesInterface->initialize(); + nmea2000MessageInterface = std::make_unique(serverCF, false, false, false, false, false, false, false); + nmea2000MessageInterface->initialize(); + nmea2000MessageInterface->set_enable_sending_cog_sog_cyclically(true); std::cout << "Task controller server started." << std::endl; @@ -94,6 +97,11 @@ bool Application::initialize() speedMessagesInterface->machineSelectedSpeedTransmitData.set_machine_direction_of_travel(isobus::SpeedMessagesInterface::MachineDirection::Forward); // TODO: Implement direction speedMessagesInterface->machineSelectedSpeedTransmitData.set_machine_speed(speed); speedMessagesInterface->machineSelectedSpeedTransmitData.set_machine_distance(0); // TODO: Implement distance + auto &cog_sog_message = nmea2000MessageInterface->get_cog_sog_transmit_message(); + cog_sog_message.set_sequence_id(nmea2000SequenceIdentifier++); + cog_sog_message.set_speed_over_ground(speed); + cog_sog_message.set_course_over_ground(0); // TODO: Implement course + cog_sog_message.set_course_over_ground_reference(isobus::NMEA2000Messages::CourseOverGroundSpeedOverGroundRapidUpdate::CourseOverGroundReference::NotApplicableOrNull); std::int32_t xte = (data[5] - 127) * 2; static const std::uint8_t xteMode = 0b00000001; @@ -155,6 +163,7 @@ bool Application::update() tcServer->request_measurement_commands(); tcServer->update(); speedMessagesInterface->update(); + nmea2000MessageInterface->update(); if (isobus::SystemTiming::time_expired_ms(lastHeartbeatTransmit, 100)) { From 2d033984eb02631492f16a47c7fdbfefbcf01def Mon Sep 17 00:00:00 2001 From: GwnDaan Date: Sun, 2 Feb 2025 23:56:18 +0100 Subject: [PATCH 2/3] fix: incorrect file character for file log --- src/logging.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logging.cpp b/src/logging.cpp index 0126e93..2a12838 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -59,7 +59,7 @@ static void setup_file_logging() std::to_string(localTime.tm_year + 1900) + "-" + std::to_string(localTime.tm_mon + 1) + "-" + std::to_string(localTime.tm_mday) + "_" + - std::to_string(localTime.tm_hour) + ":" + + std::to_string(localTime.tm_hour) + "-" + std::to_string(localTime.tm_min) + ".log"; teeStream = std::make_unique(std::cout, Settings::get_filename_path(logFilename)); From 7f9c23d93059043e7622e2fb450d90bc232c6eed Mon Sep 17 00:00:00 2001 From: GwnDaan Date: Wed, 5 Feb 2025 16:54:46 +0100 Subject: [PATCH 3/3] refactor: corrected speed conversion --- src/app.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index c13fb68..aa5f697 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -90,8 +90,8 @@ bool Application::initialize() std::uint16_t speed = data[0] | (data[1] << 8); std::uint8_t status = data[2]; - // Convert from km/h to mm/s - speed = speed * 1E5 / 3600; + // Convert from hm/h to mm/s + speed *= 1000 / 36; speedMessagesInterface->machineSelectedSpeedTransmitData.set_speed_source(isobus::SpeedMessagesInterface::MachineSelectedSpeedData::SpeedSource::NavigationBasedSpeed); speedMessagesInterface->machineSelectedSpeedTransmitData.set_machine_direction_of_travel(isobus::SpeedMessagesInterface::MachineDirection::Forward); // TODO: Implement direction