|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <sstream>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ERR_NO_VALUE -33
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum ParamKeyType {
 | 
					
						
							|  |  |  |   PERSISTENT = 0x02,
 | 
					
						
							|  |  |  |   CLEAR_ON_MANAGER_START = 0x04,
 | 
					
						
							|  |  |  |   CLEAR_ON_PANDA_DISCONNECT = 0x08,
 | 
					
						
							|  |  |  |   CLEAR_ON_IGNITION_ON = 0x10,
 | 
					
						
							|  |  |  |   CLEAR_ON_IGNITION_OFF = 0x20,
 | 
					
						
							|  |  |  |   ALL = 0x02 | 0x04 | 0x08 | 0x10 | 0x20
 | 
					
						
							|  |  |  | };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Params {
 | 
					
						
							|  |  |  | private:
 | 
					
						
							|  |  |  |   std::string params_path;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public:
 | 
					
						
							|  |  |  |   Params(bool persistent_param = false);
 | 
					
						
							|  |  |  |   Params(const std::string &path);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool checkKey(const std::string &key);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Delete a value
 | 
					
						
							|  |  |  |   int remove(const char *key);
 | 
					
						
							|  |  |  |   inline int remove(const std::string &key) {
 | 
					
						
							|  |  |  |     return remove (key.c_str());
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  |   void clearAll(ParamKeyType type);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // read all values
 | 
					
						
							|  |  |  |   int readAll(std::map<std::string, std::string> *params);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // helpers for reading values
 | 
					
						
							|  |  |  |   std::string get(const char *key, bool block = false);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline std::string get(const std::string &key, bool block = false) {
 | 
					
						
							|  |  |  |     return get(key.c_str(), block);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline std::string getParamsPath() {
 | 
					
						
							|  |  |  |     return params_path;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <class T>
 | 
					
						
							|  |  |  |   std::optional<T> get(const char *key, bool block = false) {
 | 
					
						
							|  |  |  |     std::istringstream iss(get(key, block));
 | 
					
						
							|  |  |  |     T value{};
 | 
					
						
							|  |  |  |     iss >> value;
 | 
					
						
							|  |  |  |     return iss.fail() ? std::nullopt : std::optional(value);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline bool getBool(const std::string &key) {
 | 
					
						
							|  |  |  |     return getBool(key.c_str());
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline bool getBool(const char *key) {
 | 
					
						
							|  |  |  |     return get(key) == "1";
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // helpers for writing values
 | 
					
						
							|  |  |  |   int put(const char* key, const char* val, size_t value_size);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline int put(const std::string &key, const std::string &val) {
 | 
					
						
							|  |  |  |     return put(key.c_str(), val.data(), val.size());
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline int putBool(const char *key, bool val) {
 | 
					
						
							|  |  |  |     return put(key, val ? "1" : "0", 1);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inline int putBool(const std::string &key, bool val) {
 | 
					
						
							|  |  |  |     return putBool(key.c_str(), val);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | };
 |