// Copyright 2018 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 DIAGNOSTICS_WILCO_DTC_SUPPORTD_TELEMETRY_EC_SERVICE_H_
#define DIAGNOSTICS_WILCO_DTC_SUPPORTD_TELEMETRY_EC_SERVICE_H_

#include <cstdint>
#include <memory>
#include <string>

#include <base/callback.h>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <base/observer_list.h>
#include <base/observer_list_types.h>
#include <base/sequence_checker_impl.h>
#include <base/single_thread_task_runner.h>
#include <base/threading/simple_thread.h>

#include "diagnostics/wilco_dtc_supportd/ec_constants.h"

namespace diagnostics {

namespace internal {
class EcEventMonitoringThreadDelegate;
}  // namespace internal

// Reads EC telemetry data and subscribes on EC events then distributes them to
// the list of observers.
class EcService {
 public:
  // A packet of data sent by the EC when it notices certain events have
  // occurred, such as the battery, AC adapter, or USB-C state changing.
  // The format of this packet is a variable length sequence of 16-bit words.
  // Word 0 is the |size| word, representing the number of following
  // words in the struct. Word 1 is the |type| word. The following |size|-1
  // words are the |payload|. Depending on the value of |type|, the |payload|
  // is interpreted in different ways. There are other possible values of |type|
  // and other interpretations of |payload| than those listed here. There will
  // be, at most, 6 words in the |payload|. See section 2.3 "ACPI EC Event
  // notification" of the Wilco EC specification at go/wilco-ec-spec for more
  // information.
  struct alignas(2) EcEvent {
   public:
    // Derived value representing the reason/cause of the EC event.
    //
    // NOTE: This is a computed value and not sent by the EC.
    enum Reason {
      // |SYSTEM_NOTIFY| EC event types:
      //
      // When |SystemNotifySubType| is "AC_ADAPTER" and
      // |AcAdapterFlags::Cause::NON_WILCO_CHARGER| is true.
      kNonWilcoCharger,
      // When |SystemNotifySubType| is "AC_ADAPTER" and
      // |AcAdapterFlags::Cause::LOW_POWER_CHARGER| is true.
      kLowPowerCharger,
      // When |SystemNotifySubType| is "BATTERY" and
      // |BatteryFlags::Cause::BATTERY_AUTH| is true.
      kBatteryAuth,
      // When |SystemNotifySubType| is "USB_C" and
      // |UsbCFlags::Billboard::HDMI_USBC_CONFLICT| is true.
      kDockDisplay,
      // When |SystemNotifySubType| is "USB_C" and
      // |UsbCFlags::Dock|::THUNDERBOLT_UNSUPPORTED_USING_USBC| is true.
      kDockThunderbolt,
      // When |SystemNotifySubType| is "USB_C" and
      // |UsbCFlags::Dock::INCOMPATIBLE_DOCK| is true.
      kIncompatibleDock,
      // When |SystemNotifySubType| is "USB_C" and
      // |UsbCFlags::Dock::OVERTEMP_ERROR| is true.
      kDockError,

      // |SYSTEM_NOTIFY| EC event type with no appropiate |SystemNotifySubType|
      // or flags.
      kSysNotification,
      // Non |SYSTEM_NOTIFY| EC event type.
      kNonSysNotification,
    };

    // The |type| member will be one of these.
    enum Type : uint16_t {
      // Interpret |payload| as SystemNotifyPayload.
      SYSTEM_NOTIFY = 0x0012,
    };

    // Sub-types applicable for SystemNotifyPayload.
    enum SystemNotifySubType : uint16_t {
      AC_ADAPTER = 0x0000,
      BATTERY = 0x0003,
      USB_C = 0x0008,
    };

    // Flags used within |SystemNotifyPayload|.
    struct alignas(2) AcAdapterFlags {
      enum Cause : uint16_t {
        // Barrel charger is incompatible and performance will be restricted.
        NON_WILCO_CHARGER = 1 << 0,
        // Attached charger does not supply enough power.
        LOW_POWER_CHARGER = 1 << 1,
      };
      uint16_t reserved0;
      Cause cause;
      uint16_t reserved2;
      uint16_t reserved3;
      uint16_t reserved4;
    };

    // Flags used within |SystemNotifyPayload|.
    struct alignas(2) BatteryFlags {
      enum Cause : uint16_t {
        // An incompatible battery is connected and battery will not charge.
        BATTERY_AUTH = 1 << 0,
      };
      uint16_t reserved0;
      Cause cause;
      uint16_t reserved2;
      uint16_t reserved3;
      uint16_t reserved4;
    };

    // Flags used within |SystemNotifyPayload|
    struct alignas(2) UsbCFlags {
      // "Billboard" is the name taken directly from the EC spec. It's a weird
      // name, but these can represent a variety of miscellaneous events.
      enum Billboard : uint16_t {
        // HDMI and USB Type-C ports on the dock cannot be used for
        // displays at the same time. Only the first one connected will work.
        HDMI_USBC_CONFLICT = 1 << 9,
      };
      enum Dock : uint16_t {
        // Thunderbolt is not supported on Chromebooks, so the dock
        // will fall back on using USB Type-C.
        THUNDERBOLT_UNSUPPORTED_USING_USBC = 1 << 8,
        // Attached dock is incompatible.
        INCOMPATIBLE_DOCK = 1 << 12,
        // Attached dock has overheated.
        OVERTEMP_ERROR = 1 << 15,
      };
      Billboard billboard;
      uint16_t reserved1;
      Dock dock;
    };

    // Interpretation of |payload| applicable when |type|==Type::SYSTEM_NOTIFY.
    struct alignas(2) SystemNotifyPayload {
      SystemNotifySubType sub_type;
      // Depending on |sub_type| we interpret the following data in different
      // ways. Note that these flags aren't all the same size.
      union SystemNotifyFlags {
        AcAdapterFlags ac_adapter;
        BatteryFlags battery;
        UsbCFlags usb_c;
      } flags;
    };

    EcEvent();

    EcEvent(uint16_t num_words_in_payload,
            Type type,
            const uint16_t payload[6]);

    bool operator==(const EcEvent& other) const {
      return memcmp(this, &other, sizeof(*this)) == 0;
    }

    // Extracts the EC event's reason from the event's |Type|,
    // |SystemNotifySubType| and flags.
    Reason GetReason() const;

    // Translates the |size| member into how many bytes of |payload| are used.
    size_t PayloadSizeInBytes() const;

    // |size| is the number of following 16-bit words in the event.
    // Default is 1 to account for |type| word and empty |payload|.
    uint16_t size = 1;
    Type type = static_cast<Type>(0);
    // Depending on |type| we interpret the following data in different ways.
    union {
      SystemNotifyPayload system_notify;
    } payload = {};
  };

  class Observer : public base::CheckedObserver {
   public:
    virtual ~Observer() = default;

    // Called when event from EC was received.
    virtual void OnEcEvent(const EcEvent& ec_event) = 0;
  };

  struct GetEcTelemetryResponse {
    enum Status {
      STATUS_UNSET,
      // The EC telemetry command was successfully completed.
      STATUS_OK,
      // The EC telemetry command was rejected due to the empty request payload.
      STATUS_ERROR_INPUT_PAYLOAD_EMPTY,
      // The EC telemetry command was rejected due to the request payload being
      // too large.
      STATUS_ERROR_INPUT_PAYLOAD_MAX_SIZE_EXCEEDED,
      // The EC telemetry command was failed due to EC driver error.
      STATUS_ERROR_ACCESSING_DRIVER,
    };
    Status status;
    std::string payload;
  };

  EcService();
  virtual ~EcService();

  // Starts service.
  bool Start();

  // Shuts down service.
  void ShutDown(base::Closure on_shutdown_callback);

  // Reads the telemetry information.
  GetEcTelemetryResponse GetEcTelemetry(const std::string& request_payload);

  // Overrides the file system root directory for file operations in tests.
  void set_root_dir_for_testing(const base::FilePath& root_dir) {
    root_dir_ = root_dir;
  }

  // Overrides the |event_fd_events_| in tests.
  void set_event_fd_events_for_testing(int16_t events) {
    event_fd_events_ = events;
  }

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);
  bool HasObserver(Observer* observer);

 protected:
  base::ObserverList<Observer> observers_;

 private:
  // Signal via writing to the |shutdown_fd_| that the monitoring thread should
  // shut down. Once the monitoring thread handles this event and gets ready
  // for shutting down, it will reply by scheduling an invocation of
  // OnShutdown() on the foreground thread.
  void ShutDownMonitoringThread();

  // This is called on the |task_runner_| when new EC event
  // was received by background monitoring thread.
  void OnEventAvailable(const EcEvent& ec_event);

  // This is called on the |task_runner_| when the background
  // monitoring thread is shutting down.
  void OnShutdown();

  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;

  // This callback will be invoked after current service shutdown.
  base::Closure on_shutdown_callback_;

  // The file system root directory. Can be overridden in tests.
  base::FilePath root_dir_{"/"};

  // EC event |event_fd_| and |event_fd_events_| are using for |poll()|
  // function in |monitoring_thread_|. Both can be overridden in tests.
  base::ScopedFD event_fd_;
  int16_t event_fd_events_ = kEcEventFilePollEvents;

  // Shutdown event fd. It is used to stop |poll()| immediately and shutdown
  // |monitoring_thread_|.
  base::ScopedFD shutdown_fd_;

  // The delegate which will be executed on the |monitoring_thread_|.
  std::unique_ptr<internal::EcEventMonitoringThreadDelegate>
      monitoring_thread_delegate_;
  // The backgroung thread monitoring the EC sysfs file for upcoming events.
  std::unique_ptr<base::SimpleThread> monitoring_thread_;

  base::SequenceCheckerImpl sequence_checker_;

  DISALLOW_COPY_AND_ASSIGN(EcService);
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_WILCO_DTC_SUPPORTD_TELEMETRY_EC_SERVICE_H_
