mirror of
https://github.com/mafrmt00/Apple_II_Keyboard.git
synced 2024-12-22 12:29:46 +00:00
192 lines
4.2 KiB
C++
192 lines
4.2 KiB
C++
|
#include "Arduino.h"
|
||
|
|
||
|
#include "backlog.h"
|
||
|
|
||
|
/*! \brief Constructor, init everything to zero.
|
||
|
|
||
|
*/
|
||
|
Backlog::Backlog()
|
||
|
{
|
||
|
pCurrentInputString = NULL;
|
||
|
pputs = NULL;
|
||
|
BacklogOutputPointer = 0;
|
||
|
|
||
|
for (int i = 0; i < BACKLOG_STEPS; i++)
|
||
|
StringBacklog[i] = NULL;
|
||
|
}
|
||
|
|
||
|
/*! \brief Set the puts callback.
|
||
|
|
||
|
Set the puts callback function, in our case the output to the II keyb interface.
|
||
|
*/
|
||
|
void Backlog::SetPuts(int (*pputs_funcp)(const char *string))
|
||
|
{
|
||
|
pputs = pputs_funcp;
|
||
|
}
|
||
|
|
||
|
/*! \brief Erase the current input on the screen.
|
||
|
|
||
|
The current typed input is erased with backspaces.
|
||
|
*/
|
||
|
void Backlog::EraseCurrent(void)
|
||
|
{
|
||
|
uint16_t bufferlen = strlen(pCurrentInputString);
|
||
|
|
||
|
for (int i = 0; i < bufferlen; i++)
|
||
|
{
|
||
|
if (pputs)
|
||
|
{
|
||
|
pputs(0x08); //Backspace
|
||
|
delay(CHAR_OUT_DELAY);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*! \brief Output the current string vie puts.
|
||
|
|
||
|
The current active string ist typed to the screen via puts.
|
||
|
*/
|
||
|
void Backlog::OutputCurrent(void)
|
||
|
{
|
||
|
uint16_t bufferlen = strlen(pCurrentInputString);
|
||
|
|
||
|
for (int i = 0; i < bufferlen; i++)
|
||
|
{
|
||
|
if (pputs)
|
||
|
{
|
||
|
pputs(pCurrentInputString[i]);
|
||
|
delay(CHAR_OUT_DELAY);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*! \brief Go one string back in the backlog.
|
||
|
|
||
|
Erases the current input from the screen and goes one back ion the log.
|
||
|
*/
|
||
|
void Backlog::OneBack(void)
|
||
|
{
|
||
|
uint8_t uiNewIndex = BacklogOutputPointer;
|
||
|
|
||
|
ChangeToIndex(uiNewIndex);
|
||
|
|
||
|
uiNewIndex++;
|
||
|
|
||
|
if (uiNewIndex > BACKLOG_STEPS - 1)
|
||
|
uiNewIndex = BACKLOG_STEPS - 1;
|
||
|
|
||
|
BacklogOutputPointer = uiNewIndex;
|
||
|
}
|
||
|
|
||
|
/*! \brief Go one string forward in the backlog.
|
||
|
|
||
|
Erases the current input from the screen and goes one foreward ion the log.
|
||
|
*/
|
||
|
void Backlog::OneForeward(void)
|
||
|
{
|
||
|
uint8_t uiNewIndex = BacklogOutputPointer;
|
||
|
|
||
|
if (uiNewIndex)
|
||
|
uiNewIndex--;
|
||
|
|
||
|
ChangeToIndex(uiNewIndex);
|
||
|
|
||
|
BacklogOutputPointer = uiNewIndex;
|
||
|
}
|
||
|
|
||
|
/*! \brief Change the screen to a specific index from the backlog.
|
||
|
|
||
|
Changes the active display to a specific string from the backlog.
|
||
|
*/
|
||
|
void Backlog::ChangeToIndex(uint8_t uiNewIndex)
|
||
|
{
|
||
|
EraseCurrent();
|
||
|
delete pCurrentInputString;
|
||
|
if (StringBacklog[uiNewIndex])
|
||
|
{
|
||
|
pCurrentInputString = new char[BUFFER_STEPS + (BUFFER_STEPS * (strlen(StringBacklog[uiNewIndex]) / BUFFER_STEPS)) ];
|
||
|
strcpy(pCurrentInputString, StringBacklog[uiNewIndex]);
|
||
|
OutputCurrent();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*! \brief Stores the current string in the backlog.
|
||
|
|
||
|
The current string is stored in the backlog and the log is advanced one step.
|
||
|
*/
|
||
|
void Backlog::BacklogCurrString(void)
|
||
|
{
|
||
|
BacklogOutputPointer = 0;
|
||
|
|
||
|
if (StringBacklog[BACKLOG_STEPS - 1])
|
||
|
delete StringBacklog[BACKLOG_STEPS - 1];
|
||
|
|
||
|
for (int i = BACKLOG_STEPS - 1; i > 0; i--)
|
||
|
{
|
||
|
StringBacklog[i] = StringBacklog[i - 1];
|
||
|
}
|
||
|
|
||
|
StringBacklog[0] = pCurrentInputString;
|
||
|
pCurrentInputString = NULL;
|
||
|
#if 0
|
||
|
Serial.println("Current Backlog:");
|
||
|
for (int i = 0; i < BACKLOG_STEPS; i++)
|
||
|
{
|
||
|
if (StringBacklog[i])
|
||
|
Serial.println(StringBacklog[i]);
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/*! \brief If the current typed string exceeds BUFFER_STEPS the buffer is increased.
|
||
|
*
|
||
|
If the current string gets bigger than BUFFER_STEPS another BUFFER_STEPS is added.
|
||
|
*/
|
||
|
void Backlog::IncreaseBuffer(void)
|
||
|
{
|
||
|
if (NULL == pCurrentInputString)
|
||
|
{
|
||
|
pCurrentInputString = new char[BUFFER_STEPS];
|
||
|
memset(pCurrentInputString, 0, BUFFER_STEPS);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
uint16_t bufferlen = strlen(pCurrentInputString);
|
||
|
if (((bufferlen % BUFFER_STEPS) == (BUFFER_STEPS - 2)) && (bufferlen > 0))
|
||
|
{
|
||
|
char *pnewCurrentInputString = new char[bufferlen + BUFFER_STEPS];
|
||
|
memcpy(pnewCurrentInputString, pCurrentInputString, bufferlen + 1);
|
||
|
delete [] pCurrentInputString;
|
||
|
pCurrentInputString = pnewCurrentInputString;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*! \brief Add one typed char to the current input string.
|
||
|
*
|
||
|
On char is added, or if 0x0d is received, the string is stored and the backlog advanced.
|
||
|
*/
|
||
|
void Backlog::addchar(char c)
|
||
|
{
|
||
|
|
||
|
IncreaseBuffer();
|
||
|
|
||
|
if (0x0d == c) // Finished
|
||
|
{
|
||
|
BacklogCurrString();
|
||
|
}
|
||
|
else if (0x08 == c) // Backspace)
|
||
|
{
|
||
|
uint16_t bufferlen = strlen(pCurrentInputString);
|
||
|
if (bufferlen)
|
||
|
pCurrentInputString[bufferlen - 1] = 0x00;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
uint16_t bufferlen = strlen(pCurrentInputString);
|
||
|
|
||
|
pCurrentInputString[bufferlen] = c;
|
||
|
pCurrentInputString[bufferlen + 1] = 0x00;
|
||
|
}
|
||
|
}
|