From 4f9abc42e04e17658a3ab6079c831ab2f4d0f480 Mon Sep 17 00:00:00 2001
From: Cristian Maglie <c.maglie@bug.st>
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

(limited to 'libraries/Bridge')

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.
+
+ <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++;  
+} 
-- 
cgit v1.2.3-18-g5258