Add management of version and new decoder signature.
[src/low-level-can-generator.git] / src / main.cpp
index 9f7969f..c001df3 100644 (file)
 #include <iterator>\r
 #include <json.hpp>\r
 #include "openxc/message_set.hpp"\r
+#include "openxc/decoder.hpp"\r
 \r
 #define EXIT_SUCCESS                           0\r
 #define EXIT_UNKNOWN_ERROR                     1\r
 #define EXIT_COMMAND_LINE_ERROR                2\r
 #define EXIT_PROGRAM_ERROR                     3\r
 \r
+\r
+/**\r
+ * FLAGS\r
+ */\r
+\r
+#define INVALID_FLAG 0x0001\r
+#define STANDARD_ID 0x0002\r
+#define EXTENDED_ID 0x0004\r
+#define BCM_PROTOCOL 0x0008\r
+#define J1939_PROTOCOL 0x0010\r
+#define J1939_ADDR_CLAIM_PROTOCOL 0x0020\r
+#define ISOTP_PROTOCOL 0x0040\r
+#define FD_FRAME 0x0800\r
+\r
+#define VERSION_LOW_CAN "2.0"\r
+\r
+\r
+std::string VERSION_FILE = "1.0";\r
+\r
 template <typename T>\r
 struct generator\r
 {\r
@@ -159,7 +179,9 @@ std::ostream& operator<<(std::ostream& o, const generator<openxc::signal>& v)
                << v.line_prefix_ << "\t" << gen(v.v_.force_send_changed()) << ",// force_send_changed\n"\r
                << gen(v.v_.states(), v.line_prefix_ + '\t') << ",// states\n"\r
                << v.line_prefix_ << '\t' << gen(v.v_.writable()) << ",// writable\n"\r
-               << v.line_prefix_ << '\t' << (v.v_.decoder().size() ? v.v_.decoder() : v.v_.states().size() ? "decoder_t::decode_state" : "nullptr") << ",// decoder\n"\r
+               << v.line_prefix_ << '\t' << decoder_t::add_decoder(v.v_.decoder().size() ? v.v_.decoder() : v.v_.states().size() ? "decoder_t::decode_state" : "nullptr"\r
+                       , VERSION_FILE\r
+                       , VERSION_LOW_CAN) << ",// decoder\n"\r
                << v.line_prefix_ << '\t' << (v.v_.encoder().size() ? v.v_.encoder() : "nullptr") << ",// encoder\n"\r
                << v.line_prefix_ << '\t' << "false,// received\n";\r
                std::string multi_first = "";\r
@@ -170,8 +192,8 @@ std::ostream& operator<<(std::ostream& o, const generator<openxc::signal>& v)
                }\r
                std::string multi = "std::make_pair<bool, int>(" + multi_first + ", " + std::to_string(v.v_.multiplex().second) + ")";\r
        o       << v.line_prefix_ << '\t' << multi << ",// multiplex\n"\r
-               << v.line_prefix_ << '\t' << v.v_.is_big_endian() << ",// is_big_endian\n"\r
-               << v.line_prefix_ << '\t' << v.v_.is_signed() << ",// is_signed\n"\r
+               << v.line_prefix_ << '\t' << gen(v.v_.is_big_endian()) << ",// is_big_endian\n"\r
+               << v.line_prefix_ << '\t' << gen(v.v_.is_signed()) << ",// is_signed\n"\r
                << v.line_prefix_ << "\t" << gen(v.v_.unit()) << "// unit\n"\r
                << v.line_prefix_ << "})}";\r
        return o;\r
@@ -185,18 +207,40 @@ std::ostream& operator<<(std::ostream& o, const generator<openxc::can_message>&
                << gen(v.v_.bus()) << ","\r
                << v.v_.id() << ","\r
                << "\"" << v.v_.name() << "\","\r
-               << v.v_.length() << ","\r
-               << gen(v.v_.is_fd()) << ",";\r
-               if(v.v_.is_j1939()){\r
-                       o << "message_format_t::J1939,";\r
+               << v.v_.length() << ",";\r
+               uint32_t flags = 0;\r
+               if(v.v_.is_fd())\r
+               {\r
+                       flags = flags|FD_FRAME;\r
+               }\r
+\r
+               if(v.v_.is_j1939())\r
+               {\r
+                       flags = flags|J1939_PROTOCOL;\r
+               }\r
+\r
+               if(v.v_.is_isotp())\r
+               {\r
+                       flags = flags|ISOTP_PROTOCOL;\r
                }\r
-               else if(v.v_.is_extended())\r
+\r
+               if(v.v_.is_extended())\r
                {\r
-                       o << "message_format_t::EXTENDED,";\r
+                       flags = flags|EXTENDED_ID;\r
                }\r
-               else{\r
-                       o << "message_format_t::STANDARD,";\r
+               else\r
+               {\r
+                       flags = flags|STANDARD_ID;\r
                }\r
+\r
+\r
+               if(v.v_.is_fd())\r
+               {\r
+                       flags = flags|FD_FRAME;\r
+               }\r
+\r
+               o << gen(flags) << ",";\r
+\r
        o       << "frequency_clock_t(" << gen(v.v_.max_frequency()) << "),"\r
                << gen(v.v_.force_send_changed()) << ",";\r
                std::uint32_t index = 0;\r
@@ -224,7 +268,7 @@ std::ostream& operator<<(std::ostream& o, const generator<openxc::diagnostic_mes
                << v.line_prefix_ << "\t" << 0 << ",\n"\r
                << v.line_prefix_ << "\t" << "UNIT::INVALID" << ",\n"\r
                << v.line_prefix_ << "\t" << gen(v.v_.frequency()) << ",\n"\r
-               << v.line_prefix_ << "\t" << (v.v_.decoder().size() ? v.v_.decoder() : "nullptr") << ",\n"\r
+               << v.line_prefix_ << "\t" << decoder_t::add_decoder((v.v_.decoder().size() ? v.v_.decoder() : "nullptr"),VERSION_FILE,VERSION_LOW_CAN) << ",\n"\r
                << v.line_prefix_ << "\t" << (v.v_.callback().size() ? v.v_.callback() : "nullptr") << ",\n"\r
                << v.line_prefix_ << "\t" << "true" << ",\n"\r
                << v.line_prefix_ << "\t" << "false" << "\n"\r
@@ -283,6 +327,12 @@ void generate(const std::string& header, const std::string& footer, const openxc
 \r
        out     << "\treturn " << gen(active_bus) << ";\n"\r
                << "}\n\n";\r
+\r
+\r
+       out << decoder_t::apply_patch();\r
+\r
+\r
+\r
        out     << footer << std::endl;\r
 }\r
 \r
@@ -343,6 +393,8 @@ std::cout<<"         "<<"-o application-generated.cpp : output source file. Name
 /// @return Exit code, zero if success.\r
 int main(int argc, char *argv[])\r
 {\r
+\r
+       decoder_t::init_decoder();\r
        try\r
        {\r
                std::string appName = argv[0];\r
@@ -409,6 +461,7 @@ int main(int argc, char *argv[])
                                throw std::runtime_error(ss.str());\r
                        }\r
                }\r
+               VERSION_FILE = message_set.version();\r
                generate(header.str(), footer, message_set, output_file.size() ? out : std::cout);\r
        }\r
        catch (std::exception& e)\r