Skip to content

Commit a33c094

Browse files
authored
dbcppp now also takes signal multiplexed values into account (#91)
* dbcppp now also takes signal multiplexed values into account
1 parent 3b63e95 commit a33c094

File tree

2 files changed

+135
-14
lines changed

2 files changed

+135
-14
lines changed

src/dbcppp/main.cpp

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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:\ndbcppp decode [--help] --bus=<bus name,DBC filename>...\n";
99+
std::cout << "Usage:\ndbcppp 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+
}

tests/test_files/dbc/issue_90.dbc

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
VERSION "Created by canmatrix and CSS Electronics (www.csselectronics.com)"
2+
3+
4+
NS_ :
5+
NS_DESC_
6+
CM_
7+
BA_DEF_
8+
BA_
9+
VAL_
10+
CAT_DEF_
11+
CAT_
12+
FILTER
13+
BA_DEF_DEF_
14+
EV_DATA_
15+
ENVVAR_DATA_
16+
SGTYPE_
17+
SGTYPE_VAL_
18+
BA_DEF_SGTYPE_
19+
BA_SGTYPE_
20+
SIG_TYPE_REF_
21+
VAL_TABLE_
22+
SIG_GROUP_
23+
SIG_VALTYPE_
24+
SIGTYPE_VALTYPE_
25+
BO_TX_BU_
26+
BA_DEF_REL_
27+
BA_REL_
28+
BA_DEF_DEF_REL_
29+
BU_SG_REL_
30+
BU_EV_REL_
31+
BU_BO_REL_
32+
SG_MUL_VAL_
33+
34+
BS_:
35+
36+
BU_:
37+
38+
39+
BO_ 0 Msg0: 8 Vector__XXX
40+
SG_ MuxedSig0 m0 : 0|32@1+ (1,0) [0|4294967295] "" Vector__XXX
41+
SG_ MuxedSig1 m1 : 0|32@1+ (1,0) [0|4294967295] "" Vector__XXX
42+
SG_ MuxedSig2 m2 : 0|32@1+ (1,0) [0|65535] "" Vector__XXX
43+
SG_ MuxedSig3 m3 : 0|32@1+ (1,0) [0|65535] "" Vector__XXX
44+
SG_ MuxSig0 m1M : 46|1@1+ (1,0) [0|255] "" Vector__XXX
45+
SG_ MuxSig1 m2M : 46|1@1+ (1,0) [0|255] "" Vector__XXX
46+
SG_ Mux M : 47|1@1+ (1,0) [0|15] "" Vector__XXX
47+
SG_ response : 48|8@1+ (1,0) [0|15] "" Vector__XXX
48+
SG_ length : 56|8@1+ (1,0) [0|255] "" Vector__XXX
49+
50+
SG_MUL_VAL_ 0 MuxedSig0 MuxSig0 0-0;
51+
SG_MUL_VAL_ 0 MuxedSig1 MuxSig0 1-1;
52+
SG_MUL_VAL_ 0 MuxedSig2 MuxSig1 0-0;
53+
SG_MUL_VAL_ 0 MuxedSig3 MuxSig1 1-1;
54+
SG_MUL_VAL_ 0 MuxSig0 Mux 0-0;
55+
SG_MUL_VAL_ 0 MuxSig1 Mux 1-1;

0 commit comments

Comments
 (0)