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