/*
 * Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef STARBOARD_SHARED_UWP_ANALOG_THUMBSTICK_INPUT_THREAD_H_
#define STARBOARD_SHARED_UWP_ANALOG_THUMBSTICK_INPUT_THREAD_H_

#include "starboard/common/scoped_ptr.h"
#include "starboard/configuration.h"
#include "starboard/input.h"

namespace starboard {
namespace shared {
namespace uwp {

// This class represents a thread that will poll all gamepads for
// the analog sticks. The sticks are summed together and then
// the callback will be invoked with the thumbstick values.
class AnalogThumbstickThread {
 public:
  enum { kPollingFrequency = 120 };  // Smooth playback for 60fps.

  class Callback {
   public:
    virtual ~Callback() {}
    virtual void OnJoystickUpdate(SbKey key, SbInputVector position) = 0;
  };

  explicit AnalogThumbstickThread(Callback* cb);
  ~AnalogThumbstickThread();

 private:
  AnalogThumbstickThread(const AnalogThumbstickThread&) = delete;
  void operator=(const AnalogThumbstickThread&) = delete;

  class Impl;
  scoped_ptr<Impl> impl_;
};

}  // namespace uwp
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_UWP_ANALOG_THUMBSTICK_INPUT_THREAD_H_
