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.
138 lines
4.7 KiB
138 lines
4.7 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2020 Intel Corporation. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "sw-update/dev-updates-profile.h"
|
|
#include "notifications.h"
|
|
#include "fw-update-helper.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <regex>
|
|
#include <mutex>
|
|
#include <atomic>
|
|
|
|
namespace rs2
|
|
{
|
|
class ux_window;
|
|
|
|
class updates_model
|
|
{
|
|
public:
|
|
struct update_profile_model
|
|
{
|
|
sw_update::dev_updates_profile::update_profile profile;
|
|
context ctx;
|
|
device_model* dev_model;
|
|
update_profile_model(sw_update::dev_updates_profile::update_profile p,
|
|
context contex, device_model* device_model) : profile(p), ctx(contex), dev_model(device_model) {};
|
|
};
|
|
void add_profile(const update_profile_model& update)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lock);
|
|
auto it = std::find_if(_updates.begin(), _updates.end(), [&](update_profile_model& p) {
|
|
return (p.profile.fw_update_id == update.profile.fw_update_id);
|
|
});
|
|
if (it == _updates.end())
|
|
_updates.push_back(update);
|
|
else
|
|
{
|
|
*it = update;
|
|
}
|
|
}
|
|
|
|
void update_profile(const update_profile_model& update)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lock);
|
|
auto it = std::find_if(_updates.begin(), _updates.end(), [&](update_profile_model& p) {
|
|
return (p.profile.fw_update_id == update.profile.fw_update_id);
|
|
});
|
|
if (it != _updates.end())
|
|
{
|
|
*it = update;
|
|
}
|
|
}
|
|
void remove_profile(const sw_update::dev_updates_profile::update_profile &update)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lock);
|
|
auto it = std::find_if(_updates.begin(), _updates.end(), [&](update_profile_model& p) {
|
|
return (p.profile.fw_update_id == update.fw_update_id);
|
|
});
|
|
if (it != _updates.end())
|
|
_updates.erase(it);
|
|
}
|
|
|
|
// This is a helper function to indicate if a device is connected or not.
|
|
// It change its value on device connect/disconnect
|
|
// cause calling ctx.query_devices() is too slow for the UI
|
|
void set_device_status(const sw_update::dev_updates_profile::update_profile &update, bool active)
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lock);
|
|
auto it = std::find_if(_updates.begin(), _updates.end(), [&](update_profile_model& p) {
|
|
return (p.profile.fw_update_id == update.fw_update_id);
|
|
});
|
|
if (it != _updates.end())
|
|
it->profile.dev_active = active;
|
|
}
|
|
|
|
bool has_updates() const
|
|
{
|
|
std::lock_guard<std::mutex> lock(_lock);
|
|
return !_updates.empty();
|
|
}
|
|
|
|
void draw(std::shared_ptr<notifications_model> not_model, ux_window& window, std::string& error_message);
|
|
private:
|
|
struct position_params
|
|
{
|
|
float w;
|
|
float h;
|
|
ImVec2 orig_pos;
|
|
float mid_y;
|
|
float x0;
|
|
float y0;
|
|
position_params() :w(0.0f), h(0.0f), orig_pos(), x0(0.0f), y0(0.0f) {}
|
|
};
|
|
|
|
bool draw_software_section(const char * window_name, update_profile_model& selected_profile, position_params& pos_params , ux_window& window, std::string& error_message);
|
|
bool draw_firmware_section(std::shared_ptr<notifications_model> not_model, const char * window_name, update_profile_model& selected_profile, position_params& pos_params, ux_window& window, std::string& error_message);
|
|
|
|
|
|
int selected_index = 0;
|
|
int selected_software_update_index = 0;
|
|
int selected_firmware_update_index = 0;
|
|
bool ignore = false;
|
|
std::vector<update_profile_model> _updates;
|
|
mutable std::mutex _lock;
|
|
bool emphasize_dismiss_text = false;
|
|
|
|
std::shared_ptr<firmware_update_manager> _fw_update = nullptr;
|
|
|
|
enum class fw_update_states
|
|
{
|
|
ready = 0,
|
|
downloading = 1,
|
|
started = 2,
|
|
completed = 3,
|
|
failed_downloading = 4,
|
|
failed_updating = 5
|
|
};
|
|
|
|
enum class fw_update_fail_reason
|
|
{
|
|
none = 0,
|
|
downloading_error = 1,
|
|
updating_error = 2
|
|
};
|
|
|
|
fw_update_states _fw_update_state = fw_update_states::ready;
|
|
|
|
progress_bar _progress;
|
|
std::atomic<int> _fw_download_progress{ 0 };
|
|
bool _retry = false;
|
|
std::shared_ptr<firmware_update_manager> _update_manager = nullptr;
|
|
std::vector<uint8_t> _fw_image;
|
|
};
|
|
}
|