Import CAN generator from low-level-can-service
[src/low-level-can-generator.git] / src / openxc / message_set.cpp
diff --git a/src/openxc/message_set.cpp b/src/openxc/message_set.cpp
new file mode 100755 (executable)
index 0000000..d6745bf
--- /dev/null
@@ -0,0 +1,145 @@
+#include <sstream>\r
+#include "message_set.hpp"\r
+\r
+namespace openxc\r
+{\r
+       message_set::message_set()\r
+               : name_{""}\r
+               , bit_numbering_inverted_{false}\r
+               , max_message_frequency_{0}\r
+               , raw_can_mode_{can_bus_mode::off}\r
+               , parents_{}\r
+               , initializers_{}\r
+               , loopers_{}\r
+               , buses_{}\r
+               , messages_{}\r
+               , diagnostic_messages_{}\r
+               , mappings_{}\r
+               , extra_sources_{}\r
+               , commands_{}\r
+       {\r
+       }\r
+       \r
+       std::string message_set::name() const\r
+       {\r
+               return name_;\r
+       }\r
+       \r
+       bool message_set::bit_numbering_inverted() const\r
+       {\r
+               return bit_numbering_inverted_;\r
+       }\r
+       \r
+       float message_set::max_message_frequency() const\r
+       {\r
+               return max_message_frequency_;\r
+       }\r
+       \r
+       can_bus_mode message_set::raw_can_mode() const\r
+       {\r
+               return raw_can_mode_;\r
+       }\r
+       \r
+       const std::vector<std::string>& message_set::parents() const\r
+       {\r
+               return parents_;\r
+       }\r
+       \r
+       const std::vector<std::string>& message_set::initializers() const\r
+       {\r
+               return initializers_;\r
+       }\r
+       \r
+       const std::vector<std::string>& message_set::loopers() const\r
+       {\r
+               return loopers_;\r
+       }\r
+       \r
+       const std::map<std::string, can_bus>& message_set::buses() const\r
+       {\r
+               return buses_;\r
+       }\r
+       \r
+       const std::vector<can_message>& message_set::messages() const\r
+       {\r
+               return messages_;\r
+       }\r
+       \r
+       const std::vector<diagnostic_message>& message_set::diagnostic_messages() const\r
+       {\r
+               return diagnostic_messages_;\r
+       }\r
+       \r
+       const std::vector<mapping>& message_set::mappings() const\r
+       {\r
+               return mappings_;\r
+       }\r
+       \r
+       const std::vector<std::string>& message_set::extra_sources() const\r
+       {\r
+               return extra_sources_;\r
+       }\r
+       \r
+       const std::vector<command>& message_set::commands() const\r
+       {\r
+               return commands_;\r
+       }\r
+\r
+       void message_set::from_json(const nlohmann::json& j)\r
+       {\r
+               name_ = j["name"].get<std::string>();\r
+               bit_numbering_inverted_ = j.count("bit_numbering_inverted") ? j["bit_numbering_inverted"].get<bool>() : false; // TODO: should be true by default if database-backed.\r
+               max_message_frequency_ = j.count("max_message_frequency") ? j["max_message_frequency"].get<float>() : 0.0f;\r
+               raw_can_mode_ = j.count("raw_can_mode") ? j["raw_can_mode"].get<can_bus_mode>() : can_bus_mode::off;\r
+               parents_ = j.count("parents") ? j["parents"].get<std::vector<std::string>>() : std::vector<std::string>();\r
+               initializers_ = j.count("initializers") ? j["initializers"].get<std::vector<std::string>>() : std::vector<std::string>();\r
+               loopers_ = j.count("loopers") ? j["loopers"].get<std::vector<std::string>>() : std::vector<std::string>();\r
+               buses_ = j.count("buses") ? j["buses"].get<std::map<std::string, can_bus>>() : std::map<std::string, can_bus>();\r
+               //messages_ = j.count("messages") ? j["messages"].get<std::map<std::string, can_message>>() : std::map<std::string, can_message>();\r
+               diagnostic_messages_ = j.count("diagnostic_messages") ? j["diagnostic_messages"].get<std::vector<diagnostic_message>>() : std::vector<diagnostic_message>();\r
+               mappings_ = j.count("mappings") ? j["mappings"].get<std::vector<mapping>>() : std::vector<mapping>();\r
+               extra_sources_ = j.count("extra_sources") ? j["extra_sources"].get<std::vector<std::string>>() : std::vector<std::string>();\r
+               commands_ = j.count("commands") ? j["commands"].get<std::vector<command>>() : std::vector<command>();\r
+               \r
+               \r
+               if (j.count("messages"))\r
+               {\r
+                       std::map<std::string, nlohmann::json> messages = j["messages"];\r
+                       for(const std::map<std::string, nlohmann::json>::value_type& m : messages)\r
+                       {\r
+                               can_message cm = m.second.get<can_message>();\r
+                               cm.id(m.first);\r
+                               messages_.push_back(cm);\r
+                       }\r
+               }\r
+       }\r
+\r
+       nlohmann::json message_set::to_json() const\r
+       {\r
+               nlohmann::json j;\r
+               j["name_"]                                              = name_;\r
+               j["bit_numbering_inverted"]             = bit_numbering_inverted_;\r
+               j["max_message_frequency"]              = max_message_frequency_;\r
+               j["raw_can_mode"]                               = raw_can_mode_;\r
+               j["parents"]                                    = parents_;\r
+               j["initializers"]                               = initializers_;\r
+               j["loopers"]                                    = loopers_;\r
+               j["buses"]                                              = buses_;\r
+               j["messages"]                                   = messages_;\r
+               j["diagnostic_messages"]                = diagnostic_messages_;\r
+               j["mappings"]                                   = mappings_;\r
+               j["extra_sources"]                              = extra_sources_;\r
+               j["commands"]                                   = commands_;\r
+               return j;\r
+       }\r
+\r
+       void to_json(nlohmann::json& j, const message_set& p)\r
+       {\r
+               j = p.to_json();\r
+       }\r
+\r
+       void from_json(const nlohmann::json& j, message_set& p)\r
+       {\r
+               p.from_json(j);\r
+       }\r
+}\r