Optimizing DMR RX buffer memory

AX5043
Andy CA6JAU 8 years ago
parent 5f7b628417
commit 6499fd1596

@ -33,6 +33,11 @@ const uint8_t CONTROL_NONE = 0x00U;
const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_VOICE = 0x20U;
const uint8_t CONTROL_DATA = 0x40U; const uint8_t CONTROL_DATA = 0x40U;
const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
#define READ_BIT1(p,i) ((p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) >> (7 - ((i)&7)))
CDMRDMORX::CDMRDMORX() : CDMRDMORX::CDMRDMORX() :
m_patternBuffer(0x00U), m_patternBuffer(0x00U),
m_dataPtr(0U), m_dataPtr(0U),
@ -60,7 +65,7 @@ void CDMRDMORX::reset()
void CDMRDMORX::databit(bool bit) void CDMRDMORX::databit(bool bit)
{ {
m_buffer[m_dataPtr] = bit; WRITE_BIT1(m_buffer, m_dataPtr, bit);
m_patternBuffer <<= 1; m_patternBuffer <<= 1;
if (bit) if (bit)
@ -236,28 +241,36 @@ void CDMRDMORX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer)
for (uint8_t i = 0U; i < count; i++) { for (uint8_t i = 0U; i < count; i++) {
buffer[i] = 0U; buffer[i] = 0U;
buffer[i] |= ((m_buffer[start++] & 0x01) << 7); buffer[i] |= READ_BIT1(m_buffer, start) << 7;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 6); buffer[i] |= READ_BIT1(m_buffer, start) << 6;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 5); buffer[i] |= READ_BIT1(m_buffer, start) << 5;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 4); buffer[i] |= READ_BIT1(m_buffer, start) << 4;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 3); buffer[i] |= READ_BIT1(m_buffer, start) << 3;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 2); buffer[i] |= READ_BIT1(m_buffer, start) << 2;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 1); buffer[i] |= READ_BIT1(m_buffer, start) << 1;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 0); buffer[i] |= READ_BIT1(m_buffer, start) << 0;
start++;
if (start >= DMO_BUFFER_LENGTH_BITS) if (start >= DMO_BUFFER_LENGTH_BITS)
start -= DMO_BUFFER_LENGTH_BITS; start -= DMO_BUFFER_LENGTH_BITS;
} }

@ -41,7 +41,7 @@ public:
private: private:
uint64_t m_patternBuffer; uint64_t m_patternBuffer;
uint8_t m_buffer[DMO_BUFFER_LENGTH_BITS]; uint8_t m_buffer[DMO_BUFFER_LENGTH_BITS / 8U]; // 72 bytes
uint8_t frame[DMR_FRAME_LENGTH_BYTES + 3U]; uint8_t frame[DMR_FRAME_LENGTH_BYTES + 3U];
uint16_t m_dataPtr; uint16_t m_dataPtr;
uint16_t m_syncPtr; uint16_t m_syncPtr;

@ -36,6 +36,11 @@ const uint8_t CONTROL_NONE = 0x00U;
const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_VOICE = 0x20U;
const uint8_t CONTROL_DATA = 0x40U; const uint8_t CONTROL_DATA = 0x40U;
const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
#define READ_BIT1(p,i) ((p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) >> (7 - ((i)&7)))
CDMRSlotRX::CDMRSlotRX() : CDMRSlotRX::CDMRSlotRX() :
m_slot(false), m_slot(false),
m_patternBuffer(0x00U), m_patternBuffer(0x00U),
@ -104,7 +109,7 @@ bool CDMRSlotRX::databit(bool bit)
if (m_delayPtr < m_delay) if (m_delayPtr < m_delay)
return (m_state1 != DMRRXS_NONE) || (m_state2 != DMRRXS_NONE); return (m_state1 != DMRRXS_NONE) || (m_state2 != DMRRXS_NONE);
m_buffer[m_dataPtr] = bit; WRITE_BIT1(m_buffer, m_dataPtr, bit);
m_patternBuffer <<= 1; m_patternBuffer <<= 1;
if (bit) if (bit)
@ -421,28 +426,36 @@ void CDMRSlotRX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer)
{ {
for (uint8_t i = 0U; i < count; i++) { for (uint8_t i = 0U; i < count; i++) {
buffer[i] = 0U; buffer[i] = 0U;
buffer[i] |= ((m_buffer[start++] & 0x01) << 7); buffer[i] |= READ_BIT1(m_buffer, start) << 7;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 6); buffer[i] |= READ_BIT1(m_buffer, start) << 6;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 5); buffer[i] |= READ_BIT1(m_buffer, start) << 5;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 4); buffer[i] |= READ_BIT1(m_buffer, start) << 4;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 3); buffer[i] |= READ_BIT1(m_buffer, start) << 3;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 2); buffer[i] |= READ_BIT1(m_buffer, start) << 2;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 1); buffer[i] |= READ_BIT1(m_buffer, start) << 1;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
buffer[i] |= ((m_buffer[start++] & 0x01) << 0); buffer[i] |= READ_BIT1(m_buffer, start) << 0;
start++;
if (start >= DMR_BUFFER_LENGTH_BITS) if (start >= DMR_BUFFER_LENGTH_BITS)
start -= DMR_BUFFER_LENGTH_BITS; start -= DMR_BUFFER_LENGTH_BITS;
} }

@ -50,7 +50,7 @@ public:
private: private:
bool m_slot; bool m_slot;
uint64_t m_patternBuffer; uint64_t m_patternBuffer;
uint8_t m_buffer[DMR_BUFFER_LENGTH_BITS]; uint8_t m_buffer[DMR_BUFFER_LENGTH_BITS / 8U]; // 72 bytes
uint16_t m_dataPtr; uint16_t m_dataPtr;
uint8_t frame1[DMR_FRAME_LENGTH_BYTES + 3U]; uint8_t frame1[DMR_FRAME_LENGTH_BYTES + 3U];

Loading…
Cancel
Save

Powered by TurnKey Linux.