ANDROID QEMUD SERVICES

The docs/ANDROID-QEMUD.TXT document describes how clients running in the
emulated system can communicate with the emulator through the 'qemud'
multiplexing daemon.

This document lists all services officially provided by the emulator to
clients. Each service is identified by a unique name. There is no provision
for versioning. Instead, if you need new features, create a new service
with a slightly different name and modify clients to use it in the system
image.


"gsm" service:
--------------

   The GSM service provides a communication channel where GSM/GPRS AT commands
   can be exchanged between the emulated system and an emulated modem.

   The messages consist in un-framed character messages as they appear in a
   regular AT command channel (i.e. terminated by \r\n most of the time).

   There can be only 1 client talking to the modem, since the AT command
   protocol does not allow for anything more complex.

   Implementation: telephony/modem_driver.c
   Since:          SDK 1.0

"gps" service:
--------------

  The GPS service is used to broadcast NMEA 0183 sentences containing fix
  information to all clients. The service doesn't listen to clients at all.

  All sentences are un-framed and end with a \n character.

  Implementation: android/gps.c
  Since:          SDK 1.0


"hw-control" / "control" service:
---------------------

  This service is named "control" in 1.0 and 1.1, and "hw-control"
  in 1.5 and later releases of the SDK.

  This service is used to allow the emulated system to control various aspects
  of hardware emulation. The corresponding clients are in
  hardware/libhardware_legacy in the Android source tree.

  All messages use the optional framing described in ANDROID-QEMUD.TXT.
  Only one client can talk with the service at any one time, but clients
  quickly connect/disconnect to the service anyway.

  Supported messages are:

    1/ Client sends "power:light:brightness:<lightname>:<val>", where
       <lightname> is the name of a light and <val> is an decimal value
       between 0 (off) and 255 (brightest). Valid values for 'light' are:

            lcd_backlight
            keyboard_backlight
            button_backlight

       Currently, only 'lcd_backlight' is supported by the emulator.
       Note that the brightness value doesn't scale linearly on physical
       devices.

    2/ Client sends "set_led_state:<color-rgb>:<on-ms>:<off-ms>" where
       <color-rgb> is an 8-hexchar value describing an xRGB color, and
       <on-ms> and <off-ms> are decimal values expressing timeout in
       milliseconds.

       This is used to modify the color of the notification LED on the
       emulated phone as well as provide on/off timeouts for flashing.

       cCrrently unsupported by the emulator.

    3/ Client sends "vibrator:<timeout>", where <timeout> is a decimal value.
       used to enable vibrator emulation for <timeout> milli-seconds.

       Currently unsupported by the emulator.


  Implementation: android/hw-control.c
  Since:          SDK 1.0


"sensors" service:
------------------

  This service is used for sensor emulation. All messages are framed and the
  protocol is the following:

    1/ Clients initially sends "list-sensors" and receives a single string
       containing a decimal mask value. The value is a set of bit-flags
       indicating which sensors are provided by the hardware emulation. The
       bit flags are defined as:

         bit 0:   accelerometer
         bit 1:   compass
         bit 2:   orientation
         bit 3:   temperature

    2/ Client sends "set-delay:<delay-ms>", where <delay-ms> is a decimal
       string, to set the minimum delay in milliseconds between sensor event
       reports it wants to receive.

    3/ Client sends "wake", the service must immediately send back "wake" as
       an answer. This is used to simplify parts of the client emulation.

    4/ Client sends "set:<sensor-name>:<flag>", where <sensor-name> is the
       name of one of the emulated sensors, and <flag> is either "0" or "1".
       This is used to enable or disable the report of data from a given
       emulated sensor hardware.

       the list of valid <sensor-name> values is the following:

           acceleration      : for the accelerometer
           magnetic-field    : for the compass
           orientation       : for the orientation sensor
           temperature       : for the temperature sensor


    5/ If at least one of the emulated sensors has been enabled with
       "set:<name>:1", then the service should broadcast periodically the
       state of sensors.

       this is done by broadcasting a series of framed messages that look
       like:

           acceleration:<x>:<y>:<z>
           magnetic-field:<x>:<y>:<z>
           orientation:<azimuth>:<pitch>:<roll>
           temperature:<celsius>
           sync:<time_us>

       Note that each line, corresponds to an independent framed message.
       Each line, except the last one, is optional and should only be
       produced if the corresponding sensor reporting has been enabled
       through "set:<name>:1".

       <x>, <y>, <z>, <azimuth>, <pitch>, <roll> and <celsius> are floating
       point values written as strings with the "%g" printf formatting option.

       The last 'sync' message is required to end the broadcast and contains
       the current VM clock time in micro-seconds. The client will adjust it
       internally to only care about differences between sensor broadcasts.

       If reporting is disabled for all sensors, no broadcast message needs
       to be sent back to clients.


  Implementation: android/hw-sensors.c
  Since:          SDK 1.5 (cupcake)


"boot-properties" service:
--------------------------

  WARNING: These properties don't get set until init starts a service in
  class "core" called "qemu-props". Other init services in class "core"
  include servicemanager and vold.  If those processes read the property
  (they probably don't right now), there is a small chance it has not been set yet.
  Also, init services are started asynchronously, so there is no guarantee that
  services started just after qemu-props will not run before qemu-props, and may
  not see the new properties. This hasn't been an issue, but should probably
  be cleaned up.

  This service is used to set system properties in the emulated system at
  boot time. It is invoked by the 'qemu-props' helper program that is invoked
  by /system/etc/init.goldfish.rc. All messages are framed and the protocol
  is the following:

  1/ Clients sends the 'list' command

  2/ Service answers by listing all system properties to set. One per
     message with the following format:

        <property-name>=<property-value>

     Note that <property-value> is not zero-terminated.


  3/ After sending all the properties, the service force-closes the
     connection.

  Implementation: android/boot-properties.c
  Since:          SDK 1.XXX (donut)