/*
 * Copyright 2017 Google Inc. 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:
  SB_DISALLOW_COPY_AND_ASSIGN(AnalogThumbstickThread);
  class Impl;
  scoped_ptr<Impl> impl_;
};

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

#endif  // STARBOARD_SHARED_UWP_ANALOG_THUMBSTICK_INPUT_THREAD_H_
