47#include "androidUTIL.h"
50using namespace std::literals::chrono_literals;
52typedef enum DS_ENUM_BUFFER_STATE {
55} _DS_ENUM_BUFFER_STATE;
59#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
65 std::lock_guard<std::mutex> lock(m_mutex);
66 return m_queque.size();
70 std::lock_guard<std::mutex> lock(m_mutex);
71 return m_queque.empty();
75 std::lock_guard<std::mutex> lock(m_mutex);
76 return m_queque.front();
79 void push(
const T& value) {
80 std::lock_guard<std::mutex> lock(m_mutex);
85 std::lock_guard<std::mutex> lock(m_mutex);
90 std::queue<T> m_queque;
91 mutable std::mutex m_mutex;
94#define OUT_QUEUE_LENGTH 20
95#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
97wxDEFINE_EVENT(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
100CommDriverN0183AndroidBTEvent::CommDriverN0183AndroidBTEvent(
101 wxEventType commandType,
int id = 0)
102 : wxEvent(id, commandType) {};
104CommDriverN0183AndroidBTEvent::~CommDriverN0183AndroidBTEvent() {};
106void CommDriverN0183AndroidBTEvent::SetPayload(
107 std::shared_ptr<std::vector<unsigned char>> data) {
110std::shared_ptr<std::vector<unsigned char>>
111CommDriverN0183AndroidBTEvent::GetPayload() {
116wxEvent* CommDriverN0183AndroidBTEvent::Clone()
const {
119 newevent->m_payload = this->m_payload;
127 : buf_(std::unique_ptr<T[]>(
new T[size])), max_size_(size) {}
130 size_t capacity()
const;
135 return (!full_ && (head_ == tail_));
144 std::lock_guard<std::mutex> lock(mutex_);
146 if (full_) tail_ = (tail_ + 1) % max_size_;
148 head_ = (head_ + 1) % max_size_;
150 full_ = head_ == tail_;
154 std::lock_guard<std::mutex> lock(mutex_);
156 if (empty())
return T();
159 auto val = buf_[tail_];
161 tail_ = (tail_ + 1) % max_size_;
168 std::unique_ptr<T[]> buf_;
171 const size_t max_size_;
175CommDriverN0183AndroidBT::CommDriverN0183AndroidBT(
179 m_portstring(params->GetDSPort()),
181 m_listener(listener),
182 m_stats_timer(*this, 2s) {
183 this->attributes[
"commPort"] = params->Port.ToStdString();
184 this->attributes[
"userComment"] = params->UserComment.ToStdString();
186 m_driver_stats.driver_bus = NavAddr::Bus::N0183;
187 m_driver_stats.driver_iface = params->GetStrippedDSPort();
190 Bind(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
191 &CommDriverN0183AndroidBT::handle_N0183_MSG,
this);
196CommDriverN0183AndroidBT::~CommDriverN0183AndroidBT() { Close(); }
198bool CommDriverN0183AndroidBT::Open() {
200 comx = m_params.GetDSPort().AfterFirst(
':');
202 wxString port_uc = m_params.GetDSPort().Upper();
204 androidStartBT(
this, port_uc);
205 m_driver_stats.available =
true;
210void CommDriverN0183AndroidBT::Close() {
212 wxString::Format(
"Closing NMEA BT Driver %s", m_portstring.c_str()));
213 m_stats_timer.Stop();
216 m_driver_stats.available =
false;
218 Unbind(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
219 &CommDriverN0183AndroidBT::handle_N0183_MSG,
this);
222bool CommDriverN0183AndroidBT::SendMessage(
223 std::shared_ptr<const NavMsg> msg, std::shared_ptr<const NavAddr> addr) {
224 auto msg_0183 = std::dynamic_pointer_cast<const Nmea0183Msg>(msg);
225 wxString sentence(msg_0183->payload.c_str());
226 m_driver_stats.
tx_count += sentence.Length();
228 wxString payload = sentence;
229 if (!sentence.EndsWith(
"\r\n")) payload +=
"\r\n";
231 androidSendBTMessage(payload);
235void CommDriverN0183AndroidBT::handle_N0183_MSG(
237 auto p =
event.GetPayload();
238 std::vector<unsigned char>* payload = p.get();
239 m_driver_stats.
rx_count += payload->size();
240 SendToListener({payload->begin(), payload->end()}, m_listener, m_params);
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.
Android nmea0183 internal bluetooth driver.
Driver registration container, a singleton.
Raw messages layer, supports sending and recieving navmsg messages.
std::string DsPortTypeToString(dsPortType type)
Return textual representation for use in driver ioDirection attribute.
unsigned tx_count
Number of bytes sent since program start.
unsigned rx_count
Number of bytes received since program start.