VSM C++ SDK
Vehicle Specific Modules SDK
property.h
1 /*
2  * property.h
3  *
4  * Created on: Jul 10, 2016
5  * Author: janis
6  */
7 
8 #ifndef SRC_PROPERTY_H_
9 #define SRC_PROPERTY_H_
10 
11 #include <ucs_vsm_proto.h>
12 #include <ugcs/vsm/utils.h>
13 #include <ugcs/vsm/optional.h>
14 #include <unordered_map>
15 
16 namespace ugcs {
17 namespace vsm {
18 
19 class Property: public std::enable_shared_from_this<Property>
20 {
22 public:
23 
24  typedef enum {
25  VALUE_TYPE_INT = 1,
26  VALUE_TYPE_FLOAT = 2,
27  VALUE_TYPE_DOUBLE = 3,
28  VALUE_TYPE_STRING = 4,
29  VALUE_TYPE_BOOL = 5,
30  VALUE_TYPE_ENUM = 6,
31  VALUE_TYPE_NONE = 7,
32  } Value_type;
33 
34  typedef enum {
35  VALUE_SPEC_REGULAR = 1, // Value is valid
36  VALUE_SPEC_NA = 2, // Value is "N/A"
37  } Value_spec;
38 
39  // Create from built in semantics
40  Property(int id, const std::string& name, ugcs::vsm::proto::Field_semantic semantic);
41 
42  // Create with user defined semantic
43  Property(int id, const std::string& name, Value_type type);
44 
45  // Create a copy of property
47 
48  // Create and set value.
49  template<typename Type>
50  Property(
51  const std::string& name,
52  Type value,
53  Value_type value_type):Property(0, name, value_type)
54  {
55  Set_value(value);
56  }
57 
58  // Create and set value.
59  template<typename Type>
60  Property(
61  const std::string& name,
62  ugcs::vsm::proto::Field_semantic semantic,
63  Type value):Property(0, name, semantic)
64  {
65  Set_value(value);
66  }
67 
68  void
69  Add_enum(const std::string& name, int value);
70 
71  void
72  Set_value(bool v);
73 
74  void
75  Set_value(double v);
76 
77  void
78  Set_value(const std::string& v);
79 
80  void
81  Set_value(const char* v);
82 
83  void
84  Set_value(int v);
85 
86  void
87  Set_value(unsigned int v);
88 
89  void
90  Set_value_na();
91 
92  // Set value from incoming message
93  bool
94  Set_value(const ugcs::vsm::proto::Field_value& val);
95 
96  void
97  Register(ugcs::vsm::proto::Register_field* field);
98 
99  void
100  Write_as_property(ugcs::vsm::proto::Property_field* field);
101 
102  void
103  Write_as_parameter(ugcs::vsm::proto::Parameter_field* field);
104 
105  void
106  Write_as_telemetry(ugcs::vsm::proto::Telemetry_field* field);
107 
108  void
109  Set_timeout(int);
110 
112  Min_value();
113 
115  Max_value();
116 
118  Default_value();
119 
120  bool
121  Get_value(bool &v);
122 
123  bool
124  Get_value(float &v);
125 
126  bool
127  Get_value(double &v);
128 
129  bool
130  Get_value(std::string& v);
131 
132  bool
133  Get_value(int &v);
134 
135  bool
136  Is_value_na();
137 
138  // true if value has been changed.
139  // Checks for timeout and automatically sets value to NA and
140  // returns true if value has timeouted.
141  bool
142  Is_changed();
143 
144  // Force sending telemetry on value update even if value has not changed.
145  void
146  Set_changed();
147 
148  int
149  Get_id() {return field_id;};
150 
151  std::string
152  Get_name() {return name;};
153 
154  ugcs::vsm::proto::Field_semantic
155  Get_semantic() {return semantic;};
156 
157  std::chrono::time_point<std::chrono::system_clock>
158  Get_update_time() {return update_time;};
159 
160  std::string
161  Dump_value();
162 
163 private:
164 
165  void
166  Write_value(ugcs::vsm::proto::Field_value* field);
167 
168  bool is_changed = false; // new value set. reset to false after sending to ucs.
169 
170  Value_type type = VALUE_TYPE_NONE;
171  ugcs::vsm::proto::Field_semantic semantic = ugcs::vsm::proto::FIELD_SEMANTIC_DEFAULT;
172 
173  int field_id = 0;
174  std::string name;
175 
176  std::string string_value;
177  bool bool_value = false;
178  double double_value = 0;
179  int int_value = 0;
180 
181  Property::Ptr default_value;
182  Property::Ptr min_value;
183  Property::Ptr max_value;
184 
185  std::unordered_map<int, std::string> enum_values;
186  std::chrono::seconds timeout = std::chrono::seconds(0); // timeout in seconds
187  Value_spec value_spec = VALUE_SPEC_NA;
188  std::chrono::time_point<std::chrono::system_clock> update_time;
189 };
190 
191 class Property_list : public std::unordered_map<std::string, Property::Ptr>
192 {
193 public:
194  template<typename Type>
195  bool
196  Get_value(const std::string& name, Type& value)
197  {
198  auto it = find(name);
199  if (it != end() && !it->second->Is_value_na()) {
200  return it->second->Get_value(value);
201  }
202  return false;
203  }
204 };
205 
206 
207 } /* namespace vsm */
208 } /* namespace ugcs */
209 
210 #endif /* SRC_PROPERTY_H_ */
UGCS root namespace.
Definition: android-linux/ugcs/vsm/platform_sockets.h:27
Definition: property.h:191
std::shared_ptr< Property > Ptr
Pointer type.
Definition: property.h:21
Various common utilities.
Definition: property.h:19
#define DEFINE_COMMON_CLASS(__class_name,...)
Use this macro to define some common attributes for a class.
Definition: utils.h:25