You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

dbcc_module_wrapper.cpp 7.9 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "pybind11/pybind11.h"
  2. #include "pybind11/stl.h"
  3. #include <cstring> /**< memmove */
  4. #include <sstream> /**< std::stringstream */
  5. #include "dbcc/dbc_iterator.h"
  6. #include "dbcc/message.h"
  7. #include "dbcc/signal.h"
  8. #include "dbcc/helper/gen_helper.h"
  9. #include "dbcc/version.h"
  10. using namespace pybind11;
  11. PYBIND11_MODULE(_dbcc, m)
  12. {
  13. m.def("version", &ad::dbcc::version);
  14. enum_<ad::dbcc::ByteOrder>(m, "ByteOrder")
  15. .value("Motorola", ad::dbcc::ByteOrder::kMotorola)
  16. .value("Intel", ad::dbcc::ByteOrder::kIntel)
  17. .export_values();
  18. enum_<ad::dbcc::Sign>(m, "Sign")
  19. .value("Unsigned", ad::dbcc::Sign::kUnsigned)
  20. .value("Signed", ad::dbcc::Sign::kSigned)
  21. .export_values();
  22. enum_<ad::dbcc::Multiplexor>(m, "Multiplexor")
  23. .value("None", ad::dbcc::Multiplexor::kNone)
  24. .value("Multiplexed", ad::dbcc::Multiplexor::kMultiplexed)
  25. .value("Multiplexor", ad::dbcc::Multiplexor::kMultiplexor)
  26. .export_values();
  27. class_<ad::dbcc::Signal::LayoutInfo>(m, "SignalLayoutInfo")
  28. .def_readonly("bits", &ad::dbcc::Signal::LayoutInfo::bits)
  29. .def_readonly("byte_lines", &ad::dbcc::Signal::LayoutInfo::byte_lines)
  30. .def_readonly("byte_line_range", &ad::dbcc::Signal::LayoutInfo::byte_line_range);
  31. class_<ad::dbcc::Signal>(m, "Signal")
  32. .def("__str__",
  33. [](ad::dbcc::Signal& sig) {
  34. std::stringstream ss;
  35. ss << "Signal(" << sig.Name() << "[" << (sig.IsFloat() ? "float" : "int")
  36. << "]: " << sig.StartBit() << "," << sig.Length() << " "
  37. << "(" << sig.Factor() << "," << sig.Offset() << ") "
  38. << "[" << sig.Minimum() << "," << sig.Maximum() << "]";
  39. return ss.str();
  40. })
  41. .def("__repr__",
  42. [](ad::dbcc::Signal& s) {
  43. std::stringstream ss;
  44. ss << "<dbcc.Signal name: " << s.Name() << ">";
  45. return ss.str();
  46. })
  47. .def("dbc_str",
  48. [](ad::dbcc::Signal& sig) {
  49. std::stringstream ss;
  50. ss << sig;
  51. return ss.str();
  52. })
  53. .def("encode",
  54. [](ad::dbcc::Signal& sig, double value, bytearray& ba) {
  55. Py_buffer buffer;
  56. if (PyObject_GetBuffer(ba.ptr(), &buffer, PyBUF_WRITABLE) < 0) {
  57. return;
  58. }
  59. sig.Encode(value, reinterpret_cast<uint8_t*>(buffer.buf), buffer.len);
  60. PyBuffer_Release(&buffer);
  61. })
  62. .def("decode",
  63. [](ad::dbcc::Signal& sig, bytearray& ba) -> double {
  64. double ret = 0;
  65. Py_buffer buffer;
  66. if (PyObject_GetBuffer(ba.ptr(), &buffer, PyBUF_SIMPLE) == 0) {
  67. sig.Decode(reinterpret_cast<uint8_t*>(buffer.buf), buffer.len, ret);
  68. PyBuffer_Release(&buffer);
  69. }
  70. return ret;
  71. })
  72. .def("bits_layout",
  73. [](ad::dbcc::Signal& sig) -> ad::dbcc::Signal::LayoutInfo {
  74. ad::dbcc::Signal::LayoutInfo ret;
  75. sig.BitsLayout(ret);
  76. return ret;
  77. })
  78. .def_property_readonly("name", &ad::dbcc::Signal::Name)
  79. .def_property_readonly("byte_order", &ad::dbcc::Signal::GetByteOrder)
  80. .def_property_readonly("start_bit", &ad::dbcc::Signal::StartBit)
  81. .def_property_readonly("length", &ad::dbcc::Signal::Length)
  82. .def_property_readonly("sign", &ad::dbcc::Signal::GetSign)
  83. .def_property_readonly("min", &ad::dbcc::Signal::Minimum)
  84. .def_property_readonly("max", &ad::dbcc::Signal::Maximum)
  85. .def_property_readonly("factor", &ad::dbcc::Signal::Factor)
  86. .def_property_readonly("offset", &ad::dbcc::Signal::Offset)
  87. .def_property_readonly("unit", &ad::dbcc::Signal::Unit)
  88. .def_property_readonly("is_float", &ad::dbcc::Signal::IsFloat)
  89. .def_property_readonly("multiplexor", &ad::dbcc::Signal::GetMultiplexor)
  90. .def_property_readonly("multiplexed_num", &ad::dbcc::Signal::MultiplexedNumber)
  91. .def_property_readonly("to", &ad::dbcc::Signal::To);
  92. class_<ad::dbcc::Message>(m, "Message")
  93. .def("__len__", &ad::dbcc::Message::SignalCount)
  94. /* Essential: keep object alive while iterator exists */
  95. .def(
  96. "__iter__",
  97. [](ad::dbcc::Message& s) {
  98. return make_iterator(s.begin(), s.end());
  99. },
  100. keep_alive<0, 1>())
  101. .def("__getitem__",
  102. [](ad::dbcc::Message& s, size_t i) {
  103. if (i >= s.SignalCount()) {
  104. throw index_error();
  105. }
  106. return s[i];
  107. })
  108. .def("__str__",
  109. [](ad::dbcc::Message& s) {
  110. std::stringstream ss;
  111. ss << "Message(" << s.Name() << "[0x" << std::hex << s.Id() << std::dec << ", "
  112. << s.Id() << "])";
  113. return ss.str();
  114. })
  115. .def("__repr__",
  116. [](ad::dbcc::Message& s) {
  117. std::stringstream ss;
  118. ss << "<dbcc.Message name: " << s.Name() << ", id: 0x" << std::hex << s.Id()
  119. << ", " << std::dec << s.Id() << ">";
  120. return ss.str();
  121. })
  122. .def("dbc_str",
  123. [](ad::dbcc::Message& m) {
  124. std::stringstream ss;
  125. ss << m;
  126. return ss.str();
  127. })
  128. .def_property_readonly("name", &ad::dbcc::Message::Name)
  129. .def_property_readonly("id", &ad::dbcc::Message::Id)
  130. .def_property_readonly("dlc", &ad::dbcc::Message::Dlc)
  131. .def_property_readonly("from", &ad::dbcc::Message::From)
  132. .def_property_readonly("to", &ad::dbcc::Message::To);
  133. class_<ad::dbcc::DbcIterator>(m, "DbcParser")
  134. .def(init<const std::string&>())
  135. .def("__len__", &ad::dbcc::DbcIterator::size)
  136. /* Essential: keep object alive while iterator exists */
  137. .def(
  138. "__iter__",
  139. [](ad::dbcc::DbcIterator& s) {
  140. return make_iterator(s.begin(), s.end());
  141. },
  142. keep_alive<0, 1>())
  143. .def("__getitem__", [](ad::dbcc::DbcIterator& s, size_t i) {
  144. if (i >= s.size()) {
  145. throw index_error();
  146. }
  147. return s[i];
  148. });
  149. class_<ad::dbcc::helper::GenHelper>(m, "GenHelper")
  150. .def(init<const std::string&, const std::string&>())
  151. .def("gen_all", [](ad::dbcc::helper::GenHelper &gen_helper) {
  152. return gen_helper.GenAll();
  153. })
  154. .def("gen_msg_def", [](ad::dbcc::helper::GenHelper &gen_helper, const std::string &msg, int indent_level) {
  155. return gen_helper.GenMessageDef(msg, indent_level);
  156. })
  157. .def("gen_msg_unpack_decl", [](ad::dbcc::helper::GenHelper &gen_helper, const std::string &msg, int indent_level) {
  158. return gen_helper.GenMessageUnpackDecl(msg, indent_level);
  159. })
  160. .def("gen_msg_unpack_def", [](ad::dbcc::helper::GenHelper &gen_helper, const std::string &msg, int indent_level) {
  161. return gen_helper.GenMessageUnpackDef(msg, indent_level);
  162. })
  163. .def("gen_msg_pack_decl", [](ad::dbcc::helper::GenHelper &gen_helper, const std::string &msg, int indent_level) {
  164. return gen_helper.GenMessagePackDecl(msg, indent_level);
  165. })
  166. .def("gen_msg_pack_def", [](ad::dbcc::helper::GenHelper &gen_helper, const std::string &msg, int indent_level) {
  167. return gen_helper.GenMessagePackDef(msg, indent_level);
  168. })
  169. .def("gen_macros", [](ad::dbcc::helper::GenHelper &gen_helper) {
  170. return ad::dbcc::helper::GenHelper::GenMacros();
  171. });
  172. }