60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
#include "SEGGER_RTT.h"
|
|
|
|
#include <string.h>
|
|
|
|
SEGGER_RTT_CB _SEGGER_RTT;
|
|
static char _acUpBuffer[BUFFER_SIZE_UP];
|
|
|
|
void SEGGER_RTT_Init(void)
|
|
{
|
|
memset(&_SEGGER_RTT, 0, sizeof(_SEGGER_RTT));
|
|
memcpy(_SEGGER_RTT.acID, "SEGGER RTT", 10);
|
|
_SEGGER_RTT.MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS;
|
|
_SEGGER_RTT.MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS;
|
|
_SEGGER_RTT.aUp[0].sName = "Terminal";
|
|
_SEGGER_RTT.aUp[0].pBuffer = _acUpBuffer;
|
|
_SEGGER_RTT.aUp[0].SizeOfBuffer = BUFFER_SIZE_UP;
|
|
_SEGGER_RTT.aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT;
|
|
}
|
|
|
|
static void _EnsureInit(void)
|
|
{
|
|
if (_SEGGER_RTT.acID[0] != 'S') {
|
|
SEGGER_RTT_Init();
|
|
}
|
|
}
|
|
|
|
unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes)
|
|
{
|
|
SEGGER_RTT_BUFFER_UP *ring;
|
|
const char *data = (const char *)pBuffer;
|
|
unsigned i;
|
|
|
|
_EnsureInit();
|
|
if (BufferIndex >= (unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
|
|
return 0u;
|
|
}
|
|
|
|
ring = &_SEGGER_RTT.aUp[BufferIndex];
|
|
for (i = 0; i < NumBytes; ++i) {
|
|
unsigned next = (ring->WrOff + 1u) % ring->SizeOfBuffer;
|
|
if (next == ring->RdOff) {
|
|
break;
|
|
}
|
|
ring->pBuffer[ring->WrOff] = data[i];
|
|
ring->WrOff = next;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char *s)
|
|
{
|
|
return SEGGER_RTT_Write(BufferIndex, s, (unsigned)strlen(s));
|
|
}
|
|
|
|
unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c)
|
|
{
|
|
return SEGGER_RTT_Write(BufferIndex, &c, 1u);
|
|
}
|