Updated Console class. New ConsoleAsciiTable example.

This commit is contained in:
Cristian Maglie 2013-05-22 19:17:58 +02:00
parent b822bd357c
commit 4f9abc42e0
3 changed files with 132 additions and 39 deletions

View File

@ -20,14 +20,15 @@
// Default constructor uses global Bridge instance
ConsoleClass::ConsoleClass() :
bridge(Bridge), buffered(0), readPos(0), buffer(NULL)
bridge(Bridge), inBuffered(0), inReadPos(0), inBuffer(NULL),
autoFlush(true)
{
// Empty
}
// Constructor with a user provided BridgeClass instance
ConsoleClass::ConsoleClass(BridgeClass &_b) :
bridge(_b), buffered(0), readPos(0), buffer(NULL),
bridge(_b), inBuffered(0), inReadPos(0), inBuffer(NULL),
autoFlush(true)
{
// Empty
@ -49,18 +50,18 @@ size_t ConsoleClass::write(uint8_t c) {
}
}
size_t ConsoleClass::write(const uint8_t *buffer, size_t size) {
size_t ConsoleClass::write(const uint8_t *buff, size_t size) {
if (autoFlush) {
// TODO: do it in a more efficient way
uint8_t *tmp = new uint8_t[size+1];
tmp[0] = 'P';
memcpy(tmp+1, buffer, size);
memcpy(tmp+1, buff, size);
bridge.transfer(tmp, size+1);
delete[] tmp;
return size;
} else {
while (size > 0) {
outBuffer[outBuffered++] = *buffer++;
outBuffer[outBuffered++] = *buff++;
size--;
if (outBuffered == outBufferSize)
flush();
@ -76,20 +77,22 @@ void ConsoleClass::flush() {
outBuffered = 1;
}
void ConsoleClass::setBuffer(uint8_t size) {
if (size==0) {
if (!autoFlush) {
delete[] outBuffer;
autoFlush = true;
}
} else {
if (autoFlush)
setBuffer(0);
outBuffer = new uint8_t[size+1];
outBuffer[0] = 'P'; // WRITE tag
outBufferSize = size+1;
outBuffered = 1;
}
void ConsoleClass::noBuffer() {
if (autoFlush)
return;
delete[] outBuffer;
autoFlush = true;
}
void ConsoleClass::buffer(uint8_t size) {
noBuffer();
if (size==0)
return;
outBuffer = new uint8_t[size+1];
outBuffer[0] = 'P'; // WRITE tag
outBufferSize = size+1;
outBuffered = 1;
autoFlush = false;
}
bool ConsoleClass::connected() {
@ -101,51 +104,49 @@ bool ConsoleClass::connected() {
int ConsoleClass::available() {
// Look if there is new data available
doBuffer();
return buffered;
return inBuffered;
}
int ConsoleClass::read() {
doBuffer();
if (buffered == 0)
if (inBuffered == 0)
return -1; // no chars available
else {
buffered--;
return buffer[readPos++];
inBuffered--;
return inBuffer[inReadPos++];
}
}
int ConsoleClass::peek() {
doBuffer();
if (buffered == 0)
if (inBuffered == 0)
return -1; // no chars available
else
return buffer[readPos];
return inBuffer[inReadPos];
}
void ConsoleClass::doBuffer() {
// If there are already char in buffer exit
if (buffered > 0)
if (inBuffered > 0)
return;
// Try to buffer up to 32 characters
readPos = 0;
inReadPos = 0;
uint8_t tmp[] = { 'p', BUFFER_SIZE };
buffered = bridge.transfer(tmp, 2, buffer, BUFFER_SIZE);
inBuffered = bridge.transfer(tmp, 2, inBuffer, BUFFER_SIZE);
}
void ConsoleClass::begin() {
bridge.begin();
end();
buffer = new uint8_t[BUFFER_SIZE];
inBuffer = new uint8_t[BUFFER_SIZE];
}
void ConsoleClass::end() {
if (autoFlush) {
setBuffer(0);
}
if (buffer) {
delete[] buffer;
buffer = NULL;
noBuffer();
if (inBuffer) {
delete[] inBuffer;
inBuffer = NULL;
}
}

View File

@ -32,7 +32,8 @@ public:
void begin();
void end();
void setBuffer(uint8_t size);
void buffer(uint8_t size);
void noBuffer();
bool connected();
@ -52,10 +53,10 @@ private:
BridgeClass &bridge;
void doBuffer();
uint8_t buffered;
uint8_t readPos;
uint8_t inBuffered;
uint8_t inReadPos;
static const int BUFFER_SIZE = 32;
uint8_t *buffer;
uint8_t *inBuffer;
bool autoFlush;
uint8_t outBuffered;

View File

@ -0,0 +1,91 @@
/*
ASCII table
Prints out byte values in all possible formats:
* as raw binary values
* as ASCII-encoded decimal, hex, octal, and binary values
For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII
The circuit: No external hardware needed.
created 2006
by Nicholas Zambetti
modified 9 Apr 2012
by Tom Igoe
modified 22 May 2013
by Cristian Maglie
This example code is in the public domain.
<http://www.zambetti.com>
*/
#include <Console.h>
void setup() {
//Initialize Console and wait for port to open:
Bridge.begin();
Console.begin();
// Uncomment the followinf line to enable buffering:
// - better transmission speed and efficiency
// - needs to call Console.flush() to ensure that all
// transmitted data is sent
//Console.buffer(64);
while (!Console) {
; // wait for Console port to connect.
}
// prints title with ending line break
Console.println("ASCII Table ~ Character Map");
}
// first visible ASCIIcharacter '!' is number 33:
int thisByte = 33;
// you can also write ASCII characters in single quotes.
// for example. '!' is the same as 33, so you could also use this:
//int thisByte = '!';
void loop() {
// prints value unaltered, i.e. the raw binary version of the
// byte. The Console monitor interprets all bytes as
// ASCII, so 33, the first number, will show up as '!'
Console.write(thisByte);
Console.print(", dec: ");
// prints value as string as an ASCII-encoded decimal (base 10).
// Decimal is the default format for Console.print() and Console.println(),
// so no modifier is needed:
Console.print(thisByte);
// But you can declare the modifier for decimal if you want to.
//this also works if you uncomment it:
// Console.print(thisByte, DEC);
Console.print(", hex: ");
// prints value as string in hexadecimal (base 16):
Console.print(thisByte, HEX);
Console.print(", oct: ");
// prints value as string in octal (base 8);
Console.print(thisByte, OCT);
Console.print(", bin: ");
// prints value as string in binary (base 2)
// also prints ending line break:
Console.println(thisByte, BIN);
// if printed last visible character '~' or 126, stop:
if(thisByte == 126) { // you could also use if (thisByte == '~') {
// This loop loops forever and does nothing
while(true) {
continue;
}
}
// go on to the next character
thisByte++;
}