Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NMEA2000 speed (using CourseOverGroundSpeedOverGroundRapidUpdate) #6

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion include/app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -34,5 +35,7 @@ class Application

std::shared_ptr<isobus::CANHardwarePlugin> canDriver;
std::shared_ptr<MyTCServer> tcServer;
std::shared_ptr<isobus::SpeedMessagesInterface> speedMessagesInterface;
std::unique_ptr<isobus::SpeedMessagesInterface> speedMessagesInterface;
std::unique_ptr<isobus::NMEA2000MessageInterface> nmea2000MessageInterface;
std::uint8_t nmea2000SequenceIdentifier = 0;
};
15 changes: 12 additions & 3 deletions src/app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,11 @@ bool Application::initialize()
tcServer->initialize();

// Initialize speed and distance messages
speedMessagesInterface = std::make_shared<isobus::SpeedMessagesInterface>(serverCF, false, false, true, false);
speedMessagesInterface = std::make_unique<isobus::SpeedMessagesInterface>(serverCF, false, false, true, false);
speedMessagesInterface->initialize();
nmea2000MessageInterface = std::make_unique<isobus::NMEA2000MessageInterface>(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;

Expand All @@ -87,13 +90,18 @@ 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
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;
Expand Down Expand Up @@ -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))
{
Expand Down
2 changes: 1 addition & 1 deletion src/logging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<TeeStreambuf>(std::cout, Settings::get_filename_path(logFilename));
Expand Down