201 lines
4.9 KiB
C++
201 lines
4.9 KiB
C++
#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();
|
||
};
|