#include "static_station_config.hpp" #include #include #include #include int main() { using namespace target_exposure; ExposureControl control; const auto config = staticStationExampleConfig(); double actual_exposure_us = config.empirical_exposure_us; std::cout << "SIMULATED brightness only; no camera/field validation. Exposure unit: us\n"; for (int index = 0; index < 12; ++index) { const TimestampUs now = (static_cast(index) + 1) * 1'000'000; const auto before = control.preCapture(now, config); if (!before.accepted) return 1; // The caller applies the requested exposure BEFORE acquisition. if (before.initialization_required) actual_exposure_us = *before.suggested_exposure_us; const double response = 0.11 - 0.002 * index; const auto gray = static_cast(std::clamp(std::round(response * actual_exposure_us), 0.0, 255.0)); FrameInput frame; frame.image = cv::Mat(32, 32, CV_8UC1, cv::Scalar(gray)); frame.roi.rectangles.emplace_back(8, 8, 16, 16); frame.has_usable_target = true; // real callers supply their own recognition result frame.timestamp_us = now; frame.actual_exposure_us = actual_exposure_us; frame.next_capture_timestamp_us = now + 1'000'000; const auto result = control.processFrame(frame); if (!result.accepted || !result.metering.target.valid()) return 2; std::cout << std::fixed << std::setprecision(2) << "frame=" << index << " state=" << toString(result.state) << " gray=" << *result.metering.target.gray << " actual_us=" << actual_exposure_us << " next_us=" << *result.suggested_exposure_us << " prediction_used=" << result.prediction.adopted << " reason=" << toString(result.reason) << '\n'; // The application applies this to frame N+1, then supplies the actual applied value. if (result.adjustment_suggested) actual_exposure_us = *result.suggested_exposure_us; } }