/ firmware / src / console / terminal.h
terminal.h
 1  #pragma once
 2  
 3  #include <stddef.h>
 4  #include <stdint.h>
 5  
 6  namespace console {
 7  
 8  //------------------------------------------
 9  //  Key codes from ANSI escape parsing
10  //------------------------------------------
11  enum class KeyCode {
12    None,
13    Backspace,
14    Delete,
15    Enter,
16    Tab,
17    Escape,
18    ArrowUp,
19    ArrowDown,
20    ArrowLeft,
21    ArrowRight,
22    Home,
23    End,
24    CtrlA,       // home
25    CtrlB,       // left
26    CtrlC,       // interrupt
27    CtrlD,       // delete / EOF
28    CtrlE,       // end
29    CtrlF,       // right
30    CtrlK,       // kill to end of line
31    CtrlL,       // clear screen
32    CtrlN,       // history next
33    CtrlP,       // history previous
34    CtrlR,       // redraw line
35    CtrlT,       // swap chars
36    CtrlU,       // kill line
37    CtrlW,       // delete word
38    Char,
39  };
40  
41  //------------------------------------------
42  //  Events from key handling
43  //------------------------------------------
44  enum class TerminalEvent {
45    None,
46    BufferChanged,
47    CursorMoved,
48    CursorHome,
49    CursorEnd,
50    CommandReady,
51    EmptyCommand,
52    Interrupt,
53    EndOfFile,
54    HistoryPrevious,
55    HistoryNext,
56    ClearScreen,
57    DeleteWord,
58    KillToEnd,
59    ClearLine,
60    SwapChars,
61    Redraw,
62  };
63  
64  //------------------------------------------
65  //  Terminal — line buffer with ANSI parsing
66  //------------------------------------------
67  class Terminal {
68  public:
69    Terminal(char *buf, size_t cap);
70  
71    KeyCode process_byte(uint8_t byte);
72    TerminalEvent handle_key(KeyCode key, uint8_t ch = 0);
73  
74    const char *buffer_str() const;
75    size_t buffer_length() const;
76    size_t cursor_position() const;
77  
78    void set_buffer(const char *content);
79    void clear_buffer();
80    const char *take_command();
81  
82  private:
83    char *buf_;
84    size_t cap_;
85    size_t len_;
86    size_t cursor_;
87    uint8_t last_char_;
88  
89    enum EscapeState { Normal, Escape, Bracket } escape_state_;
90  };
91  
92  }