From 89a55d890d4c15261a47c84867de20bf4caca8e8 Mon Sep 17 00:00:00 2001 From: Doug McLain Date: Thu, 8 Apr 2021 15:09:24 -0400 Subject: [PATCH] Add USRP Header frame (text frame) and EOT frame --- USRP2M17/ModeConv.cpp | 36 ++++++++++++++++++++++++++++++------ USRP2M17/ModeConv.h | 20 ++++++++++++++------ USRP2M17/USRP2M17.cpp | 37 +++++++++++++++++++++++++++++++++++-- USRP2M17/USRP2M17.h | 1 + USRP2P25/ModeConv.h | 1 - 5 files changed, 80 insertions(+), 15 deletions(-) diff --git a/USRP2M17/ModeConv.cpp b/USRP2M17/ModeConv.cpp index ab68a23..0e9f71c 100644 --- a/USRP2M17/ModeConv.cpp +++ b/USRP2M17/ModeConv.cpp @@ -109,6 +109,24 @@ void CModeConv::putUSRP(int16_t* data) m_m17N += 1U; } +void CModeConv::putM17Header() +{ + const int16_t zero[160U] = {0}; + + m_USRP.addData(&TAG_USRP_HEADER, 1U); + m_USRP.addData(zero, 160U); + m_usrpN += 1U; +} + +void CModeConv::putM17EOT() +{ + const int16_t zero[160U] = {0}; + + m_USRP.addData(&TAG_USRP_EOT, 1U); + m_USRP.addData(zero, 160U); + m_usrpN += 1U; +} + void CModeConv::putM17(uint8_t* data) { int16_t audio[160U]; @@ -124,6 +142,7 @@ void CModeConv::putM17(uint8_t* data) audio_adjusted[i] = m_m17Attenuate ? audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } + m_USRP.addData(&TAG_USRP_DATA, 1U); m_USRP.addData(audio_adjusted, 160U); m_usrpN += 1U; @@ -132,20 +151,25 @@ void CModeConv::putM17(uint8_t* data) for(int i = 0; i < 160; ++i){ audio_adjusted[i] = m_m17Attenuate ? audio[i] / m_m17GainMultiplier : audio[i] * m_m17GainMultiplier; } - + m_USRP.addData(&TAG_USRP_DATA, 1U); m_USRP.addData(audio_adjusted, 160U); m_usrpN += 1U; } -bool CModeConv::getUSRP(int16_t* data) +uint32_t CModeConv::getUSRP(int16_t* data) { + int16_t tag[1U]; + + tag[0] = TAG_USRP_NODATA; + if(m_usrpN){ + m_USRP.getData(tag, 1U); + m_USRP.getData(data, 160U); --m_usrpN; - return m_USRP.getData(data, 160U); - } - else{ - return false; + //return tag[0]; } + + return tag[0]; } uint32_t CModeConv::getM17(uint8_t* data) diff --git a/USRP2M17/ModeConv.h b/USRP2M17/ModeConv.h index 254ca94..07f5245 100644 --- a/USRP2M17/ModeConv.h +++ b/USRP2M17/ModeConv.h @@ -21,11 +21,17 @@ #include "RingBuffer.h" #include "codec2/codec2.h" -const unsigned char TAG_HEADER = 0x00U; -const unsigned char TAG_DATA = 0x01U; -const unsigned char TAG_LOST = 0x02U; -const unsigned char TAG_EOT = 0x03U; -const unsigned char TAG_NODATA = 0x04U; +const uint8_t TAG_HEADER = 0x00U; +const uint8_t TAG_DATA = 0x01U; +const uint8_t TAG_LOST = 0x02U; +const uint8_t TAG_EOT = 0x03U; +const uint8_t TAG_NODATA = 0x04U; + +const int16_t TAG_USRP_HEADER = 0x0000U; +const int16_t TAG_USRP_DATA = 0x0001U; +const int16_t TAG_USRP_LOST = 0x0002U; +const int16_t TAG_USRP_EOT = 0x0003U; +const int16_t TAG_USRP_NODATA = 0x0004U; #if !defined(MODECONV_H) #define MODECONV_H @@ -41,8 +47,10 @@ public: void putUSRPHeader(); void putUSRPEOT(); void putM17(uint8_t* data); + void putM17Header(); + void putM17EOT(); uint32_t getM17(uint8_t* data); - bool getUSRP(int16_t* data); + uint32_t getUSRP(int16_t* data); private: uint32_t m_m17N; uint32_t m_usrpN; diff --git a/USRP2M17/USRP2M17.cpp b/USRP2M17/USRP2M17.cpp index 950343a..41348eb 100644 --- a/USRP2M17/USRP2M17.cpp +++ b/USRP2M17/USRP2M17.cpp @@ -127,6 +127,7 @@ int main(int argc, char** argv) CUSRP2M17::CUSRP2M17(const std::string& configFile) : m_callsign(), m_m17Ref(), +m_usrpcs(), m_conf(configFile), m_usrpNetwork(NULL), m_m17Network(NULL), @@ -357,8 +358,10 @@ int CUSRP2M17::run() if (!memcmp(m_m17Frame, "M17 ", 4)) { if (m_m17Frame[34] == 0 && m_m17Frame[35] == 0) { m_m17Frames = 0; + m_conv.putM17Header(); } else if (m_m17Frame[34U] & 0x80U) { + m_conv.putM17EOT(); LogMessage("M17 received end of voice transmission, %.1f seconds", float(m_m17Frames) / 25.0F); } else{ @@ -368,7 +371,7 @@ int CUSRP2M17::run() memcpy(cs, m_m17Frame+12, 6); decode_callsign(cs); std::string css((char *)cs); - css = css.substr(0, css.find(' ')); + m_usrpcs = css.substr(0, css.find(' ')); m_m17Frames++; } @@ -376,7 +379,37 @@ int CUSRP2M17::run() if (usrpWatch.elapsed() > USRP_FRAME_PER) { int16_t pcm[160]; - if(m_conv.getUSRP(pcm)){ + uint32_t usrpFrameType = m_conv.getUSRP(pcm); + + if(usrpFrameType == TAG_USRP_HEADER){ + //CUtils::dump(1U, "USRP data:", m_usrpFrame, 33U); + + const uint32_t cnt = htonl(usrp_cnt); + memset(m_usrpFrame, 0, 352); + memcpy(m_usrpFrame, "USRP", 4); + memcpy(m_usrpFrame+4, &cnt, 4); + m_usrpFrame[20] = 2; + memcpy(m_usrpFrame+46, m_usrpcs.c_str(), m_usrpcs.size()); + + m_usrpNetwork->writeData(m_usrpFrame, 352); + usrp_cnt++; + usrpWatch.start(); + } + + if(usrpFrameType == TAG_USRP_EOT){ + //CUtils::dump(1U, "USRP data:", m_usrpFrame, 33U); + const uint32_t cnt = htonl(usrp_cnt); + memcpy(m_usrpFrame, "USRP", 4); + memset(m_usrpFrame+4, 0, 28); + memcpy(m_usrpFrame+4, &cnt, 4); + m_usrpFrame[15] = 0; + + m_usrpNetwork->writeData(m_usrpFrame, 32); + usrp_cnt++; + usrpWatch.start(); + } + + if(usrpFrameType == TAG_USRP_DATA){ //CUtils::dump(1U, "USRP data:", m_usrpFrame, 33U); const uint32_t cnt = htonl(usrp_cnt); memcpy(m_usrpFrame, "USRP", 4); diff --git a/USRP2M17/USRP2M17.h b/USRP2M17/USRP2M17.h index 5cbe2ec..3c42ec8 100644 --- a/USRP2M17/USRP2M17.h +++ b/USRP2M17/USRP2M17.h @@ -43,6 +43,7 @@ public: private: std::string m_callsign; std::string m_m17Ref; + std::string m_usrpcs; CConf m_conf; CUSRPNetwork* m_usrpNetwork; CM17Network* m_m17Network; diff --git a/USRP2P25/ModeConv.h b/USRP2P25/ModeConv.h index 528bdd3..4ea1c42 100644 --- a/USRP2P25/ModeConv.h +++ b/USRP2P25/ModeConv.h @@ -40,7 +40,6 @@ public: void putUSRP(int16_t* data); void putUSRPHeader(); void putUSRPEOT(); - void putP25(unsigned char* data); uint32_t getP25(uint8_t* data);