// Copyright 2017 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.

#ifndef DEVICE_GAMEPAD_ABSTRACT_HAPTIC_GAMEPAD_
#define DEVICE_GAMEPAD_ABSTRACT_HAPTIC_GAMEPAD_

#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "device/gamepad/gamepad_export.h"
#include "device/gamepad/public/mojom/gamepad.mojom.h"

namespace device {

// AbstractHapticGamepad is a base class for gamepads that support dual-rumble
// vibration effects. To use it, override the SetVibration method so that it
// sets the vibration intensity on the device. Then, calling PlayEffect or
// ResetVibration will call your SetVibration method at the appropriate times
// to produce the desired vibration effect. When the effect is complete, or when
// it has been preempted by another effect, the callback is invoked with a
// result code.
//
// By default, SetZeroVibration simply calls SetVibration with both parameters
// set to zero. You may optionally override SetZeroVibration if the device has a
// more efficient means of stopping an ongoing effect.
class DEVICE_GAMEPAD_EXPORT AbstractHapticGamepad {
 public:
  AbstractHapticGamepad();
  virtual ~AbstractHapticGamepad();

  // Start playing a haptic effect of type |type|, described by |params|. When
  // the effect is complete, or if it encounters an error, the result code is
  // passed back to the caller on its own sequence by calling |callback| using
  // |callback_runner|.
  void PlayEffect(
      mojom::GamepadHapticEffectType type,
      mojom::GamepadEffectParametersPtr params,
      mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback callback,
      scoped_refptr<base::SequencedTaskRunner> callback_runner);

  // Reset vibration on the gamepad, perhaps interrupting an ongoing effect. A
  // result code is passed back to the caller on its own sequence by calling
  // |callback| using |callback_runner|.
  void ResetVibration(
      mojom::GamepadHapticsManager::ResetVibrationActuatorCallback callback,
      scoped_refptr<base::SequencedTaskRunner> callback_runner);

  // Stop vibration effects, run callbacks, and release held resources. Must be
  // called before the device is destroyed.
  void Shutdown();

  // Set the vibration magnitude for the strong and weak vibration actuators.
  virtual void SetVibration(double strong_magnitude, double weak_magnitude) = 0;

  // Set the vibration magnitude for both actuators to zero.
  virtual void SetZeroVibration();

  // The maximum effect duration supported by this device. Long-running effects
  // must be divided into effects of this duration or less.
  virtual double GetMaxEffectDurationMillis();

 private:
  // Override to perform additional shutdown actions after vibration effects
  // are halted and callbacks are issued.
  virtual void DoShutdown() {}

  void PlayDualRumbleEffect(int sequence_id,
                            double duration,
                            double start_delay,
                            double strong_magnitude,
                            double weak_magnitude);
  void StartVibration(int sequence_id,
                      double duration,
                      double strong_magnitude,
                      double weak_magnitude);
  void FinishEffect(int sequence_id);

  bool is_shut_down_;
  int sequence_id_;
  mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback
      playing_effect_callback_;
  scoped_refptr<base::SequencedTaskRunner> callback_runner_;
  THREAD_CHECKER(thread_checker_);
  base::WeakPtrFactory<AbstractHapticGamepad> weak_factory_;
};

}  // namespace device

#endif  // DEVICE_GAMEPAD_ABSTRACT_HAPTIC_GAMEPAD_
