43#include "model/comm_drv_n0183_android_bt.h"
48#include "androidUTIL.h"
51using namespace std::literals::chrono_literals;
53typedef enum DS_ENUM_BUFFER_STATE {
56} _DS_ENUM_BUFFER_STATE;
60#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
66 std::lock_guard<std::mutex> lock(m_mutex);
67 return m_queque.size();
71 std::lock_guard<std::mutex> lock(m_mutex);
72 return m_queque.empty();
76 std::lock_guard<std::mutex> lock(m_mutex);
77 return m_queque.front();
80 void push(
const T& value) {
81 std::lock_guard<std::mutex> lock(m_mutex);
86 std::lock_guard<std::mutex> lock(m_mutex);
91 std::queue<T> m_queque;
92 mutable std::mutex m_mutex;
95#define OUT_QUEUE_LENGTH 20
96#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
98wxDEFINE_EVENT(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
101CommDriverN0183AndroidBTEvent::CommDriverN0183AndroidBTEvent(
102 wxEventType commandType,
int id = 0)
103 : wxEvent(id, commandType) {};
105CommDriverN0183AndroidBTEvent::~CommDriverN0183AndroidBTEvent() {};
107void CommDriverN0183AndroidBTEvent::SetPayload(
108 std::shared_ptr<std::vector<unsigned char>> data) {
111std::shared_ptr<std::vector<unsigned char>>
112CommDriverN0183AndroidBTEvent::GetPayload() {
117wxEvent* CommDriverN0183AndroidBTEvent::Clone()
const {
120 newevent->m_payload = this->m_payload;
128 : buf_(std::unique_ptr<T[]>(
new T[size])), max_size_(size) {}
131 size_t capacity()
const;
136 return (!full_ && (head_ == tail_));
145 std::lock_guard<std::mutex> lock(mutex_);
147 if (full_) tail_ = (tail_ + 1) % max_size_;
149 head_ = (head_ + 1) % max_size_;
151 full_ = head_ == tail_;
155 std::lock_guard<std::mutex> lock(mutex_);
157 if (empty())
return T();
160 auto val = buf_[tail_];
162 tail_ = (tail_ + 1) % max_size_;
169 std::unique_ptr<T[]> buf_;
172 const size_t max_size_;
176CommDriverN0183AndroidBT::CommDriverN0183AndroidBT(
180 m_portstring(params->GetDSPort()),
182 m_listener(listener),
183 m_stats_timer(*this, 2s) {
184 this->attributes[
"commPort"] = params->Port.ToStdString();
185 this->attributes[
"userComment"] = params->UserComment.ToStdString();
186 this->attributes[
"ioDirection"] = DsPortTypeToString(params->IOSelect);
187 m_driver_stats.driver_bus = NavAddr::Bus::N0183;
188 m_driver_stats.driver_iface = params->GetStrippedDSPort();
191 Bind(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
192 &CommDriverN0183AndroidBT::handle_N0183_MSG,
this);
197CommDriverN0183AndroidBT::~CommDriverN0183AndroidBT() { Close(); }
199bool CommDriverN0183AndroidBT::Open() {
201 comx = m_params.GetDSPort().AfterFirst(
':');
203 wxString port_uc = m_params.GetDSPort().Upper();
205 androidStartBT(
this, port_uc);
206 m_driver_stats.available =
true;
211void CommDriverN0183AndroidBT::Close() {
213 wxString::Format(_T(
"Closing NMEA BT Driver %s"), m_portstring.c_str()));
214 m_stats_timer.Stop();
217 m_driver_stats.available =
false;
219 Unbind(wxEVT_COMMDRIVER_N0183_ANDROID_BT,
220 &CommDriverN0183AndroidBT::handle_N0183_MSG,
this);
223bool CommDriverN0183AndroidBT::SendMessage(
224 std::shared_ptr<const NavMsg> msg, std::shared_ptr<const NavAddr> addr) {
225 auto msg_0183 = std::dynamic_pointer_cast<const Nmea0183Msg>(msg);
226 wxString sentence(msg_0183->payload.c_str());
227 m_driver_stats.
tx_count += sentence.Length();
229 wxString payload = sentence;
230 if (!sentence.EndsWith(_T(
"\r\n"))) payload += _T(
"\r\n");
232 androidSendBTMessage(payload);
236void CommDriverN0183AndroidBT::handle_N0183_MSG(
238 auto p =
event.GetPayload();
239 std::vector<unsigned char>* payload = p.get();
240 m_driver_stats.
rx_count += payload->size();
243 std::string full_sentence = std::string(payload->begin(), payload->end());
245 if ((full_sentence[0] ==
'$') || (full_sentence[0] ==
'!')) {
246 std::string identifier;
248 identifier = full_sentence.substr(1, 5);
252 auto msg = std::make_shared<const Nmea0183Msg>(identifier, full_sentence,
254 auto msg_all = std::make_shared<const Nmea0183Msg>(*msg,
"ALL");
256 if (m_params.SentencePassesFilter(full_sentence, FILTER_INPUT))
257 m_listener.
Notify(std::move(msg));
259 m_listener.
Notify(std::move(msg_all));
NMEA0183 drivers common part.
Interface for handling incoming messages.
virtual void Notify(std::shared_ptr< const NavMsg > message)=0
Handle a received message.
Where messages are sent to or received from.
Driver registration container, a singleton.
Raw messages layer, supports sending and recieving navmsg messages.
unsigned tx_count
Number of bytes sent since program start.
unsigned rx_count
Number of bytes received since program start.