43#include "model/comm_drv_n0183_android_int.h"
48#include "androidUTIL.h"
51typedef enum DS_ENUM_BUFFER_STATE {
54} _DS_ENUM_BUFFER_STATE;
58#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
64 std::lock_guard<std::mutex> lock(m_mutex);
65 return m_queque.size();
69 std::lock_guard<std::mutex> lock(m_mutex);
70 return m_queque.empty();
74 std::lock_guard<std::mutex> lock(m_mutex);
75 return m_queque.front();
78 void push(
const T& value) {
79 std::lock_guard<std::mutex> lock(m_mutex);
84 std::lock_guard<std::mutex> lock(m_mutex);
89 std::queue<T> m_queque;
90 mutable std::mutex m_mutex;
93#define OUT_QUEUE_LENGTH 20
94#define MAX_OUT_QUEUE_MESSAGE_LENGTH 100
96wxDEFINE_EVENT(wxEVT_COMMDRIVER_N0183_ANDROID_INT,
99CommDriverN0183AndroidIntEvent::CommDriverN0183AndroidIntEvent(
100 wxEventType commandType,
int id = 0)
101 : wxEvent(id, commandType) {};
103CommDriverN0183AndroidIntEvent::~CommDriverN0183AndroidIntEvent() {};
105void CommDriverN0183AndroidIntEvent::SetPayload(
106 std::shared_ptr<std::vector<unsigned char>> data) {
109std::shared_ptr<std::vector<unsigned char>>
110CommDriverN0183AndroidIntEvent::GetPayload() {
115wxEvent* CommDriverN0183AndroidIntEvent::Clone()
const {
118 newevent->m_payload = this->m_payload;
126 : buf_(std::unique_ptr<T[]>(new T[size])), max_size_(size) {}
129 size_t capacity()
const;
134 return (!full_ && (head_ == tail_));
143 std::lock_guard<std::mutex> lock(mutex_);
145 if (full_) tail_ = (tail_ + 1) % max_size_;
147 head_ = (head_ + 1) % max_size_;
149 full_ = head_ == tail_;
153 std::lock_guard<std::mutex> lock(mutex_);
155 if (empty())
return T();
158 auto val = buf_[tail_];
160 tail_ = (tail_ + 1) % max_size_;
167 std::unique_ptr<T[]> buf_;
170 const size_t max_size_;
174CommDriverN0183AndroidInt::CommDriverN0183AndroidInt(
178 m_portstring(params->GetDSPort()),
180 m_listener(listener) {
181 this->attributes[
"commPort"] = params->Port.ToStdString();
182 this->attributes[
"userComment"] = params->UserComment.ToStdString();
183 this->attributes[
"ioDirection"] = DsPortTypeToString(params->IOSelect);
186 Bind(wxEVT_COMMDRIVER_N0183_ANDROID_INT,
187 &CommDriverN0183AndroidInt::handle_N0183_MSG,
this);
192CommDriverN0183AndroidInt::~CommDriverN0183AndroidInt() { Close(); }
194bool CommDriverN0183AndroidInt::Open() {
195 androidStartGPS(
this);
199void CommDriverN0183AndroidInt::Close() {
201 wxString::Format(_T(
"Closing NMEA Driver %s"), m_portstring.c_str()));
205 Unbind(wxEVT_COMMDRIVER_N0183_ANDROID_INT,
206 &CommDriverN0183AndroidInt::handle_N0183_MSG,
this);
209bool CommDriverN0183AndroidInt::SendMessage(
210 std::shared_ptr<const NavMsg> msg, std::shared_ptr<const NavAddr> addr) {
214void CommDriverN0183AndroidInt::handle_N0183_MSG(
216 auto p =
event.GetPayload();
217 std::vector<unsigned char>* payload = p.get();
220 std::string full_sentence = std::string(payload->begin(), payload->end());
222 if ((full_sentence[0] ==
'$') || (full_sentence[0] ==
'!')) {
223 std::string identifier;
225 identifier = full_sentence.substr(1, 5);
229 auto msg = std::make_shared<const Nmea0183Msg>(identifier, full_sentence,
231 auto msg_all = std::make_shared<const Nmea0183Msg>(*msg,
"ALL");
233 if (m_params.SentencePassesFilter(full_sentence, FILTER_INPUT))
234 m_listener.
Notify(std::move(msg));
236 m_listener.
Notify(std::move(msg_all));
NMEA0183 drivers common part.
Interface implemented by transport layer and possible other parties like test code which should handl...
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.