You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.2 KiB
67 lines
2.2 KiB
|
|
#include "opendbc/can/common.h"
|
|
#undef INFO
|
|
#include "catch2/catch.hpp"
|
|
#include "tools/cabana/dbcmanager.h"
|
|
#include "tools/replay/logreader.h"
|
|
|
|
// demo route, first segment
|
|
const std::string TEST_RLOG_URL = "https://commadata2.blob.core.windows.net/commadata2/4cf7a6ad03080c90/2021-09-29--13-46-36/0/rlog.bz2";
|
|
|
|
TEST_CASE("DBCManager::generateDBC") {
|
|
DBCManager dbc_origin(nullptr);
|
|
dbc_origin.open("toyota_new_mc_pt_generated");
|
|
DBCManager dbc_from_generated(nullptr);
|
|
dbc_from_generated.open("", dbc_origin.generateDBC());
|
|
|
|
auto &msgs = dbc_origin.messages();
|
|
auto &new_msgs = dbc_from_generated.messages();
|
|
REQUIRE(msgs.size() == new_msgs.size());
|
|
for (auto &[address, m] : msgs) {
|
|
auto new_m = new_msgs.at(address);
|
|
REQUIRE(m.name == new_m.name);
|
|
REQUIRE(m.size == new_m.size);
|
|
REQUIRE(m.sigs.size() == new_m.sigs.size());
|
|
for (auto &[name, sig] : m.sigs)
|
|
REQUIRE(sig == new_m.sigs[name]);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Parse can messages") {
|
|
DBCManager dbc(nullptr);
|
|
dbc.open("toyota_new_mc_pt_generated");
|
|
CANParser can_parser(0, "toyota_new_mc_pt_generated", {}, {});
|
|
|
|
LogReader log;
|
|
REQUIRE(log.load(TEST_RLOG_URL, nullptr, {}, true));
|
|
REQUIRE(log.events.size() > 0);
|
|
for (auto e : log.events) {
|
|
if (e->which == cereal::Event::Which::CAN) {
|
|
std::map<std::pair<uint32_t, std::string>, std::vector<double>> values_1;
|
|
for (const auto &c : e->event.getCan()) {
|
|
const auto msg = dbc.msg(c.getAddress());
|
|
if (c.getSrc() == 0 && msg) {
|
|
for (auto &[name, sig] : msg->sigs) {
|
|
double val = get_raw_value((uint8_t *)c.getDat().begin(), c.getDat().size(), sig);
|
|
values_1[{c.getAddress(), name.toStdString()}].push_back(val);
|
|
}
|
|
}
|
|
}
|
|
|
|
can_parser.UpdateCans(e->mono_time, e->event.getCan());
|
|
auto values_2 = can_parser.query_latest();
|
|
for (auto &[key, v1] : values_1) {
|
|
bool found = false;
|
|
for (auto &v2 : values_2) {
|
|
if (v2.address == key.first && v2.name == key.second) {
|
|
REQUIRE(v2.all_values.size() == v1.size());
|
|
REQUIRE(v2.all_values == v1);
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
REQUIRE(found);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|