chromium/chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_events.mojom

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Definitions for the event API exposed by the cros_healthd daemon. This API is
// normally consumed by the browser.

// NOTE: This mojom should be kept in sync with the copy in Chromium OS's repo
// in src/platform2/diagnostics/mojom/public/cros_healthd_events.mojom.
module ash.cros_healthd.mojom;

import "ash/system/diagnostics/mojom/input.mojom";
import "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_probe.mojom";
import "chromeos/ash/services/cros_healthd/public/mojom/nullable_primitives.mojom";
import "mojo/public/mojom/base/time.mojom";

// Implemented by clients who desire Bluetooth notifications.
//
// NextMinVersion: 1, NextIndex: 6
[Stable]
interface CrosHealthdBluetoothObserver {
  // Fired when a Bluetooth adapter is added.
  OnAdapterAdded@0();

  // Fired when a Bluetooth adapter is removed.
  OnAdapterRemoved@1();

  // Fired when a property of a Bluetooth adapter is changed.
  OnAdapterPropertyChanged@2();

  // Fired when a Bluetooth device is added.
  OnDeviceAdded@3();

  // Fired when a Bluetooth device is removed.
  OnDeviceRemoved@4();

  // Fired when a property of a Bluetooth device is changed.
  OnDevicePropertyChanged@5();
};

// Implemented by clients who desire lid notifications.
//
// NextMinVersion: 1, NextIndex: 2
[Stable]
interface CrosHealthdLidObserver {
  // Fired when the device's lid is closed.
  OnLidClosed@0();

  // Fired when the device's lid is opened.
  OnLidOpened@1();
};

// Implemented by clients who desire power notifications.
//
// NextMinVersion: 1, NextIndex: 4
[Stable]
interface CrosHealthdPowerObserver {
  // Fired when the device begins consuming from an external power source.
  OnAcInserted@0();

  // Fired when the device stops consuming from an external power source.
  OnAcRemoved@1();

  // Fired when the system receives a suspend request.
  OnOsSuspend@2();

  // Fired when the system completes a suspend request.
  OnOsResume@3();
};

// Implemented by clients who desire audio notifications.
//
// NextMinVersion: 1, NextIndex: 2
[Stable]
interface CrosHealthdAudioObserver {
  // Fired when the audio underrun happens.
  OnUnderrun@0();

  // Fired when the audio severe underrun happens.
  OnSevereUnderrun@1();
};

// Implemented by clients who desire Thunderbolt notifications.
//
// NextMinVersion: 1, NextIndex: 4
[Stable]
interface CrosHealthdThunderboltObserver {
  // Fired when the Thunderbolt plug in.
  OnAdd@0();

  // Fired when the Thunderbolt plug out.
  OnRemove@1();

  // Fired when the Thunderbolt device is authorized.
  OnAuthorized@2();

  // Fired when the Thunderbolt device is unauthorized.
  OnUnAuthorized@3();
};

// USB event info.
//
// NextMinVersion: 2, NextIndex: 6
[Stable]
struct UsbEventInfo {
  // Vendor name.
  string vendor@0;
  // Name, model name or product name.
  string name@1;
  // Vendor ID.
  uint16 vid@2;
  // Product ID.
  uint16 pid@3;
  // USB device categories.
  // https://www.usb.org/defined-class-codes
  array<string> categories@4;

  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // USB plugs in.
    kAdd = 1,
    // USB unplugs.
    kRemove = 2,
  };

  [MinVersion=1]
  State state@5;
};

// Implemented by clients who desire USB notifications.
//
// NextMinVersion: 1, NextIndex: 2
[Stable]
interface CrosHealthdUsbObserver {
  // Fired when the USB plug in.
  OnAdd@0(UsbEventInfo info);

  // Fired when the USB plug out.
  OnRemove@1(UsbEventInfo info);
};

// Implemented by clients who desire SD Card notifications.
//
// NextMinVersion: 1, NextIndex: 2
[Stable]
interface CrosHealthdSdCardObserver {
  // Fired when the SD Card plug in.
  OnAdd@0();

  // Fired when the SD Card plug out.
  OnRemove@1();
};

// Thunderbolt event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct ThunderboltEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // Thunderbolt plug in.
    kAdd = 1,
    // Thunderbolt plug out.
    kRemove = 2,
    // Thunderbolt device is authorized.
    kAuthorized = 3,
    // Thunderbolt device is unauthorized.
    kUnAuthorized = 4,
  };

  State state@0;
};

// Lid event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct LidEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // Lid closed.
    kClosed = 1,
    // Lid opened.
    kOpened = 2,
  };

  State state@0;
};

// Bluetooth event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct BluetoothEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // Adapter is added.
    kAdapterAdded = 1,
    // Adapter is removed.
    kAdapterRemoved = 2,
    // Adapter property is changed.
    kAdapterPropertyChanged = 3,
    // Device is added.
    kDeviceAdded = 4,
    // Device is removed.
    kDeviceRemoved = 5,
    // Device property is changed.
    kDevicePropertyChanged = 6,
  };

  State state@0;
};

// Power event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct PowerEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // Device begins consuming from an external power source.
    kAcInserted = 1,
    // Device stops consuming from an external power source.
    kAcRemoved = 2,
    // System receives a suspend request.
    kOsSuspend = 3,
    // System completes a suspend request.
    kOsResume = 4,
  };

  State state@0;
};

// Audio event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct AudioEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField = 0,
    // Audio underrun happens.
    kUnderrun = 1,
    // Audio severe underrun happens.
    kSevereUnderrun = 2,
  };

  State state@0;
};

// Audio jack event info.
//
// NextMinVersion: 2, NextIndex: 2
[Stable]
struct AudioJackEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField,
    // Audio jack added.
    kAdd,
    // Aduio jack removed.
    kRemove,
  };

  State state@0;

  [Stable, Extensible]
  enum DeviceType {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField,
    // The device is a headphone.
    kHeadphone,
    // The device is a microphone.
    kMicrophone,
  };

  [MinVersion=1]
  DeviceType device_type@1;
};

// SD Card event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct SdCardEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField,
    // SD Card added.
    kAdd,
    // SD Card removed.
    kRemove,
  };

  State state@0;
};

// An enumeration of input touch buttons.
//
// NextMinVersion: 1, NextIndex: 4
[Stable, Extensible]
enum InputTouchButton {
  // This is required for backwards compatibility, should not be used.
  [Default] kUnmappedEnumField = 0,
  // Left key.
  kLeft = 1,
  // Middle key.
  kMiddle = 2,
  // Right key.
  kRight = 3,
};

// Emitted when some touchpad button is pressed or released.
//
// NextMinVersion: 1, NextIndex: 2
[Stable]
struct TouchpadButtonEvent {
  // The button corresponds to this event.
  InputTouchButton button@0;
  // True when if the button is pressed. False if the button is released.
  bool pressed@1;
};

// Touch point info.
//
// NextMinVersion: 1, NextIndex: 6
[Stable]
struct TouchPointInfo {
  // An id to track an initiated contact throughout its life cycle.
  uint32 tracking_id@0;
  // The x position.
  uint32 x@1;
  // The y position.
  uint32 y@2;
  // The pressure applied to the touch contact.
  NullableUint32? pressure@3;
  // The length of the longer dimension of the touch contact.
  NullableUint32? touch_major@4;
  // The length of the shorter dimension of the touch contact.
  NullableUint32? touch_minor@5;
};

// Emitted when new touch points are updated.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct TouchpadTouchEvent {
  // The touch points reported by the touchpad.
  array<TouchPointInfo> touch_points@0;
};

// Emitted once the observer get connected to the touchpad events. This will be
// the first event from the touchpad.
//
// NextMinVersion: 1, NextIndex: 4
[Stable]
struct TouchpadConnectedEvent {
  // The maximum possible x position of touch points.
  uint32 max_x@0;
  // The maximum possible y position of touch points.
  uint32 max_y@1;
  // The maximum possible pressure of touch points, or 0 if pressure is not
  // supported.
  uint32 max_pressure@2;
  // The supported buttons;
  array<InputTouchButton> buttons@3;
};

// Union of touchpad events.
//
// NextMinVersion: 1, NextIndex: 4
[Stable, Extensible]
union TouchpadEventInfo {
  // The default value for forward compatibility. All the unknown type will be
  // mapped to this.
  [Default]
  uint8 default_type@0;
  TouchpadButtonEvent button_event@1;
  TouchpadTouchEvent touch_event@2;
  TouchpadConnectedEvent connected_event@3;
};

// External Display event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct ExternalDisplayEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField,
    // External display plugs in.
    kAdd,
    // External display plugs out.
    kRemove,
  };

  State state@0;
  // On external display event, also report information about the display.
  [MinVersion=1]
  ExternalDisplayInfo? display_info@1;
};

// Emitted when new touch points are updated.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct TouchscreenTouchEvent {
  // The touch points reported by the touchscreen.
  array<TouchPointInfo> touch_points@0;
};

// Emitted once the observer get connected to the touchscreen events. This will
// be the first event from the touchscreen.
//
// NextMinVersion: 1, NextIndex: 3
[Stable]
struct TouchscreenConnectedEvent {
  // The maximum possible x position of touch points.
  uint32 max_x@0;
  // The maximum possible y position of touch points.
  uint32 max_y@1;
  // The maximum possible pressure of touch points, or 0 if pressure is not
  // supported.
  uint32 max_pressure@2;
};

// Union of Touchscreen events.
//
// NextMinVersion: 1, NextIndex: 3
[Stable, Extensible]
union TouchscreenEventInfo {
  // The default value for forward compatibility. All the unknown type will be
  // mapped to this.
  [Default]
  uint8 default_type@0;
  TouchscreenTouchEvent touch_event@1;
  TouchscreenConnectedEvent connected_event@2;
};

// Stylus garage event info.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct StylusGarageEventInfo {
  [Stable, Extensible]
  enum State {
    // This is required for backwards compatibility, should not be used.
    [Default] kUnmappedEnumField,
    // Stylus inserted into the garage.
    kInserted,
    // Stylus removed from the garage.
    kRemoved,
  };

  State state@0;
};

// Stylus touch point info.
//
// NextMinVersion: 1, NextIndex: 3
[Stable]
struct StylusTouchPointInfo {
  // The x position.
  uint32 x@0;
  // The y position.
  uint32 y@1;
  // The pressure applied to the touch contact.
  NullableUint32? pressure@2;
};

// Emitted when new touch point is updated.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
struct StylusTouchEvent {
  // The info of the stylus touch point. A null touch point means the stylus
  // leaves the contact.
  StylusTouchPointInfo? touch_point@0;
};

// Emitted once the observer get connected to the stylus events. This will be
// the first event from the stylus.
//
// NextMinVersion: 1, NextIndex: 3
[Stable]
struct StylusConnectedEvent {
  // The maximum possible x position of touch points.
  uint32 max_x@0;
  // The maximum possible y position of touch points.
  uint32 max_y@1;
  // The maximum possible pressure of touch points, or 0 if pressure is not
  // supported.
  uint32 max_pressure@2;
};

// Union of stylus events.
//
// NextMinVersion: 1, NextIndex: 3
[Stable, Extensible]
union StylusEventInfo {
  // The default value for forward compatibility. All the unknown type will be
  // mapped to this.
  [Default]
  uint8 default_type@0;
  StylusTouchEvent touch_event@1;
  StylusConnectedEvent connected_event@2;
};

// Emitted within CrashEventInfo. Contains information available for uploaded
// crash events only.
//
// NextMinVersion: 1, NextIndex: 3
[Stable]
struct CrashUploadInfo {
  // Corresponding to "upload_id" in uploads.log.
  string crash_report_id@0;
  // The creation time of the uploads.log file.
  // Used to distinguish uploads.log file in case it has been deleted and
  // recreated.
  mojo_base.mojom.Time creation_time@1;
  // Number of valid logs before this event in uploads.log. Useful to inform
  // subscribers that need to distinguish whether a crash event has been
  // encountered before.
  uint64 offset@2;
};

// Emitted once the observer gets new crash events.
//
// NextMinVersion: 1, NextIndex: 4
[Stable]
struct CrashEventInfo {
  // NextMinVersion: 2, NextIndex: 4
  [Stable, Extensible]
  enum CrashType {
    [Default] kUnknown = 0,
    kKernel,
    kEmbeddedController,
    [MinVersion=1] kChrome,
  };
  // Type of the crash. Corresponding to "fatal_crash_type" in uploads.log.
  CrashType crash_type@0;
  // ID that represents crash locally. Corresponding to "path_hash" in
  // uploads.log.
  string local_id@1;
  // The time at which the crash event is captured by the system. Corresponding
  // to "capture_time" in uploads.log.
  mojo_base.mojom.Time capture_time@2;
  // Information available for uploaded crash events only. Missing if the crash
  // hasn't been uploaded by crash_sender yet.
  CrashUploadInfo? upload_info@3;
};

// Implemented by clients who desire events.
//
// NextMinVersion: 1, NextIndex: 1
[Stable]
interface EventObserver {
  // Fired when an event happens.
  OnEvent@0(EventInfo info);
};

// Union of event info.
//
// NextMinVersion: 10, NextIndex: 16
[Stable, Extensible]
union EventInfo {
  // The default value for forward compatibility. All the unknown type will be
  // mapped to this.
  [Default]
  uint8 default_type@0;
  // USB event info.
  UsbEventInfo usb_event_info@1;
  // Thunderbolt event info.
  ThunderboltEventInfo thunderbolt_event_info@2;
  // Lid event info.
  LidEventInfo lid_event_info@3;
  // Bluetooth event info.
  BluetoothEventInfo bluetooth_event_info@4;
  // Power event info.
  PowerEventInfo power_event_info@5;
  // Audio event info.
  AudioEventInfo audio_event_info@6;
  // Audio jack event info.
  [MinVersion=1]
  AudioJackEventInfo audio_jack_event_info@7;
  // SD Card event info.
  [MinVersion=2]
  SdCardEventInfo sd_card_event_info@8;
  // Keyboard diagnostics event info. It is fired when users completed a
  // keyboard diagnostic in the Diagnostics App.
  [MinVersion=3]
  ash.diagnostics.mojom.KeyboardDiagnosticEventInfo
      keyboard_diagnostic_event_info@9;
  // Touchpad event info.
  [MinVersion=4]
  TouchpadEventInfo touchpad_event_info@10;
  // External Display event info.
  [MinVersion=5]
  ExternalDisplayEventInfo external_display_event_info@11;
  // Touchscreen event info.
  [MinVersion=6]
  TouchscreenEventInfo touchscreen_event_info@12;
  // Stylus garagge event info.
  [MinVersion=7]
  StylusGarageEventInfo stylus_garage_event_info@13;
  // Stylus event info.
  [MinVersion=8]
  StylusEventInfo stylus_event_info@14;
  // Crash event info.
  [MinVersion=9]
  CrashEventInfo crash_event_info@15;
};

// An enumeration of event categories.
//
// NextMinVersion: 11, NextIndex: 17
[Stable, Extensible]
enum EventCategoryEnum {
  // This is required for backwards compatibility, should not be used.
  [Default] kUnmappedEnumField = 0,
  kUsb = 1,
  kThunderbolt = 2,
  kLid = 3,
  kBluetooth = 4,
  kPower = 5,
  kAudio = 6,
  [MinVersion=1] kAudioJack = 7,
  [MinVersion=2] kSdCard = 8,
  [MinVersion=3] kNetwork = 9,
  [MinVersion=4] kKeyboardDiagnostic = 10,
  [MinVersion=5] kTouchpad = 11,
  [MinVersion=6] kExternalDisplay = 12,
  [MinVersion=7] kTouchscreen = 13,
  [MinVersion=8] kStylusGarage = 14,
  [MinVersion=9] kStylus = 15,
  [MinVersion=10] kCrash = 16,
};