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.