dragonpilot - 基於 openpilot 的開源駕駛輔助系統
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.

51 lines
1.4 KiB

#include <future>
#include "catch2/catch.hpp"
#include "selfdrive/loggerd/loggerd.h"
int random_int(int min, int max) {
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist(min, max);
return dist(rng);
}
int get_synced_frame_id(LoggerdState *s, CameraType cam_type, int start_frame_id) {
int frame_id = start_frame_id;
while (!sync_encoders(s, cam_type, frame_id)) {
++frame_id;
usleep(0);
}
return frame_id;
};
TEST_CASE("sync_encoders") {
const int max_waiting = GENERATE(1, 2, 3);
for (int test_cnt = 0; test_cnt < 10; ++test_cnt) {
LoggerdState s{.max_waiting = max_waiting};
std::vector<int> start_frames;
std::vector<std::future<int>> futures;
for (int i = 0; i < max_waiting; ++i) {
int start_frame_id = random_int(0, 20);
start_frames.push_back(start_frame_id);
futures.emplace_back(std::async(std::launch::async, get_synced_frame_id, &s, (CameraType)i, start_frame_id));
}
// get results
int synced_frame_id = 0;
for (int i = 0; i < max_waiting; ++i) {
if (i == 0) {
synced_frame_id = futures[i].get();
// require synced_frame_id equal start_frame_id if max_waiting == 1
if (max_waiting == 1) {
REQUIRE(synced_frame_id == start_frames[0]);
}
} else {
REQUIRE(futures[i].get() == synced_frame_id);
}
}
}
}