46using namespace std::literals::chrono_literals;
51 m_portstring(params->GetDSPort()),
52 m_baudrate(params->baudrate),
54 [&](const std::vector<unsigned char>& v) { SendMessage(v); },
55 m_portstring, m_baudrate)),
58 m_stats_timer(*
this, 2s) {
59 m_garmin_handler =
nullptr;
60 this->attributes[
"commPort"] = params->serial_port.ToStdString();
61 this->attributes[
"userComment"] = params->user_comment.ToStdString();
67CommDriverN0183Serial::~CommDriverN0183Serial() { Close(); }
69bool CommDriverN0183Serial::Open() {
71 comx = m_params.
GetDSPort().AfterFirst(
':');
72 if (comx.IsEmpty())
return false;
74 wxString port_uc = m_params.
GetDSPort().Upper();
76 auto send_func = [&](
const std::vector<unsigned char>& v) { SendMessage(v); };
77 if ((wxNOT_FOUND != port_uc.Find(
"USB")) &&
78 (wxNOT_FOUND != port_uc.Find(
"GARMIN"))) {
80 }
else if (m_params.is_garmin) {
90void CommDriverN0183Serial::Close() {
92 wxString::Format(
"Closing NMEA Driver %s", m_portstring.c_str()));
97 if (m_serial_io->IsRunning()) {
98 wxLogMessage(
"Stopping Secondary Thread");
99 m_serial_io->RequestStop();
100 std::chrono::milliseconds elapsed;
101 if (m_serial_io->WaitUntilStopped(10s, elapsed)) {
102 MESSAGE_LOG <<
"Stopped in " << elapsed.count() <<
" msec.";
104 MESSAGE_LOG <<
"Not stopped after 10 sec.";
109 if (m_garmin_handler) {
110 m_garmin_handler->Close();
111 delete m_garmin_handler;
112 m_garmin_handler =
nullptr;
116bool CommDriverN0183Serial::IsGarminThreadActive()
const {
117 if (m_garmin_handler) {
120 if (m_garmin_handler->m_usb_handle != INVALID_HANDLE_VALUE)
130void CommDriverN0183Serial::StopGarminUSBIOThread(
bool b_pause)
const {
131 if (m_garmin_handler) {
132 m_garmin_handler->StopIOThread(b_pause);
136bool CommDriverN0183Serial::SendMessage(std::shared_ptr<const NavMsg> msg,
137 std::shared_ptr<const NavAddr> addr) {
138 auto msg_0183 = std::dynamic_pointer_cast<const Nmea0183Msg>(msg);
139 wxString sentence(msg_0183->payload.c_str());
141 if (m_serial_io->IsRunning()) {
142 for (
int retries = 0; retries < 10; retries += 1) {
143 if (m_serial_io->SetOutMsg(sentence)) {
153void CommDriverN0183Serial::SendMessage(
const std::vector<unsigned char>& msg) {
156 if (m_params.direction == PortDirection::kOutput)
return;
NMEA0183 basic parsing common parts:
void SendToListener(const std::string &payload, DriverListener &listener, const ConnectionParams ¶ms)
Wrap argument string in NavMsg pointer, forward to listener.
Connection data container close to a POD struct.
wxString GetDSPort() const
Return port description including for example serial port or network address/port,...
Interface for handling incoming messages.
Where messages are sent to or received from.
Nmea0183 serial communications wrapper, possibly running a thread.
Various input/output buffers.
Communication statistics infrastructure.
std::string PortDirectionToString(PortDirection pd)
Return textual representation for use in driver ioDirection attribute.
Enhanced logging interface on top of wx/log.h.
General observable pattern implementation built on top of wxWidgets event handling.