
// Created by rhetenor on 04.10.18.
//

#ifndef flippR_driver_OUTPUTDRIVERFACTORY_H
#define flippR_driver_OUTPUTDRIVERFACTORY_H

#include "output/OutputDriver.h"
#include "output/items/detail/Solenoid.h"
#include "output/items/detail/Lamp.h"
#include "output/items/detail/Sound.h"
#include "output/items/Flipper.h"
#include "output/items/detail/Flipper.h"
#include "output/DisplayBoardPinController.h"

#include "json/json.hpp"

#include <memory>

namespace flippR_driver
{
namespace output
{
namespace OutputDriverFactory
{
std::shared_ptr<OutputDriver> get_OutputDriver(const std::string & solenoid_config_path,
                                                  const std::string & lamp_config_path,
                                                  const std::string & sound_config_path,
                                                  const std::string & display_config_path);

std::chrono::microseconds get_update_frequency(const std::string & display_config_path);

template<typename FactoryType, typename ControllerType, typename ItemType>
std::map<std::string, std::shared_ptr<ItemType>> get_items(const std::string & config_path, std::shared_ptr<PinController> pin_controller);

}
}
}

#endif //flippR_driver_OUTPUTDRIVERFACTORY_H