blob: 14c3e2c1a6d80b449cff825af91ad01bfc301f16 [file] [log] [blame]
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
option java_multiple_files = true;
option java_package = "android.emulation.control";
option java_outer_classname = "";
option objc_class_prefix = "AEC";
package android.emulation.control;
import "google/protobuf/empty.proto";
// An EmulatorController service lets you control the emulator.
service EmulatorController {
rpc setRotation(Rotation) returns (Rotation) {}
rpc getRotation(google.protobuf.Empty) returns (Rotation) {}
rpc setBattery(BatteryState) returns (BatteryState) {}
rpc getBattery(google.protobuf.Empty) returns (BatteryState) {}
rpc getGps(google.protobuf.Empty) returns (GpsState) {}
rpc setGps(GpsState) returns (GpsState) {}
rpc sendTouch(TouchEvent) returns (google.protobuf.Empty) {}
rpc sendKey(KeyboardEvent) returns (google.protobuf.Empty) {}
rpc sendMouse(MouseEvent) returns (google.protobuf.Empty) {}
rpc sendRotary(RotaryEvent) returns (google.protobuf.Empty) {}
rpc getVmConfiguration(google.protobuf.Empty) returns (VmConfiguration) {}
rpc getScreenshot(ImageFormat) returns (Image) {}
// Returns the last 128Kb of logcat output from the emulator
rpc getLogcat(LogMessage) returns (LogMessage) {}
// Streams the logcat output from the emulator. The first call
// can retrieve up to 128Kb. This call will not return.
rpc streamLogcat(LogMessage) returns (stream LogMessage) {}
rpc usePhone(TelephoneOperation) returns (TelephoneResponse) {}
// The following endpoints are needed to establish the webrtc protocol
// Due to limitiations in Javascript we cannot make use of bidirectional
// endpoints See this (blog)[https://grpc.io/blog/state-of-grpc-web] for
// details.
// This function will generate a new identifier that the client
// should use for further interaction. It will initiate the
// JSEP protocol on the server side.
rpc requestRtcStream(google.protobuf.Empty) returns (RtcId) {}
// Sends the given JsepMsg to the server. The RtcId in the
// message should point to an active stream negotiation in
// progress, otherwise the message will be ignored.
rpc sendJsepMessage(JsepMsg) returns (google.protobuf.Empty) {}
// Reads an available jsep messages for the given client id,
// blocking at most 5 seconds, or until one becomes available.
//
// The ice candidates for example will trickle in on this callback,
// as will the SDP negotation.
rpc receiveJsepMessage(RtcId) returns (JsepMsg) {}
}
message RtcId {
// The unique identifier of this connection. You will have to use the same
// identifier when sending/receiving messages. The server will generate a
// guid when receiving the start message.
string guid = 1;
}
message JsepMsg {
// The unique identifier of this connection. You will have to use the same
// identifier when sending/receiving messages. The server will generate a
// guid when receiving the start message.
RtcId id = 1;
// The JSON payload. This usually can be directly handled by the Javascript
// The dictionary can contain the following properties
//
// - bye:
// You can hang up now. No new message expected for you.
// The server has stopped the RTC stream.
//
// - start:
// An RTCConfiguration dictionary providing options to
// configure the new connection. This can include the
// turn configuration the serve is using. This dictionary can be
// passed in directly to the
// (RTCPeerConnection)[https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection]
// object.
//
// - candidate:
// The WebRTC API's RTCIceCandidateInit dictionary, which
// contains the information needed to fundamentally describe an
// RTCIceCandidate. See
// (RTCIceCandidate)[https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate]
// and (Session
// Lifetime)[https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Session_lifetime]
// for more details.
//
// - sdp:
// RTCSessionDescriptionInit dictionary containing the values
// to that can be assigned to a
// (RTCSessionDescription)[https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription]
string message = 2;
}
message LogMessage {
// [Output Only] The contents of the log output.
string contents = 1;
// The starting byte position of the output that was returned. This should
// match the start parameter sent with the request. If the serial console
// output exceeds the size of the buffer, older output will be overwritten
// by newer content and the start values will be mismatched.
int64 start = 2;
//[Output Only] The position of the next byte of content from the serial
//console output. Use this value in the next request as the start parameter.
int64 next = 3;
}
message VmConfiguration {
enum VmHypervisorType {
HV_UNKNOWN = 0;
HV_NONE = 1;
HV_KVM = 2;
HV_HAXM = 3;
HV_HVF = 4;
HV_WHPX = 5;
};
VmHypervisorType hypervisorType = 1;
int32 numberOfCpuCores = 2;
int64 ramSizeBytes = 3;
}
message RotaryEvent {
int32 delta = 1;
}
message MouseEvent {
int32 x = 1;
int32 y = 2;
int32 buttons = 3;
}
// KeyboardEvent objects describe a user interaction with the keyboard; each
// event describes a single interaction between the user and a key (or
// combination of a key with modifier keys) on the keyboard.
// This follows the pattern as set by
// (javascript)[https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent]
//
// Note: that only keyCode, key, or text can be set and that the semantics
// will slightly vary.
message KeyboardEvent {
// Code types that the emulator can receive. Note that the emulator
// will do its best to translate the code to an evdev value that
// will be send to the emulator. This translation is based on
// the chromium translation tables.
// See
// https://chromium.googlesource.com/chromium/src/+/lkgr/ui/events/keycodes/dom/keycode_converter_data.inc
// for details on the translation.
enum KeyCodeType {
Usb = 0;
Evdev = 1;
XKB = 2;
Win = 3;
Mac = 4;
};
enum KeyEventType {
// Indicates that this keyevent should be send to the emulator
// as a key down event. Meaning that the key event will be
// translated to an EvDev event type and bit 11 (0x400) will be
// set before it is sent to the emulator.
keydown = 0;
// Indicates that the keyevent should be send to the emulator
// as a key up event. Meaning that the key event will be
// translated to an EvDev event type and
// sent to the emulator.
keyup = 1;
// Indicates that the keyevent will be send to the emulator
// as e key down event and immediately followed by a keyup event.
keypress = 2;
};
// Type of keycode contained in the keyCode field.
KeyCodeType codeType = 1;
// The type of keyboard event that should be sent to the emulator
KeyEventType eventType = 2;
// This property represents a physical key on the keyboard (as opposed to
// the character generated by pressing the key). In other words, this
// property is a value which isn't altered by keyboard layout or the state
// of the modifier keys. This value will be interpreted by
// the emulator depending on the KeyCodeType. The incoming key code will be
// translated to an evdev code type and send to the emulator.
// The values in key and text will be ignored.
int32 keyCode = 3;
// The value of the key pressed by the user, taking into consideration the
// state of modifier keys such as Shift as well as the keyboard locale and
// layout. This follows the w3c standard used in browsers.
// You can find an accurate description of valid values
// (here)[https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values]
// The values in text, keyCode, eventType and codeType will be ignored and a
// keypress event will be delivered to the emulator.
string key = 4;
// Series of utf8 encoded characters to send to the emulator. Every
// character will be translated to an EvDev event type and send to the
// emulator as a keypress event. The values in keyCode, eventType, codeType
// and key will be ignored.
string text = 5;
}
message TouchEvent {
bool isTouching = 1;
int32 touchId = 2;
}
message GpsState {
bool passiveUpdate = 1;
double latitude = 2;
double longitude = 3;
double speed = 4;
double heading = 5;
double elevation = 6;
int32 satellites = 7;
}
message BatteryState {
enum BatteryStatus {
BATTERY_STATUS_UNKNOWN = 0;
BATTERY_STATUS_CHARGING = 1;
BATTERY_STATUS_DISCHARGING = 2;
BATTERY_STATUS_NOT_CHARGING = 3;
BATTERY_STATUS_FULL = 4;
};
enum BatteryCharger {
BATTERY_CHARGER_NONE = 0;
BATTERY_CHARGER_AC = 1;
BATTERY_CHARGER_USB = 2;
BATTERY_CHARGER_WIRELESS = 3;
};
enum BatteryHealth {
BATTERY_HEALTH_GOOD = 0;
BATTERY_HEALTH_FAILED = 1;
BATTERY_HEALTH_DEAD = 2;
BATTERY_HEALTH_OVERVOLTAGE = 3;
BATTERY_HEALTH_OVERHEATED = 4;
};
bool hasBattery = 1;
bool isPresent = 2;
BatteryCharger charger = 3;
int32 chargeLevel = 4;
BatteryHealth health = 5;
BatteryStatus status = 6;
}
message ImageStream {
uint32 framerate = 1;
ImageFormat format = 2;
}
message ImageFormat {
enum ImgFormat {
PNG = 0;
RAW = 1;
RGB888 = 2;
RGBA8888 = 3;
}
ImgFormat format = 1;
Rotation rotation = 2;
}
message Image {
ImageFormat format = 1;
uint32 width = 2;
uint32 height = 3;
// The organization of the pixels in the image buffer is from left to
// right and bottom up.
bytes image = 4;
}
message Rotation {
enum SkinRotation {
SKIN_ROTATION_0 = 0;
SKIN_ROTATION_90 = 1;
SKIN_ROTATION_180 = 2;
SKIN_ROTATION_270 = 3;
}
SkinRotation rotation = 1;
}
message TelephoneOperation {
enum Operation {
InitCall = 0;
AcceptCall = 1;
RejectCallExplicit = 2;
RejectCallBusy = 3;
DisconnectCall = 4;
PlaceCallOnHold = 5;
TakeCallOffHold = 6;
}
Operation operation = 1;
string number = 2;
}
message TelephoneResponse {
enum Response {
OK = 0;
BadOperation = 1; // Enum out of range
BadNumber = 2; // Mal-formed telephone number
InvalidAction = 3; // E.g., disconnect when no call is in progress
ActionFailed = 4; // Internal error
RadioOff = 5; // Radio power off
}
Response response = 1;
}