vncinput.hh revision 9330
1/*
2 * Copyright (c) 2010 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder.  You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Ali Saidi
38 *          William Wang
39 */
40
41/** @file
42 * Declaration of a VNC input
43 */
44
45#ifndef __BASE_VNC_VNC_INPUT_HH__
46#define __BASE_VNC_VNC_INPUT_HH__
47
48#include <iostream>
49
50#include "base/vnc/convert.hh"
51#include "base/bitmap.hh"
52#include "params/VncInput.hh"
53#include "sim/sim_object.hh"
54
55/**
56 * A device that expects to receive input from the vnc server should derrive
57 * (through mulitple inheritence if necessary from VncKeyboard or VncMouse
58 * and call setKeyboard() or setMouse() respectively on the vnc server.
59 */
60class VncKeyboard
61{
62  public:
63    /**
64     * Called when the vnc server receives a key press event from the
65     * client.
66     * @param key the key passed is an x11 keysym
67     * @param down is the key now down or up?
68     */
69    virtual void keyPress(uint32_t key, bool down) = 0;
70};
71
72class VncMouse
73{
74  public:
75    /**
76     * called whenever the mouse moves or it's button state changes
77     * buttons is a simple mask with each button (0-8) corresponding to
78     * a bit position in the byte with 1 being down and 0 being up
79     * @param x the x position of the mouse
80     * @param y the y position of the mouse
81     * @param buttos the button state as described above
82     */
83    virtual void mouseAt(uint16_t x, uint16_t y, uint8_t buttons) = 0;
84};
85
86class VncInput : public SimObject
87{
88  public:
89
90    /** Client -> Server message IDs */
91    enum ClientMessages {
92        ClientSetPixelFormat    = 0,
93        ClientSetEncodings      = 2,
94        ClientFrameBufferUpdate = 3,
95        ClientKeyEvent          = 4,
96        ClientPointerEvent      = 5,
97        ClientCutText           = 6
98    };
99
100    struct PixelFormat {
101        uint8_t bpp;
102        uint8_t depth;
103        uint8_t bigendian;
104        uint8_t truecolor;
105        uint16_t redmax;
106        uint16_t greenmax;
107        uint16_t bluemax;
108        uint8_t redshift;
109        uint8_t greenshift;
110        uint8_t blueshift;
111        uint8_t padding[3];
112    } M5_ATTR_PACKED;
113
114    struct PixelFormatMessage {
115        uint8_t type;
116        uint8_t padding[3];
117        PixelFormat px;
118    } M5_ATTR_PACKED;
119
120    struct PixelEncodingsMessage {
121        uint8_t type;
122        uint8_t padding;
123        uint16_t num_encodings;
124    } M5_ATTR_PACKED;
125
126    struct FrameBufferUpdateReq {
127        uint8_t type;
128        uint8_t incremental;
129        uint16_t x;
130        uint16_t y;
131        uint16_t width;
132        uint16_t height;
133    } M5_ATTR_PACKED;
134
135    struct KeyEventMessage {
136        uint8_t type;
137        uint8_t down_flag;
138        uint8_t padding[2];
139        uint32_t key;
140    } M5_ATTR_PACKED;
141
142    struct PointerEventMessage {
143        uint8_t type;
144        uint8_t button_mask;
145        uint16_t x;
146        uint16_t y;
147    } M5_ATTR_PACKED;
148
149    struct ClientCutTextMessage {
150        uint8_t type;
151        uint8_t padding[3];
152        uint32_t length;
153    } M5_ATTR_PACKED;
154
155    typedef VncInputParams Params;
156    VncInput(const Params *p);
157
158    /** Set the address of the frame buffer we are going to show.
159     * To avoid copying, just have the display controller
160     * tell us where the data is instead of constanly copying it around
161     * @param rfb frame buffer that we're going to use
162     */
163    void
164    setFramebufferAddr(uint8_t* rfb)
165    {
166        fbPtr = rfb;
167    }
168
169    /** Set up the device that would like to receive notifications when keys are
170     * pressed in the vnc client keyboard
171     * @param _keyboard an object that derrives from VncKeyboard
172     */
173    void setKeyboard(VncKeyboard *_keyboard) { keyboard = _keyboard; }
174
175    /** Setup the device that would like to receive notifications when mouse
176     * movements or button presses are received from the vnc client.
177     * @param _mouse an object that derrives from VncMouse
178     */
179    void setMouse(VncMouse *_mouse) { mouse = _mouse; }
180
181    /** What is the width of the screen we're displaying.
182     * This is used for pointer/tablet devices that need to know to calculate
183     * the correct value to send to the device driver.
184     * @return the width of the simulated screen
185     */
186    uint16_t videoWidth() const { return _videoWidth; }
187
188    /** What is the height of the screen we're displaying.
189     * This is used for pointer/tablet devices that need to know to calculate
190     * the correct value to send to the device driver.
191     * @return the height of the simulated screen
192     */
193    uint16_t videoHeight() const { return _videoHeight; }
194
195    /** The frame buffer uses this call to notify the vnc server that
196     * the frame buffer has been updated and a new image needs to be sent to the
197     * client
198     */
199    virtual void setDirty()
200    {
201        if (captureEnabled)
202            captureFrameBuffer();
203    }
204
205    /** Set the mode of the data the frame buffer will be sending us
206     * @param mode the mode
207     */
208    virtual void setFrameBufferParams(VideoConvert::Mode mode, uint16_t width, uint16_t height);
209
210  protected:
211    /** The device to notify when we get key events */
212    VncKeyboard *keyboard;
213
214    /** The device to notify when we get mouse events */
215    VncMouse *mouse;
216
217    /** The video converter that transforms data for us */
218    VideoConvert *vc;
219
220    /** pointer to the actual data that is stored in the frame buffer device */
221    uint8_t* fbPtr;
222
223    /** The mode of data we're getting frame buffer in */
224    VideoConvert::Mode videoMode;
225
226    /** the width of the frame buffer we are sending to the client */
227    uint16_t _videoWidth;
228
229    /** the height of the frame buffer we are sending to the client */
230    uint16_t _videoHeight;
231
232    /** Flag indicating whether to capture snapshots of frame buffer or not */
233    bool captureEnabled;
234
235    /** Current frame number being captured to a file */
236    int captureCurrentFrame;
237
238    /** Directory to store captured frames to */
239    std::string captureOutputDirectory;
240
241    /** Computed hash of the last captured frame */
242    uint64_t captureLastHash;
243
244    /** Cached bitmap object for writing out frame buffers to file */
245    Bitmap *captureBitmap;
246
247    /** Captures the current frame buffer to a file */
248    void captureFrameBuffer();
249};
250#endif
251