#pragma once #include #include #include namespace Kernel::Input { class PS2Mouse final : public PS2Device { private: enum Command : uint8_t { SET_SAMPLE_RATE = 0xF3 }; public: static BAN::ErrorOr create(PS2Controller&); virtual void send_initialize() override; virtual void command_timedout(uint8_t* command_data, uint8_t command_size) final override {} virtual void handle_byte(uint8_t) final override; private: PS2Mouse(PS2Controller& controller); void initialize_extensions(uint8_t); private: uint8_t m_byte_buffer[10]; uint8_t m_byte_index { 0 }; bool m_enabled { false }; uint8_t m_mouse_id { 0x00 }; uint8_t m_button_mask { 0x00 }; BAN::CircularQueue m_event_queue; Semaphore m_semaphore; protected: virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual bool can_read_impl() const override { return !m_event_queue.empty(); } virtual bool can_write_impl() const override { return false; } virtual bool has_error_impl() const override { return false; } }; }