#pragma once #include "../Figments/Figments.h" class SerialInput: public InputSource { public: SerialInput(); InputEvent read() override; class LogPrinter : public Print { private: SerialInput* serial; Ringbuf buf; public: LogPrinter(SerialInput* serial) : serial(serial) {}; size_t write(uint8_t byte) { if (byte == '\n') { char c; Serial.print('\r'); while (buf.take(c)) { Serial.write(c); } Serial.println(); serial->redrawPrompt(); } else { buf.insert(byte); } return sizeof(byte); } }; void redrawPrompt(); Print* logPrinter() { return &m_logPrinter; } //static SerialInput::Command *s_root; LogPrinter* printer() { return &m_logPrinter; } const std::vector &commands() const override; private: enum ParseState { Normal, EscapeSequence, CSI }; String m_buf; ParseState m_state; char m_escapeSeq[3]; void doCommand(); LogPrinter m_logPrinter; bool m_canRedraw = true; Ringbuf m_history; int m_historyOffset = 0; InputEvent parseNormal(char nextChar); InputEvent parseEscape(char nextChar); InputEvent parseCSI(char nextChar); };