/*
 * Detector.h
 *
 * Responsible for detecting InputEvents.
 *
 * Creates two Threads;
 * One cycles over the inputs gpios and pushes detected input events to a queue.
 * The other cycles over the queue and notifies input event handlers.
 *
 *  Created on: Apr 5, 2018
 *      Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert
 */

#ifndef INPUT_IMPL_DETECTOR_H_
#define INPUT_IMPL_DETECTOR_H_


#include <thread>
#include <vector>
#include <map>

#include "input/InputPinController.h"

#include "input/Detector.h"
#include "input/DistributingEvent.h"
#include "input/EventNotifier.h"

namespace flippR_driver
{
namespace input
{
namespace detail
{

class Detector : public input::Detector
{

public:
  Detector(std::unique_ptr<input::InputPinController> input_pin_controller, std::vector<std::shared_ptr<DistributingEvent>> events);
  ~Detector() override;

private:
  void detect() const;
  void check_inputs() const;

private:
  const std::unique_ptr<input::InputPinController> input_pin_controller;

  const std::vector<std::shared_ptr<DistributingEvent>> events;

  bool is_running;
  std::thread detect_thread;
};

}
}
}
#endif
