1b481d905SBen Tyner #pragma once 2b481d905SBen Tyner 3b481d905SBen Tyner #include <libpdbg.h> 4b481d905SBen Tyner 53fb52e53SBen Tyner #include <attn/attn_config.hpp> 63fb52e53SBen Tyner 73fb52e53SBen Tyner #include <bitset> 83fb52e53SBen Tyner 9b481d905SBen Tyner namespace attn 10b481d905SBen Tyner { 11b481d905SBen Tyner 12b481d905SBen Tyner /** @brief attention handler configuration flags */ 13b481d905SBen Tyner inline constexpr uint32_t enableBreakpoints = 1; 14b481d905SBen Tyner 15b481d905SBen Tyner /** 16b481d905SBen Tyner * @brief These objects contain information about an active attention. 17b481d905SBen Tyner * 18b481d905SBen Tyner * An Attention object is created for each active attention. These objects 19b481d905SBen Tyner * carry with them various configuration and status information as well 20b481d905SBen Tyner * the attention handler function to call for handling the attention. Each 21b481d905SBen Tyner * Attention object also carries a priority value. This priority is used 22b481d905SBen Tyner * to determine which attention event(s) to handle when there are more than 23b481d905SBen Tyner * one active event. 24b481d905SBen Tyner */ 25b481d905SBen Tyner class Attention 26b481d905SBen Tyner { 27b481d905SBen Tyner public: 28b481d905SBen Tyner /** @brief types of attentions to be handled (by priority low to high) */ 29b481d905SBen Tyner enum AttentionType 30b481d905SBen Tyner { 31b481d905SBen Tyner Special = 0, 32b481d905SBen Tyner Checkstop = 1, 33b481d905SBen Tyner Vital = 2 34b481d905SBen Tyner }; 35b481d905SBen Tyner 36b481d905SBen Tyner /** @brief Default constructor. */ 37b481d905SBen Tyner Attention() = delete; 38b481d905SBen Tyner 39b481d905SBen Tyner /** @brief Main constructors */ 40b481d905SBen Tyner Attention(AttentionType i_type, int (*i_handler)(Attention*), 413fb52e53SBen Tyner pdbg_target* i_target, Config* i_config); 42b481d905SBen Tyner 43b481d905SBen Tyner /** @brief Destructor */ 44b481d905SBen Tyner ~Attention() = default; 45b481d905SBen Tyner 46b481d905SBen Tyner /** @brief Get attention priority */ 47b481d905SBen Tyner int getPriority() const; 48b481d905SBen Tyner 493fb52e53SBen Tyner /* @brief Get config object */ 503fb52e53SBen Tyner Config* getConfig() const; 51b481d905SBen Tyner 52b481d905SBen Tyner /* @brief Call attention handler function */ 53b481d905SBen Tyner int handle(); 54b481d905SBen Tyner 55*792f32f7SBen Tyner /* @brief Get attention handler target */ 56*792f32f7SBen Tyner pdbg_target* getTarget() const; 57*792f32f7SBen Tyner 58b481d905SBen Tyner /** @brief Copy constructor. */ 59b481d905SBen Tyner Attention(const Attention&) = default; 60b481d905SBen Tyner 61b481d905SBen Tyner /** @brief Assignment operator. */ 62b481d905SBen Tyner Attention& operator=(const Attention&) = default; 63b481d905SBen Tyner 64b481d905SBen Tyner /** @brief less than operator */ 65b481d905SBen Tyner bool operator<(const Attention& right) const; 66b481d905SBen Tyner 67b481d905SBen Tyner private: 68b481d905SBen Tyner AttentionType iv_type; // attention type 69b481d905SBen Tyner int (*iv_handler)(Attention*); // handler function 70b481d905SBen Tyner pdbg_target* iv_target; // handler function target 713fb52e53SBen Tyner Config* iv_config; // configuration flags 72b481d905SBen Tyner }; 73b481d905SBen Tyner 74b481d905SBen Tyner } // namespace attn 75