1 // Copyright 2009 Dolphin Emulator Project 2 // Licensed under GPLv2+ 3 // Refer to the license.txt file included. 4 5 #pragma once 6 7 #include <array> 8 #include <queue> 9 #include <string> 10 #include <type_traits> 11 12 #include "Common/CommonTypes.h" 13 #include "Core/IOS/Device.h" 14 #include "Core/IOS/IOS.h" 15 16 namespace IOS::HLE::Device 17 { 18 class USB_KBD : public Device 19 { 20 public: 21 USB_KBD(Kernel& ios, const std::string& device_name); 22 23 IPCCommandResult Open(const OpenRequest& request) override; 24 IPCCommandResult Write(const ReadWriteRequest& request) override; 25 IPCCommandResult IOCtl(const IOCtlRequest& request) override; 26 void Update() override; 27 28 private: 29 enum class MessageType : u32 30 { 31 KeyboardConnect = 0, 32 KeyboardDisconnect = 1, 33 Event = 2 34 }; 35 36 using PressedKeyData = std::array<u8, 6>; 37 38 #pragma pack(push, 1) 39 struct MessageData 40 { 41 MessageType msg_type{}; 42 u32 unk1 = 0; 43 u8 modifiers = 0; 44 u8 unk2 = 0; 45 PressedKeyData pressed_keys{}; 46 47 MessageData(MessageType msg_type, u8 modifiers, PressedKeyData pressed_keys); 48 }; 49 static_assert(std::is_trivially_copyable_v<MessageData>, 50 "MessageData must be trivially copyable, as it's copied into emulated memory."); 51 #pragma pack(pop) 52 std::queue<MessageData> m_message_queue; 53 54 std::array<bool, 256> m_old_key_buffer{}; 55 u8 m_old_modifiers = 0; 56 57 bool IsKeyPressed(int key) const; 58 59 // This stuff should probably die 60 enum 61 { 62 KBD_LAYOUT_QWERTY = 0, 63 KBD_LAYOUT_AZERTY = 1 64 }; 65 int m_keyboard_layout = KBD_LAYOUT_QWERTY; 66 }; 67 } // namespace IOS::HLE::Device 68