1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_ANDROID_MULTITOUCH_PORT_H_
18#define ANDROID_ANDROID_MULTITOUCH_PORT_H_
19
20#include "android/sdk-controller-socket.h"
21
22/*
23 * Encapsulates exchange protocol between the multi-touch screen emulator, and an
24 * application running on an Android device that provides touch events, and is
25 * connected to the host via USB.
26 */
27
28/*
29 * Codes that define transmitted framebuffer format:
30 *
31 * NOTE: Application on the device side depends on these values. Any changes
32 * made here must be reflected in the app too. Application location is at
33 * 'sdk/apps/SdkController/SdkControllerMultitouch' root.
34 */
35
36/* Framebuffer is transmitted as JPEG. */
37#define MTFB_JPEG       1
38/* Framebuffer is transmitted as raw RGB565 bitmap. */
39#define MTFB_RGB565     2
40/* Framebuffer is transmitted as raw RGB888 bitmap. */
41#define MTFB_RGB888     3
42
43/* Framebuffer update descriptor.
44 * This descriptor is used to collect properties of the updated framebuffer
45 * region. This descriptor is also sent to the MT emulation application on the
46 * device, so it can properly redraw its screen.
47 *
48 * NOTE: Application on the device side depends on that structure. Any changes
49 * made here must be reflected in the app too. Application location is at
50 * 'sdk/apps/SdkController/SdkControllerMultitouch' root.
51 */
52typedef struct MTFrameHeader {
53    /* Size of the header. Must be always sizeof(MTFrameHeader). */
54    int         header_size;
55    /* Display width */
56    int         disp_width;
57    /* Display height */
58    int         disp_height;
59    /* x, y, w, and h define framebuffer region that has been updated. */
60    int         x;
61    int         y;
62    int         w;
63    int         h;
64    /* Bytes per line in the framebufer. */
65    int         bpl;
66    /* Bytes per pixel in the framebufer. */
67    int         bpp;
68    /* Defines format in which framebuffer is transmitted to the device. */
69    int         format;
70} MTFrameHeader;
71
72/* Declares multi-touch port descriptor. */
73typedef struct AndroidMTSPort AndroidMTSPort;
74
75/* Creates multi-touch port, and connects it to the device.
76 * Param:
77 *  opaque - An opaque pointer that is passed back to the callback routines.
78 * Return:
79 *  Initialized device descriptor on success, or NULL on failure. If failure is
80 *  returned from this routine, 'errno' indicates the reason for failure. If this
81 *  routine successeds, a connection is established with the sensor reading
82 *  application on the device.
83 */
84extern AndroidMTSPort* mts_port_create(void* opaque);
85
86/* Disconnects from the multi-touch port, and destroys the descriptor. */
87extern void mts_port_destroy(AndroidMTSPort* amtp);
88
89/* Sends framebuffer update to the multi-touch emulation application, running on
90 * the android device.
91 * Param:
92 *  mtsp - Android multi-touch port instance returned from mts_port_create.
93 *  fmt - Framebuffer update descriptor.
94 *  fb - Beginning of the framebuffer.
95 *  cb - Callback to invoke when update has been transferred to the MT-emulating
96 *      application on the device.
97 *  cb_opaque - An opaque parameter to pass back to the 'cb' callback.
98 *  ydir - Indicates direction in which lines are arranged in the framebuffer. If
99 *      this value is negative, lines are arranged in bottom-up format (i.e. the
100 *      bottom line is at the beginning of the buffer).
101 * Return:
102 *  0 on success, or != 0 on failure.
103 */
104extern int mts_port_send_frame(AndroidMTSPort* mtsp,
105                               MTFrameHeader* fmt,
106                               const uint8_t* fb,
107                               on_sdkctl_direct_cb cb,
108                               void* cb_opaque,
109                               int ydir);
110
111#endif  /* ANDROID_ANDROID_MULTITOUCH_PORT_H_ */
112