diff --git a/DroidStar.pro b/DroidStar.pro index 1b22ddf..b9f5b9c 100644 --- a/DroidStar.pro +++ b/DroidStar.pro @@ -102,6 +102,7 @@ HEADERS += \ Golay24128.h \ M17Convolution.h \ M17Defines.h \ + MMDVMDefines.h \ SHA256.h \ YSFConvolution.h \ YSFFICH.h \ diff --git a/MMDVMDefines.h b/MMDVMDefines.h new file mode 100644 index 0000000..8140ae1 --- /dev/null +++ b/MMDVMDefines.h @@ -0,0 +1,108 @@ +#ifndef MMDVMDEFINES_H +#define MMDVMDEFINES_H + +enum HW_TYPE { + HWT_MMDVM, + HWT_DVMEGA, + HWT_MMDVM_ZUMSPOT, + HWT_MMDVM_HS_HAT, + HWT_NANO_HOTSPOT, + HWT_MMDVM_HS, + HWT_UNKNOWN +}; + +enum RPT_RF_STATE { + RS_RF_LISTENING, + RS_RF_LATE_ENTRY, + RS_RF_AUDIO, + RS_RF_DATA, + RS_RF_REJECTED, + RS_RF_INVALID +}; + +enum RPT_NET_STATE { + RS_NET_IDLE, + RS_NET_AUDIO, + RS_NET_DATA +}; + +enum B_STATUS { + BS_NO_DATA, + BS_DATA, + BS_MISSING +}; + +const unsigned char MMDVM_FRAME_START = 0xE0U; + +const unsigned char MMDVM_GET_VERSION = 0x00U; +const unsigned char MMDVM_GET_STATUS = 0x01U; +const unsigned char MMDVM_SET_CONFIG = 0x02U; +const unsigned char MMDVM_SET_MODE = 0x03U; +const unsigned char MMDVM_SET_FREQ = 0x04U; + +const unsigned char MMDVM_SEND_CWID = 0x0AU; + +const unsigned char MMDVM_DSTAR_HEADER = 0x10U; +const unsigned char MMDVM_DSTAR_DATA = 0x11U; +const unsigned char MMDVM_DSTAR_LOST = 0x12U; +const unsigned char MMDVM_DSTAR_EOT = 0x13U; + +const unsigned char MMDVM_DMR_DATA1 = 0x18U; +const unsigned char MMDVM_DMR_LOST1 = 0x19U; +const unsigned char MMDVM_DMR_DATA2 = 0x1AU; +const unsigned char MMDVM_DMR_LOST2 = 0x1BU; +const unsigned char MMDVM_DMR_SHORTLC = 0x1CU; +const unsigned char MMDVM_DMR_START = 0x1DU; +const unsigned char MMDVM_DMR_ABORT = 0x1EU; + +const unsigned char MMDVM_YSF_DATA = 0x20U; +const unsigned char MMDVM_YSF_LOST = 0x21U; + +const unsigned char MMDVM_P25_HDR = 0x30U; +const unsigned char MMDVM_P25_LDU = 0x31U; +const unsigned char MMDVM_P25_LOST = 0x32U; + +const unsigned char MMDVM_NXDN_DATA = 0x40U; +const unsigned char MMDVM_NXDN_LOST = 0x41U; + +const unsigned char MMDVM_M17_LINK_SETUP = 0x45U; +const unsigned char MMDVM_M17_STREAM = 0x46U; +const unsigned char MMDVM_M17_PACKET = 0x47U; +const unsigned char MMDVM_M17_LOST = 0x48U; +const unsigned char MMDVM_M17_EOT = 0x49U; + +const unsigned char MMDVM_POCSAG_DATA = 0x50U; + +const unsigned char MMDVM_FM_PARAMS1 = 0x60U; +const unsigned char MMDVM_FM_PARAMS2 = 0x61U; +const unsigned char MMDVM_FM_PARAMS3 = 0x62U; + +const unsigned char MMDVM_ACK = 0x70U; +const unsigned char MMDVM_NAK = 0x7FU; + +const unsigned char MMDVM_SERIAL = 0x80U; + +const unsigned char MMDVM_TRANSPARENT = 0x90U; +const unsigned char MMDVM_QSO_INFO = 0x91U; + +const unsigned char MMDVM_DEBUG1 = 0xF1U; +const unsigned char MMDVM_DEBUG2 = 0xF2U; +const unsigned char MMDVM_DEBUG3 = 0xF3U; +const unsigned char MMDVM_DEBUG4 = 0xF4U; +const unsigned char MMDVM_DEBUG5 = 0xF5U; + +const unsigned int MAX_RESPONSES = 30U; + +const unsigned int BUFFER_LENGTH = 2000U; +const unsigned char MODE_IDLE = 0U; +const unsigned char MODE_DSTAR = 1U; +const unsigned char MODE_DMR = 2U; +const unsigned char MODE_YSF = 3U; +const unsigned char MODE_P25 = 4U; +const unsigned char MODE_NXDN = 5U; +const unsigned char MODE_M17 = 7U; +const unsigned char MODE_CW = 98U; +const unsigned char MODE_LOCKOUT = 99U; +const unsigned char MODE_ERROR = 100U; + +#endif // MMDVMDEFINES_H diff --git a/androidserialport.cpp b/androidserialport.cpp index 2a3d627..8996938 100644 --- a/androidserialport.cpp +++ b/androidserialport.cpp @@ -55,7 +55,7 @@ QStringList AndroidSerialPort::discover_devices() int AndroidSerialPort::open(int p) { qDebug() << serialJavaObject.callObjectMethod("setup_serial", "(Landroid/content/Context;)Ljava/lang/String;", QtAndroid::androidContext().object()).toString(); - return 1; + return p; } int AndroidSerialPort::write(char *data, int s) diff --git a/cbptc19696.cpp b/cbptc19696.cpp index 13d1715..e5a019f 100644 --- a/cbptc19696.cpp +++ b/cbptc19696.cpp @@ -35,7 +35,7 @@ CBPTC19696::~CBPTC19696() } // The main decode function -void CBPTC19696::decode(const unsigned char* in, unsigned char* out) +void CBPTC19696::decode(const uint8_t* in, uint8_t* out) { assert(in != NULL); assert(out != NULL); @@ -54,7 +54,7 @@ void CBPTC19696::decode(const unsigned char* in, unsigned char* out) } // The main encode function -void CBPTC19696::encode(const unsigned char* in, unsigned char* out) +void CBPTC19696::encode(const uint8_t* in, uint8_t* out) { assert(in != NULL); assert(out != NULL); @@ -72,7 +72,7 @@ void CBPTC19696::encode(const unsigned char* in, unsigned char* out) encodeExtractBinary(out); } -void CBPTC19696::byteToBitsBE(unsigned char byte, bool* bits) +void CBPTC19696::byteToBitsBE(uint8_t byte, bool* bits) { assert(bits != NULL); @@ -86,7 +86,7 @@ void CBPTC19696::byteToBitsBE(unsigned char byte, bool* bits) bits[7U] = (byte & 0x01U) == 0x01U; } -void CBPTC19696::bitsToByteBE(bool* bits, unsigned char& byte) +void CBPTC19696::bitsToByteBE(bool* bits, uint8_t& byte) { assert(bits != NULL); @@ -100,7 +100,7 @@ void CBPTC19696::bitsToByteBE(bool* bits, unsigned char& byte) byte |= bits[7U] ? 0x01U : 0x00U; } -void CBPTC19696::decodeExtractBinary(const unsigned char* in) +void CBPTC19696::decodeExtractBinary(const uint8_t* in) { // First block byteToBitsBE(in[0U], m_rawData + 0U); @@ -141,13 +141,13 @@ void CBPTC19696::decodeExtractBinary(const unsigned char* in) // Deinterleave the raw data void CBPTC19696::decodeDeInterleave() { - for (unsigned int i = 0U; i < 196U; i++) + for (uint32_t i = 0U; i < 196U; i++) m_deInterData[i] = false; // The first bit is R(3) which is not used so can be ignored - for (unsigned int a = 0U; a < 196U; a++) { + for (uint32_t a = 0U; a < 196U; a++) { // Calculate the interleave sequence - unsigned int interleaveSequence = (a * 181U) % 196U; + uint32_t interleaveSequence = (a * 181U) % 196U; // Shuffle the data m_deInterData[a] = m_rawData[interleaveSequence]; } @@ -157,22 +157,22 @@ void CBPTC19696::decodeDeInterleave() void CBPTC19696::decodeErrorCheck() { bool fixing; - unsigned int count = 0U; + uint32_t count = 0U; do { fixing = false; // Run through each of the 15 columns bool col[13U]; - for (unsigned int c = 0U; c < 15U; c++) { - unsigned int pos = c + 1U; - for (unsigned int a = 0U; a < 13U; a++) { + for (uint32_t c = 0U; c < 15U; c++) { + uint32_t pos = c + 1U; + for (uint32_t a = 0U; a < 13U; a++) { col[a] = m_deInterData[pos]; pos = pos + 15U; } if (CHamming::decode1393(col)) { - unsigned int pos = c + 1U; - for (unsigned int a = 0U; a < 13U; a++) { + uint32_t pos = c + 1U; + for (uint32_t a = 0U; a < 13U; a++) { m_deInterData[pos] = col[a]; pos = pos + 15U; } @@ -182,8 +182,8 @@ void CBPTC19696::decodeErrorCheck() } // Run through each of the 9 rows containing data - for (unsigned int r = 0U; r < 9U; r++) { - unsigned int pos = (r * 15U) + 1U; + for (uint32_t r = 0U; r < 9U; r++) { + uint32_t pos = (r * 15U) + 1U; if (CHamming::decode15113_2(m_deInterData + pos)) fixing = true; } @@ -193,37 +193,38 @@ void CBPTC19696::decodeErrorCheck() } // Extract the 96 bits of payload -void CBPTC19696::decodeExtractData(unsigned char* data) +void CBPTC19696::decodeExtractData(uint8_t* data) { bool bData[96U]; - unsigned int pos = 0U; - for (unsigned int a = 4U; a <= 11U; a++, pos++) + uint32_t pos = 0U; + for(uint32_t a = 4U; a <= 11U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 16U; a <= 26U; a++, pos++) + } + for(uint32_t a = 16U; a <= 26U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 31U; a <= 41U; a++, pos++) + } + for(uint32_t a = 31U; a <= 41U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 46U; a <= 56U; a++, pos++) + } + for(uint32_t a = 46U; a <= 56U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 61U; a <= 71U; a++, pos++) + } + for(uint32_t a = 61U; a <= 71U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 76U; a <= 86U; a++, pos++) + } + for(uint32_t a = 76U; a <= 86U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 91U; a <= 101U; a++, pos++) + } + for(uint32_t a = 91U; a <= 101U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 106U; a <= 116U; a++, pos++) + } + for(uint32_t a = 106U; a <= 116U; a++, pos++){ bData[pos] = m_deInterData[a]; - - for (unsigned int a = 121U; a <= 131U; a++, pos++) + } + for(uint32_t a = 121U; a <= 131U; a++, pos++){ bData[pos] = m_deInterData[a]; - + } + bitsToByteBE(bData + 0U, data[0U]); bitsToByteBE(bData + 8U, data[1U]); bitsToByteBE(bData + 16U, data[2U]); @@ -239,7 +240,7 @@ void CBPTC19696::decodeExtractData(unsigned char* data) } // Extract the 96 bits of payload -void CBPTC19696::encodeExtractData(const unsigned char* in) +void CBPTC19696::encodeExtractData(const uint8_t* in) { bool bData[96U]; byteToBitsBE(in[0U], bData + 0U); @@ -255,35 +256,35 @@ void CBPTC19696::encodeExtractData(const unsigned char* in) byteToBitsBE(in[10U], bData + 80U); byteToBitsBE(in[11U], bData + 88U); - for (unsigned int i = 0U; i < 196U; i++) + for (uint32_t i = 0U; i < 196U; i++) m_deInterData[i] = false; - unsigned int pos = 0U; - for (unsigned int a = 4U; a <= 11U; a++, pos++) + uint32_t pos = 0U; + for (uint32_t a = 4U; a <= 11U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 16U; a <= 26U; a++, pos++) + for (uint32_t a = 16U; a <= 26U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 31U; a <= 41U; a++, pos++) + for (uint32_t a = 31U; a <= 41U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 46U; a <= 56U; a++, pos++) + for (uint32_t a = 46U; a <= 56U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 61U; a <= 71U; a++, pos++) + for (uint32_t a = 61U; a <= 71U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 76U; a <= 86U; a++, pos++) + for (uint32_t a = 76U; a <= 86U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 91U; a <= 101U; a++, pos++) + for (uint32_t a = 91U; a <= 101U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 106U; a <= 116U; a++, pos++) + for (uint32_t a = 106U; a <= 116U; a++, pos++) m_deInterData[a] = bData[pos]; - for (unsigned int a = 121U; a <= 131U; a++, pos++) + for (uint32_t a = 121U; a <= 131U; a++, pos++) m_deInterData[a] = bData[pos]; } @@ -292,16 +293,16 @@ void CBPTC19696::encodeErrorCheck() { // Run through each of the 9 rows containing data - for (unsigned int r = 0U; r < 9U; r++) { - unsigned int pos = (r * 15U) + 1U; + for (uint32_t r = 0U; r < 9U; r++) { + uint32_t pos = (r * 15U) + 1U; CHamming::encode15113_2(m_deInterData + pos); } // Run through each of the 15 columns bool col[13U]; - for (unsigned int c = 0U; c < 15U; c++) { - unsigned int pos = c + 1U; - for (unsigned int a = 0U; a < 13U; a++) { + for (uint32_t c = 0U; c < 15U; c++) { + uint32_t pos = c + 1U; + for (uint32_t a = 0U; a < 13U; a++) { col[a] = m_deInterData[pos]; pos = pos + 15U; } @@ -309,7 +310,7 @@ void CBPTC19696::encodeErrorCheck() CHamming::encode1393(col); pos = c + 1U; - for (unsigned int a = 0U; a < 13U; a++) { + for (uint32_t a = 0U; a < 13U; a++) { m_deInterData[pos] = col[a]; pos = pos + 15U; } @@ -319,19 +320,19 @@ void CBPTC19696::encodeErrorCheck() // Interleave the raw data void CBPTC19696::encodeInterleave() { - for (unsigned int i = 0U; i < 196U; i++) + for (uint32_t i = 0U; i < 196U; i++) m_rawData[i] = false; // The first bit is R(3) which is not used so can be ignored - for (unsigned int a = 0U; a < 196U; a++) { + for (uint32_t a = 0U; a < 196U; a++) { // Calculate the interleave sequence - unsigned int interleaveSequence = (a * 181U) % 196U; + uint32_t interleaveSequence = (a * 181U) % 196U; // Unshuffle the data m_rawData[interleaveSequence] = m_deInterData[a]; } } -void CBPTC19696::encodeExtractBinary(unsigned char* data) +void CBPTC19696::encodeExtractBinary(uint8_t* data) { // First block bitsToByteBE(m_rawData + 0U, data[0U]); @@ -348,7 +349,7 @@ void CBPTC19696::encodeExtractBinary(unsigned char* data) bitsToByteBE(m_rawData + 88U, data[11U]); // Handle the two bits - unsigned char byte; + uint8_t byte; bitsToByteBE(m_rawData + 96U, byte); data[12U] = (data[12U] & 0x3FU) | ((byte >> 0) & 0xC0U); data[20U] = (data[20U] & 0xFCU) | ((byte >> 4) & 0x03U); diff --git a/cbptc19696.h b/cbptc19696.h index 9f5ee61..a4e890b 100644 --- a/cbptc19696.h +++ b/cbptc19696.h @@ -18,6 +18,7 @@ #if !defined(BPTC19696_H) #define BPTC19696_H +#include class CBPTC19696 { @@ -25,25 +26,25 @@ public: CBPTC19696(); ~CBPTC19696(); - void decode(const unsigned char* in, unsigned char* out); + void decode(const uint8_t* in, uint8_t* out); - void encode(const unsigned char* in, unsigned char* out); + void encode(const uint8_t* in, uint8_t* out); private: bool m_rawData[196]; bool m_deInterData[196]; - void decodeExtractBinary(const unsigned char* in); + void decodeExtractBinary(const uint8_t* in); void decodeErrorCheck(); void decodeDeInterleave(); - void decodeExtractData(unsigned char* data); + void decodeExtractData(uint8_t* data); - void encodeExtractData(const unsigned char* in); + void encodeExtractData(const uint8_t* in); void encodeInterleave(); void encodeErrorCheck(); - void encodeExtractBinary(unsigned char* data); - void byteToBitsBE(unsigned char byte, bool* bits); - void bitsToByteBE(bool* bits, unsigned char& byte); + void encodeExtractBinary(uint8_t* data); + void byteToBitsBE(uint8_t byte, bool* bits); + void bitsToByteBE(bool* bits, uint8_t& byte); }; #endif diff --git a/dcscodec.cpp b/dcscodec.cpp index b129b3e..2d3fb07 100755 --- a/dcscodec.cpp +++ b/dcscodec.cpp @@ -18,14 +18,10 @@ #include #include "dcscodec.h" #include "CRCenc.h" +#include "MMDVMDefines.h" //#define DEBUG -const unsigned char MMDVM_DSTAR_HEADER = 0x10U; -const unsigned char MMDVM_DSTAR_DATA = 0x11U; -const unsigned char MMDVM_DSTAR_LOST = 0x12U; -const unsigned char MMDVM_DSTAR_EOT = 0x13U; - DCSCodec::DCSCodec(QString callsign, QString hostname, char module, QString host, int port, bool ipv6, QString vocoder, QString modem, QString audioin, QString audioout) : Codec(callsign, module, hostname, host, port, ipv6, vocoder, modem, audioin, audioout) { @@ -133,7 +129,7 @@ void DCSCodec::process_udp() if(m_modem){ uint8_t out[44]; - out[0] = 0xe0; + out[0] = MMDVM_FRAME_START; out[1] = 44; out[2] = MMDVM_DSTAR_HEADER; out[3] = 0x40; @@ -217,14 +213,14 @@ void DCSCodec::process_udp() emit update(m_modeinfo); m_modeinfo.streamid = 0; if(m_modem){ - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(3); m_rxmodemq.append(MMDVM_DSTAR_EOT); } } else if(m_modeinfo.stream_state == STREAMING){ if(m_modem){ - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(15); m_rxmodemq.append(MMDVM_DSTAR_DATA); for(int i = 0; i < 12; ++i){ @@ -568,7 +564,7 @@ void DCSCodec::process_rx_data() if(m_rxmodemq.size() > 2){ QByteArray out; int s = m_rxmodemq[1]; - if((m_rxmodemq[0] == 0xe0) && (m_rxmodemq.size() >= s)){ + if((m_rxmodemq[0] == MMDVM_FRAME_START) && (m_rxmodemq.size() >= s)){ for(int i = 0; i < s; ++i){ out.append(m_rxmodemq.dequeue()); } diff --git a/dmrcodec.cpp b/dmrcodec.cpp index 4c5f603..13b3b2f 100755 --- a/dmrcodec.cpp +++ b/dmrcodec.cpp @@ -22,17 +22,10 @@ #include "crs129.h" #include "SHA256.h" #include "CRCenc.h" +#include "MMDVMDefines.h" //#define DEBUG -const unsigned char MMDVM_DMR_DATA1 = 0x18U; -const unsigned char MMDVM_DMR_LOST1 = 0x19U; -const unsigned char MMDVM_DMR_DATA2 = 0x1AU; -const unsigned char MMDVM_DMR_LOST2 = 0x1BU; -const unsigned char MMDVM_DMR_SHORTLC = 0x1CU; -const unsigned char MMDVM_DMR_START = 0x1DU; -const unsigned char MMDVM_DMR_ABORT = 0x1EU; - const uint32_t ENCODING_TABLE_1676[] = {0x0000U, 0x0273U, 0x04E5U, 0x0696U, 0x09C9U, 0x0BBAU, 0x0D2CU, 0x0F5FU, 0x11E2U, 0x1391U, 0x1507U, 0x1774U, 0x182BU, 0x1A58U, 0x1CCEU, 0x1EBDU, 0x21B7U, 0x23C4U, 0x2552U, 0x2721U, 0x287EU, 0x2A0DU, 0x2C9BU, 0x2EE8U, @@ -221,7 +214,7 @@ void DMRCodec::process_udp() qDebug() << "New DMR stream from " << m_modeinfo.srcid << " to " << m_modeinfo.dstid; } if(m_modem){ - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(0x25); m_rxmodemq.append(MMDVM_DMR_DATA2); m_rxmodemq.append(t); @@ -274,7 +267,7 @@ void DMRCodec::process_udp() uint8_t t = ((uint8_t)buf.data()[15] & 0x0f); if(!t) t = 0x20; - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(0x25); m_rxmodemq.append(MMDVM_DMR_DATA2); m_rxmodemq.append(t); @@ -939,7 +932,7 @@ void DMRCodec::process_rx_data() if((m_rxmodemq.size() > 2) && (++cnt >= 3)){ QByteArray out; int s = m_rxmodemq[1]; - if((m_rxmodemq[0] == 0xe0) && (m_rxmodemq.size() >= s)){ + if((m_rxmodemq[0] == MMDVM_FRAME_START) && (m_rxmodemq.size() >= s)){ for(int i = 0; i < s; ++i){ out.append(m_rxmodemq.dequeue()); } diff --git a/m17codec.cpp b/m17codec.cpp index c3c9ed0..e95429a 100755 --- a/m17codec.cpp +++ b/m17codec.cpp @@ -18,6 +18,7 @@ #include #include +#include "MMDVMDefines.h" #include "m17codec.h" #include "M17Defines.h" #include "M17Convolution.h" @@ -411,9 +412,9 @@ void M17Codec::send_modem_data(QByteArray d) interleave(txframe, tmp); decorrelate(tmp, txframe); - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(M17_FRAME_LENGTH_BYTES + 4); - m_rxmodemq.append(0x45); + m_rxmodemq.append(MMDVM_M17_LINK_SETUP); m_rxmodemq.append('\x00'); for(uint32_t i = 0; i < M17_FRAME_LENGTH_BYTES; ++i){ @@ -444,9 +445,9 @@ void M17Codec::send_modem_data(QByteArray d) interleave(txframe, tmp); decorrelate(tmp, txframe); - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(M17_FRAME_LENGTH_BYTES + 4); - m_rxmodemq.append(0x46); + m_rxmodemq.append(MMDVM_M17_STREAM); m_rxmodemq.append('\x00'); for(uint32_t i = 0; i < M17_FRAME_LENGTH_BYTES; ++i){ @@ -470,13 +471,13 @@ void M17Codec::process_modem_data(QByteArray d) } uint8_t *p = (uint8_t *)d.data(); - if((d.data()[2] == 0x45) || (d.data()[2] == 0x46)){ + if((d.data()[2] == MMDVM_M17_LINK_SETUP) || (d.data()[2] == MMDVM_M17_STREAM)){ p += 4; decorrelate(p, tmp); interleave(tmp, p); } - if((d.data()[2] == 0x48) || (d.data()[2] == 0x49)){ + if((d.data()[2] == MMDVM_M17_LOST) || (d.data()[2] == MMDVM_M17_EOT)){ txstreamid = 0; if(m_modeinfo.host == "MMDVM_DIRECT"){ m_modeinfo.streamid = 0; @@ -484,9 +485,9 @@ void M17Codec::process_modem_data(QByteArray d) } } - else if(d.data()[2] == 0x45){ + else if(d.data()[2] == MMDVM_M17_LINK_SETUP){ ::memset(lsf, 0x00U, M17_LSF_LENGTH_BYTES); - uint32_t ber = conv.decodeLinkSetup(p + M17_SYNC_LENGTH_BYTES, lsf); + conv.decodeLinkSetup(p + M17_SYNC_LENGTH_BYTES, lsf); bool valid = checkCRC16(lsf, M17_LSF_LENGTH_BYTES); txstreamid = static_cast((::rand() & 0xFFFF)); qDebug() << "LSF valid == " << valid; @@ -501,9 +502,9 @@ void M17Codec::process_modem_data(QByteArray d) m_modeinfo.src = QString((char *)cs); } } - else if(d.data()[2] == 0x46){ + else if(d.data()[2] == MMDVM_M17_STREAM){ uint8_t frame[M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES]; - uint32_t errors = conv.decodeData(p + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_FEC_LENGTH_BYTES, frame); + conv.decodeData(p + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_FEC_LENGTH_BYTES, frame); //uint16_t fn = (frame[0U] << 8) + (frame[1U] << 0); uint8_t netframe[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; @@ -806,7 +807,7 @@ void M17Codec::process_rx_data() if((m_rxmodemq.size() > 2) && (++cnt >= 2)){ QByteArray out; int s = m_rxmodemq[1]; - if((m_rxmodemq[0] == 0xe0) && (m_rxmodemq.size() >= s)){ + if((m_rxmodemq[0] == MMDVM_FRAME_START) && (m_rxmodemq.size() >= s)){ for(int i = 0; i < s; ++i){ out.append(m_rxmodemq.dequeue()); } diff --git a/serialambe.cpp b/serialambe.cpp index d402999..e6c1d83 100755 --- a/serialambe.cpp +++ b/serialambe.cpp @@ -233,9 +233,9 @@ void SerialAMBE::encode(int16_t *audio) packet [(i*2)+7] = (audio[i] >> 8) & 0xff; packet [(i*2)+8] = audio[i] & 0xff; } - int r = m_serial->write((char *)packet, 327); + m_serial->write((char *)packet, 327); #ifdef DEBUG - fprintf(stderr, "SENDHW:%d: ", r); + fprintf(stderr, "SENDHW: "); for(int i = 0; i < 326; ++i){ //if((d.data()[i] == 0x61) && (data.data()[i+1] == 0x01) && (data.data()[i+2] == 0x42) && (data.data()[i+3] == 0x02)){ // i+= 6; diff --git a/serialmodem.cpp b/serialmodem.cpp index af0ec2c..584b46a 100644 --- a/serialmodem.cpp +++ b/serialmodem.cpp @@ -19,120 +19,9 @@ #include #include #include "serialmodem.h" +#include "MMDVMDefines.h" //#define DEBUGHW -#define ENDLINE "\n" - -const unsigned char MODE_IDLE = 0U; -const unsigned char MODE_DSTAR = 1U; -const unsigned char MODE_DMR = 2U; -const unsigned char MODE_YSF = 3U; -const unsigned char MODE_P25 = 4U; -const unsigned char MODE_NXDN = 5U; -const unsigned char MODE_M17 = 7U; -const unsigned char MODE_CW = 98U; -const unsigned char MODE_LOCKOUT = 99U; -const unsigned char MODE_ERROR = 100U; - -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; - -enum HW_TYPE { - HWT_MMDVM, - HWT_DVMEGA, - HWT_MMDVM_ZUMSPOT, - HWT_MMDVM_HS_HAT, - HWT_NANO_HOTSPOT, - HWT_MMDVM_HS, - HWT_UNKNOWN -}; - -enum RPT_RF_STATE { - RS_RF_LISTENING, - RS_RF_LATE_ENTRY, - RS_RF_AUDIO, - RS_RF_DATA, - RS_RF_REJECTED, - RS_RF_INVALID -}; - -enum RPT_NET_STATE { - RS_NET_IDLE, - RS_NET_AUDIO, - RS_NET_DATA -}; - -enum B_STATUS { - BS_NO_DATA, - BS_DATA, - BS_MISSING -}; - -const unsigned char MMDVM_FRAME_START = 0xE0U; - -const unsigned char MMDVM_GET_VERSION = 0x00U; -const unsigned char MMDVM_GET_STATUS = 0x01U; -const unsigned char MMDVM_SET_CONFIG = 0x02U; -const unsigned char MMDVM_SET_MODE = 0x03U; -const unsigned char MMDVM_SET_FREQ = 0x04U; - -const unsigned char MMDVM_SEND_CWID = 0x0AU; - -const unsigned char MMDVM_DSTAR_HEADER = 0x10U; -const unsigned char MMDVM_DSTAR_DATA = 0x11U; -const unsigned char MMDVM_DSTAR_LOST = 0x12U; -const unsigned char MMDVM_DSTAR_EOT = 0x13U; - -const unsigned char MMDVM_DMR_DATA1 = 0x18U; -const unsigned char MMDVM_DMR_LOST1 = 0x19U; -const unsigned char MMDVM_DMR_DATA2 = 0x1AU; -const unsigned char MMDVM_DMR_LOST2 = 0x1BU; -const unsigned char MMDVM_DMR_SHORTLC = 0x1CU; -const unsigned char MMDVM_DMR_START = 0x1DU; -const unsigned char MMDVM_DMR_ABORT = 0x1EU; - -const unsigned char MMDVM_YSF_DATA = 0x20U; -const unsigned char MMDVM_YSF_LOST = 0x21U; - -const unsigned char MMDVM_P25_HDR = 0x30U; -const unsigned char MMDVM_P25_LDU = 0x31U; -const unsigned char MMDVM_P25_LOST = 0x32U; - -const unsigned char MMDVM_NXDN_DATA = 0x40U; -const unsigned char MMDVM_NXDN_LOST = 0x41U; - -const unsigned char MMDVM_M17_LINK_SETUP = 0x45U; -const unsigned char MMDVM_M17_STREAM = 0x46U; -const unsigned char MMDVM_M17_PACKET = 0x47U; -const unsigned char MMDVM_M17_LOST = 0x48U; -const unsigned char MMDVM_M17_EOT = 0x49U; - -const unsigned char MMDVM_POCSAG_DATA = 0x50U; - -const unsigned char MMDVM_FM_PARAMS1 = 0x60U; -const unsigned char MMDVM_FM_PARAMS2 = 0x61U; -const unsigned char MMDVM_FM_PARAMS3 = 0x62U; - -const unsigned char MMDVM_ACK = 0x70U; -const unsigned char MMDVM_NAK = 0x7FU; - -const unsigned char MMDVM_SERIAL = 0x80U; - -const unsigned char MMDVM_TRANSPARENT = 0x90U; -const unsigned char MMDVM_QSO_INFO = 0x91U; - -const unsigned char MMDVM_DEBUG1 = 0xF1U; -const unsigned char MMDVM_DEBUG2 = 0xF2U; -const unsigned char MMDVM_DEBUG3 = 0xF3U; -const unsigned char MMDVM_DEBUG4 = 0xF4U; -const unsigned char MMDVM_DEBUG5 = 0xF5U; - -const unsigned int MAX_RESPONSES = 30U; - -const unsigned int BUFFER_LENGTH = 2000U; SerialModem::SerialModem(QString protocol) { diff --git a/xrfcodec.cpp b/xrfcodec.cpp index 39cd691..4a1b234 100755 --- a/xrfcodec.cpp +++ b/xrfcodec.cpp @@ -19,14 +19,10 @@ #include #include "xrfcodec.h" #include "CRCenc.h" +#include "MMDVMDefines.h" //#define DEBUG -const unsigned char MMDVM_DSTAR_HEADER = 0x10U; -const unsigned char MMDVM_DSTAR_DATA = 0x11U; -const unsigned char MMDVM_DSTAR_LOST = 0x12U; -const unsigned char MMDVM_DSTAR_EOT = 0x13U; - XRFCodec::XRFCodec(QString callsign, QString hostname, char module, QString host, int port, bool ipv6, QString vocoder, QString modem, QString audioin, QString audioout) : Codec(callsign, module, hostname, host, port, ipv6, vocoder, modem, audioin, audioout) { @@ -120,7 +116,7 @@ void XRFCodec::process_udp() if(m_modem){ uint8_t out[44]; - out[0] = 0xe0; + out[0] = MMDVM_FRAME_START; out[1] = 44; out[2] = MMDVM_DSTAR_HEADER; out[3] = 0x40; @@ -182,7 +178,7 @@ void XRFCodec::process_udp() } } else if(m_modem){ - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(15); m_rxmodemq.append(MMDVM_DSTAR_DATA); for(int i = 0; i < 12; ++i){ @@ -593,7 +589,7 @@ void XRFCodec::process_rx_data() if(m_rxmodemq.size() > 2){ QByteArray out; int s = m_rxmodemq[1]; - if((m_rxmodemq[0] == 0xe0) && (m_rxmodemq.size() >= s)){ + if((m_rxmodemq[0] == MMDVM_FRAME_START) && (m_rxmodemq.size() >= s)){ for(int i = 0; i < s; ++i){ out.append(m_rxmodemq.dequeue()); } diff --git a/ysfcodec.cpp b/ysfcodec.cpp index 692a71d..4e54687 100755 --- a/ysfcodec.cpp +++ b/ysfcodec.cpp @@ -20,6 +20,7 @@ #include "CRCenc.h" #include "Golay24128.h" #include "chamming.h" +#include "MMDVMDefines.h" #include #include @@ -193,9 +194,9 @@ void YSFCodec::process_udp() m_modeinfo.gw = QString(ysftag); p_data = (uint8_t *)buf.data() + 35; if(m_modem){ - m_rxmodemq.append(0xe0); + m_rxmodemq.append(MMDVM_FRAME_START); m_rxmodemq.append(124); - m_rxmodemq.append(0x20); + m_rxmodemq.append(MMDVM_YSF_DATA); m_rxmodemq.append('\x00'); for(int i = 0; i < 120; ++i){ @@ -609,7 +610,8 @@ void YSFCodec::process_modem_data(QByteArray d) { QByteArray txdata; uint8_t *p_frame = (uint8_t *)(d.data()); - if(m_fcs){ + + if(m_fcs && d.size() >= 130){ ::memset(p_frame + 120U, 0, 10U); ::memcpy(p_frame + 121U, m_fcsname.c_str(), 8); } @@ -621,6 +623,7 @@ void YSFCodec::process_modem_data(QByteArray d) m_ysfFrame[34U] = (m_txcnt & 0x7f) << 1; ::memcpy(m_ysfFrame + 35U, p_frame + 4U, 120); } + ++m_txcnt; txdata.append((char *)m_ysfFrame, 155); m_udp->writeDatagram(txdata, m_address, m_modeinfo.port); @@ -1288,7 +1291,7 @@ void YSFCodec::process_rx_data() if((m_rxmodemq.size() > 2) && (++cnt >= 5)){ QByteArray out; int s = m_rxmodemq[1]; - if((m_rxmodemq[0] == 0xe0) && (m_rxmodemq.size() >= s)){ + if((m_rxmodemq[0] == MMDVM_FRAME_START) && (m_rxmodemq.size() >= s)){ for(int i = 0; i < s; ++i){ out.append(m_rxmodemq.dequeue()); }