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.

219 lines
8.6 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
#pragma once
#include "notifications.h"
#include <rsutils/concurrency/concurrency.h>
#include "../src/algo.h"
#include <random>
#include <string>
namespace rs2
{
class viewer_model;
class subdevice_model;
struct subdevice_ui_selection;
// On-chip Calibration manager owns the background thread
// leading the calibration process
// It is controlled by autocalib_notification_model UI object
// that invokes the process when needed
class on_chip_calib_manager : public process_manager
{
public:
on_chip_calib_manager(viewer_model& viewer, std::shared_ptr<subdevice_model> sub, device_model& model, device dev, std::shared_ptr<subdevice_model> sub_color = nullptr, bool uvmapping_calib_full = false);
~on_chip_calib_manager();
bool allow_calib_keep() const { return true; }
// Get health number from the calibration summary
float get_health() const { return _health; }
float get_health_1() const { return _health_1; }
float get_health_2() const { return _health_2; }
float get_health_nums(int idx) const { return _health_nums[idx]; }
// Write new calibration to the device
void keep();
// Restore Viewer UI to how it was before auto-calib
void restore_workspace(invoker invoke);
// Ask the firmware to use one of the before/after calibration tables
void apply_calib(bool use_new);
// Get depth metrics for before/after calibration tables
std::pair<float, float> get_metric(bool use_new);
void update_last_used();
float ground_truth = 1200.0f;
int average_step_count = 20;
int step_count = 20;
int accuracy = 2;
int speed = 2; //"Very Fast", "Fast", "Medium", "Slow", "White Wall"
int speed_fl = 1;
bool intrinsic_scan = true;
bool apply_preset = true;
enum auto_calib_action
{
RS2_CALIB_ACTION_ON_CHIP_OB_CALIB, // On-Chip calibration extended
RS2_CALIB_ACTION_ON_CHIP_CALIB, // On-Chip calibration
RS2_CALIB_ACTION_ON_CHIP_FL_CALIB, // On-Chip focal length calibration
RS2_CALIB_ACTION_TARE_CALIB, // Tare calibration
RS2_CALIB_ACTION_TARE_GROUND_TRUTH, // Tare ground truth
RS2_CALIB_ACTION_FL_CALIB, // Focal length calibration
RS2_CALIB_ACTION_UVMAPPING_CALIB, // UVMapping calibration
RS2_CALIB_ACTION_FL_PLUS_CALIB, // Focal length plus calibration
};
auto_calib_action action = RS2_CALIB_ACTION_ON_CHIP_CALIB;
int host_assistance = 0;
int step_count_v3 = 256;
int fl_step_count = 51;
int fy_scan_range = 40;
int keep_new_value_after_sucessful_scan = 1;
int fl_data_sampling = 1;
int adjust_both_sides = 0;
int fl_scan_location = 0;
int fy_scan_direction = 0;
int white_wall_mode = 0;
int retry_times = 0;
bool toggle = false;
float corrected_ratio = 0.0f;
float tilt_angle = 0.0f;
const float correction_factor = 0.50f;
bool tare_health = false;
std::shared_ptr<subdevice_model> _sub;
std::shared_ptr<subdevice_model> _sub_color;
bool py_px_only = false;
const std::string Y8_FORMAT = "Y8";
const std::string Z16_FORMAT = "Z16";
const std::string RGB8_FORMAT = "RGB8";
std::string device_name_string;
void calibrate();
void calibrate_fl();
void calibrate_uv_mapping();
//void calibrate_fl_plus();
void get_ground_truth();
void turn_roi_on();
void turn_roi_off();
void save_options_controlled_by_calib();
void restore_options_controlled_by_calib();
void start_gt_viewer();
void start_fl_viewer();
void start_uvmapping_viewer(bool b3D = false);
void start_fl_plus_viewer();
void stop_viewer();
void reset_device() { _dev.hardware_reset(); }
private:
void save_laser_emitter_state();
void save_thermal_loop_state();
void restore_laser_emitter_state();
void restore_thermal_loop_state();
void set_laser_emitter_state( float value );
void set_thermal_loop_state( float value );
std::vector<uint8_t> safe_send_command(const std::vector<uint8_t>& cmd, const std::string& name);
rs2::depth_frame fetch_depth_frame(invoker invoke, int timeout_ms = 5000); // Wait for next depth frame and return it
std::pair<float, float> get_depth_metrics(invoker invoke);
void process_flow(std::function<void()> cleanup, invoker invoke) override;
float _health = -1.0f;
float _health_1 = -1.0f; //percentage of error, relative to ground truth, before the current iteration.
float _health_2 = -1.0f; //percentage of error, relative to ground truth, after the current iteration.
float _health_nums[4] = { -0.1f, -0.1f, -0.1f, -0.1f };
std::vector<uint8_t> color_intrin_raw_data;
device _dev;
bool _options_saved = false;
float _laser_status_prev = 0.0f;
float _thermal_loop_prev = 0.0f;
bool _was_streaming = false;
bool _synchronized = false;
bool _post_processing = false;
std::shared_ptr<subdevice_ui_selection> _ui { nullptr };
bool _in_3d_view = false;
int _uid = 0;
int _uid2 = 0;
int _uid_color = 0;
std::shared_ptr<subdevice_ui_selection> _ui_color{ nullptr };
viewer_model& _viewer;
std::vector<uint8_t> _old_calib, _new_calib;
std::vector<std::pair<float, float>> _metrics;
device_model& _model;
bool _restored = true;
float _ppx = 0.0f;
float _ppy = 0.0f;
float _fx = 0.0f;
float _fy = 0.0f;
void stop_viewer(invoker invoke);
bool start_viewer(int w, int h, int fps, invoker invoke);
void try_start_viewer(int w, int h, int fps, invoker invoke);
};
// Auto-calib notification model is managing the UI state-machine
// controling auto-calibration
struct autocalib_notification_model : public process_notification_model
{
enum auto_calib_ui_state
{
RS2_CALIB_STATE_INITIAL_PROMPT, // First screen, would you like to run Health-Check?
RS2_CALIB_STATE_FAILED, // Failed, show _error_message
RS2_CALIB_STATE_COMPLETE, // After write, quick blue notification
RS2_CALIB_STATE_CALIB_IN_PROCESS,// Calibration in process... Shows progressbar
RS2_CALIB_STATE_CALIB_COMPLETE, // Calibration complete, show before/after toggle and metrics
RS2_CALIB_STATE_TARE_INPUT, // Collect input parameters for Tare calib
RS2_CALIB_STATE_TARE_INPUT_ADVANCED, // Collect input parameters for Tare calib
RS2_CALIB_STATE_SELF_INPUT, // Collect input parameters for Self calib
RS2_CALIB_STATE_GET_TARE_GROUND_TRUTH, // Calculating ground truth
RS2_CALIB_STATE_GET_TARE_GROUND_TRUTH_IN_PROCESS, // Calculating ground truth in process... Shows progressbar
RS2_CALIB_STATE_GET_TARE_GROUND_TRUTH_COMPLETE, // Calculating ground truth complete, show succeeded or failed
RS2_CALIB_STATE_GET_TARE_GROUND_TRUTH_FAILED, // Failed to calculating the ground truth
RS2_CALIB_STATE_FL_INPUT, // Collect input parameters for focal length calib
RS2_CALIB_STATE_UVMAPPING_INPUT, // Collect input parameters for UVMapping calibration with specific target
RS2_CALIB_STATE_FL_PLUS_INPUT, // Collect input parameters for focal length plus calib
};
autocalib_notification_model(std::string name, std::shared_ptr<on_chip_calib_manager> manager, bool expaned);
on_chip_calib_manager& get_manager() { return *std::dynamic_pointer_cast<on_chip_calib_manager>(update_manager); }
void set_color_scheme(float t) const override;
void draw_content(ux_window& win, int x, int y, float t, std::string& error_message) override;
void draw_dismiss(ux_window& win, int x, int y) override;
void draw_expanded(ux_window& win, std::string& error_message) override;
void draw_intrinsic_extrinsic(int x, int y);
int calc_height() override;
void dismiss(bool snooze) override;
bool use_new_calib = true;
std::string _error_message = "";
};
}