mirror of
https://github.com/ShaYmez/MMDVM_CM.git
synced 2025-03-11 23:09:48 -04:00
Use USRP callsign for M17 source if found, and add header and EOT frames to USRP2P25
This commit is contained in:
parent
89a55d890d
commit
83e663b3f0
@ -166,7 +166,6 @@ uint32_t CModeConv::getUSRP(int16_t* data)
|
||||
m_USRP.getData(tag, 1U);
|
||||
m_USRP.getData(data, 160U);
|
||||
--m_usrpN;
|
||||
//return tag[0];
|
||||
}
|
||||
|
||||
return tag[0];
|
||||
|
@ -307,6 +307,19 @@ int CUSRP2M17::run()
|
||||
if (m17Watch.elapsed() > M17_FRAME_PER) {
|
||||
uint32_t m17FrameType = m_conv.getM17(m_m17Frame);
|
||||
|
||||
if( (m_usrpcs.size()) > 3 && (m_usrpcs.size() < 8) ){
|
||||
memset(m17_src, ' ', 9);
|
||||
memcpy(m17_src, m_usrpcs.c_str(), m_usrpcs.size());
|
||||
m17_src[8] = 'D';
|
||||
m17_src[9] = 0x00;
|
||||
encode_callsign(m17_src);
|
||||
}
|
||||
else{
|
||||
memcpy(m17_src, m_callsign.c_str(), 9);
|
||||
m17_src[9] = 0x00;
|
||||
encode_callsign(m17_src);
|
||||
}
|
||||
|
||||
if(m17FrameType == TAG_HEADER) {
|
||||
m17_cnt = 0U;
|
||||
m17Watch.start();
|
||||
@ -432,10 +445,15 @@ int CUSRP2M17::run()
|
||||
if((len == 32) && !memcmp(m_usrpFrame, "USRP", 4)) {
|
||||
LogMessage("USRP received end of voice transmission, %.1f seconds", float(m_usrpFrames) / 50.0F);
|
||||
m_conv.putUSRPEOT();
|
||||
m_usrpcs.clear();
|
||||
m_usrpFrames = 0U;
|
||||
}
|
||||
|
||||
if( (!memcmp(m_usrpFrame, "USRP", 4)) && len == 352) {
|
||||
if( (m_usrpFrame[20] == 0x02) && (m_usrpFrame[32] == 0x08) ){
|
||||
m_usrpcs = (char *)(m_usrpFrame + 46);
|
||||
}
|
||||
|
||||
if(!m_usrpFrames){
|
||||
m_conv.putUSRPHeader();
|
||||
LogMessage("USRP first frame received");
|
||||
|
@ -100,6 +100,24 @@ void CModeConv::putUSRP(int16_t* data)
|
||||
m_p25N += 1U;
|
||||
}
|
||||
|
||||
void CModeConv::putP25Header()
|
||||
{
|
||||
const int16_t zero[160U] = {0};
|
||||
|
||||
m_USRP.addData(&TAG_USRP_HEADER, 1U);
|
||||
m_USRP.addData(zero, 160U);
|
||||
m_usrpN += 1U;
|
||||
}
|
||||
|
||||
void CModeConv::putP25EOT()
|
||||
{
|
||||
const int16_t zero[160U] = {0};
|
||||
|
||||
m_USRP.addData(&TAG_USRP_EOT, 1U);
|
||||
m_USRP.addData(zero, 160U);
|
||||
m_usrpN += 1U;
|
||||
}
|
||||
|
||||
void CModeConv::putP25(uint8_t* data)
|
||||
{
|
||||
int16_t audio[160U];
|
||||
@ -171,20 +189,25 @@ void CModeConv::putP25(uint8_t* data)
|
||||
audio_adjusted[i] = m_p25Attenuate ? audio[i] / m_p25GainMultiplier : audio[i] * m_p25GainMultiplier;
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
uint32_t CModeConv::getP25(uint8_t* data)
|
||||
|
@ -27,6 +27,12 @@ const unsigned char TAG_LOST = 0x02U;
|
||||
const unsigned char TAG_EOT = 0x03U;
|
||||
const unsigned char 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
|
||||
|
||||
@ -40,10 +46,12 @@ public:
|
||||
void putUSRP(int16_t* data);
|
||||
void putUSRPHeader();
|
||||
void putUSRPEOT();
|
||||
void putP25Header();
|
||||
void putP25EOT();
|
||||
void putP25(unsigned char* data);
|
||||
|
||||
uint32_t getP25(uint8_t* data);
|
||||
bool getUSRP(int16_t* data);
|
||||
uint32_t getUSRP(int16_t* data);
|
||||
private:
|
||||
uint32_t m_p25N;
|
||||
uint32_t m_usrpN;
|
||||
|
@ -441,7 +441,7 @@ int CUSRP2P25::run()
|
||||
if (m_p25Frame[0U] != 0xF0U && m_p25Frame[0U] != 0xF1U) {
|
||||
if (m_p25Frame[0U] == 0x62U && !m_p25info) {
|
||||
m_p25Frames = 0;
|
||||
//m_conv.putP25Header();
|
||||
m_conv.putP25Header();
|
||||
} else if (m_p25Frame[0U] == 0x65U && !m_p25info) {
|
||||
m_p25Dst = (m_p25Frame[1U] << 16) & 0xFF0000U;
|
||||
m_p25Dst |= (m_p25Frame[2U] << 8) & 0x00FF00U;
|
||||
@ -455,16 +455,47 @@ int CUSRP2P25::run()
|
||||
} else if (m_p25Frame[0U] == 0x80U) {
|
||||
LogMessage("P25 received end of voice transmission, %.1f seconds", float(m_p25Frames) / 50.0F);
|
||||
m_p25info = false;
|
||||
//m_conv.putP25EOT();
|
||||
m_conv.putP25EOT();
|
||||
}
|
||||
m_conv.putP25(m_p25Frame);
|
||||
m_p25Frames++;
|
||||
}
|
||||
}
|
||||
|
||||
if (usrpWatch.elapsed() > USRP_FRAME_PER) {
|
||||
if ( (usrpWatch.elapsed() > USRP_FRAME_PER) && (m_p25Frames > 4U) ) {
|
||||
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);
|
||||
//const uint32_t 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);
|
||||
|
Loading…
Reference in New Issue
Block a user