From 74637287fd52f5ccd8c97b816c7e8bb9b3bbb2ec Mon Sep 17 00:00:00 2001 From: Doug McLain Date: Thu, 16 Nov 2023 18:20:39 -0500 Subject: [PATCH] More work on dstar gps decoding --- droidstar.cpp | 10 ++++-- droidstar.h | 1 + main.qml | 1 + mode.h | 2 ++ ref.cpp | 98 ++++++++++++++++++++++++++++++++------------------- 5 files changed, 74 insertions(+), 38 deletions(-) diff --git a/droidstar.cpp b/droidstar.cpp index edc82ea..369f43f 100644 --- a/droidstar.cpp +++ b/droidstar.cpp @@ -336,7 +336,8 @@ void DroidStar::process_connect() m_mode->set_modem_params(m_modemBaud.toUInt(), rxfreq, txfreq, m_modemTxDelay.toInt(), m_modemRxLevel.toFloat(), m_modemRFLevel.toFloat(), ysfTXHang, m_modemCWIdTxLevel.toFloat(), m_modemDstarTxLevel.toFloat(), m_modemDMRTxLevel.toFloat(), m_modemYSFTxLevel.toFloat(), m_modemP25TxLevel.toFloat(), m_modemNXDNTxLevel.toFloat(), pocsagTXLevel, m17TXLevel); connect(this, SIGNAL(module_changed(char)), m_mode, SLOT(module_changed(char))); - connect(m_mode, SIGNAL(update(Mode::MODEINFO)), this, SLOT(update_data(Mode::MODEINFO))); + connect(m_mode, SIGNAL(update(Mode::MODEINFO)), this, SLOT(update_data(Mode::MODEINFO))); + connect(m_mode, SIGNAL(update_log(QString)), this, SLOT(updatelog(QString))); connect(m_mode, SIGNAL(update_output_level(unsigned short)), this, SLOT(update_output_level(unsigned short))); connect(m_modethread, SIGNAL(started()), m_mode, SLOT(begin_connect())); connect(m_modethread, SIGNAL(finished()), m_mode, SLOT(deleteLater())); @@ -1341,7 +1342,12 @@ void DroidStar::update_data(Mode::MODEINFO info) emit update_log(t + " " + m_protocol + " RX lost id: " + QString::number(info.streamid, 16) + " src: " + info.src + " dst: " + info.gw2); } } - emit update_data(); + emit update_data(); +} + +void DroidStar::updatelog(QString s) +{ + emit update_log(s); } void DroidStar::set_input_volume(qreal v) diff --git a/droidstar.h b/droidstar.h index 706eab4..7288a67 100644 --- a/droidstar.h +++ b/droidstar.h @@ -394,6 +394,7 @@ private slots: void process_dmr_ids(); void process_nxdn_ids(); void update_data(Mode::MODEINFO); + void updatelog(QString); void save_settings(); void update_output_level(unsigned short l){ m_outlevel = l;} //void load_md380_fw(); diff --git a/main.qml b/main.qml index 496b78b..f67398a 100644 --- a/main.qml +++ b/main.qml @@ -511,6 +511,7 @@ ApplicationWindow { mainTab.buttonTX.enabled = true; mainTab.btntxt.color = "black"; mainTab.agcBox.checked = true; + droidstar.set_debug(settingsTab.debugBox.checked); } if(c === 3){ } diff --git a/mode.h b/mode.h index 50965c8..f9d7416 100644 --- a/mode.h +++ b/mode.h @@ -98,6 +98,7 @@ public: QString mmdvm; QString host; QString module; + QString gps; int port; bool path; char type; @@ -131,6 +132,7 @@ public: }; signals: void update(Mode::MODEINFO); + void update_log(QString); void update_output_level(unsigned short); protected slots: virtual void send_disconnect(){} diff --git a/ref.cpp b/ref.cpp index 1da1f28..ba5c3c7 100755 --- a/ref.cpp +++ b/ref.cpp @@ -44,10 +44,13 @@ void REF::process_udp() quint16 senderPort; static bool sd_sync = 0; static int sd_txt_seq = 0; - static int sd_gps_seq = 0; static int sd_gps_cnt = 0; + static int sd_hdr_cnt = 0; + static int sd_debug_cnt = 0; static char user_data[21]; - static char gps_data[100]; + static QByteArray gps_data; + static uint8_t debug_data[64]; + const uint8_t header[5] = {0x80,0x44,0x53,0x56,0x54}; buf.resize(m_udp->pendingDatagramSize()); @@ -177,6 +180,8 @@ void REF::process_udp() qDebug() << "New stream from " << m_modeinfo.src << " to " << m_modeinfo.dst << " id == " << QString::number(m_modeinfo.streamid, 16); emit update(m_modeinfo); + sd_gps_cnt = 0; + gps_data.clear(); } } else{ @@ -203,61 +208,82 @@ void REF::process_udp() if((buf.data()[16] == 0) && (buf.data()[26] == 0x55) && (buf.data()[27] == 0x2d) && (buf.data()[28] == 0x16)){ sd_sync = 1; sd_txt_seq = 1; + //sd_debug_cnt = 0; + //for(int i = 0; i < 63; i++){ + // fprintf(stderr, "%02x ", debug_data[i]); + //} + // fprintf(stderr, "\n"); } - if( sd_sync && (buf.data()[26] & 0xf0) == 0x40){ - sd_gps_cnt = (buf.data()[26] & 0x0f); - gps_data[sd_gps_seq] = buf.data()[27] ^ 0x4f; + //debug_data[sd_debug_cnt++] = buf.data()[26] ^ 0x70; + //debug_data[sd_debug_cnt++] = buf.data()[27] ^ 0x4f; + //debug_data[sd_debug_cnt++] = buf.data()[28] ^ 0x93; + + char c = buf.data()[26] ^ 0x70; - if( (gps_data[sd_gps_seq] == 0x0a) || (gps_data[sd_gps_seq] == 0x0d) ){ - gps_data[sd_gps_seq] = '\0'; - sd_gps_seq = 0; + if( sd_sync && !sd_gps_cnt && ((c & 0xf0) == 0x50)){ + sd_hdr_cnt = (c & 0x0f); + } + else if(sd_hdr_cnt){ + c = 0; + sd_hdr_cnt = 0; + } + if( sd_sync && !sd_gps_cnt && ((c & 0xf0) == 0x30)){ + sd_gps_cnt = (c & 0x0f); + c = buf.data()[27] ^ 0x4f; + if( (c == 0x0a) || (c == 0x0d) ){ + gps_data.append('\0'); sd_gps_cnt = 0; - qDebug() << "GPS string: " << QString(gps_data); + QTextStream(stderr) << "GPS: " << QString(gps_data) << Qt::endl; + if(gps_data[0] == '$') emit update_log("GPS: " + QString(gps_data)); + gps_data.clear(); } else{ - sd_gps_seq++; sd_gps_cnt--; - gps_data[sd_gps_seq] = buf.data()[28] ^ 0x93; - if( (gps_data[sd_gps_seq] == 0x0a) || (gps_data[sd_gps_seq] == 0x0d) ){ - gps_data[sd_gps_seq] = '\0'; - sd_gps_seq = 0; + gps_data.append(c); + c = buf.data()[28] ^ 0x93; + if( (c == 0x0a) || (c == 0x0d) ){ + gps_data.append('\0'); sd_gps_cnt = 0; - qDebug() << "GPS string: " << QString(gps_data); + QTextStream(stderr) << "GPS: " << QString(gps_data) << Qt::endl; + if(gps_data[0] == '$') emit update_log("GPS: " + QString(gps_data)); + gps_data.clear(); } else{ - sd_gps_seq++; sd_gps_cnt--; + gps_data.append(c); } } } - else if(sd_gps_cnt){ - gps_data[sd_gps_seq] = buf.data()[26] ^ 0x70; - if( (gps_data[sd_gps_seq] == 0x0a) || (gps_data[sd_gps_seq] == 0x0d) ){ - gps_data[sd_gps_seq] = '\0'; - sd_gps_seq = 0; + else if(sd_gps_cnt && (buf.data()[16] != 0)){ + if( (c == 0x0a) || (c == 0x0d) ){ + gps_data.append('\0'); sd_gps_cnt = 0; - qDebug() << "GPS string: " << QString(gps_data); + QTextStream(stderr) << "GPS: " << QString(gps_data) << Qt::endl; + if(gps_data[0] == '$') emit update_log("GPS: " + QString(gps_data)); + gps_data.clear(); } else{ - sd_gps_seq++; - gps_data[sd_gps_seq] = buf.data()[27] ^ 0x4f; - if( (gps_data[sd_gps_seq] == 0x0a) || (gps_data[sd_gps_seq] == 0x0d) ){ - gps_data[sd_gps_seq] = '\0'; - sd_gps_seq = 0; + gps_data.append(c); + c = buf.data()[27] ^ 0x4f; + if( (c == 0x0a) || (c == 0x0d) ){ + gps_data.append('\0'); sd_gps_cnt = 0; - qDebug() << "GPS string: " << QString(gps_data); + QTextStream(stderr) << "GPS: " << QString(gps_data) << Qt::endl; + if(gps_data[0] == '$') emit update_log("GPS: " + QString(gps_data)); + gps_data.clear(); } else{ - sd_gps_seq++; - gps_data[sd_gps_seq] = buf.data()[28] ^ 0x93; - if( (gps_data[sd_gps_seq] == 0x0a) || (gps_data[sd_gps_seq] == 0x0d) ){ - gps_data[sd_gps_seq] = '\0'; - sd_gps_seq = 0; + gps_data.append(c); + c = buf.data()[28] ^ 0x93; + if( (c == 0x0a) || (c == 0x0d) ){ + gps_data.append('\0'); sd_gps_cnt = 0; - qDebug() << "GPS string: " << QString(gps_data); + QTextStream(stderr) << "GPS: " << QString(gps_data) << Qt::endl; + if(gps_data[0] == '$') emit update_log("GPS: " + QString(gps_data)); + gps_data.clear(); } else{ - sd_gps_seq++; + gps_data.append(c); } } } @@ -306,7 +332,6 @@ void REF::process_udp() user_data[18] = buf.data()[27] ^ 0x4f; user_data[19] = buf.data()[28] ^ 0x93; user_data[20] = '\0'; - //if(sd_gps_seq == 0) sd_sync = 0; sd_txt_seq = 0; m_modeinfo.usertxt = QString(user_data); } @@ -331,6 +356,7 @@ void REF::process_udp() emit update(m_modeinfo); m_modeinfo.streamid = 0; sd_sync = 0; + sd_gps_cnt = 0; } } //emit update(m_modeinfo);