From 6420391294f5d4f766fbe0410b8efd3662bd934f Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 1 Feb 2024 13:31:04 +0000 Subject: [PATCH] Change the interface to the FM networking. --- FMControl.cpp | 198 +++++++++++++++++++++++---------------------- FMControl.h | 5 +- FMIAXNetwork.cpp | 35 +++----- FMIAXNetwork.h | 2 + FMNetwork.h | 2 + FMRAWNetwork.cpp | 37 +++------ FMRAWNetwork.h | 5 +- FMUSRPNetwork.cpp | 200 ++++++++++++++++++++++------------------------ FMUSRPNetwork.h | 4 +- Modem.cpp | 2 +- 10 files changed, 236 insertions(+), 254 deletions(-) diff --git a/FMControl.cpp b/FMControl.cpp index bf54cfb..1359494 100644 --- a/FMControl.cpp +++ b/FMControl.cpp @@ -40,6 +40,7 @@ m_rxAudioGain(rxAudioGain), m_preEmphasisOn(preEmphasisOn), m_deEmphasisOn(deEmphasisOn), m_enabled(false), +m_begin(true), m_incomingRFAudio(1600U, "Incoming RF FM Audio"), m_preEmphasis(NULL), m_deEmphasis(NULL), @@ -47,148 +48,155 @@ m_filterStage1(NULL), m_filterStage2(NULL), m_filterStage3(NULL) { - assert(txAudioGain > 0.0F); - assert(rxAudioGain > 0.0F); + assert(txAudioGain > 0.0F); + assert(rxAudioGain > 0.0F); - m_preEmphasis = new CIIRDirectForm1Filter(8.315375384336983F, -7.03334621603483F,0.0F,1.0F, 0.282029168302153F,0.0F, PREEMPHASIS_GAIN_DB); - m_deEmphasis = new CIIRDirectForm1Filter(0.07708787090460224F, 0.07708787090460224F,0.0F, 1.0F, -0.8458242581907955F,0.0F, DEEMPHASIS_GAIN_DB); + m_preEmphasis = new CIIRDirectForm1Filter(8.315375384336983F, -7.03334621603483F,0.0F,1.0F, 0.282029168302153F,0.0F, PREEMPHASIS_GAIN_DB); + m_deEmphasis = new CIIRDirectForm1Filter(0.07708787090460224F, 0.07708787090460224F,0.0F, 1.0F, -0.8458242581907955F,0.0F, DEEMPHASIS_GAIN_DB); - // Chebyshev type 1 0.2dB cheby type 1 3rd order 300-2700Hz fs=8000 - m_filterStage1 = new CIIRDirectForm1Filter(0.29495028f, 0.0f, -0.29495028f, 1.0f, -0.61384624f, -0.057158668f, FILTER_GAIN_DB); - m_filterStage2 = new CIIRDirectForm1Filter(1.0f, 2.0f, 1.0f, 1.0f, 0.9946123f, 0.6050482f, FILTER_GAIN_DB); - m_filterStage3 = new CIIRDirectForm1Filter(1.0f, -2.0f, 1.0f, 1.0f, -1.8414584f, 0.8804949f, FILTER_GAIN_DB); + // Chebyshev type 1 0.2dB cheby type 1 3rd order 300-2700Hz fs=8000 + m_filterStage1 = new CIIRDirectForm1Filter(0.29495028f, 0.0f, -0.29495028f, 1.0f, -0.61384624f, -0.057158668f, FILTER_GAIN_DB); + m_filterStage2 = new CIIRDirectForm1Filter(1.0f, 2.0f, 1.0f, 1.0f, 0.9946123f, 0.6050482f, FILTER_GAIN_DB); + m_filterStage3 = new CIIRDirectForm1Filter(1.0f, -2.0f, 1.0f, 1.0f, -1.8414584f, 0.8804949f, FILTER_GAIN_DB); } CFMControl::~CFMControl() { - delete m_preEmphasis; - delete m_deEmphasis; + delete m_preEmphasis; + delete m_deEmphasis; - delete m_filterStage1; - delete m_filterStage2; - delete m_filterStage3; + delete m_filterStage1; + delete m_filterStage2; + delete m_filterStage3; } bool CFMControl::writeModem(const unsigned char* data, unsigned int length) { - assert(data != NULL); - assert(length > 0U); + assert(data != NULL); + assert(length > 0U); - if (m_network == NULL) - return true; + if (m_network == NULL) + return true; - if (data[0U] == TAG_HEADER) - return true; + if (data[0U] == TAG_HEADER) + return true; - if (data[0U] == TAG_EOT) - return m_network->writeEnd(); + if (data[0U] == TAG_EOT) { + m_begin = true; + return m_network->writeEnd(); + } - if (data[0U] != TAG_DATA) - return false; + if (data[0U] != TAG_DATA) + return false; - m_incomingRFAudio.addData(data + 1U, length - 1U); - unsigned int bufferLength = m_incomingRFAudio.dataSize(); - if (bufferLength > 240U) // 160 samples 12-bit - bufferLength = 240U; // 160 samples 12-bit + if (m_begin) { + m_begin = false; + m_network->writeStart(); + } - if (bufferLength >= 3U) { - bufferLength = bufferLength - bufferLength % 3U; // Round down to nearest multiple of 3 - unsigned char bufferData[240U]; // 160 samples 12-bit - m_incomingRFAudio.getData(bufferData, bufferLength); + m_incomingRFAudio.addData(data + 1U, length - 1U); + unsigned int bufferLength = m_incomingRFAudio.dataSize(); + if (bufferLength > 240U) // 160 samples 12-bit + bufferLength = 240U; // 160 samples 12-bit - unsigned int pack = 0U; - unsigned char* packPointer = (unsigned char*)&pack; - float out[160U]; // 160 samples 12-bit - unsigned int nOut = 0U; - short unpackedSamples[2U]; + if (bufferLength >= 3U) { + bufferLength = bufferLength - bufferLength % 3U; // Round down to nearest multiple of 3 + unsigned char bufferData[240U]; // 160 samples 12-bit + m_incomingRFAudio.getData(bufferData, bufferLength); - for (unsigned int i = 0U; i < bufferLength; i += 3U) { - // Extract unsigned 12 bit unsigned sample pairs packed into 3 bytes to 16 bit signed - packPointer[0U] = bufferData[i + 0U]; - packPointer[1U] = bufferData[i + 1U]; - packPointer[2U] = bufferData[i + 2U]; + unsigned int pack = 0U; + unsigned char* packPointer = (unsigned char*)&pack; + float out[160U]; // 160 samples 12-bit + unsigned int nOut = 0U; + short unpackedSamples[2U]; - unpackedSamples[1U] = short(int(pack & FM_MASK) - 2048); - unpackedSamples[0U] = short(int(pack >> 12 & FM_MASK) - 2048); // + for (unsigned int i = 0U; i < bufferLength; i += 3U) { + // Extract unsigned 12 bit unsigned sample pairs packed into 3 bytes to 16 bit signed + packPointer[0U] = bufferData[i + 0U]; + packPointer[1U] = bufferData[i + 1U]; + packPointer[2U] = bufferData[i + 2U]; - // Process unpacked sample pair - for (unsigned char j = 0U; j < 2U; j++) { - // Convert to float (-1.0 to +1.0) - float sampleFloat = (float(unpackedSamples[j]) * m_rxAudioGain) / 2048.0F; + unpackedSamples[1U] = short(int(pack & FM_MASK) - 2048); + unpackedSamples[0U] = short(int(pack >> 12 & FM_MASK) - 2048); - // De-emphasise and remove CTCSS - if (m_deEmphasisOn) - sampleFloat = m_deEmphasis->filter(sampleFloat); + // Process unpacked sample pair + for (unsigned char j = 0U; j < 2U; j++) { + // Convert to float (-1.0 to +1.0) + float sampleFloat = (float(unpackedSamples[j]) * m_rxAudioGain) / 2048.0F; - out[nOut++] = m_filterStage3->filter(m_filterStage2->filter(m_filterStage1->filter(sampleFloat))); - } - } + // De-emphasise and remove CTCSS + if (m_deEmphasisOn) + sampleFloat = m_deEmphasis->filter(sampleFloat); + + out[nOut++] = m_filterStage3->filter(m_filterStage2->filter(m_filterStage1->filter(sampleFloat))); + } + } #if defined(DUMP_RF_AUDIO) - FILE * audiofile = fopen("./audiodump.bin", "ab"); - if (audiofile != NULL) { - fwrite(out, sizeof(float), nOut, audiofile); - fclose(audiofile); - } + FILE* audiofile = ::fopen("./audiodump.bin", "ab"); + if (audiofile != NULL) { + ::fwrite(out, sizeof(float), nOut, audiofile); + ::fclose(audiofile); + } #endif - return m_network->writeData(out, nOut); - } + return m_network->writeData(out, nOut); + } - return true; + return true; } unsigned int CFMControl::readModem(unsigned char* data, unsigned int space) { - assert(data != NULL); - assert(space > 0U); + assert(data != NULL); + assert(space > 0U); - if (m_network == NULL) - return 0U; + if (m_network == NULL) + return 0U; - if (space > 240U) // 160 samples 12-bit - space = 240U; // 160 samples 12-bit + if (space > 240U) // 160 samples 12-bit + space = 240U; // 160 samples 12-bit - float netData[160U]; // Modem can handle up to 160 samples at a time - unsigned int length = m_network->readData(netData, 160U); // 160 samples 12-bit - if (length == 0U) - return 0U; + float netData[160U]; // Modem can handle up to 160 samples at a time + unsigned int length = m_network->readData(netData, 160U); // 160 samples 12-bit + if (length == 0U) + return 0U; - unsigned int pack = 0U; - unsigned char* packPointer = (unsigned char*)&pack; - unsigned int nData = 0U; + unsigned int pack = 0U; + unsigned char* packPointer = (unsigned char*)&pack; + unsigned int nData = 0U; - for (unsigned int i = 0; i < length; i++) { - float sampleFloat = netData[i] * m_txAudioGain; + for (unsigned int i = 0; i < length; i++) { + float sampleFloat = netData[i] * m_txAudioGain; - // Pre-emphasis - if (m_preEmphasisOn) - sampleFloat = m_preEmphasis->filter(sampleFloat); + // Pre-emphasis + if (m_preEmphasisOn) + sampleFloat = m_preEmphasis->filter(sampleFloat); - // Convert float to 12-bit samples (0 to 4095) - unsigned int sample12bit = (unsigned int)((sampleFloat + 1.0F) * 2048.0F + 0.5F); + // Convert float to 12-bit samples (0 to 4095) + unsigned int sample12bit = (unsigned int)((sampleFloat + 1.0F) * 2048.0F + 0.5F); - // Pack 2 samples into 3 bytes - if ((i & 1U) == 0) { - pack = 0U; - pack = sample12bit << 12; - } else { - pack |= sample12bit; + // Pack 2 samples into 3 bytes + if ((i & 1U) == 0) { + pack = 0U; + pack = sample12bit << 12; + } else { + pack |= sample12bit; - data[nData++] = packPointer[0U]; - data[nData++] = packPointer[1U]; - data[nData++] = packPointer[2U]; - } - } + data[nData++] = packPointer[0U]; + data[nData++] = packPointer[1U]; + data[nData++] = packPointer[2U]; + } + } - return nData; + return nData; } void CFMControl::clock(unsigned int ms) { - // May not be needed + // May not be needed } void CFMControl::enable(bool enabled) { - // May not be needed + // May not be needed } diff --git a/FMControl.h b/FMControl.h index 0e4747f..0047815 100644 --- a/FMControl.h +++ b/FMControl.h @@ -48,8 +48,11 @@ private: float m_rxAudioGain; bool m_preEmphasisOn; bool m_deEmphasisOn; - bool m_enabled; + bool m_enabled; + bool m_begin; + CRingBuffer m_incomingRFAudio; + CIIRDirectForm1Filter* m_preEmphasis; CIIRDirectForm1Filter* m_deEmphasis; CIIRDirectForm1Filter* m_filterStage1; diff --git a/FMIAXNetwork.cpp b/FMIAXNetwork.cpp index f9c9a9a..f202b2e 100644 --- a/FMIAXNetwork.cpp +++ b/FMIAXNetwork.cpp @@ -152,17 +152,16 @@ bool CFMIAXNetwork::open() return m_socket.open(m_addr); } +bool CFMIAXNetwork::writeStart() +{ + return true; +} + bool CFMIAXNetwork::writeData(const float* data, unsigned int nSamples) { assert(data != NULL); assert(nSamples > 0U); -/* - if (m_iSeqNo == 0U) { - bool ret = writeStart(); - if (!ret) - return false; - } -*/ + return true; } @@ -193,21 +192,7 @@ void CFMIAXNetwork::clock(unsigned int ms) if (m_debug) CUtils::dump(1U, "FM IAX Network Data Received", buffer, length); - // Invalid packet type? - if (::memcmp(buffer, "USRP", 4U) != 0) - return; - - if (length < 32) - return; - - // The type is a big-endian 4-byte integer - unsigned int type = (buffer[20U] << 24) + - (buffer[21U] << 16) + - (buffer[22U] << 8) + - (buffer[23U] << 0); - - if (type == 0U) - m_buffer.addData(buffer + 32U, length - 32U); + m_buffer.addData(buffer + 32U, length - 32U); } unsigned int CFMIAXNetwork::readData(float* out, unsigned int nOut) @@ -257,7 +242,7 @@ void CFMIAXNetwork::enable(bool enabled) bool CFMIAXNetwork::writeCall() { - unsigned short sCall = ++m_sCallNo | 0x8000; + unsigned short sCall = ++m_sCallNo | 0x8000U; m_timestamp.start(); @@ -329,7 +314,7 @@ bool CFMIAXNetwork::writeAuth() char hash[MD5_DIGEST_STRING_LENGTH]; ::MD5Data((unsigned char*)m_password.c_str(), m_password.size(), hash); - unsigned short sCall = m_sCallNo | 0x8000; + unsigned short sCall = m_sCallNo | 0x8000U; unsigned int ts = m_timestamp.elapsed(); unsigned char buffer[50U]; @@ -543,7 +528,7 @@ bool CFMIAXNetwork::writeDisconnect() { const char* REASON = "MMDVM Out"; - unsigned short sCall = m_sCallNo | 0x8000; + unsigned short sCall = m_sCallNo | 0x8000U; unsigned int ts = m_timestamp.elapsed(); unsigned char buffer[50U]; diff --git a/FMIAXNetwork.h b/FMIAXNetwork.h index 73c5c9c..d035cab 100644 --- a/FMIAXNetwork.h +++ b/FMIAXNetwork.h @@ -36,6 +36,8 @@ public: virtual void enable(bool enabled); + virtual bool writeStart(); + virtual bool writeData(const float* data, unsigned int nSamples); virtual bool writeEnd(); diff --git a/FMNetwork.h b/FMNetwork.h index 3721c33..2774980 100644 --- a/FMNetwork.h +++ b/FMNetwork.h @@ -30,6 +30,8 @@ public: virtual void enable(bool enabled) = 0; + virtual bool writeStart() = 0; + virtual bool writeData(const float* data, unsigned int nSamples) = 0; virtual bool writeEnd() = 0; diff --git a/FMRAWNetwork.cpp b/FMRAWNetwork.cpp index da60b6f..64e9620 100644 --- a/FMRAWNetwork.cpp +++ b/FMRAWNetwork.cpp @@ -43,7 +43,6 @@ m_squelchFile(squelchFile), m_debug(debug), m_enabled(false), m_buffer(2000U, "FM Network"), -m_seqNo(0U), m_resampler(NULL), m_error(0), m_fd(-1) @@ -83,17 +82,24 @@ bool CFMRAWNetwork::open() return m_socket.open(m_addr); } +bool CFMRAWNetwork::writeStart() +{ + if (m_fd != -1) { + size_t n = ::write(m_fd, "O", 1); + if (n != 1) { + LogError("Cannot write to the squelch file: %s, errno=%d", m_squelchFile.c_str(), errno); + return false; + } + } + + return true; +} + bool CFMRAWNetwork::writeData(const float* in, unsigned int nIn) { assert(in != NULL); assert(nIn > 0U); - if (m_seqNo == 0U) { - bool ret = writeStart(); - if (!ret) - return false; - } - unsigned char buffer[2000U]; unsigned int length = 0U; @@ -135,15 +141,11 @@ bool CFMRAWNetwork::writeData(const float* in, unsigned int nIn) if (m_debug) CUtils::dump(1U, "FM RAW Network Data Sent", buffer, length); - m_seqNo++; - return m_socket.write(buffer, length, m_addr, m_addrLen); } bool CFMRAWNetwork::writeEnd() { - m_seqNo = 0U; - if (m_fd != -1) { size_t n = ::write(m_fd, "Z", 1); if (n != 1) { @@ -262,16 +264,3 @@ void CFMRAWNetwork::enable(bool enabled) m_enabled = enabled; } -bool CFMRAWNetwork::writeStart() -{ - if (m_fd != -1) { - size_t n = ::write(m_fd, "O", 1); - if (n != 1) { - LogError("Cannot write to the squelch file: %s, errno=%d", m_squelchFile.c_str(), errno); - return false; - } - } - - return true; -} - diff --git a/FMRAWNetwork.h b/FMRAWNetwork.h index 7012330..39ae798 100644 --- a/FMRAWNetwork.h +++ b/FMRAWNetwork.h @@ -37,6 +37,8 @@ public: virtual void enable(bool enabled); + virtual bool writeStart(); + virtual bool writeData(const float* in, unsigned int nIn); virtual bool writeEnd(); @@ -58,12 +60,9 @@ private: bool m_debug; bool m_enabled; CRingBuffer m_buffer; - unsigned int m_seqNo; SRC_STATE* m_resampler; int m_error; int m_fd; - - bool writeStart(); }; #endif diff --git a/FMUSRPNetwork.cpp b/FMUSRPNetwork.cpp index 980d7a2..0ea0517 100644 --- a/FMUSRPNetwork.cpp +++ b/FMUSRPNetwork.cpp @@ -71,17 +71,108 @@ bool CFMUSRPNetwork::open() return m_socket.open(m_addr); } +bool CFMUSRPNetwork::writeStart() +{ + unsigned char buffer[500U]; + ::memset(buffer, 0x00U, 500U); + + unsigned int length = 0U; + + buffer[length++] = 'U'; + buffer[length++] = 'S'; + buffer[length++] = 'R'; + buffer[length++] = 'P'; + + // Sequence number + buffer[length++] = (m_seqNo >> 24) & 0xFFU; + buffer[length++] = (m_seqNo >> 16) & 0xFFU; + buffer[length++] = (m_seqNo >> 8) & 0xFFU; + buffer[length++] = (m_seqNo >> 0) & 0xFFU; + + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // PTT off + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // Type, 2 for metadata + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x02U; + + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // TLV TAG for Metadata + buffer[length++] = 0x08U; + + // TLV Length + buffer[length++] = 3U + 4U + 3U + 1U + 1U + m_callsign.size() + 1U; + + // DMR Id + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // Rpt Id + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // Talk Group + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + buffer[length++] = 0x00U; + + // Time Slot + buffer[length++] = 0x00U; + + // Color Code + buffer[length++] = 0x00U; + + // Callsign + for (std::string::const_iterator it = m_callsign.cbegin(); it != m_callsign.cend(); ++it) + buffer[length++] = *it; + + // End of Metadata + buffer[length++] = 0x00U; + + length = 70U; + + if (length > 0U) { + if (m_debug) + CUtils::dump(1U, "FM USRP Network Data Sent", buffer, length); + + return m_socket.write(buffer, length, m_addr, m_addrLen); + } else { + return true; + } +} + bool CFMUSRPNetwork::writeData(const float* data, unsigned int nSamples) { assert(data != NULL); assert(nSamples > 0U); - if (m_seqNo == 0U) { - bool ret = writeStart(); - if (!ret) - return false; - } - unsigned char buffer[500U]; ::memset(buffer, 0x00U, 500U); @@ -293,100 +384,3 @@ void CFMUSRPNetwork::enable(bool enabled) m_enabled = enabled; } -bool CFMUSRPNetwork::writeStart() -{ - unsigned char buffer[500U]; - ::memset(buffer, 0x00U, 500U); - - unsigned int length = 0U; - - buffer[length++] = 'U'; - buffer[length++] = 'S'; - buffer[length++] = 'R'; - buffer[length++] = 'P'; - - // Sequence number - buffer[length++] = (m_seqNo >> 24) & 0xFFU; - buffer[length++] = (m_seqNo >> 16) & 0xFFU; - buffer[length++] = (m_seqNo >> 8) & 0xFFU; - buffer[length++] = (m_seqNo >> 0) & 0xFFU; - - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // PTT off - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // Type, 2 for metadata - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x02U; - - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // TLV TAG for Metadata - buffer[length++] = 0x08U; - - // TLV Length - buffer[length++] = 3U + 4U + 3U + 1U + 1U + m_callsign.size() + 1U; - - // DMR Id - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // Rpt Id - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // Talk Group - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - buffer[length++] = 0x00U; - - // Time Slot - buffer[length++] = 0x00U; - - // Color Code - buffer[length++] = 0x00U; - - // Callsign - for (std::string::const_iterator it = m_callsign.cbegin(); it != m_callsign.cend(); ++it) - buffer[length++] = *it; - - // End of Metadata - buffer[length++] = 0x00U; - - length = 70U; - - if (length > 0U) { - if (m_debug) - CUtils::dump(1U, "FM USRP Network Data Sent", buffer, length); - - return m_socket.write(buffer, length, m_addr, m_addrLen); - } else { - return true; - } -} - diff --git a/FMUSRPNetwork.h b/FMUSRPNetwork.h index 5def554..b0e8f2c 100644 --- a/FMUSRPNetwork.h +++ b/FMUSRPNetwork.h @@ -35,6 +35,8 @@ public: virtual void enable(bool enabled); + virtual bool writeStart(); + virtual bool writeData(const float* data, unsigned int nSamples); virtual bool writeEnd(); @@ -56,8 +58,6 @@ private: bool m_enabled; CRingBuffer m_buffer; unsigned int m_seqNo; - - bool writeStart(); }; #endif diff --git a/Modem.cpp b/Modem.cpp index d88162e..b7d2640 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -737,7 +737,7 @@ void CModem::clock(unsigned int ms) unsigned int data1 = m_length - m_offset + 1U; m_rxFMData.addData((unsigned char*)&data1, sizeof(unsigned int)); - unsigned char data2= TAG_HEADER; + unsigned char data2 = TAG_HEADER; m_rxFMData.addData(&data2, 1U); m_rxFMData.addData(m_buffer + m_offset, m_length - m_offset);