Files
renderbug-cpp/src/inputs/Serial.h
2023-12-11 07:57:27 +01:00

63 lines
1.4 KiB
C++

#pragma once
#include "../Figments/Figments.h"
class SerialInput: public InputSource {
public:
SerialInput();
InputEvent read() override;
class LogPrinter : public Print {
private:
SerialInput* serial;
Ringbuf<char, 512> 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<Command> &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<String, 5> m_history;
int m_historyOffset = 0;
InputEvent parseNormal(char nextChar);
InputEvent parseEscape(char nextChar);
InputEvent parseCSI(char nextChar);
};