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.4 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
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
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include "dbcc/signal_processor.h"
  2. #include <tuple>
  3. namespace ad {
  4. namespace dbcc {
  5. size_t SignalProcessor::SignalIndex(uint32_t msg_id, const std::string& signal_name)
  6. {
  7. auto msg_iter = dbc_iter_.find(msg_id);
  8. if (msg_iter == dbc_iter_.end()) {
  9. return kInvalidIndex;
  10. }
  11. if (!msg_iter->contains(signal_name)) {
  12. return kInvalidIndex;
  13. }
  14. return (*msg_iter)[signal_name];
  15. }
  16. bool SignalProcessor::DecodeMessage(uint32_t msg_id, const uint8_t* data, size_t length)
  17. {
  18. ad::dbcc::ParsedValue pv;
  19. auto iter = decoder_map_.find(msg_id);
  20. if (iter == decoder_map_.end()) {
  21. return false;
  22. }
  23. ad::dbcc::Message msg;
  24. std::vector<size_t> vt;
  25. std::tie(msg, vt) = iter->second;
  26. for (size_t i = 0; i < vt.size(); i++) {
  27. auto& sig = msg[vt[i]];
  28. if (sig.Decode(data, length, pv)) {
  29. sig.GetDecodeDelegate()->OnDecoded(msg_id, sig.Name(), pv);
  30. } else {
  31. std::cout << "[WARNING] Failed to decode: " << msg_id << ":" << sig.Name() << std::endl;
  32. return false;
  33. }
  34. }
  35. return true;
  36. }
  37. bool SignalProcessor::EncodeMessage(uint32_t msg_id, const SignalValues& pvs, uint8_t* data,
  38. size_t length)
  39. {
  40. auto iter = encoder_map_.find(msg_id);
  41. if (iter == encoder_map_.end()) {
  42. return false;
  43. }
  44. ad::dbcc::Message msg;
  45. std::vector<size_t> vt;
  46. std::tie(msg, vt) = iter->second;
  47. for (size_t i = 0; i < pvs.size(); i++) {
  48. auto& pv = pvs[i];
  49. auto idx = msg[pv.first];
  50. if (idx != kInvalidIndex) {
  51. auto& sig = msg[idx];
  52. if (sig.Encode(pv.second, data, length)) {
  53. if (!sig.GetEncodeDelegate()->OnEncoded(msg_id, sig.Name(), data, length, pv.second,
  54. i == pvs.size() - 1)) {
  55. break;
  56. }
  57. } else {
  58. std::cout << "[WARNING] Failed to encode: " << msg_id << ":" << sig.Name()
  59. << std::endl;
  60. return false;
  61. }
  62. } else {
  63. std::cout << "[WARNING] The signal (" << msg_id << ":" << pv.first
  64. << ") does not exist!" << std::endl;
  65. return false;
  66. }
  67. }
  68. return true;
  69. }
  70. bool SignalProcessor::EncodeMessage(uint32_t msg_id, const SignalValuesVector& pvs, uint8_t* data,
  71. size_t length)
  72. {
  73. auto iter = encoder_map_.find(msg_id);
  74. if (iter == encoder_map_.end()) {
  75. return false;
  76. }
  77. ParsedValue rpv;
  78. ad::dbcc::Message msg;
  79. std::vector<size_t> vt;
  80. std::tie(msg, vt) = iter->second;
  81. for (size_t i = 0; i < pvs.size(); i++) {
  82. auto& pv = pvs[i];
  83. auto idx = msg[pv.first];
  84. if (idx != kInvalidIndex) {
  85. auto& sig = msg[idx];
  86. if (sig.Encode(pv.second, data, length)) {
  87. rpv.is_integer = !sig.IsFloat();
  88. if (rpv.is_integer) {
  89. rpv.i = static_cast<int32_t>(pv.second);
  90. } else {
  91. rpv.f = static_cast<float>(pv.second);
  92. }
  93. if (!sig.GetEncodeDelegate()->OnEncoded(msg_id, sig.Name(), data, length, rpv,
  94. i == pvs.size() - 1)) {
  95. break;
  96. }
  97. } else {
  98. std::cout << "[WARNING] Failed to encode: " << msg_id << ":" << sig.Name()
  99. << std::endl;
  100. return false;
  101. }
  102. } else {
  103. std::cout << "[WARNING] The signal (" << msg_id << ":" << pv.first
  104. << ") does not exist!" << std::endl;
  105. return false;
  106. }
  107. }
  108. return true;
  109. }
  110. bool SignalProcessor::EncodeMessage(uint32_t msg_id, const SignalValuesMap& pvs, uint8_t* data,
  111. size_t length)
  112. {
  113. auto iter = encoder_map_.find(msg_id);
  114. if (iter == encoder_map_.end()) {
  115. return false;
  116. }
  117. ParsedValue rpv;
  118. ad::dbcc::Message msg;
  119. std::vector<size_t> vt;
  120. std::tie(msg, vt) = iter->second;
  121. size_t i = 0;
  122. for (auto& kv : pvs) {
  123. auto idx = msg[kv.first];
  124. if (idx != kInvalidIndex) {
  125. auto& sig = msg[idx];
  126. if (sig.Encode(kv.second, data, length)) {
  127. rpv.is_integer = !sig.IsFloat();
  128. if (rpv.is_integer) {
  129. rpv.i = static_cast<int32_t>(kv.second);
  130. } else {
  131. rpv.f = static_cast<float>(kv.second);
  132. }
  133. if (!sig.GetEncodeDelegate()->OnEncoded(msg_id, sig.Name(), data, length, rpv,
  134. i == pvs.size() - 1)) {
  135. break;
  136. }
  137. } else {
  138. std::cout << "[WARNING] Failed to encode: " << msg_id << ":" << sig.Name()
  139. << std::endl;
  140. return false;
  141. }
  142. } else {
  143. std::cout << "[WARNING] The signal (" << msg_id << ":" << kv.first
  144. << ") does not exist!" << std::endl;
  145. return false;
  146. }
  147. ++i;
  148. }
  149. return true;
  150. }
  151. } // namespace dbcc
  152. } // namespace ad