xref: /openbmc/obmc-ikvm/ikvm_input.hpp (revision 21b177e0)
1*21b177e0SEddie James #pragma once
2*21b177e0SEddie James 
3*21b177e0SEddie James #include <rfb/rfb.h>
4*21b177e0SEddie James 
5*21b177e0SEddie James #include <map>
6*21b177e0SEddie James #include <string>
7*21b177e0SEddie James 
8*21b177e0SEddie James namespace ikvm
9*21b177e0SEddie James {
10*21b177e0SEddie James 
11*21b177e0SEddie James /*
12*21b177e0SEddie James  * @class Input
13*21b177e0SEddie James  * @brief Receives events from RFB clients and sends reports to the USB input
14*21b177e0SEddie James  *        device
15*21b177e0SEddie James  */
16*21b177e0SEddie James class Input
17*21b177e0SEddie James {
18*21b177e0SEddie James   public:
19*21b177e0SEddie James     /*
20*21b177e0SEddie James      * @brief Constructs Input object
21*21b177e0SEddie James      *
22*21b177e0SEddie James      * @param[in] p - Path to the USB input device
23*21b177e0SEddie James      */
24*21b177e0SEddie James     Input(const std::string& p);
25*21b177e0SEddie James     ~Input();
26*21b177e0SEddie James     Input(const Input&) = default;
27*21b177e0SEddie James     Input& operator=(const Input&) = default;
28*21b177e0SEddie James     Input(Input&&) = default;
29*21b177e0SEddie James     Input& operator=(Input&&) = default;
30*21b177e0SEddie James 
31*21b177e0SEddie James     /*
32*21b177e0SEddie James      * @brief RFB client key event handler
33*21b177e0SEddie James      *
34*21b177e0SEddie James      * @param[in] down - Boolean indicating whether key is pressed or not
35*21b177e0SEddie James      * @param[in] key  - Key code
36*21b177e0SEddie James      * @param[in] cl   - Handle to the RFB client
37*21b177e0SEddie James      */
38*21b177e0SEddie James     static void keyEvent(rfbBool down, rfbKeySym key, rfbClientPtr cl);
39*21b177e0SEddie James     /*
40*21b177e0SEddie James      * @brief RFB client pointer event handler
41*21b177e0SEddie James      *
42*21b177e0SEddie James      * @param[in] buttonMask - Bitmask indicating which buttons have been
43*21b177e0SEddie James      *                         pressed
44*21b177e0SEddie James      * @param[in] x          - Pointer x-coordinate
45*21b177e0SEddie James      * @param[in] y          - Pointer y-coordinate
46*21b177e0SEddie James      * @param[in] cl         - Handle to the RFB client
47*21b177e0SEddie James      */
48*21b177e0SEddie James     static void pointerEvent(int buttonMask, int x, int y, rfbClientPtr cl);
49*21b177e0SEddie James 
50*21b177e0SEddie James     /*
51*21b177e0SEddie James      * @brief Sends a data packet to the USB input device
52*21b177e0SEddie James      *
53*21b177e0SEddie James      * @param[in] data - pointer to data
54*21b177e0SEddie James      * @param[in] size - number of bytes to send
55*21b177e0SEddie James      */
56*21b177e0SEddie James     void sendRaw(char* data, int size);
57*21b177e0SEddie James     /* @brief Sends an HID report to the USB input device */
58*21b177e0SEddie James     void sendReport();
59*21b177e0SEddie James 
60*21b177e0SEddie James   private:
61*21b177e0SEddie James     enum
62*21b177e0SEddie James     {
63*21b177e0SEddie James         NUM_MODIFIER_BITS = 4,
64*21b177e0SEddie James         POINTER_LENGTH = 6,
65*21b177e0SEddie James         REPORT_LENGTH = 8
66*21b177e0SEddie James     };
67*21b177e0SEddie James 
68*21b177e0SEddie James     /* @brief Keyboard HID identifier byte */
69*21b177e0SEddie James     static const char keyboardID;
70*21b177e0SEddie James     /* @brief Pointer HID identifier byte */
71*21b177e0SEddie James     static const char pointerID;
72*21b177e0SEddie James     /* @brief HID modifier bits mapped to shift and control key codes */
73*21b177e0SEddie James     static const char shiftCtrlMap[NUM_MODIFIER_BITS];
74*21b177e0SEddie James     /* @brief HID modifier bits mapped to meta and alt key codes */
75*21b177e0SEddie James     static const char metaAltMap[NUM_MODIFIER_BITS];
76*21b177e0SEddie James 
77*21b177e0SEddie James     /*
78*21b177e0SEddie James      * @brief Translates a RFB-specific key code to HID modifier bit
79*21b177e0SEddie James      *
80*21b177e0SEddie James      * @param[in] key - key code
81*21b177e0SEddie James      */
82*21b177e0SEddie James     static char keyToMod(rfbKeySym key);
83*21b177e0SEddie James     /*
84*21b177e0SEddie James      * @brief Translates a RFB-specific key code to HID scancode
85*21b177e0SEddie James      *
86*21b177e0SEddie James      * @param[in] key - key code
87*21b177e0SEddie James      */
88*21b177e0SEddie James     static char keyToScancode(rfbKeySym key);
89*21b177e0SEddie James 
90*21b177e0SEddie James     /* @brief Indicates whether or not to send a keyboard report */
91*21b177e0SEddie James     bool sendKeyboard;
92*21b177e0SEddie James     /* @brief Indicates whether or not to send a pointer report */
93*21b177e0SEddie James     bool sendPointer;
94*21b177e0SEddie James     /* @brief File descriptor for the USB input device */
95*21b177e0SEddie James     int fd;
96*21b177e0SEddie James     /* @brief Data for keyboard report */
97*21b177e0SEddie James     char keyboardReport[REPORT_LENGTH];
98*21b177e0SEddie James     /* @brief Data for pointer report */
99*21b177e0SEddie James     char pointerReport[REPORT_LENGTH];
100*21b177e0SEddie James     /* @brief Path to the USB input device */
101*21b177e0SEddie James     std::string path;
102*21b177e0SEddie James     /*
103*21b177e0SEddie James      * @brief Mapping of RFB key code to report data index to keep track
104*21b177e0SEddie James      *        of which keys are down
105*21b177e0SEddie James      */
106*21b177e0SEddie James     std::map<int, int> keysDown;
107*21b177e0SEddie James };
108*21b177e0SEddie James 
109*21b177e0SEddie James } // namespace ikvm
110