inputs: serial: implement a CLI
This commit is contained in:
@@ -3,14 +3,60 @@
|
||||
|
||||
class SerialInput: public InputSource {
|
||||
public:
|
||||
void onStart() override {
|
||||
//Serial.begin();
|
||||
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;
|
||||
}
|
||||
|
||||
InputEvent read();
|
||||
//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);
|
||||
};
|
||||
|
Reference in New Issue
Block a user