File: SpiDevFactory.h

package info (click to toggle)
libexadrums 0.7.0-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 652 kB
  • sloc: cpp: 6,970; ansic: 220; makefile: 160; sh: 12
file content (75 lines) | stat: -rw-r--r-- 1,811 bytes parent folder | download | duplicates (2)
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 */