Add a ring buffer to the serial repeater. Uncompiled on the STM32

platform.
c4fmdemod
Jonathan Naylor 2017-04-24 18:02:36 +01:00
parent 6161d298f7
commit 99ac6146d9
5 changed files with 96 additions and 53 deletions

View File

@ -27,7 +27,6 @@
#define DEBUG3(a,b,c) serial.writeDebug((a),(b),(c))
#define DEBUG4(a,b,c,d) serial.writeDebug((a),(b),(c),(d))
#define DEBUG5(a,b,c,d,e) serial.writeDebug((a),(b),(c),(d),(e))
#define ASSERT(a) serial.writeAssert((a),#a,__FILE__,__LINE__)
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
*
* 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
@ -54,6 +54,20 @@ int CSerialPort::availableInt(uint8_t n)
}
}
int CSerialPort::availableForWriteInt(uint8_t n)
{
switch (n) {
case 1U:
return Serial.availableForWrite();
case 2U:
return Serial2.availableForWrite();
case 3U:
return Serial3.availableForWrite();
default:
return false;
}
}
uint8_t CSerialPort::readInt(uint8_t n)
{
switch (n) {

View File

@ -93,7 +93,8 @@ CSerialPort::CSerialPort() :
m_buffer(),
m_ptr(0U),
m_len(0U),
m_debug(false)
m_debug(false),
m_repeat()
{
}
@ -643,8 +644,10 @@ void CSerialPort::process()
break;
#if defined(SERIAL_REPEATER)
case MMDVM_SERIAL:
writeInt(3U, m_buffer + 3U, m_len - 3U);
case MMDVM_SERIAL: {
for (uint8_t i = 3U; i < m_len; i++)
m_repeat.put(m_buffer[i]);
}
break;
#endif
@ -661,9 +664,22 @@ void CSerialPort::process()
}
#if defined(SERIAL_REPEATER)
// Drain any incoming serial data
while (availableInt(3U))
readInt(3U);
// Write any outgoing serial data
uint16_t space = m_repeat.getData();
if (space > 0U) {
int avail = availableForWriteInt(3U);
if (avail < space)
space = avail;
for (uint16_t i = 0U; i < space; i++) {
uint8_t c = m_repeat.get();
writeInt(3U, &c, 1U);
}
}
// Read any incoming serial data
while (availableInt(3U))
readInt(3U);
#endif
}
@ -1058,32 +1074,3 @@ void CSerialPort::writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n
writeInt(1U, reply, count, true);
}
void CSerialPort::writeAssert(bool cond, const char* text, const char* file, long line)
{
if (cond)
return;
uint8_t reply[200U];
reply[0U] = MMDVM_FRAME_START;
reply[1U] = 0U;
reply[2U] = MMDVM_DEBUG2;
uint8_t count = 3U;
for (uint8_t i = 0U; text[i] != '\0'; i++, count++)
reply[count] = text[i];
reply[count++] = ' ';
for (uint8_t i = 0U; file[i] != '\0'; i++, count++)
reply[count] = file[i];
reply[count++] = (line >> 8) & 0xFF;
reply[count++] = (line >> 0) & 0xFF;
reply[1U] = count;
writeInt(1U, reply, count, true);
}

View File

@ -21,6 +21,7 @@
#include "Config.h"
#include "Globals.h"
#include "SerialRB.h"
class CSerialPort {
@ -55,13 +56,12 @@ public:
void writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3);
void writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3, int16_t n4);
void writeAssert(bool cond, const char* text, const char* file, long line);
private:
uint8_t m_buffer[256U];
uint8_t m_ptr;
uint8_t m_len;
bool m_debug;
uint8_t m_buffer[256U];
uint8_t m_ptr;
uint8_t m_len;
bool m_debug;
CSerialRB m_repeat;
void sendACK();
void sendNAK(uint8_t err);
@ -74,9 +74,9 @@ private:
// Hardware versions
void beginInt(uint8_t n, int speed);
int availableInt(uint8_t n);
int availableForWriteInt(uint8_t n);
uint8_t readInt(uint8_t n);
void writeInt(uint8_t n, const uint8_t* data, uint16_t length, bool flush = false);
};
#endif

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2016 by Jim McLaughlin KI6ZUM
* Copyright (C) 2016, 2017 by Andy Uribe CA6JAU
* Copyright (c) 2017 by Jonathan Naylor G4KLX
*
* 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
@ -207,7 +208,7 @@ void InitUSART1(int speed)
RXSerialfifoinit1();
}
uint8_t AvailUSART1(void)
uint8_t AvailUSART1()
{
if (RXSerialfifolevel1() > 0U)
return 1U;
@ -215,7 +216,12 @@ uint8_t AvailUSART1(void)
return 0U;
}
uint8_t ReadUSART1(void)
int AvailForWriteUSART1()
{
return TXSerialfifolevel1();
}
uint8_t ReadUSART1()
{
uint8_t data_c = RXSerialfifo1[RXSerialfifotail1];
@ -395,7 +401,7 @@ void InitUSART2(int speed)
RXSerialfifoinit2();
}
uint8_t AvailUSART2(void)
uint8_t AvailUSART2()
{
if (RXSerialfifolevel2() > 0U)
return 1U;
@ -403,7 +409,12 @@ uint8_t AvailUSART2(void)
return 0U;
}
uint8_t ReadUSART2(void)
int AvailForWriteUSART2()
{
return TXSerialfifolevel2();
}
uint8_t ReadUSART2()
{
uint8_t data_c = RXSerialfifo2[RXSerialfifotail2];
@ -583,7 +594,7 @@ void InitUSART3(int speed)
RXSerialfifoinit3();
}
uint8_t AvailUSART3(void)
uint8_t AvailUSART3()
{
if (RXSerialfifolevel3() > 0U)
return 1U;
@ -591,7 +602,12 @@ uint8_t AvailUSART3(void)
return 0U;
}
uint8_t ReadUSART3(void)
int AvailForWriteUSART3()
{
return TXSerialfifolevel3();
}
uint8_t ReadUSART3()
{
uint8_t data_c = RXSerialfifo3[RXSerialfifotail3];
@ -775,7 +791,7 @@ void InitUART5(int speed)
RXSerialfifoinit5();
}
uint8_t AvailUART5(void)
uint8_t AvailUART5()
{
if (RXSerialfifolevel5() > 0U)
return 1U;
@ -783,7 +799,12 @@ uint8_t AvailUART5(void)
return 0U;
}
uint8_t ReadUART5(void)
int AvailForWriteUSART5()
{
return TXSerialfifolevel5();
}
uint8_t ReadUART5()
{
uint8_t data_c = RXSerialfifo5[RXSerialfifotail5];
@ -847,7 +868,29 @@ int CSerialPort::availableInt(uint8_t n)
return AvailUART5();
#endif
default:
return false;
return 0;
}
}
int CSerialPort::availableForWriteInt(uint8_t n)
{
switch (n) {
case 1U:
#if defined(STM32F4_DISCOVERY)
return AvailForWriteUSART3();
#elif defined(STM32F4_PI)
return AvailForWriteUSART1();
#elif defined(STM32F4_NUCLEO)
return AvailForWriteUSART2();
#endif
case 3U:
#if defined(STM32F4_NUCLEO) && defined(STM32F4_NUCLEO_ARDUINO_HEADER)
return AvailForWriteUSART1();
#else
return AvailForWriteUART5();
#endif
default:
return 0;
}
}