Reorganised internal structure of M17LinkSetupFrame class, renamed M17Frame to M17StreamFrame and reorganised its structure

This commit is contained in:
Silvano Seva 2022-01-05 12:23:33 +01:00
parent c73aa92305
commit 49bd8ee2f4
6 changed files with 47 additions and 31 deletions

View File

@ -147,10 +147,8 @@ private:
*/ */
uint16_t crc16(const void *data, const size_t len); uint16_t crc16(const void *data, const size_t len);
/**
* Data structure corresponding to a full M17 Link Setup Frame. struct __attribute__((packed))
*/
typedef struct
{ {
call_t dst; ///< Destination callsign call_t dst; ///< Destination callsign
call_t src; ///< Source callsign call_t src; ///< Source callsign
@ -158,9 +156,7 @@ private:
meta_t meta; ///< Metadata meta_t meta; ///< Metadata
uint16_t crc; ///< CRC uint16_t crc; ///< CRC
} }
__attribute__((packed)) lsf_t; data; ///< Frame data.
lsf_t data; ///< Underlying frame data.
}; };
#endif /* M17_LINKSETUPFRAME_H */ #endif /* M17_LINKSETUPFRAME_H */

View File

@ -1,8 +1,8 @@
/*************************************************************************** /***************************************************************************
* Copyright (C) 2021 by Federico Amedeo Izzo IU2NUO, * * Copyright (C) 2021 - 2022 by Federico Amedeo Izzo IU2NUO, *
* Niccolò Izzo IU2KIN * * Niccolò Izzo IU2KIN *
* Frederik Saraci IU2NRO * * Frederik Saraci IU2NRO *
* Silvano Seva IU2KWO * * Silvano Seva IU2KWO *
* * * *
* This program is free software; you can redistribute it and/or modify * * This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by * * it under the terms of the GNU General Public License as published by *
@ -32,14 +32,14 @@
/** /**
* This class describes and handles a generic M17 data frame. * This class describes and handles a generic M17 data frame.
*/ */
class M17Frame class M17StreamFrame
{ {
public: public:
/** /**
* Constructor. * Constructor.
*/ */
M17Frame() M17StreamFrame()
{ {
clear(); clear();
} }
@ -47,14 +47,14 @@ public:
/** /**
* Destructor. * Destructor.
*/ */
~M17Frame(){ } ~M17StreamFrame(){ }
/** /**
* Clear the frame content, filling it with zeroes. * Clear the frame content, filling it with zeroes.
*/ */
void clear() void clear()
{ {
memset(&data, 0x00, sizeof(dataFrame_t)); memset(&data, 0x00, sizeof(data));
} }
/** /**
@ -65,7 +65,18 @@ public:
void setFrameNumber(const uint16_t seqNum) void setFrameNumber(const uint16_t seqNum)
{ {
// NOTE: M17 fields are big-endian, we need to swap bytes // NOTE: M17 fields are big-endian, we need to swap bytes
data.frameNum = __builtin_bswap16(seqNum & 0x7fff); data.frameNum = __builtin_bswap16(seqNum & FN_MASK);
}
/**
* Get frame sequence number.
*
* @return frame number, between 0 and 0x7FFF.
*/
uint16_t getFrameNumber()
{
// NOTE: M17 fields are big-endian, we need to swap bytes
return __builtin_bswap16(data.frameNum);
} }
/** /**
@ -74,7 +85,18 @@ public:
*/ */
void lastFrame() void lastFrame()
{ {
data.frameNum |= 0x0080; data.frameNum |= EOS_BIT;
}
/**
* Check if this frame is the last one that is, get the value of the EOS
* bit.
*
* @return true if the frame has the EOS bit set.
*/
bool isLastFrame()
{
return ((data.frameNum & EOS_BIT) != 0) ? true : false;
} }
/** /**
@ -100,17 +122,15 @@ public:
private: private:
/** struct __attribute__((packed))
* Data structure corresponding to a full M17 data frame.
*/
typedef struct
{ {
uint16_t frameNum; ///< Frame number uint16_t frameNum; // Frame number
payload_t payload; ///< Payload data payload_t payload; // Payload data
} }
__attribute__((packed)) dataFrame_t; data;
///< Frame data.
dataFrame_t data; ///< Underlying frame data. static constexpr uint16_t EOS_BIT = 0x0080; ///< End Of Stream bit.
static constexpr uint16_t FN_MASK = 0x7FFF; ///< Bitmask for frame number.
}; };
#endif /* M17_FRAME_H */ #endif /* M17_FRAME_H */

View File

@ -29,7 +29,7 @@
#include <array> #include <array>
#include "M17ConvolutionalEncoder.h" #include "M17ConvolutionalEncoder.h"
#include "M17LinkSetupFrame.h" #include "M17LinkSetupFrame.h"
#include "M17Frame.h" #include "M17StreamFrame.h"
#include "M17Modulator.h" #include "M17Modulator.h"
namespace M17 namespace M17
@ -83,7 +83,7 @@ private:
M17ConvolutionalEncoder encoder; ///< Convolutional encoder. M17ConvolutionalEncoder encoder; ///< Convolutional encoder.
M17LinkSetupFrame lsf; ///< Link Setup Frame handler. M17LinkSetupFrame lsf; ///< Link Setup Frame handler.
M17Frame dataFrame; ///< Data frame Handler. M17StreamFrame dataFrame; ///< Data frame Handler.
M17Modulator& modulator; ///< 4FSK modulator. M17Modulator& modulator; ///< 4FSK modulator.
std::array< lich_t, 6 > lichSegments; ///< Encoded LSF chunks for LICH generation. std::array< lich_t, 6 > lichSegments; ///< Encoded LSF chunks for LICH generation.
uint8_t currentLich; ///< Index of current LSF chunk. uint8_t currentLich; ///< Index of current LSF chunk.

View File

@ -102,7 +102,7 @@ inline void setSymbol(std::array< uint8_t, N >& array, const size_t pos,
setBit<N> (array, 2 * pos + 1, 1); setBit<N> (array, 2 * pos + 1, 1);
break; break;
default: default:
assert("Error: storing unknown M17 symbol!"); assert("Error: unknown M17 symbol!");
} }
} }

View File

@ -36,7 +36,7 @@ M17LinkSetupFrame::~M17LinkSetupFrame()
void M17LinkSetupFrame::clear() void M17LinkSetupFrame::clear()
{ {
memset(&data, 0x00, sizeof(lsf_t)); memset(&data, 0x00, sizeof(data));
data.dst.fill(0xFF); data.dst.fill(0xFF);
} }

View File

@ -102,7 +102,7 @@ void M17Transmitter::send(const payload_t& payload, const bool isLast)
// Encode frame // Encode frame
std::array<uint8_t, 37> encoded; std::array<uint8_t, 37> encoded;
encoder.reset(); encoder.reset();
encoder.encode(dataFrame.getData(), encoded.data(), sizeof(M17Frame)); encoder.encode(dataFrame.getData(), encoded.data(), sizeof(M17StreamFrame));
encoded[36] = encoder.flush(); encoded[36] = encoder.flush();
std::array<uint8_t, 34> punctured; std::array<uint8_t, 34> punctured;