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->Port.ToStdString();
61 this->attributes[
"userComment"] = params->UserComment.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.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.IOSelect == DS_TYPE_OUTPUT)
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.
Interface for handling incoming messages.
Where messages are sent to or received from.
Nmea0183 serial communications wrapper, possibly running a thread.
Line-oriented input/output buffers.
Communication statistics infrastructure.
std::string DsPortTypeToString(dsPortType type)
Return textual representation for use in driver ioDirection attribute.
Enhanced logging interface on top of wx/log.h.
General observable implementation with several specializations.