StreamOutput: inherit Stream, StreamOutputPool: use puts instead of printf to improve...
authorMichael Moon <triffid.hunter@gmail.com>
Wed, 19 Dec 2012 23:57:40 +0000 (10:57 +1100)
committerMichael Moon <triffid.hunter@gmail.com>
Wed, 2 Jan 2013 00:45:28 +0000 (11:45 +1100)
src/libs/StreamOutput.h
src/libs/StreamOutputPool.h
src/libs/USBDevice/USBSerial/USBSerial.cpp
src/libs/USBDevice/USBSerial/USBSerial.h
src/modules/communication/SerialConsole.cpp
src/modules/communication/SerialConsole.h

index ec115eb..4fa100f 100644 (file)
@@ -8,10 +8,38 @@
 #ifndef STREAMOUTPUT_H
 #define STREAMOUTPUT_H
 
-class StreamOutput {
+#include <Stream.h>
+#include <cstdarg>
+
+class StreamOutput : public mbed::Stream {
     public:
-       StreamOutput(){}
-       virtual int printf(const char* format, ...) { return 0; }
+        StreamOutput(){}
+//         virtual int puts(const char *str) = 0;
+        virtual int printf(const char* format, ...) {
+            char *buffer; // = printf_default_buffer;
+            // Make the message
+            va_list args;
+            va_start(args, format);
+
+            int size = vsnprintf(NULL, 0, format, args)
+                + 1; // we add one to take into account space for the terminating \0
+
+//             if (size > PRINTF_DEFAULT_BUFFER_SIZE) {
+                buffer = new char[size];
+                vsnprintf(buffer, size, format, args);
+//             }
+
+            va_end(args);
+
+            puts(buffer);
+
+//             if (buffer != printf_default_buffer)
+                delete buffer;
+
+            return size - 1;
+        }
+        virtual int _putc(int c) { return 0; }
+        virtual int _getc(void) { return 0; }
 };
 
 #endif
index d905943..d1c05f4 100644 (file)
@@ -44,7 +44,7 @@ public:
         // Dispatch to all
         for(set<StreamOutput*>::iterator i = this->streams.begin(); i != this->streams.end(); i++)
         {
-            (*i)->printf(buffer);
+            (*i)->puts(buffer);
         }
 
         if (buffer != printf_default_buffer)
index eef4d62..b37caf1 100644 (file)
@@ -64,6 +64,18 @@ int USBSerial::_getc()
     return c;\r
 }\r
 \r
+int USBSerial::puts(const char *str)\r
+{\r
+    int i = 0;\r
+    while (*str)\r
+    {\r
+        _putc(*str);\r
+        i++;\r
+        str++;\r
+    }\r
+    return i;\r
+}\r
+\r
 uint16_t USBSerial::writeBlock(uint8_t * buf, uint16_t size)\r
 {\r
     if (size > txbuf.free())\r
@@ -236,6 +248,7 @@ void USBSerial::on_main_loop(void *argument)
                 struct SerialMessage message;\r
                 message.message = received;\r
                 message.stream = this;\r
+                iprintf("USBSerial Received: %s\n", message.message.c_str());\r
                 this->kernel->call_event(ON_CONSOLE_LINE_RECEIVED, &message );\r
                 return;\r
             }\r
index 33d8483..34a47c9 100644 (file)
@@ -37,6 +37,7 @@ public:
 \r
     virtual int _putc(int c);\r
     virtual int _getc();\r
+    virtual int puts(const char *);\r
 \r
     uint8_t available();\r
 \r
index a92afcb..b5297c7 100644 (file)
@@ -76,6 +76,15 @@ int SerialConsole::printf(const char* format, ...){
     return result;
 }
 
+int SerialConsole::_putc(int c)
+{
+    return this->serial->putc(c);
+}
+
+int SerialConsole::_getc()
+{
+    return this->serial->getc();
+}
 
 bool SerialConsole::has_char(char letter){
     int index = this->buffer.head;
index 5b29996..5f27ba4 100644 (file)
@@ -23,13 +23,17 @@ using std::string;
 class SerialConsole : public Module, public StreamOutput {
     public:
         SerialConsole( PinName rx_pin, PinName tx_pin, int baud_rate );
-        
+
         virtual void on_module_loaded();
         void on_serial_char_received();
         virtual void on_main_loop(void * argument);
         bool has_char(char letter);
+
         int printf(const char* format, ...);
-        
+
+        virtual int _putc(int c);
+        virtual int _getc(void);
+
         //string receive_buffer;                 // Received chars are stored here until a newline character is received
         //vector<std::string> received_lines;    // Received lines are stored here until they are requested
         RingBuffer<char,256> buffer;             // Receive buffer