@@ -88,21 +88,21 @@ int main(int argc, char** argv)
8888 {
8989 options.add_options ()
9090 (" h,help" , " Produce help message" )
91- (" bus" , " List of buses in format (< bus name, DBC filename>) " , cxxopts::value<std::vector<std::string>>());
91+ (" bus" , " List of buses in format << bus name>:< DBC filename>> " , cxxopts::value<std::vector<std::string>>());
9292 for (std::size_t i = 1 ; i < argc - 1 ; i++)
9393 {
9494 argv[i] = argv[i + 1 ];
9595 }
9696 auto vm = options.parse (argc, argv);
9797 if (vm.count (" help" ))
9898 {
99- std::cout << " Usage:\n dbcppp decode [--help] --bus=<bus name, DBC filename>...\n " ;
99+ std::cout << " Usage:\n dbcppp decode [--help] --bus=<< bus name>:< DBC filename> >...\n " ;
100100 std::cout << options.help ();
101101 return 1 ;
102102 }
103103 if (!vm.count (" bus" ))
104104 {
105- std::cout << " Argument error: At least one --bus=<bus name, DBC filename> argument required\n " ;
105+ std::cout << " Argument error: At least one --bus=<< bus name>:< DBC filename> > argument required\n " ;
106106 return 1 ;
107107 }
108108 const auto & opt_buses = vm[" bus" ].as <std::vector<std::string>>();
@@ -117,22 +117,29 @@ int main(int argc, char** argv)
117117 std::istringstream ss (opt_bus);
118118 std::string opt;
119119 Bus b;
120- if (std::getline (ss, opt, ' , ' ))
120+ if (std::getline (ss, opt, ' : ' ))
121121 {
122122 b.name = opt;
123123 }
124124 else
125125 {
126- // TODO error
126+ std::cout << " error: could parse bus parameter" << std::endl;
127+ return 1 ;
127128 }
128129 if (std::getline (ss, opt))
129130 {
130131 std::ifstream fdbc (opt);
131132 b.net = dbcppp::INetwork::LoadDBCFromIs (fdbc);
133+ if (!b.net )
134+ {
135+ std::cout << " error: could not load DBC '" << opt << " '" << std::endl;
136+ return 1 ;
137+ }
132138 }
133139 else
134140 {
135- // TODO error
141+ std::cout << " error: could parse bus parameter" << std::endl;
142+ return 1 ;
136143 }
137144 buses.insert (std::make_pair (b.name , std::move (b)));
138145 }
@@ -181,24 +188,83 @@ int main(int argc, char** argv)
181188 bool first = true ;
182189 const auto * mux_sig = msg->MuxSignal ();
183190
184- for (const dbcppp::ISignal& sig : msg->Signals ())
185- {
186- if (sig.MultiplexerIndicator () != dbcppp::ISignal::EMultiplexer::MuxValue ||
187- mux_sig && sig.MultiplexerSwitchValue () == mux_sig->Decode (&data[0 ]))
191+ auto print_signal =
192+ [&data](const dbcppp::ISignal& sig, bool first)
188193 {
189- if (first) first = false ; else std::cout << " , " ;
194+ if (! first) std::cout << " , " ;
190195 auto raw = sig.Decode (&data[0 ]);
191196 auto beg_ved = sig.ValueEncodingDescriptions ().begin ();
192197 auto end_ved = sig.ValueEncodingDescriptions ().end ();
193198 auto iter = std::find_if (beg_ved, end_ved, [&](const dbcppp::IValueEncodingDescription& ved) { return ved.Value () == raw; });
194199 if (iter != end_ved)
195200 {
196- std::cout << sig.Name () << " : " << iter->Description () << " " << sig.Unit ();
201+ std::cout << sig.Name () << " : ' " << iter->Description () << " ' " << sig.Unit ();
197202 }
198203 else
199204 {
200205 auto val = sig.RawToPhys (raw);
201- std::cout << sig.Name () << " : " << val << " " << sig.Unit ();
206+ std::cout << sig.Name () << " : " << val;
207+ if (sig.Unit ().size ())
208+ {
209+ std::cout << " " << sig.Unit ();
210+ }
211+ }
212+ };
213+
214+ for (const dbcppp::ISignal& sig : msg->Signals ())
215+ {
216+ if (sig.MultiplexerIndicator () != dbcppp::ISignal::EMultiplexer::MuxValue)
217+ {
218+ print_signal (sig, first);
219+ first = false ;
220+ }
221+ else if (mux_sig && sig.SignalMultiplexerValues_Size () == 0 &&
222+ sig.MultiplexerSwitchValue () == mux_sig->Decode (&data[0 ]))
223+ {
224+ print_signal (sig, first);
225+ first = false ;
226+ }
227+ else
228+ {
229+ std::function<bool (const dbcppp::ISignal&)> check_signal_multiplexer_values;
230+ check_signal_multiplexer_values =
231+ [&](const dbcppp::ISignal& sig)
232+ -> bool
233+ {
234+ for (const auto & smv : sig.SignalMultiplexerValues ())
235+ {
236+ auto sig_beg = msg->Signals ().begin ();
237+ auto sig_end = msg->Signals ().end ();
238+ auto sig_iter = std::find_if (sig_beg, sig_end,
239+ [&](const auto & sig)
240+ {
241+ return sig.Name () == smv.SwitchName ();
242+ });
243+ if (sig_iter != sig_end)
244+ {
245+ for (auto ranges : smv.ValueRanges ())
246+ {
247+ auto raw = sig_iter->Decode (&data[0 ]);
248+ if (ranges.from >= raw && ranges.to <= raw)
249+ {
250+ if (sig_iter->SignalMultiplexerValues_Size () != 0 )
251+ {
252+ return check_signal_multiplexer_values (*sig_iter);
253+ }
254+ else
255+ {
256+ return true ;
257+ }
258+ }
259+ }
260+ }
261+ }
262+ return false ;
263+ };
264+ if (check_signal_multiplexer_values (sig))
265+ {
266+ print_signal (sig, first);
267+ first = false ;
202268 }
203269 }
204270 }
@@ -212,4 +278,4 @@ int main(int argc, char** argv)
212278 print_help ();
213279 return 1 ;
214280 }
215- }
281+ }
0 commit comments