X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.cpp;h=c001df3b6e9e36bc14c9f2289f8e6c4c2502204b;hb=69b65a1551f25e8c05b20061770dedad6f2d1a29;hp=0929d8ff47164a3fb4e2bacdabd5462f7d755338;hpb=e2a6bd168da5505f150ffad21aaf03498f2a3f67;p=src%2Flow-level-can-generator.git diff --git a/src/main.cpp b/src/main.cpp index 0929d8f..c001df3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,12 +27,32 @@ #include #include #include "openxc/message_set.hpp" +#include "openxc/decoder.hpp" #define EXIT_SUCCESS 0 #define EXIT_UNKNOWN_ERROR 1 #define EXIT_COMMAND_LINE_ERROR 2 #define EXIT_PROGRAM_ERROR 3 + +/** + * FLAGS + */ + +#define INVALID_FLAG 0x0001 +#define STANDARD_ID 0x0002 +#define EXTENDED_ID 0x0004 +#define BCM_PROTOCOL 0x0008 +#define J1939_PROTOCOL 0x0010 +#define J1939_ADDR_CLAIM_PROTOCOL 0x0020 +#define ISOTP_PROTOCOL 0x0040 +#define FD_FRAME 0x0800 + +#define VERSION_LOW_CAN "2.0" + + +std::string VERSION_FILE = "1.0"; + template struct generator { @@ -109,16 +129,16 @@ template <> std::ostream& operator<<(std::ostream& o, const generator& v) { o << v.line_prefix_ - << "{std::make_shared(can_message_set_t{" + << "{std::make_shared(message_set_t{" << "0," << gen(v.v_.name()) << ",\n" - << "\t\t\t{ // beginning can_message_definition_ vector\n" + << "\t\t\t{ // beginning message_definition_ vector\n" << gen(v.v_.messages(), "\t\t\t") - << "\n\t\t}, // end can_message_definition vector\n" + << "\n\t\t}, // end message_definition vector\n" << "\t\t\t{ // beginning diagnostic_messages_ vector\n" << gen(v.v_.diagnostic_messages(),"\t\t\t") << "\n" << "\t\t\t} // end diagnostic_messages_ vector\n" - << "\t\t})} // end can_message_set entry\n"; + << "\t\t})} // end message_set entry\n"; return o; } @@ -146,22 +166,35 @@ std::ostream& operator<<(std::ostream& o, const generator std::ostream& operator<<(std::ostream& o, const generator& v) { - o << v.line_prefix_ << "{std::make_shared (can_signal_t{\n" - << v.line_prefix_ << "\t" << gen(v.v_.generic_name()) << ",\n" - << v.line_prefix_ << "\t" << v.v_.bit_position() << ",\n" - << v.line_prefix_ << "\t" << v.v_.bit_size() << ",\n" - << v.line_prefix_ << "\t" << gen(v.v_.factor()) << ",\n" - << v.line_prefix_ << "\t" << v.v_.offset() << ",\n" - << v.line_prefix_ << "\t" << "0,\n" - << v.line_prefix_ << "\t" << "0,\n" - << v.line_prefix_ << "\tfrequency_clock_t(" << gen(v.v_.max_frequency()) << "),\n" - << v.line_prefix_ << "\t" << gen(v.v_.send_same()) << ",\n" - << v.line_prefix_ << "\t" << gen(v.v_.force_send_changed()) << ",\n" - << gen(v.v_.states(), v.line_prefix_ + '\t') << ",\n" - << v.line_prefix_ << '\t' << gen(v.v_.writable()) << ",\n" - << v.line_prefix_ << '\t' << (v.v_.decoder().size() ? v.v_.decoder() : "nullptr") << ",\n" - << v.line_prefix_ << '\t' << (v.v_.encoder().size() ? v.v_.encoder() : "nullptr") << ",\n" - << v.line_prefix_ << '\t' << "false\n" + o << v.line_prefix_ << "{std::make_shared (signal_t{\n" + << v.line_prefix_ << "\t" << gen(v.v_.generic_name()) << ",// generic_name\n" + << v.line_prefix_ << "\t" << v.v_.bit_position() << ",// bit_position\n" + << v.line_prefix_ << "\t" << v.v_.bit_size() << ",// bit_size\n" + << v.line_prefix_ << "\t" << gen(v.v_.factor()) << ",// factor\n" + << v.line_prefix_ << "\t" << gen(v.v_.offset()) << ",// offset\n" + << v.line_prefix_ << "\t" << "0,// min_value\n" + << v.line_prefix_ << "\t" << "0,// max_value\n" + << v.line_prefix_ << "\tfrequency_clock_t(" << gen(v.v_.max_frequency()) << "),// frequency\n" + << v.line_prefix_ << "\t" << gen(v.v_.send_same()) << ",// send_same\n" + << v.line_prefix_ << "\t" << gen(v.v_.force_send_changed()) << ",// force_send_changed\n" + << gen(v.v_.states(), v.line_prefix_ + '\t') << ",// states\n" + << v.line_prefix_ << '\t' << gen(v.v_.writable()) << ",// writable\n" + << v.line_prefix_ << '\t' << decoder_t::add_decoder(v.v_.decoder().size() ? v.v_.decoder() : v.v_.states().size() ? "decoder_t::decode_state" : "nullptr" + , VERSION_FILE + , VERSION_LOW_CAN) << ",// decoder\n" + << v.line_prefix_ << '\t' << (v.v_.encoder().size() ? v.v_.encoder() : "nullptr") << ",// encoder\n" + << v.line_prefix_ << '\t' << "false,// received\n"; + std::string multi_first = ""; + if(v.v_.multiplex().first){ + multi_first = "true"; + }else{ + multi_first = "false"; + } + std::string multi = "std::make_pair(" + multi_first + ", " + std::to_string(v.v_.multiplex().second) + ")"; + o << v.line_prefix_ << '\t' << multi << ",// multiplex\n" + << v.line_prefix_ << '\t' << gen(v.v_.is_big_endian()) << ",// is_big_endian\n" + << v.line_prefix_ << '\t' << gen(v.v_.is_signed()) << ",// is_signed\n" + << v.line_prefix_ << "\t" << gen(v.v_.unit()) << "// unit\n" << v.line_prefix_ << "})}"; return o; } @@ -170,14 +203,48 @@ template <> std::ostream& operator<<(std::ostream& o, const generator& v) { o << v.line_prefix_ - << "{std::make_shared(can_message_definition_t{" + << "{std::make_shared(message_definition_t{" << gen(v.v_.bus()) << "," << v.v_.id() << "," - << "can_message_format_t::STANDARD," - << "frequency_clock_t(" << gen(v.v_.max_frequency()) << ")," - << gen(v.v_.force_send_changed()) << ",\n"; + << "\"" << v.v_.name() << "\"," + << v.v_.length() << ","; + uint32_t flags = 0; + if(v.v_.is_fd()) + { + flags = flags|FD_FRAME; + } + + if(v.v_.is_j1939()) + { + flags = flags|J1939_PROTOCOL; + } + + if(v.v_.is_isotp()) + { + flags = flags|ISOTP_PROTOCOL; + } + + if(v.v_.is_extended()) + { + flags = flags|EXTENDED_ID; + } + else + { + flags = flags|STANDARD_ID; + } + + + if(v.v_.is_fd()) + { + flags = flags|FD_FRAME; + } + + o << gen(flags) << ","; + + o << "frequency_clock_t(" << gen(v.v_.max_frequency()) << ")," + << gen(v.v_.force_send_changed()) << ","; std::uint32_t index = 0; - o << "\t\t\t\t\t{ // beginning can_signals vector\n"; + o << "\n\t\t\t\t\t{ // beginning signals vector\n"; std::uint32_t signal_count = (uint32_t)v.v_.signals().size(); for(const openxc::signal& s : v.v_.signals()) { @@ -186,8 +253,8 @@ std::ostream& operator<<(std::ostream& o, const generator& --signal_count; o << '\n'; } - o << "\t\t\t\t\t} // end can_signals vector\n" - << "\t\t\t\t})} // end can_message_definition entry\n"; + o << "\t\t\t\t\t} // end signals vector\n" + << "\t\t\t\t})} // end message_definition entry\n"; return o; } @@ -201,7 +268,7 @@ std::ostream& operator<<(std::ostream& o, const generator cms: message_set_)\n" << " {\n" - << " std::vector >& can_messages_definition = cms->get_can_message_definition();\n" - << " for(auto& cmd : can_messages_definition)\n" + << " std::vector> messages_definition = cms->get_messages_definition();\n" + << " for(std::shared_ptr cmd : messages_definition)\n" << " {\n" - << " cmd->set_parent(cms.get());\n" - << " std::vector >& can_signals = cmd->get_can_signals();\n" - << " for(auto& sig: can_signals)\n" + << " cmd->set_parent(cms);\n" + << " std::vector> signals = cmd->get_signals();\n" + << " for(std::shared_ptr sig: signals)\n" << " {\n" - << " sig->set_parent(cmd.get());\n" + << " sig->set_parent(cmd);\n" << " }\n" << " }\n\n" - << " std::vector >& diagnostic_messages = cms->get_diagnostic_messages();\n" - << " for(auto& dm : diagnostic_messages)\n" + << " std::vector> diagnostic_messages = cms->get_diagnostic_messages();\n" + << " for(std::shared_ptr dm : diagnostic_messages)\n" << " {\n" - << " dm->set_parent(cms.get());\n" + << " dm->set_parent(cms);\n" << " }\n" << " }\n" << " }\n\n" @@ -260,6 +327,12 @@ void generate(const std::string& header, const std::string& footer, const openxc out << "\treturn " << gen(active_bus) << ";\n" << "}\n\n"; + + + out << decoder_t::apply_patch(); + + + out << footer << std::endl; } @@ -320,6 +393,8 @@ std::cout<<" "<<"-o application-generated.cpp : output source file. Name /// @return Exit code, zero if success. int main(int argc, char *argv[]) { + + decoder_t::init_decoder(); try { std::string appName = argv[0]; @@ -386,6 +461,7 @@ int main(int argc, char *argv[]) throw std::runtime_error(ss.str()); } } + VERSION_FILE = message_set.version(); generate(header.str(), footer, message_set, output_file.size() ? out : std::cout); } catch (std::exception& e)