eis/eqpalg/.do_not_use/otheralg/exp.h

201 lines
4.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 <eqpalg/alg_base.h>
#include <eqpalg/define/public.h>
#include <eqpalg/gb_item_memory.h>
#include <glob/SingletonTemplate.h>
#include <iomanip>
#include <iostream>
#include <map>
#include <memory>
#include <string>
#include <vector>
// 三个表达式执行结构,对应三个进程类型
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<AlarmInfo> 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<mix_cc::matheval::Expression> exp_act_; ///< 动作表达式
std::unique_ptr<mix_cc::matheval::Expression> exp_feedback_; ///< 反馈表达式
std::unique_ptr<mix_cc::matheval::Expression> exp_result_; ///< 数值表达式
std::map<std::string, double> 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();
};