#pragma once /** * @file eqpalg/algs/exp.h * @brief 所有表达式算法的基类 * 这个类只会载入前提表达式的信息 * @author Cat (null.null.null@qq.com) * @version 0.1 * @date 2021-09-13 * * Copyright: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION * */ #include #include #include #include #include #include #include #include #include #include // 三个表达式执行结构,对应三个进程类型 struct exec_cron_t {}; struct exec_task_t {}; struct exec_mon_t {}; /** * @brief 表达式类,可以自动检测是否带有动作反馈 */ class Exp : public AlgBase { public: Exp(const string& name, const mix_cc::json& rule_json, const string& ruleId, size_t dims); ~Exp() override; public: /** * @brief 重新载入表达式及其配置 * @return int */ virtual int init() override; /** * @brief 得到所有的计算结果 * @return std::string */ AlarmInfo exec_mon() override; /** * @brief Set the last alarm time object * unpause时,重新刷新mm_vars,屏蔽因长时间的停机再开机的误报 * @param time_point My Param doc */ virtual void set_last_alarm_time( TimePoint time_point = system_clock::now()) override; /** * @brief Set the usable object * set_usable 重新刷新mm_vars,屏蔽因长时间的停用带来的误报 * @param usable My Param doc */ virtual void set_usable(bool usable) override; /** * @brief 得到在指定时间内的单次执行结果,该执行只会从ihdb中获取历史数据 * 所以要确保对应时间和TAG点的历史数据确实存储在了IHDB中 * @param time_range 对应时间的历史数据 * @return AlarmInfo */ std::vector exec_task(mix_cc::time_range_t time_range) override; /** * @brief 最小的执行单元 * @return AlarmInfo */ virtual AlarmInfo mon_proc(); virtual mix_cc::json exec_cron(); virtual AlarmInfo cron_proc(); private: /** * @brief 重新载入数据源信息 * @return int */ int reload_config_data_source(); /** * @brief 重新载入表达式(不带反馈)信息,并确定算法是否是带反馈的算法 * @return int */ int reload_config_exp_act(); private: /** * @brief 重新载入反馈表达式、计算表达式、反馈限制执行时间 * @return int */ int reload_config_exp_feedback(); protected: /** * @brief 把从共享内存查询到的数据载入到表达式变量中 * @return int */ int refresh_exp_vars_mem(); /** * @brief 把从ihyperDB查询到的数据载入到表达式变量中 * @param row 数据矩阵的行数 * @return int */ int refresh_exp_vars_ihd(int row); int first_fill_mm_vars(); protected: /** * @brief 打印表达式和它的变量值 * @param expstr My Param doc */ void print_exp_vars(const string& expstr = ""); protected: std::unique_ptr exp_act_; ///< 动作表达式 std::unique_ptr exp_feedback_; ///< 反馈表达式 std::unique_ptr exp_result_; ///< 数值表达式 std::map mm_vars; ///< 表达式系统变量map string exp_str_; ///< 表达式字符串 string error_str_; ///< 错误字符串 protected: const size_t dims_; ///< 数据维度数量 TimeDur time_out_; ///< 反馈限制超时时间 TimePoint act_start_time_; ///<动作开始时间 bool act_triggered_; ///< 开始动作是否触发 bool act_started_ = false; ///< 动作是否开始(即使之前触发过,但是也可能由于超时、未保持而停止) bool feedback_triggered_; ///< 反馈是否触发 bool m_timemode; ///< 执行的时间模式 int refresh_counts_ = 0; ///< 当数据源是共享内存时开机保证前4次 mm_vars有值 protected: bool feedback_mode_ = false; ///< 有反馈的表达式模式 bool keep_mode_ = false; ///< 开始动作是否需要保持 protected: /** * @brief 表达式开始动作更新 * 更新动作开始时间和s{tagN} * 使程序进入到开始动作满足状态 * @return true * @return false */ bool act_start_done(); /** * @brief 表达式开始动作未保持 * 使得程序退出开始动作满足状态 * @return true * @return false */ bool act_not_hold(); /** * @brief 满足表达式终止条件 * 需要开始动作满足状态作为前提条件 * @return true * @return false */ bool act_done(); /** * @brief 开始动作是否超时 * 使得表达式推出满足开始动作状态 * @return true * @return false */ bool act_timeout(); protected: /** * @brief 获得超时报警 * @return AlarmInfo */ AlarmInfo get_timeout_alarm(); };