Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MjLineSerial.cpp
- Committer:
- matsujirushi
- Date:
- 2014-11-19
- Revision:
- 2:84178b3b2824
- Parent:
- 1:833745ae8a7e
- Child:
- 3:e730a11160d7
File content as of revision 2:84178b3b2824:
#include "MjLineSerial.h"
#include <cstdarg>
#define STRING_STACK_LIMIT 120
namespace matsujirushi {
MjLineSerial::MjLineSerial(RawSerial *serial)
{
baseSerial = serial;
readLineFunc = NULL;
}
int MjLineSerial::putc(int c)
{
return baseSerial->putc(c);
}
int MjLineSerial::puts(const char *str)
{
for (; *str != '\0'; str++)
{
putc(*str);
}
return 0;
}
int MjLineSerial::printf(const char *format, ...)
{
std::va_list arg;
va_start(arg, format);
int len = vsnprintf(NULL, 0, format, arg);
if (len < STRING_STACK_LIMIT) {
char temp[STRING_STACK_LIMIT];
vsprintf(temp, format, arg);
puts(temp);
} else {
char *temp = new char[len + 1];
vsprintf(temp, format, arg);
puts(temp);
delete[] temp;
}
va_end(arg);
return len;
}
void MjLineSerial::attachReadLine(void (*func)(const char *str))
{
readLineFunc = func;
}
void MjLineSerial::task()
{
if (baseSerial->readable())
{
char c = baseSerial->getc();
switch (c)
{
case '\r':
if (readLineFunc != NULL)
{
rxBuffer.push_back('\0');
readLineFunc(rxBuffer.begin());
}
rxBuffer.clear();
break;
case '\b':
if (rxBuffer.size() <= 0)
{
putc('\a');
}
else
{
rxBuffer.pop_back();
puts("\b \b");
}
break;
default:
rxBuffer.push_back(c);
putc(c);
break;
}
}
}
} // namespace matsujirushi