#pragma once #include #include #include #include namespace Kernel::Input { class PS2Keyboard final : public PS2Device { private: enum Command : uint8_t { SET_LEDS = 0xED, SCANCODE = 0xF0, ENABLE_SCANNING = 0xF4, DISABLE_SCANNING = 0xF5, }; enum class State { Normal, WaitingAck, }; public: static BAN::ErrorOr create(PS2Controller&); virtual void on_byte(uint8_t) override; virtual void update() override; virtual BAN::ErrorOr read(BAN::Span) override; private: PS2Keyboard(PS2Controller& controller) : m_controller(controller) {} BAN::ErrorOr initialize(); void append_command_queue(uint8_t); void append_command_queue(uint8_t, uint8_t); void buffer_has_key(); void update_leds(); private: PS2Controller& m_controller; uint8_t m_byte_buffer[10]; uint8_t m_byte_index { 0 }; uint8_t m_modifiers { 0 }; BAN::CircularQueue m_event_queue; BAN::CircularQueue m_command_queue; PS2Keymap m_keymap; State m_state { State::Normal }; }; }