/*
 * Copyright 2021 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef CAMERA_INCLUDE_CROS_CAMERA_SENSOR_HAL_CLIENT_H_
#define CAMERA_INCLUDE_CROS_CAMERA_SENSOR_HAL_CLIENT_H_

#include <map>
#include <memory>
#include <vector>

#include <base/callback.h>

#include "cros-camera/camera_mojo_channel_manager_token.h"
#include "cros-camera/export.h"

namespace cros {

// SamplesObserver imitates the iioservice mojo interface:
// cros::mojom::SensorDeviceSamplesObserver, which waits for samples and errors
// from iioservice.
//
// The user should implement this virtual class to get notified when samples and
// errors come in the mojo IPC thread, which is the thread that
// CameraMojoChannelManager uses to communicate with iioservice in mojo
// channels.
// Note that the user should NOT block in the mojo IPC thread, as it's used to
// send and receive multiple IPC calls. Most SensorHalClient's functions defined
// below are blocking functions and therefore should not be used in the mojo IPC
// thread.
class CROS_CAMERA_EXPORT SamplesObserver {
 public:
  struct Sample {
    double x_value;
    double y_value;
    double z_value;
    int64_t timestamp;
  };
  // Enumeration of receiver errors.
  enum class ErrorType {
    // Mojo connection to SensorHalDispatcher is broken.
    // Abort all usages.
    MOJO_DISCONNECTED = 0,
    // Error when setting configurations to iioservice.
    // Abort all usages.
    INVALID_ARGUMENT = 1,
    // A sample read failed. Other samples should still be read. If this
    // happens too frequently, the user could abort all usages.
    READ_FAILED = 2,
  };

  // |OnSampleUpdated| and |OnErrorOccurred| are guaranteed to be called in
  // sequence (in the IPC thread). Users can send them to other sequences by
  // posting tasks.

  // |sample| contains the 3d calibrated and scaled data in x, y, and z axes.
  // |sample.timestamp| contains the timestamp of |sample|.
  virtual void OnSampleUpdated(Sample sample) = 0;
  virtual void OnErrorOccurred(ErrorType error) = 0;
};

// SensorHalClient is a wrapper class of the iioservice mojo interfaces, which
// gets connected to chromium's SensorHalDispatcher and iioservice, retrieves
// the information of devices, and lets the user register SamplesObservers.
//
// Note that the user should not use SensorHalClient's methods in the IPC
// thread, which is the thread to receive samples and errors in SamplesObserver,
// as they are blocking functions and will wait for callbacks in the IPC thread.
//
// Example:
//   SensorHalClient* sensor_hal_client = SensorHalClient::GetInstance(token);
//
//   // Look for the accelerometer on LID.
//   if (!sensor_hal_client->HasDevice(SensorHalClient::DeviceType::kAccel,
//       SensorHalClient::Location::kLid)) {
//     // No accel on LID. Abort.
//   }
//
//   // Implement an observer based on SamplesObserver.
//   SamplesObserverImpl samples_observer;
//
//   // Register |samples_observer| with 100Hz on the accelerometer on lid.
//   sensor_hal_client->RegisterSamplesObserver(
//       SensorHalClient::DeviceType::kAccel,
//       SensorHalClient::Location::kLid,
//       100.0,
//       &samples_observer);
//
//   // Wait for samples or errors on the IPC thread.
//
//   // Unregister |samples_observer| before destructing it.
//   sensor_hal_client->UnregisterSamplesObserver(&samples_observer);
//
class CROS_CAMERA_EXPORT SensorHalClient {
 public:
  enum class DeviceType {
    kNone = 0,     // Not used. Just making the order the same with iioservice:
                   // cros::mojom::DeviceType.
    kAccel = 1,    // Accelerometer.
    kAnglVel = 2,  // Gyroscope.
    kMagn = 3,     // Magnetometer.
    kGravity = 4,  // Gravity fusion sensor.
  };

  enum class Location {
    kNone = 0,  // The device doesn't have the location attribute.
    kBase = 1,
    kLid = 2,
    kCamera = 3,
  };

  static SensorHalClient* GetInstance(CameraMojoChannelManagerToken* token);

  virtual ~SensorHalClient() = default;

  // Check if a device exists by |type| and |location|.
  virtual bool HasDevice(DeviceType type, Location location) = 0;

  // Register |samples_observer| with |frequency| to the device with |type| and
  // |location|. The pair of |type| and |location| should exist in the result of
  // the previous query: |HasDevice|.
  // It's the user's responsibility to ensure |samples_observer| is valid until
  // UnregisterSamplesObserver is called.
  // Return true if success; Return false if device with |type| and |location|
  // doesn't exist, or |frequency| is invalid, or |samples_observer| is already
  // registered to another device.
  virtual bool RegisterSamplesObserver(DeviceType type,
                                       Location location,
                                       double frequency,
                                       SamplesObserver* samples_observer) = 0;

  // Unregister |samples_observer| to prevent getting more samples. It should be
  // called before destructing |samples_observer|.
  virtual void UnregisterSamplesObserver(SamplesObserver* samples_observer) = 0;
};

}  // namespace cros

#endif  // CAMERA_INCLUDE_CROS_CAMERA_SENSOR_HAL_CLIENT_H_
