From 4f9abc42e04e17658a3ab6079c831ab2f4d0f480 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 22 May 2013 19:17:58 +0200 Subject: Updated Console class. New ConsoleAsciiTable example. --- libraries/Bridge/Console.cpp | 71 ++++++++--------- libraries/Bridge/Console.h | 9 ++- .../ConsoleAsciiTable/ConsoleAsciiTable.ino | 91 ++++++++++++++++++++++ 3 files changed, 132 insertions(+), 39 deletions(-) create mode 100644 libraries/Bridge/examples/ConsoleAsciiTable/ConsoleAsciiTable.ino diff --git a/libraries/Bridge/Console.cpp b/libraries/Bridge/Console.cpp index 76c6481..8607421 100644 --- a/libraries/Bridge/Console.cpp +++ b/libraries/Bridge/Console.cpp @@ -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; } } diff --git a/libraries/Bridge/Console.h b/libraries/Bridge/Console.h index 72a3967..73a9739 100644 --- a/libraries/Bridge/Console.h +++ b/libraries/Bridge/Console.h @@ -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; diff --git a/libraries/Bridge/examples/ConsoleAsciiTable/ConsoleAsciiTable.ino b/libraries/Bridge/examples/ConsoleAsciiTable/ConsoleAsciiTable.ino new file mode 100644 index 0000000..d547df7 --- /dev/null +++ b/libraries/Bridge/examples/ConsoleAsciiTable/ConsoleAsciiTable.ino @@ -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. + + + + */ + +#include + +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++; +} -- cgit v1.2.3-18-g5258