#include HoldTime::HoldTime(double time, std::string tagi, std::string var_name) : hold_time(time), tagi(tagi), var_name(var_name), value(false), last_value(0) { last_time = std::chrono::system_clock::now(); } HoldTime::~HoldTime() {} bool HoldTime::update_value(double tag_value) { if (fabs(tag_value - last_value) > std::numeric_limits::epsilon()) { value = false; last_time = std::chrono::system_clock::now(); } else { if (std::chrono::system_clock::now() - last_time > std::chrono::seconds(int(hold_time * 60))) { value = true; } else { value = false; } } last_value = tag_value; return value; } std::tuple HoldTime::find_hold( std::string exp_str) { bool flag = false; double timeM = 0; std::string tagi = ""; std::string var_name = ""; auto res = exp_str.find("hold"); if (res != std::string::npos) { auto res2 = exp_str.find("_on_tag"); if (res2 != std::string::npos) { std::string time_str = exp_str.substr(res + 4, res2 - res); auto res21 = time_str.find("_"); auto res22 = time_str.find("."); if (res21 != std::string::npos) { time_str.replace(res21, res21 + 1, "."); } timeM = std::stod(time_str); auto res3 = exp_str.find("_HE"); if (res3 != std::string::npos) { tagi = exp_str.substr(res2 + 4, res3 - res2 - 4); flag = true; var_name = exp_str.substr(res, res3 + 3 - res); } else { timeM = 2; tagi = "no _HE"; } if (res22 != std::string::npos) { timeM = 3; tagi = "has dot"; flag = false; } } else { timeM = 1; tagi = "no _on_tag"; } } else { timeM = 0; tagi = "no hold"; } return std::make_tuple(flag, timeM, tagi, var_name); } std::vector HoldTime::find_substr(std::string str, std::string sub_str) { std::vector res; std::string str1 = str; auto res1 = find_str(str1, sub_str); while (res1.first != " ") { res.push_back(res1.first); str1 = res1.second; res1 = find_str(str1, sub_str); } return res; } std::pair HoldTime::find_str(std::string str, std::string sub_str) { if (str == " ") { return std::make_pair(" ", " "); } try { auto index = str.find(sub_str); if (index != std::string::npos) { if (index >= str.size() - 1) { return std::make_pair(str.substr(0, index + sub_str.size() + 1), " "); } return std::make_pair( str.substr(0, index + sub_str.size()), str.substr(index + sub_str.size(), str.size() - index)); } else { return std::make_pair(" ", " "); } } catch (const std::exception& e) { return std::make_pair(" ", " "); } }