blob: 121deb0826a243270708234732e4d00c87b387d1 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Next min version: 1
// NOTE: This mojom exists in two places and must be kept in sync:
// Chromium: //chromeos/components/sensors/mojom/
// Chrome OS: src/platform2/iioservice/mojo/
// Note: Other repos downstream of Chromium might also use this mojom.
// Example: A backwards-compatible mojom change (and corresponding
// implementation change) can be made in Chrome OS first, then replicated to the
// clients (Chromium, other downstream repos) later.
module chromeos.sensors.mojom;
const string kScale = "scale";
const string kSamplingFrequencyAvailable = "sampling_frequency_available";
const string kLocation = "location";
const string kLocationBase = "base";
const string kLocationLid = "lid";
const string kLocationCamera = "camera";
// As Mojo doesn't support const arrays of strings and char, and also axes are
// trivial, let Sensor clients append the axes.
// Supported axes: {"x", "y", "z"}. Ex: "accel_x".
const string kAccelerometerChannel = "accel";
const string kGyroscopeChannel = "anglvel";
const string kMagnetometerChannel = "magn";
// The light sensor may have not only channel "illuminance", but three color
// channels: illuminance_red, illuminance_green, and illuminance_blue.
const string kLightChannel = "illuminance";
const string kPressureChannel = "pressure";
const string kTimestampChannel = "timestamp";
enum DeviceType {
NONE = 0, // invalid device type
ACCEL = 1,
ANGLVEL = 2,
LIGHT = 3,
COUNT = 4,
MAGN = 5,
ANGL = 6,
BARO = 7,
MAX = 8,
};
enum ObserverErrorType {
ALREADY_STARTED = 0,
SET_FREQUENCY_IO_FAILED = 1,
FREQUENCY_INVALID = 2,
NO_ENABLED_CHANNELS = 3,
GET_FD_FAILED = 4,
READ_FAILED = 5,
READ_TIMEOUT = 6,
};
// SensorService, an interface to search and get SensorDevices. A User can get
// multiple isolated SensorDevices for one physical device, if it wants
// different frequencies of that device's samples.
//
// Next method ID: 4
interface SensorService {
// Gets device ids as a vector of int given the device's type. Only devices
// with id having "iio:device" as the prefix would be available.
// Gets an empty vector if no device can be found.
GetDeviceIds@0(DeviceType type) => (array<int32> iio_device_ids);
// Gets all device ids and their types. Only devices with id having
// "iio:device" as the prefix would be available. For combo sensors, there are
// multiple types in the array of types.
// Gets an empty vector if no device can be found.
GetAllDeviceIds@1() => (map<int32, array<DeviceType>> iio_device_ids_types);
// Creates a new Mojo channel to the iioservice as an isolated client. Upon
// successfully binding of |device_request|, the caller will have an
// established Mojo channel to iioservice.
// If failed, the request won't be bound and will be destroyed directly.
GetDevice@2(int32 iio_device_id,
pending_receiver<SensorDevice> device_request);
// Registers a SensorServiceNewDevicesObserver to iioservice. Users will get
// notified when new devices are added and visible to iioservice.
RegisterNewDevicesObserver
@3(pending_remote<SensorServiceNewDevicesObserver> observer);
};
// SensorDevice, an interface sending requests for a physical device
// (libiio:iio_device). It is an isolated client in iioservice's point of view.
//
// Next method ID: 9
interface SensorDevice {
// Sets |timeout| in milliseconds for I/O operations, mainly for reading
// samples. Sets |timeout| as 0 to specify that no timeout should occur.
// Default: 5000 milliseconds.
SetTimeout@0(uint32 timeout);
// Gets the |attr_names| attributes of this device into |values| as strings.
// When an attribute cannot be read, its value in |values| is set to null.
// |values| and |attr_names| always have the same size.
GetAttributes@1(array<string> attr_names) => (array<string?> values);
// Sets the frequency in Hz of the device before starting to read samples.
// If no frequency or an invalid frequency is set, an
// ObserverErrorType::FREQUENCY_INVALID error will occur after calling
// |StartReadingSamples|.
// After starting to read samples, the client can set the frequency to 0 to
// pause the reading, and set a valid frequency later to resume the reading.
// |result_freq| would be the frequency set by iioservice for the client.
SetFrequency@2(double frequency) => (double result_freq);
// Starts reading samples with the frequency set by |SetFrequency|. Samples or
// errors will be pushed to the observer. It's the user's responsibility to
// keep |observer| active while reading.
StartReadingSamples@3(pending_remote<SensorDeviceSamplesObserver> observer);
// Stops reading samples in this device. Reading can be restarted by calling
// |StartReadingSamples| again.
StopReadingSamples@4();
// Gets all channels' ids as a vector of string. The ids are ordered and the
// user should use the indices of channels to send further requests and
// receive samples.
GetAllChannelIds@5() => (array<string> iio_chn_ids);
// Sets channels' enabled status to |en| with channel indices
// |iio_chn_indices|. Returns an array of channel indices |failed_indices| if
// there are some invalid or duplicate indices.
SetChannelsEnabled @6(array<int32> iio_chn_indices, bool en)
=> (array<int32> failed_indices);
// Returns an array of bool indicating if channels are enabled.
GetChannelsEnabled@7(array<int32> iio_chn_indices) => (array<bool> enabled);
// Gets the |attr_name| attribute of channels as a group into |values| in
// string.
// Returns base::nullopt if the attribute in the channel cannot be read.
GetChannelsAttributes@8(array<int32> iio_chn_indices, string attr_name)
=> (array<string?> values);
};
// One observer is created to track one specific device's samples, using
// SensorDevice::StartReadingSamples to register the observer.
//
// Next method ID: 2
interface SensorDeviceSamplesObserver {
// |sample| arrives and is sent to the client as a map from iio_chn_indices to
// data (64 bit integer).
OnSampleUpdated@0(map<int32, int64> sample);
// An error occurs and is sent to the client as an enum type.
OnErrorOccurred@1(ObserverErrorType type);
};
// One observer is created to track new sensors updated to iioservice, using
// SensorService::RegisterNewDevicesObserver to register the observer.
//
// Next method ID: 1
interface SensorServiceNewDevicesObserver {
// A new IIO device with |iio_device_id| and |types| is added and visible to
// iioservice. Sensor clients can get access to this device with the id.
OnNewDeviceAdded@0(int32 iio_device_id, array<DeviceType> types);
};