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.
231 lines
9.0 KiB
231 lines
9.0 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "rendering.h"
|
|
#include "ux-window.h"
|
|
#include "rs-config.h"
|
|
|
|
#define GLFW_INCLUDE_GLU
|
|
#include <GLFW/glfw3.h>
|
|
#include "opengl3.h"
|
|
#include <imgui.h>
|
|
#include <imgui_impl_glfw.h>
|
|
#include <map>
|
|
#include <set>
|
|
#include <array>
|
|
#include <unordered_map>
|
|
#include <fstream>
|
|
|
|
#include "objects-in-frame.h"
|
|
#include "processing-block-model.h"
|
|
|
|
#include "realsense-ui-advanced-mode.h"
|
|
#include "fw-update-helper.h"
|
|
#include "updates-model.h"
|
|
#include "calibration-model.h"
|
|
#include <rsutils/time/periodic-timer.h>
|
|
#include <rsutils/number/stabilized-value.h>
|
|
#include "option-model.h"
|
|
|
|
namespace rs2
|
|
{
|
|
std::vector<const char*> get_string_pointers(const std::vector<std::string>& vec);
|
|
|
|
bool restore_processing_block(const char* name,
|
|
std::shared_ptr<rs2::processing_block> pb, bool enable = true);
|
|
|
|
std::string get_device_sensor_name(subdevice_model* sub);
|
|
|
|
class frame_queues
|
|
{
|
|
public:
|
|
frame_queue& at(int id)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lookup_mutex);
|
|
return _queues[id];
|
|
}
|
|
|
|
template<class T>
|
|
void foreach(T action)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lookup_mutex);
|
|
for (auto&& kvp : _queues)
|
|
action(kvp.second);
|
|
}
|
|
|
|
private:
|
|
std::unordered_map<int, frame_queue> _queues;
|
|
std::mutex _lookup_mutex;
|
|
};
|
|
|
|
// Preserve user selections in UI
|
|
struct subdevice_ui_selection
|
|
{
|
|
int selected_res_id = 0;
|
|
std::map<int, int> selected_res_id_map; // used for depth and ir mixed resolutions
|
|
bool is_multiple_resolutions = false; // used for depth and ir mixed resolutions
|
|
int selected_shared_fps_id = 0;
|
|
std::map<int, int> selected_fps_id;
|
|
std::map<int, int> selected_format_id;
|
|
};
|
|
|
|
class subdevice_model
|
|
{
|
|
public:
|
|
void populate_options( const std::string & opt_base_label, bool * options_invalidated, std::string & error_message );
|
|
|
|
subdevice_model(device& dev, std::shared_ptr<sensor> s, std::shared_ptr< atomic_objects_in_frame > objects, std::string& error_message, viewer_model& viewer, bool new_device_connected = true);
|
|
~subdevice_model();
|
|
|
|
bool is_there_common_fps();
|
|
bool supports_on_chip_calib();
|
|
bool draw_stream_selection(std::string& error_message);
|
|
bool is_selected_combination_supported();
|
|
std::vector<stream_profile> get_selected_profiles(bool enforce_inter_stream_policies = true);
|
|
std::vector<stream_profile> get_supported_profiles();
|
|
void stop(std::shared_ptr<notifications_model> not_model);
|
|
void play(const std::vector<stream_profile>& profiles, viewer_model& viewer, std::shared_ptr<rs2::asynchronous_syncer>);
|
|
bool is_synchronized_frame(viewer_model& viewer, const frame& f);
|
|
void update(std::string& error_message, notifications_model& model);
|
|
void draw_options(const std::vector<rs2_option>& drawing_order,
|
|
bool update_read_only_options, std::string& error_message,
|
|
notifications_model& model);
|
|
uint64_t num_supported_non_default_options() const;
|
|
bool draw_option(rs2_option opt, bool update_read_only_options,
|
|
std::string& error_message, notifications_model& model)
|
|
{
|
|
if (options_metadata.find(opt) != options_metadata.end())
|
|
return options_metadata[opt].draw_option(update_read_only_options, streaming, error_message, model);
|
|
return false;
|
|
}
|
|
|
|
bool is_paused() const;
|
|
void pause();
|
|
void resume();
|
|
|
|
void update_ui(std::vector<stream_profile> profiles_vec);
|
|
void get_sorted_profiles(std::vector<stream_profile>& profiles);
|
|
|
|
template<typename T, typename V>
|
|
bool check_profile(stream_profile p, T cond, std::map<V, std::map<int, stream_profile>>& profiles_map,
|
|
std::vector<stream_profile>& results, V key, int num_streams, stream_profile& def_p);
|
|
|
|
void restore_ui_selection() { ui = last_valid_ui; }
|
|
void store_ui_selection() { last_valid_ui = ui; }
|
|
|
|
void get_depth_ir_mismatch_resolutions_ids(int& depth_res_id, int& ir1_res_id, int& ir2_res_id) const;
|
|
|
|
template<typename T>
|
|
bool get_default_selection_index(const std::vector<T>& values, const T& def, int* index)
|
|
{
|
|
auto max_default = values.begin();
|
|
for (auto it = values.begin(); it != values.end(); it++)
|
|
{
|
|
|
|
if (*it == def)
|
|
{
|
|
*index = (int)(it - values.begin());
|
|
return true;
|
|
}
|
|
if (*max_default < *it)
|
|
{
|
|
max_default = it;
|
|
}
|
|
}
|
|
*index = (int)(max_default - values.begin());
|
|
return false;
|
|
}
|
|
|
|
viewer_model& viewer;
|
|
std::function<void()> on_frame = [] {};
|
|
|
|
std::ofstream _fout;
|
|
|
|
std::shared_ptr<sensor> s;
|
|
device dev;
|
|
std::shared_ptr< atomic_objects_in_frame > detected_objects;
|
|
|
|
std::map< rs2_option, option_model > options_metadata;
|
|
std::vector<std::string> resolutions;
|
|
std::map<int, std::vector<std::string>> fpses_per_stream;
|
|
std::vector<std::string> shared_fpses;
|
|
std::map<int, std::vector<std::string>> formats;
|
|
std::map<int, bool> stream_enabled;
|
|
std::map<int, bool> prev_stream_enabled;
|
|
std::map<int, std::string> stream_display_names;
|
|
|
|
subdevice_ui_selection ui;
|
|
subdevice_ui_selection last_valid_ui;
|
|
|
|
std::vector<std::pair<int, int>> res_values;
|
|
std::map<int, std::vector<std::pair<int, int>>> profile_id_to_res; // used for depth and ir mixed resolutions
|
|
std::map<int, std::vector<int>> fps_values_per_stream;
|
|
std::vector<int> shared_fps_values;
|
|
bool show_single_fps_list = false;
|
|
std::map<int, std::vector<rs2_format>> format_values;
|
|
|
|
std::vector<stream_profile> profiles;
|
|
|
|
frame_queues queues;
|
|
std::mutex _queue_lock;
|
|
bool _options_invalidated = false;
|
|
int next_option = 0;
|
|
std::vector<rs2_option> supported_options;
|
|
bool streaming = false;
|
|
std::map<int, bool> streaming_map; // used for depth and ir mixed resolutions
|
|
bool allow_change_resolution_while_streaming = false;
|
|
bool allow_change_fps_while_streaming = false;
|
|
rect normalized_zoom{ 0, 0, 1, 1 };
|
|
rect roi_rect;
|
|
bool auto_exposure_enabled = false;
|
|
float depth_units = 1.f;
|
|
float stereo_baseline = -1.f;
|
|
|
|
bool roi_checked = false;
|
|
|
|
std::atomic<bool> _pause;
|
|
std::atomic<bool> _is_being_recorded{ false };
|
|
|
|
bool draw_streams_selector = true;
|
|
bool draw_fps_selector = true;
|
|
bool draw_advanced_mode_prompt = false;
|
|
|
|
region_of_interest algo_roi;
|
|
bool show_algo_roi = false;
|
|
float roi_percentage;
|
|
|
|
std::shared_ptr<rs2::colorizer> depth_colorizer;
|
|
std::shared_ptr<rs2::yuy_decoder> yuy2rgb;
|
|
std::shared_ptr<rs2::y411_decoder> y411;
|
|
|
|
std::vector<std::shared_ptr<processing_block_model>> post_processing;
|
|
bool post_processing_enabled = true;
|
|
std::vector<std::shared_ptr<processing_block_model>> const_effects;
|
|
|
|
bool uvmapping_calib_full = false;
|
|
|
|
private:
|
|
bool draw_resolutions(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1);
|
|
bool draw_fps(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1);
|
|
bool draw_streams_and_formats(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1);
|
|
bool draw_res_stream_formats(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1);
|
|
bool draw_resolutions_combo_box_multiple_resolutions(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1,
|
|
int stream_type_id, int depth_res_id);
|
|
bool draw_formats_combo_box_multiple_resolutions(std::string& error_message, std::string& label, std::function<void()> streaming_tooltip, float col0, float col1,
|
|
int stream_type_id);
|
|
bool is_multiple_resolutions_supported() const { return false; }
|
|
std::pair<int, int> get_max_resolution(rs2_stream stream) const;
|
|
void sort_resolutions(std::vector<std::pair<int, int>>& resolutions) const;
|
|
bool is_ir_calibration_profile() const;
|
|
|
|
// used in method get_max_resolution per stream
|
|
std::map<rs2_stream, std::vector<std::pair<int, int>>> resolutions_per_stream;
|
|
|
|
const float SHORT_RANGE_MIN_DISTANCE = 0.05f; // 5 cm
|
|
const float SHORT_RANGE_MAX_DISTANCE = 4.0f; // 4 meters
|
|
std::atomic_bool _destructing;
|
|
};
|
|
}
|