mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-25 04:03:30 -05:00
DSDplus library: basic implementation with DMR and DSTAR
This commit is contained in:
parent
f6ac20cbb0
commit
e48b825741
@ -1,6 +1,7 @@
|
|||||||
project(dsdplus)
|
project(dsdplus)
|
||||||
|
|
||||||
set(dsdplus_SOURCES
|
set(dsdplus_SOURCES
|
||||||
|
descramble.cpp
|
||||||
dmr_voice.cpp
|
dmr_voice.cpp
|
||||||
dsd_decoder.cpp
|
dsd_decoder.cpp
|
||||||
dsd_filters.cpp
|
dsd_filters.cpp
|
||||||
@ -11,6 +12,7 @@ set(dsdplus_SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(dsdplus_HEADERS
|
set(dsdplus_HEADERS
|
||||||
|
descramble.h
|
||||||
dmr_voice.h
|
dmr_voice.h
|
||||||
dsd_decoder.h
|
dsd_decoder.h
|
||||||
dsd_filters.h
|
dsd_filters.h
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "dstar.h"
|
#include "dstar.h"
|
||||||
#include "dsd_decoder.h"
|
#include "dsd_decoder.h"
|
||||||
|
#include "descramble.h"
|
||||||
|
|
||||||
namespace DSDplus
|
namespace DSDplus
|
||||||
{
|
{
|
||||||
@ -151,6 +152,7 @@ void DSDDstar::init()
|
|||||||
sync_missed = 0;
|
sync_missed = 0;
|
||||||
bitbuffer = 0;
|
bitbuffer = 0;
|
||||||
m_symbolIndex = 0;
|
m_symbolIndex = 0;
|
||||||
|
m_symbolIndexHD = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSDDstar::initVoiceFrame()
|
void DSDDstar::initVoiceFrame()
|
||||||
@ -160,6 +162,9 @@ void DSDDstar::initVoiceFrame()
|
|||||||
w = dW;
|
w = dW;
|
||||||
x = dX;
|
x = dX;
|
||||||
}
|
}
|
||||||
|
void DSDDstar::initDataFrame()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DSDDstar::process()
|
void DSDDstar::process()
|
||||||
{
|
{
|
||||||
@ -173,7 +178,15 @@ void DSDDstar::process()
|
|||||||
}
|
}
|
||||||
else if (m_symbolIndex < 97) // data frame
|
else if (m_symbolIndex < 97) // data frame
|
||||||
{
|
{
|
||||||
|
if (m_symbolIndex == 72) {
|
||||||
|
initDataFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
processData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dsdDecoder->m_fsmState = DSDDecoder::DSDLookForSync; // end
|
||||||
}
|
}
|
||||||
|
|
||||||
m_symbolIndex++;
|
m_symbolIndex++;
|
||||||
@ -181,6 +194,16 @@ void DSDDstar::process()
|
|||||||
|
|
||||||
void DSDDstar::processHD()
|
void DSDDstar::processHD()
|
||||||
{
|
{
|
||||||
|
int dibit = m_dsdDecoder->getDibit(); // get dibit from symbol and store it in HD cache
|
||||||
|
radioheaderbuffer[m_symbolIndexHD] = dibit;
|
||||||
|
|
||||||
|
if (m_symbolIndexHD == 660-1)
|
||||||
|
{
|
||||||
|
dstar_header_decode();
|
||||||
|
m_dsdDecoder->m_fsmState = DSDDecoder::DSDprocessDSTAR; // go to DSTAR
|
||||||
|
}
|
||||||
|
|
||||||
|
m_symbolIndexHD++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSDDstar::processVoice()
|
void DSDDstar::processVoice()
|
||||||
@ -223,7 +246,148 @@ void DSDDstar::processVoice()
|
|||||||
|
|
||||||
void DSDDstar::processData()
|
void DSDDstar::processData()
|
||||||
{
|
{
|
||||||
|
bool terminate = false;
|
||||||
|
int dibit = m_dsdDecoder->getDibit(); // get dibit from symbol and store it in cache
|
||||||
|
m_dibitCache[m_symbolIndex] = dibit;
|
||||||
|
|
||||||
|
if (m_symbolIndex == 97-1) // last dibit in data frame
|
||||||
|
{
|
||||||
|
for (int i = 73; i < 97; i++)
|
||||||
|
{
|
||||||
|
int dibit = m_dibitCache[i];
|
||||||
|
|
||||||
|
bitbuffer <<= 1;
|
||||||
|
|
||||||
|
if (dibit == 1) {
|
||||||
|
bitbuffer |= 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bitbuffer & 0x00FFFFFF) == 0x00AAB468)
|
||||||
|
{
|
||||||
|
// looking if we're slipping bits
|
||||||
|
if (i != 96)
|
||||||
|
{
|
||||||
|
fprintf(m_dsdDecoder->m_state.logfile, "sync after i=%d\n", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
slowdata[0] = (bitbuffer >> 16) & 0x000000FF;
|
||||||
|
slowdata[1] = (bitbuffer >> 8) & 0x000000FF;
|
||||||
|
slowdata[2] = (bitbuffer) & 0x000000FF;
|
||||||
|
slowdata[3] = 0;
|
||||||
|
|
||||||
|
if ((bitbuffer & 0x00FFFFFF) == 0x00AAB468)
|
||||||
|
{
|
||||||
|
//We got sync!
|
||||||
|
//printf("Sync on framecount = %d\n", framecount);
|
||||||
|
sync_missed = 0;
|
||||||
|
}
|
||||||
|
else if ((bitbuffer & 0x00FFFFFF) == 0xAAAAAA)
|
||||||
|
{
|
||||||
|
//End of transmission
|
||||||
|
printf("End of transmission\n");
|
||||||
|
terminate = true;
|
||||||
|
}
|
||||||
|
else if (framecount % 21 == 0)
|
||||||
|
{
|
||||||
|
printf("Missed sync on framecount = %d, value = %x/%x/%x\n",
|
||||||
|
framecount, slowdata[0], slowdata[1], slowdata[2]);
|
||||||
|
sync_missed++;
|
||||||
|
}
|
||||||
|
else if (framecount != 0 && (bitbuffer & 0x00FFFFFF) != 0x000000)
|
||||||
|
{
|
||||||
|
slowdata[0] ^= 0x70;
|
||||||
|
slowdata[1] ^= 0x4f;
|
||||||
|
slowdata[2] ^= 0x93;
|
||||||
|
//printf("unscrambled- %s",slowdata);
|
||||||
|
}
|
||||||
|
else if (framecount == 0)
|
||||||
|
{
|
||||||
|
//printf("never scrambled-%s\n",slowdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (terminate)
|
||||||
|
{
|
||||||
|
m_dsdDecoder->m_fsmState = DSDDecoder::DSDLookForSync; // end
|
||||||
|
}
|
||||||
|
else if (sync_missed < 3)
|
||||||
|
{
|
||||||
|
m_symbolIndex = 0; // restart a frame sequence
|
||||||
|
framecount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dsdDecoder->m_fsmState = DSDDecoder::DSDLookForSync; // end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSDDstar::dstar_header_decode()
|
||||||
|
{
|
||||||
|
int radioheaderbuffer2[660];
|
||||||
|
unsigned char radioheader[41];
|
||||||
|
int octetcount, bitcount, loop;
|
||||||
|
unsigned char bit2octet[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
|
||||||
|
unsigned int FCSinheader;
|
||||||
|
unsigned int FCScalculated;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
Descramble::scramble(radioheaderbuffer, radioheaderbuffer2);
|
||||||
|
Descramble::deinterleave(radioheaderbuffer2, radioheaderbuffer);
|
||||||
|
len = Descramble::FECdecoder(radioheaderbuffer, radioheaderbuffer2);
|
||||||
|
memset(radioheader, 0, 41);
|
||||||
|
|
||||||
|
// note we receive 330 bits, but we only use 328 of them (41 octets)
|
||||||
|
// bits 329 and 330 are unused
|
||||||
|
octetcount = 0;
|
||||||
|
bitcount = 0;
|
||||||
|
|
||||||
|
for (loop = 0; loop < 328; loop++)
|
||||||
|
{
|
||||||
|
if (radioheaderbuffer2[loop])
|
||||||
|
{
|
||||||
|
radioheader[octetcount] |= bit2octet[bitcount];
|
||||||
|
};
|
||||||
|
|
||||||
|
bitcount++;
|
||||||
|
|
||||||
|
// increase octetcounter and reset bitcounter every 8 bits
|
||||||
|
if (bitcount >= 8)
|
||||||
|
{
|
||||||
|
octetcount++;
|
||||||
|
bitcount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print header
|
||||||
|
printf("\nDSTAR HEADER: ");
|
||||||
|
//printf("FLAG1: %02X - FLAG2: %02X - FLAG3: %02X\n", radioheader[0],
|
||||||
|
// radioheader[1], radioheader[2]);
|
||||||
|
printf("RPT 2: %c%c%c%c%c%c%c%c ", radioheader[3], radioheader[4],
|
||||||
|
radioheader[5], radioheader[6], radioheader[7], radioheader[8],
|
||||||
|
radioheader[9], radioheader[10]);
|
||||||
|
printf("RPT 1: %c%c%c%c%c%c%c%c ", radioheader[11], radioheader[12],
|
||||||
|
radioheader[13], radioheader[14], radioheader[15], radioheader[16],
|
||||||
|
radioheader[17], radioheader[18]);
|
||||||
|
printf("YOUR: %c%c%c%c%c%c%c%c ", radioheader[19], radioheader[20],
|
||||||
|
radioheader[21], radioheader[22], radioheader[23], radioheader[24],
|
||||||
|
radioheader[25], radioheader[26]);
|
||||||
|
printf("MY: %c%c%c%c%c%c%c%c/%c%c%c%c\n", radioheader[27], radioheader[28],
|
||||||
|
radioheader[29], radioheader[30], radioheader[31], radioheader[32],
|
||||||
|
radioheader[33], radioheader[34], radioheader[35], radioheader[36],
|
||||||
|
radioheader[37], radioheader[38]);
|
||||||
|
|
||||||
|
//FCSinheader = ((radioheader[39] << 8) | radioheader[40]) & 0xFFFF;
|
||||||
|
//FCScalculated = calc_fcs((unsigned char*) radioheader, 39);
|
||||||
|
//printf("Check sum = %04X ", FCSinheader);
|
||||||
|
//if (FCSinheader == FCScalculated) {
|
||||||
|
// printf("(OK)\n");
|
||||||
|
//} else {
|
||||||
|
// printf("(NOT OK- Calculated FCS = %04X)\n", FCScalculated);
|
||||||
|
//}; // end else - if
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace DSDplus
|
} // namespace DSDplus
|
||||||
|
@ -34,11 +34,14 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void initVoiceFrame();
|
void initVoiceFrame();
|
||||||
|
void initDataFrame();
|
||||||
void processVoice();
|
void processVoice();
|
||||||
void processData();
|
void processData();
|
||||||
|
void dstar_header_decode();
|
||||||
|
|
||||||
DSDDecoder *m_dsdDecoder;
|
DSDDecoder *m_dsdDecoder;
|
||||||
int m_symbolIndex; //!< Current symbol index
|
int m_symbolIndex; //!< Current symbol index in non HD sequence
|
||||||
|
int m_symbolIndexHD; //!< Current symbol index in HD sequence
|
||||||
int m_dibitCache[97]; // has to handle a voice + data frame (97 dibits)
|
int m_dibitCache[97]; // has to handle a voice + data frame (97 dibits)
|
||||||
int m_dibitIndex; // index in dibit cache
|
int m_dibitIndex; // index in dibit cache
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user