// Copyright 2019 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 LIBMEMS_IIO_DEVICE_TRIGGER_IMPL_H_
#define LIBMEMS_IIO_DEVICE_TRIGGER_IMPL_H_

#include <iio.h>

#include <string>
#include <vector>

#include <base/optional.h>

#include "libmems/export.h"
#include "libmems/iio_device.h"

namespace libmems {

class IioChannel;
class IioContext;
class IioContextImpl;

class LIBMEMS_EXPORT IioDeviceTriggerImpl : public IioDevice {
 public:
  // Return -1 for iio_sysfs_trigger
  static base::Optional<int> GetIdFromString(const char* id_str);
  // Return iio_sysfs_trigger for -1
  static std::string GetStringFromId(int id);

  // iio_device objects are kept alive by the IioContextImpl.
  IioDeviceTriggerImpl(IioContextImpl* ctx, iio_device* dev);
  IioDeviceTriggerImpl(const IioDeviceTriggerImpl&) = delete;
  IioDeviceTriggerImpl& operator=(const IioDeviceTriggerImpl&) = delete;

  ~IioDeviceTriggerImpl() override = default;

  IioContext* GetContext() const override;

  const char* GetName() const override;
  // Return -1 for iio_sysfs_trigger
  int GetId() const override;

  base::FilePath GetPath() const override;

  base::Optional<std::string> ReadStringAttribute(
      const std::string& name) const override;
  base::Optional<int64_t> ReadNumberAttribute(
      const std::string& name) const override;
  base::Optional<double> ReadDoubleAttribute(
      const std::string& name) const override;

  bool WriteStringAttribute(const std::string& name,
                            const std::string& value) override {
    return false;
  }
  bool WriteNumberAttribute(const std::string& name, int64_t value) override;
  bool WriteDoubleAttribute(const std::string& name, double value) override;

  bool HasFifo() const override { return false; }

  iio_device* GetUnderlyingIioDevice() const override { return nullptr; }

  bool SetTrigger(IioDevice* trigger_device) override { return false; }
  IioDevice* GetTrigger() override { return nullptr; }
  IioDevice* GetHrtimer() override { return nullptr; }

  base::Optional<size_t> GetSampleSize() const override {
    return base::nullopt;
  }

  bool EnableBuffer(size_t num) override { return false; }
  bool DisableBuffer() override { return false; }
  bool IsBufferEnabled(size_t* num = nullptr) const override { return false; }

  bool CreateBuffer() override { return false; }
  base::Optional<int32_t> GetBufferFd() override { return base::nullopt; }
  base::Optional<IioSample> ReadSample() override { return base::nullopt; }
  void FreeBuffer() override {}

 private:
  IioContextImpl* context_;    // non-owned
  iio_device* const trigger_;  // non-owned

  std::string log_prefix_;
};

}  // namespace libmems

#endif  // LIBMEMS_IIO_DEVICE_TRIGGER_IMPL_H_
