eis/eqpalg/alg_base.h

345 lines
8.0 KiB
C
Raw Normal View History

#pragma once
/**
* @file eqpalg/alg_base.h
* @brief
* @author Cat (null.null.null@qq.com)
* @version 0.1
* @date 2021-09-17
*
* Copyright: Baosight Co. Ltd.
* DO NOT COPY/USE WITHOUT PERMISSION
*
*/
#include "mix_cc/ihyper_db.h"
#include "mix_cc/json.h"
#include "mix_cc/matheval/matheval.hpp"
#include <chrono>
#include <dsm/public.h>
#include <eqpalg/define/error_code.h>
#include <eqpalg/define/public.h>
#include <eqpalg/gb_logger.h>
#include <eqpalg/utility/expression_engine.h>
#include <eqpalg/utility/VarsCache.hpp>
#include <eqpalg/utility/XorShift128Plus.hpp>
#include <eqpalg/utility/alarm_poster.h>
#include <eqpalg/utility/condition_monitor.hpp>
#include <eqpalg/utility/eqp_stat.h>
#include <memory>
#include <mutex>
#include <shm/RuleStatShm.h>
#include <shm/SingletonTemp.hpp>
#include <string>
#include <unordered_map>
#include <vector>
#include <zlib/MemVar.h>
using std::string;
using namespace std::chrono;
using std::chrono::system_clock;
using TimePoint = system_clock::time_point;
using TimeDur = milliseconds;
/**
* @brief
*/
class AlgBase {
protected:
std::map<std::string, double> mm_vars;
const size_t pv_num_ = 6;
VarsCache var_cache_;
const string rule_id_;
const string rule_name_;
const mix_cc::json rule_json_;
std::unique_ptr<GbLogger> gb_logger_;
std::unique_ptr<LOG>
logger_;
TimePoint last_run_start_time_;
TimePoint last_save_start_time_;
TimePoint
last_rule_state_updae_start_time_;
TimePoint last_heart_beat_start_time_;
TimePoint this_run_start_time_;
TimePoint now_time_;
int data_source_ = 1;
TimePoint last_alarm_time_;
TimeDur delay_time_;
TimeDur query_interval_time_ = hours(
CMemVar::Const()->eis_qihd_interval_time);
TimeDur ihd_min_time_particles_ = 20ms;
vector<string> m_tags;
bool is_usable_;
bool is_running_ = true;
utility::AlarmPoster alarm_poster_;
string remark_ =
"0";
std::mutex lm;
RuleStatShm::RuleStatLocal rule_stat_;
std::string error_message_str_;
std::vector<ErrorCodeType> error_code_list_;
int prr_ = PRR::None;
std::unique_ptr<ExpressionEngine> expr_engine_;
DataInfo data_info_;
ConditionMonitor con_monitor_;
bool now_prr_ = false;
int task_seq = 0;
TimeDur save_interval_ms_ = 5000ms;
TimeDur rule_state_update_interval_ms_ = 500ms;
public:
void logReset(int task_seq);
/**
* @brief map
* @return true
* @return false
*/
bool update_map_rule();
/**
* @brief
* @param name
* @param rulejson
* @param ruleId id
*/
AlgBase(const string &name, const mix_cc::json &rule_json,
const string &ruleId);
virtual ~AlgBase();
/**
* @brief
* 1.tag点
* 2.
* 3.
* @return int
*/
virtual int init();
/**
* @brief start end
*/
virtual void save_rule_norm_data();
/**
* @brief
* @return true
* @return false
*/
bool get_cycled();
/**
* @brief
* 线
* @return true
* @return false
*/
bool get_save_data_cycled();
/**
* @brief
* 线
* @return true
* @return false
*/
bool get_update_rule_stat_cycled();
/**
* @brief 51
* @return true
* @return false
*/
bool get_heart_beat_log_cycled();
/**
* @brief
* @param usable
*/
virtual void set_usable(bool usable);
/**
* @brief
* @return true
* @return false
*/
bool get_usable() { return this->is_usable_; }
/**
* @brief
* @return true
* @return false
*/
virtual bool get_prr();
/**
* @brief Get the rule id object
* @return std::string
*/
std::string get_rule_id() { return this->rule_id_; }
/**
* @brief Get the rule name object
* @return std::string
*/
std::string get_rule_name() { return this->rule_name_; }
/**
* @brief
* @param time_point My Param doc
*/
virtual void set_last_alarm_time(TimePoint time_point = system_clock::now());
/**
* @brief
* @return TimePoint
*/
TimePoint get_last_alarm_time();
/**
* @brief
* @return AlarmInfo
*/
virtual AlarmInfo exec_mon() = 0;
/**
* @brief
*
* @param time_range
* @return AlarmInfo
*/
virtual std::vector<AlarmInfo> exec_task(mix_cc::time_range_t time_range) = 0;
// normal 单次执行
virtual AlarmInfo exec_normal_task(mix_cc::time_range_t time_range) {
return AlarmInfo{};
};
/**
* @brief
* (json形式)
* @return mix_cc::json
*/
virtual mix_cc::json exec_cron();
/**
* @brief threads进行调用
* 使
*/
void exec_mon_call();
/**
* @brief
*/
void exec_task_call(const mix_cc::time_range_t &time_range);
void exec_normal_task_call(const mix_cc::time_range_t &time_range);
/**
* @brief
*/
void exec_cron_call();
/**
* @brief Get the is cron run object
* 线cron进程用
* @return true
* @return false
*/
// bool get_is_cron_run(){return this->is_cron_run};
protected:
mix_cc::time_range_t query_time_range_;
mix_cc::time_range_t task_time_range_;
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
queried_data_;
std::vector<TimePoint> queried_time_;
protected:
/**
* @brief ihyperdb中刷新该算法所对应的数据
*
* queried_data_ queried_time_变量中
* @return int
*/
int refresh_ihd_cache();
/**
* @brief task用 ihyperdb中刷新该算法所对应的数据
* @param delay_time ihd间隔时间
* @return int
*/
int refresh_ihd_cache(TimeDur delay_time);
/**
* @brief ihd到 queried_data_
* @param time_range
* @return int 0--
*/
int refresh_ihd_cache(mix_cc::time_range_t time_range);
/**
* @brief tag点名称信息
* @return int
*/
int reload_config_tag();
/**
* @brief now_time_
* @return int
*/
int refresh_now_time();
/**
* @brief tag和时间范围ihd到 queried_data_
* @param tag tag点
* @param time_range
* @return int 0--
*/
int ihd_get_by_tag(string tag, mix_cc::time_range_t time_range);
public:
/**
* @brief
* @return int
*/
int get_data_source();
/**
* @brief
* ExpTimes用
*/
virtual void reset_dev_data(){};
/**
* @brief
* @param lb
* @param ub
* @param va
* @param stime
* @param etime
*/
virtual void update_limit_alarm(double lb, double ub, double va,
int64_t stime = 0, int64_t etime = 0);
protected:
/**
* @brief Get the alarm time object
* @return mix_cc::time_range_t
*/
virtual mix_cc::time_range_t get_alarm_time();
};