From 540974f8f109aa8874f032eddf59819c76eb018e Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 8 Dec 2017 15:24:37 +0100 Subject: "Fix" esp8266 UART output by removing virtual functions --- include/esp8266/driver/stdout.h | 51 ++++++++-- src/arch/esp8266/driver/stdout.cc | 190 ++++++++++++++++++++++++++++++++++++++ src/os/main.cc | 1 + 3 files changed, 236 insertions(+), 6 deletions(-) diff --git a/include/esp8266/driver/stdout.h b/include/esp8266/driver/stdout.h index 9114501..e3d6baa 100644 --- a/include/esp8266/driver/stdout.h +++ b/include/esp8266/driver/stdout.h @@ -1,20 +1,59 @@ #ifndef STANDARDOUTPUT_H #define STANDANDOUTPUT_H -#include "object/outputstream.h" - -class StandardOutput : public OutputStream { +class StandardOutput { private: StandardOutput(const StandardOutput ©); + char digit_buffer[sizeof(long long) * 8]; + unsigned char base; public: - StandardOutput () {} + StandardOutput (); void setup(); - virtual void put(char c) override; - virtual void write(const char *s) override; + void put(char c); + void write(const char *s); + void flush() {} + + StandardOutput & operator<<(char c); + StandardOutput & operator<<(unsigned char c); + StandardOutput & operator<<(unsigned short number); + StandardOutput & operator<<(short number); + StandardOutput & operator<<(unsigned int number); + StandardOutput & operator<<(int number); + StandardOutput & operator<<(unsigned long number); + StandardOutput & operator<<(long number); + StandardOutput & operator<<(unsigned long long number); + StandardOutput & operator<<(long long number); + StandardOutput & operator<<(void *pointer); + StandardOutput & operator<<(const char *text); + StandardOutput & operator<<(StandardOutput & (*fun) (StandardOutput &)); + + void setBase(unsigned char b); }; + +// ENDL: new line character (and flush) +StandardOutput & endl(StandardOutput & os); + +// BIN: print numbers in binary form. +StandardOutput & bin(StandardOutput & os); + +// OCT: print numbers in octal form. +StandardOutput & oct(StandardOutput & os); + +// DEC: print numbers in decimal form. +StandardOutput & dec(StandardOutput & os); + +// HEX: print numbers in hexadecimal form. +StandardOutput & hex(StandardOutput & os); + +// FLUSH: flush StandardOutput buffer +StandardOutput & flush(StandardOutput & os); + +// TERM: zero-termination +StandardOutput & term(StandardOutput & os); + extern StandardOutput kout; #endif diff --git a/src/arch/esp8266/driver/stdout.cc b/src/arch/esp8266/driver/stdout.cc index b35275b..9638a81 100644 --- a/src/arch/esp8266/driver/stdout.cc +++ b/src/arch/esp8266/driver/stdout.cc @@ -7,6 +7,196 @@ void uart_div_modify(uint8_t uart_no, uint32 DivLatchValue); void os_printf_plus(const char *s, ...); } +StandardOutput & StandardOutput::operator<<(unsigned char c) +{ + put(c); + return *this; +} + +StandardOutput & StandardOutput::operator<<(char c) +{ + put(c); + return *this; +} + +StandardOutput & StandardOutput::operator<<(unsigned short number) +{ + *this << (unsigned long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(short number) +{ + *this << (long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(unsigned int number) +{ + *this << (unsigned long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(int number) +{ + *this << (long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(unsigned long number) +{ + *this << (unsigned long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(long number) +{ + *this << (long long)number; + return *this; +} + +StandardOutput & StandardOutput::operator<<(unsigned long long number) +{ + switch (base) { + case 2: + put('0'); + put('b'); + break; + case 8: + put('0'); + break; + case 16: + put('0'); + put('x'); + break; + } + + if (number == 0) { + put('0'); + return *this; + } + + signed int i = 0; + while (number > 0) { + if (base == 16 && number % base > 9) { + digit_buffer[i] = 'a' + (number % base) - 10; + } else { + digit_buffer[i] = '0' + (number % base); + } + number /= base; + i++; + } + i--; + for (; i >= 0; i--) { + put(digit_buffer[i]); + } + return *this; + +} + +StandardOutput & StandardOutput::operator<<(long long number) +{ + if (number < 0) { + put('-'); + number *= -1; + } + *this << (unsigned long long)number; + + return *this; +} + +StandardOutput & StandardOutput::operator<<(void *pointer) +{ + unsigned short temp_base = base; + *this << hex << (long)pointer; + switch (temp_base) { + case 2: + *this << bin; break; + case 8: + *this << oct; break; + case 10: + *this << dec; break; + } + return *this; +} + +StandardOutput & StandardOutput::operator<<(const char *text) +{ + int i = 0; + while (text[i] != '\0') { + put(text[i++]); + } + return *this; +} + +StandardOutput & StandardOutput::operator<<(StandardOutput & (*fkt) (StandardOutput &)) +{ + return fkt(*this); +} + +void StandardOutput::setBase(uint8_t b) +{ + if (b == 2 || b == 8 || b == 10 || b == 16) { + base = b; + } +} + +// FLUSH +StandardOutput & flush(StandardOutput & os) +{ + os.flush(); + return os; +} + +// ENDL: fuegt einen Zeilenumbruch in die Ausgabe ein. +StandardOutput & endl(StandardOutput & os) +{ + os.put('\n'); + os.flush(); + return os; +} + +// BIN: print numbers in binary form +StandardOutput & bin(StandardOutput & os) +{ + os.setBase(2); + return os; +} + +// OCT: print numbers in octal form. +StandardOutput & oct(StandardOutput & os) +{ + os.setBase(8); + return os; +} + +// DEC: print numbers in decimal form. +StandardOutput & dec(StandardOutput & os) +{ + os.setBase(10); + return os; +} + +// HEX: print numbers in hexadecimal form. +StandardOutput & hex(StandardOutput & os) +{ + os.setBase(16); + return os; +} + +// TERM: null-termination +StandardOutput & term(StandardOutput & os) +{ + os.put('\0'); + os.flush(); + return os; +} + +StandardOutput::StandardOutput() +{ + base = 10; +} + void StandardOutput::setup() { uart_div_modify(0, UART_CLK_FREQ / 115200); diff --git a/src/os/main.cc b/src/os/main.cc index 3e48053..4509301 100644 --- a/src/os/main.cc +++ b/src/os/main.cc @@ -98,6 +98,7 @@ int main(void) gpio.led_on(0); kout << "Hello, World!" << endl; + kout << "Test, World!" << endl; arch.idle_loop(); -- cgit v1.2.3