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.

signal_processor.cpp 5.3 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "dbcc/signal_processor.h"
  2. #include <tuple>
  3. namespace ad {
  4. namespace dbcc {
  5. size_t SignalProcessor::_signalIndex(uint32_t msgId, const std::string &signalName)
  6. {
  7. auto msgIter = m_dbcIter.find(msgId);
  8. if (msgIter == m_dbcIter.end())
  9. {
  10. return InvalidIndex;
  11. }
  12. if (!msgIter->contains(signalName))
  13. {
  14. return InvalidIndex;
  15. }
  16. return (*msgIter)[signalName];
  17. }
  18. bool SignalProcessor::decodeMessage(uint32_t msgId, const uint8_t *data, size_t length)
  19. {
  20. ad::dbcc::ParsedValue pv;
  21. auto iter = m_decoderMap.find(msgId);
  22. if (iter == m_decoderMap.end())
  23. {
  24. return false;
  25. }
  26. ad::dbcc::Message msg;
  27. std::vector<size_t> vt;
  28. std::tie(msg, vt) = iter->second;
  29. for (size_t i = 0; i < vt.size(); i++)
  30. {
  31. auto & sig = msg[vt[i]];
  32. if (sig.decode(data, length, pv))
  33. {
  34. sig.getDecodeDelegate()->onDecoded(msgId, sig.name(), pv);
  35. }
  36. else
  37. {
  38. std::cout << "[WARNING] Failed to decode: " << msgId << ":" << sig.name() << std::endl;
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44. bool SignalProcessor::encodeMessage(uint32_t msgId, const SignalValues &pvs, uint8_t *data, size_t length)
  45. {
  46. auto iter = m_encoderMap.find(msgId);
  47. if (iter == m_encoderMap.end())
  48. {
  49. return false;
  50. }
  51. ad::dbcc::Message msg;
  52. std::vector<size_t> vt;
  53. std::tie(msg, vt) = iter->second;
  54. for (size_t i = 0; i < pvs.size(); i++)
  55. {
  56. auto &pv = pvs[i];
  57. auto idx = msg[pv.first];
  58. if (idx != InvalidIndex)
  59. {
  60. auto &sig = msg[idx];
  61. if (sig.encode(pv.second, data, length))
  62. {
  63. if (!sig.getEncodeDelegate()->onEncoded(msgId, sig.name(), data, length, pv.second, i == pvs.size() - 1))
  64. {
  65. break;
  66. }
  67. }
  68. else
  69. {
  70. std::cout << "[WARNING] Failed to encode: " << msgId << ":" << sig.name() << std::endl;
  71. return false;
  72. }
  73. }
  74. else
  75. {
  76. std::cout << "[WARNING] The signal (" << msgId << ":" << pv.first << ") does not exist!" << std::endl;
  77. return false;
  78. }
  79. }
  80. return true;
  81. }
  82. bool SignalProcessor::encodeMessage(uint32_t msgId, const SignalValuesVector &pvs, uint8_t *data, size_t length)
  83. {
  84. auto iter = m_encoderMap.find(msgId);
  85. if (iter == m_encoderMap.end())
  86. {
  87. return false;
  88. }
  89. ParsedValue rpv;
  90. ad::dbcc::Message msg;
  91. std::vector<size_t> vt;
  92. std::tie(msg, vt) = iter->second;
  93. for (size_t i = 0; i < pvs.size(); i++)
  94. {
  95. auto &pv = pvs[i];
  96. auto idx = msg[pv.first];
  97. if (idx != InvalidIndex)
  98. {
  99. auto &sig = msg[idx];
  100. if (sig.encode(pv.second, data, length))
  101. {
  102. rpv.isInteger = !sig.isFloat();
  103. if (rpv.isInteger)
  104. {
  105. rpv.i = static_cast<int32_t>(pv.second);
  106. }
  107. else
  108. {
  109. rpv.f = static_cast<float>(pv.second);
  110. }
  111. if (!sig.getEncodeDelegate()->onEncoded(msgId, sig.name(), data, length, rpv, i == pvs.size() - 1))
  112. {
  113. break;
  114. }
  115. }
  116. else
  117. {
  118. std::cout << "[WARNING] Failed to encode: " << msgId << ":" << sig.name() << std::endl;
  119. return false;
  120. }
  121. }
  122. else
  123. {
  124. std::cout << "[WARNING] The signal (" << msgId << ":" << pv.first << ") does not exist!" << std::endl;
  125. return false;
  126. }
  127. }
  128. return true;
  129. }
  130. bool SignalProcessor::encodeMessage(uint32_t msgId, const SignalValuesMap &pvs, uint8_t *data, size_t length)
  131. {
  132. auto iter = m_encoderMap.find(msgId);
  133. if (iter == m_encoderMap.end())
  134. {
  135. return false;
  136. }
  137. ParsedValue rpv;
  138. ad::dbcc::Message msg;
  139. std::vector<size_t> vt;
  140. std::tie(msg, vt) = iter->second;
  141. size_t i = 0;
  142. for (auto &kv : pvs)
  143. {
  144. auto idx = msg[kv.first];
  145. if (idx != InvalidIndex)
  146. {
  147. auto &sig = msg[idx];
  148. if (sig.encode(kv.second, data, length))
  149. {
  150. rpv.isInteger = !sig.isFloat();
  151. if (rpv.isInteger)
  152. {
  153. rpv.i = static_cast<int32_t>(kv.second);
  154. }
  155. else
  156. {
  157. rpv.f = static_cast<float>(kv.second);
  158. }
  159. if (!sig.getEncodeDelegate()->onEncoded(msgId, sig.name(), data, length, rpv, i == pvs.size() - 1))
  160. {
  161. break;
  162. }
  163. }
  164. else
  165. {
  166. std::cout << "[WARNING] Failed to encode: " << msgId << ":" << sig.name() << std::endl;
  167. return false;
  168. }
  169. }
  170. else
  171. {
  172. std::cout << "[WARNING] The signal (" << msgId << ":" << kv.first << ") does not exist!" << std::endl;
  173. return false;
  174. }
  175. ++i;
  176. }
  177. return true;
  178. }
  179. } // namespace dbcc
  180. } // namespace ad