1 #pragma once
2 
3 #include <cstdint>
4 #include <map>
5 #include <stdexcept>
6 #include <string>
7 #include <unordered_map>
8 #include <utility>
9 #include <vector>
10 
11 namespace pid_control
12 {
13 
14 struct VariantToDoubleVisitor
15 {
16     template <typename T>
17     std::enable_if_t<std::is_arithmetic<T>::value, double>
operator ()pid_control::VariantToDoubleVisitor18         operator()(const T& t) const
19     {
20         return static_cast<double>(t);
21     }
22 
23     template <typename T>
24     std::enable_if_t<!std::is_arithmetic<T>::value, double>
operator ()pid_control::VariantToDoubleVisitor25         operator()([[maybe_unused]] const T& t) const
26     {
27         throw std::invalid_argument("Cannot translate type to double");
28     }
29 };
30 
31 std::string getSensorPath(const std::string& type, const std::string& id);
32 std::string getMatch(const std::string& path);
33 void scaleSensorReading(const double min, const double max, double& value);
34 bool validType(const std::string& type);
35 
36 bool findSensors(const std::unordered_map<std::string, std::string>& sensors,
37                  const std::string& search,
38                  std::vector<std::pair<std::string, std::string>>& matches);
39 
40 // Set zone number for a zone, 0-based
41 int64_t setZoneIndex(const std::string& name,
42                      std::map<std::string, int64_t>& zones, int64_t index);
43 
44 // Read zone number for a zone.
45 int64_t getZoneIndex(const std::string& name,
46                      std::map<std::string, int64_t>& zones);
47 
48 } // namespace pid_control
49