canscope/src/canid_unit.hpp

85 lines
3.5 KiB
C++

#pragma once
#include <ftxui/component/component.hpp>
#include <ftxui/component/component_options.hpp>
#include <ftxui/component/mouse.hpp>
#include <ftxui/component/screen_interactive.hpp>
#include <ftxui/dom/elements.hpp>
#include <boost/signals2.hpp>
#define FMT_HEADER_ONLY
#include <fmt/format.h>
#include "signals.hpp"
#include "tagsettings.hpp"
#include <map>
#include <memory>
#include <optional>
class CanIDUnit : public ftxui::ComponentBase {
public:
CanIDUnit(const std::string &iface, const std::string &canid, const std::string &protocol, size_t &spn_count,
const std::vector<uint8_t> &data, ftxui::ScreenInteractive *screen, signals_map_t &smap,
ftxui::Component content, ftxui::Component container, ftxui::Component spn_settings_dialog,
ftxui::Component cansettings_dialog, bool is_deployed, bool is_verbose, bool is_brief, bool is_manual,
std::string &, bool &, bool &canbus_parameters_export_shown, bool &filedialog_shown,
std::map<std::string, std::map<int32_t, ftxui::Component>> &spnSettingsFormMap,
spn_settings_map_t &spnSettingsMap);
inline const std::string &getIfaceName() const { return m_iface_; }
inline const std::string &getCanID() const { return m_canid_; }
inline std::string getLabel() const {
if (m_data_verbose_ && !m_data_verbose_->is_null() && m_data_verbose_->contains("Label")) {
return (*m_data_verbose_)["Label"].get<std::string>();
}
return {};
}
inline size_t getDataSize() const { return m_data_.size(); }
inline const std::vector<uint8_t> &getData() const { return m_data_; }
inline bool getDeployed() const { return m_deployed_; }
inline bool getVerbose() const { return m_verbose_; }
inline bool getBrief() const { return m_brief_; }
inline bool getManual() const { return m_manual_mode_; }
inline ftxui::Component getSpnSettingsForm() { return m_spnSettingsForm_; }
inline const auto &getParametersExportMap() const { return s_canbus_parameters_export_map_; }
static inline std::string *s_export_filter_text_ = nullptr;
static inline std::map<
/* canid */ std::string,
std::tuple</* deployed flag */ bool, /* has data flag */ bool,
/* Selected spns to export */
std::map</* spn name */ std::string,
std::tuple</* deployed */ bool, /* selected */ bool, /* data */ nlohmann::json>>>>
s_canbus_parameters_export_map_ = {};
void update(const can_frame_data_s &data, const can_frame_diff_s &diff, std::shared_ptr<nlohmann::json> verbose,
std::shared_ptr<nlohmann::json> brief);
bool OnEvent(ftxui::Event event) override;
private:
const ftxui::Component m_spnSettingsForm_;
const std::string m_canid_, m_iface_;
std::vector<uint8_t> m_data_;
mutable bool m_deployed_ = false, m_verbose_ = false, m_brief_ = true, m_manual_mode_ = false;
can_frame_diff_s m_diff_;
std::string m_last_update_time_;
bool m_hovered_ = false;
ftxui::Box m_box_ = {};
std::shared_ptr<nlohmann::json> m_data_verbose_ = std::make_shared<nlohmann::json>(nullptr);
std::shared_ptr<nlohmann::json> m_data_short_ = std::make_shared<nlohmann::json>(nullptr);
ftxui::Component m_brief_content_, m_verbose_content_;
ftxui::Component m_cansettings_dialog_;
spn_settings_map_t *m_spnSettingsMap_ = nullptr;
size_t m_last_verbose_spn_count_ = 0;
size_t m_last_brief_spn_count_ = 0;
ftxui::Component m_export_selectors_;
std::map<int32_t, std::pair<ftxui::Component, size_t>> m_export_custom_containers_;
};