#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
// 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)
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
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
\r
virtual int _putc(int c);\r
virtual int _getc();\r
+ virtual int puts(const char *);\r
\r
uint8_t available();\r
\r
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;
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