37 #include <gtest/gtest.h>
46 using namespace std::chrono_literals;
84 std::make_optional(time),
85 std::make_optional(network),
107 std::vector<ImuRate> accel_rates{{1.0f, 2.0f}, {3.0f, 4.4f}, {5.5f, 6.7f}};
108 std::vector<ImuRange> accel_ranges{{1.1f, 3.0f}, {3.1f, 4.5f}, {5.6f, 6.8f}};
110 std::vector<ImuRate> gyro_rates{{1.1f, 2.1f}, {3.1f, 5.4f}, {5.6f, 7.7f}};
111 std::vector<ImuRange> gyro_ranges{{2.1f, 3.1f}, {4.1f, 5.5f}, {6.6f, 7.8f}};
113 std::vector<ImuRate> mag_rates{{2.1f, 3.1f}, {4.1f, 6.4f}, {6.6f, 8.7f}};
114 std::vector<ImuRange> mag_ranges{{3.1f, 4.1f}, {5.1f, 5.6f}, {6.7f, 8.8f}};
209 config.
configs[0].name =
"accelerometer";
211 config.
configs[0].rateTableIndex = 1;
212 config.
configs[0].rangeTableIndex = 0;
214 config.
configs[1].name =
"gyroscope";
216 config.
configs[1].rateTableIndex = 0;
217 config.
configs[1].rangeTableIndex = 1;
219 config.
configs[2].name =
"magnetometer";
221 config.
configs[2].rateTableIndex = 1;
222 config.
configs[2].rangeTableIndex = 1;
264 template <
typename ConfigT,
typename ControlT>
266 const ControlT &control)
268 ASSERT_TRUE(
static_cast<bool>(config.manual_exposure));
269 ASSERT_FLOAT_EQ(config.manual_exposure->gain, control.gain);
270 ASSERT_EQ(config.manual_exposure->exposure_time.count(), control.exposure);
272 ASSERT_TRUE(
static_cast<bool>(config.auto_exposure));
273 ASSERT_EQ(config.auto_exposure_enabled, control.autoExposure);
274 ASSERT_EQ(config.auto_exposure->max_exposure_time.count(), control.autoExposureMax);
275 ASSERT_EQ(config.auto_exposure->decay, control.autoExposureDecay);
276 ASSERT_FLOAT_EQ(config.auto_exposure->target_threshold, control.autoExposureThresh);
277 ASSERT_FLOAT_EQ(config.auto_exposure->target_intensity, control.autoExposureTargetIntensity);
278 ASSERT_FLOAT_EQ(config.auto_exposure->max_gain, control.gainMax);
280 ASSERT_EQ(config.auto_exposure->roi.top_left_x_position, control.autoExposureRoiX);
281 ASSERT_EQ(config.auto_exposure->roi.top_left_y_position, control.autoExposureRoiY);
282 ASSERT_EQ(config.auto_exposure->roi.width, control.autoExposureRoiWidth);
283 ASSERT_EQ(config.auto_exposure->roi.height, control.autoExposureRoiHeight);
285 if (config.manual_white_balance)
287 ASSERT_FLOAT_EQ(config.manual_white_balance->red, control.whiteBalanceRed);
288 ASSERT_FLOAT_EQ(config.manual_white_balance->blue, control.whiteBalanceBlue);
291 if (config.auto_white_balance)
293 ASSERT_EQ(config.auto_white_balance_enabled, control.autoWhiteBalance);
294 ASSERT_EQ(config.auto_white_balance->decay, control.autoWhiteBalanceDecay);
295 ASSERT_EQ(config.auto_white_balance->threshold, control.autoWhiteBalanceThresh);
298 ASSERT_EQ(config.gamma, control.gamma);
318 ASSERT_TRUE(
static_cast<bool>(config.
aux_config));
382 ASSERT_EQ(
static_cast<bool>(imu_info.
gyroscope),
static_cast<bool>(config.
gyroscope));
385 ASSERT_GT(wire_config.
configs.size(), 2);
387 for (
size_t i = 0 ; i < wire_config.
configs.size() ; ++i)
389 const auto &wire = wire_config.
configs[i];
393 const auto rate = imu_info.
accelerometer->rates[wire.rateTableIndex];
394 const auto range = imu_info.
accelerometer->ranges[wire.rangeTableIndex];
396 ASSERT_EQ(config.
accelerometer->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
403 const auto rate = imu_info.
gyroscope->rates[wire.rateTableIndex];
404 const auto range = imu_info.
gyroscope->ranges[wire.rangeTableIndex];
406 ASSERT_EQ(config.
gyroscope->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
413 const auto rate = imu_info.
magnetometer->rates[wire.rateTableIndex];
414 const auto range = imu_info.
magnetometer->ranges[wire.rangeTableIndex];
416 ASSERT_EQ(config.
magnetometer->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
435 ASSERT_FLOAT_EQ(config.
internal->intensity, wire.
intensity[0] / 255.0f * 100.0f);
444 ASSERT_FLOAT_EQ(config.
external->intensity, wire.
intensity[0] / 255.0f * 100.0f);
453 ASSERT_EQ(wire.
flash, 0);
459 ASSERT_EQ(wire.
flash, 1);
465 ASSERT_EQ(wire.
flash, 1);
483 ASSERT_FLOAT_EQ(config.
internal->intensity, wire.
intensity[i] / 255.0f * 100.0f);
484 ASSERT_EQ(wire.
mask & 1<<i, 1<<i);
497 ASSERT_FLOAT_EQ(config.
external->intensity, wire.
intensity[i] / 255.0f * 100.0f);
498 ASSERT_EQ(wire.
mask & 1<<i, 1<<i);
509 ASSERT_EQ(wire.
flash, 0);
515 ASSERT_EQ(wire.
flash, 1);
521 ASSERT_EQ(wire.
flash, 1);
541 ASSERT_TRUE(config == config);
551 ASSERT_FALSE(config0 == config1);
561 const auto wire_resolution = convert<wire::CamSetResolution>(config);
573 const auto cam_control = convert<wire::CamControl>(config);
585 ASSERT_TRUE(
static_cast<bool>(config.aux_config));
587 const auto cam_control =
convert(config.aux_config.value());
599 const auto config =
convert(wire_config,
608 ASSERT_TRUE(
static_cast<bool>(config.aux_config));
611 check_equal(config.aux_config.value(), wire_aux_config);
619 const auto config =
convert(wire_config,
628 ASSERT_FALSE(
static_cast<bool>(config.aux_config));
638 const auto config =
convert(wire_config,
647 ASSERT_FALSE(
static_cast<bool>(config.imu_config));
651 ASSERT_TRUE(
static_cast<bool>(config.network_config));
652 check_equal(config.network_config.value(), packet_config);
660 const auto config =
convert(wire_config,
669 ASSERT_FALSE(
static_cast<bool>(config.lighting_config));
673 ASSERT_TRUE(
static_cast<bool>(config.network_config));
674 check_equal(config.network_config.value(), packet_config);
682 lighting_config.available = 0;
686 const auto config =
convert(wire_config,
689 std::make_optional(lighting_config),
695 ASSERT_FALSE(
static_cast<bool>(config.lighting_config));
699 ASSERT_TRUE(
static_cast<bool>(config.network_config));
700 check_equal(config.network_config.value(), packet_config);
721 const auto round_trip =
convert(
convert(wire_config, info), info, wire_config.samplesPerMessage - 1);
723 ASSERT_EQ(round_trip.samplesPerMessage, wire_config.samplesPerMessage - 1);
743 const auto config =
convert(wire_config,
752 ASSERT_TRUE(
static_cast<bool>(config.network_config));
754 convert<wire::SysPacketDelay>(config.network_config.value()));