1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
#ifndef LIBEXADRUMS_IO_SPIDEVICES_SPIDEVFACTORY_H
#define LIBEXADRUMS_IO_SPIDEVICES_SPIDEVFACTORY_H
#include "../../Util/ErrorHandling.h"
#include "MCP3XXX.h"
#include "SpiDev.h"
#include <functional>
#include <map>
#include <memory>
#include <ranges>
#include <string>
#include <vector>
namespace IO
{
class SpiDevFactory
{
public:
SpiDevFactory() = default;
SpiDevPtr MakeMCP3008(size_t dev, size_t cs) const
{
return std::make_unique<MCP3008>(dev, cs);
}
SpiDevPtr MakeMCP3204(size_t dev, size_t cs) const
{
return std::make_unique<MCP3204>(dev, cs);
}
SpiDevPtr MakeMCP3208(size_t dev, size_t cs) const
{
return std::make_unique<MCP3208>(dev, cs);
}
SpiDevPtr Make(const std::string& type, size_t dev, size_t cs) &&
{
auto iter = spiDevMap.find(type);
if(iter == spiDevMap.end())
{
throw Util::Exception("Spi device type doesn't exist.", Util::error_type_error);
}
return std::invoke(iter->second, this, dev, cs);
}
auto GetTypes() &&
{
using namespace std::views;
return std::vector<std::string>{ keys(spiDevMap).begin(), keys(spiDevMap).end() };
}
private:
using FactoryPtmf = SpiDevPtr(SpiDevFactory::*)(size_t, size_t) const;
using SpiDevMap = std::map<std::string, FactoryPtmf>;
const SpiDevMap spiDevMap
{
{"MCP3008", &SpiDevFactory::MakeMCP3008},
{"MCP3204", &SpiDevFactory::MakeMCP3204},
{"MCP3208", &SpiDevFactory::MakeMCP3208},
};
};
} // namespace IO
#endif /* LIBEXADRUMS_IO_SPIDEVICES_SPIDEVFACTORY_H */
|