tty.hpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma once
  2. #include <stdint.h>
  3. #include <sys/types.h>
  4. #include <termios.h>
  5. #include <kernel/event/evtqueue.hpp>
  6. #include <types/allocator.hpp>
  7. #include <types/buffer.hpp>
  8. #include <types/cplusplus.hpp>
  9. class tty : public types::non_copyable {
  10. public:
  11. static constexpr size_t BUFFER_SIZE = 4096;
  12. static constexpr size_t NAME_SIZE = 32;
  13. private:
  14. void _real_commit_char(int c);
  15. void _echo_char(int c);
  16. int _do_erase(bool should_echo);
  17. public:
  18. tty();
  19. virtual void putchar(char c) = 0;
  20. void print(const char* str);
  21. size_t read(char* buf, size_t buf_size, size_t n);
  22. // characters committed to buffer will be handled
  23. // by the input line discipline (N_TTY)
  24. void commit_char(int c);
  25. // print character to the output
  26. // characters will be handled by the output line discipline
  27. void show_char(int c);
  28. void clear_read_buf(void);
  29. constexpr void set_pgrp(pid_t pgid)
  30. {
  31. fg_pgroup = pgid;
  32. }
  33. constexpr pid_t get_pgrp(void) const
  34. {
  35. return fg_pgroup;
  36. }
  37. char name[NAME_SIZE];
  38. termios termio;
  39. protected:
  40. types::buffer buf;
  41. kernel::cond_var m_cv;
  42. pid_t fg_pgroup;
  43. };
  44. class vga_tty : public virtual tty {
  45. public:
  46. vga_tty();
  47. virtual void putchar(char c) override;
  48. };
  49. class serial_tty : public virtual tty {
  50. public:
  51. serial_tty(int id);
  52. virtual void putchar(char c) override;
  53. public:
  54. uint16_t id;
  55. };
  56. inline tty* console;