add function

This commit is contained in:
lnk
2025-09-04 20:59:17 +08:00
parent 722512fad6
commit 869189d18e
85 changed files with 1209 additions and 15 deletions

View File

@@ -2820,6 +2820,9 @@ void upload_data_test(){
//////////////////////////////////////////////////////////////////////////////////////////////////台账赋值给通信
std::vector<DeviceInfo> GenerateDeviceInfoFromLedger(const std::vector<terminal_dev>& terminal_devlist) {
std::lock_guard<std::mutex> lock(ledgermtx);
std::vector<DeviceInfo> devices;
for (const auto& terminal : terminal_devlist) {
@@ -3217,7 +3220,7 @@ void check_device_busy_timeout()
if (dev.busytimecount > 30)
{
std::cout << "[Timeout] Device " << dev.terminal_id
<< " busytype=READING_FILEMENU 超时("
<< " busytype=READING_FILEDATA 超时("
<< dev.busytimecount << "s)" << std::endl;
//发送超时响应
@@ -3407,6 +3410,37 @@ bool save_internal_value(const std::string &dev_id, const std::vector<float> &fa
return true;
}
bool save_internal_info(const std::string &dev_id, const std::vector<NameFixValue> &fixValueList) {
// 找到对应 terminal_dev
std::lock_guard<std::mutex> lock(ledgermtx);
auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(),
[&](const terminal_dev &dev) { return dev.terminal_id == dev_id; });
if (it == terminal_devlist.end()) {
std::cerr << "[send_set_reply] device not found: " << dev_id << std::endl;
return false;
}
terminal_dev &dev = *it;
// 判断 isbusy==2 且 busytype==READING_INTERFIXEDVALUE
if (dev.isbusy != 2 || dev.busytype != static_cast<int>(DeviceState::READING_INTERFIXEDVALUE)) {
std::cerr << "[send_set_reply] device not in READING_INTERFIXEDVALUE state." << std::endl;
return false;
}
// ★ 新增:清理原有的内部定值列表
dev.dz_internal_info_list.clear();
//将值严格按顺序存入list中
for (const auto &info : fixValueList) {
dev.dz_internal_info_list.push_back(info);
}
dev.isbusy--;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////回复定值读取响应
bool send_set_value_reply(const std::string &dev_id, unsigned char mp_index, const std::vector<DZ_TAB_STRUCT> &dz_info) {
std::lock_guard<std::mutex> lock(ledgermtx);
@@ -3530,3 +3564,70 @@ bool send_set_value_reply(const std::string &dev_id, unsigned char mp_index, con
return true;
}
bool send_internal_value_reply(const std::string &dev_id, const std::vector<DZ_kzz_bit> &control_words) {
std::lock_guard<std::mutex> lock(ledgermtx);
// 1) 找终端
auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(),
[&](const terminal_dev &d) { return d.terminal_id == dev_id; });
if (it == terminal_devlist.end()) {
std::cerr << "[send_set_value_reply] device not found: " << dev_id << std::endl;
return false;
}
terminal_dev &dev = *it;
// 2) 校验状态:发送“定值读取结果”回复,应处于 READING_INTERFIXEDVALUEisbusy == 1
if (dev.isbusy != 1 || dev.busytype != static_cast<int>(DeviceState::READING_INTERFIXEDVALUE)) { //定值读取
std::cerr << "[send_set_value_reply] device not in READING_INTERFIXEDVALUE state." << std::endl;
return false;
}
// 5) 生成 JSON结构严格贴合你给的样例
nlohmann::json j;
// 顶层
j["guid"] = dev.guid;
j["FrontIP"] = FRONT_IP; // 你的前置机 IP项目已有常量/变量)
j["Node"] = g_front_seg_index; // 节点号(项目已有变量)
j["Dev_mac"] = normalize_mac(dev.addr_str);
// Detail
nlohmann::json detail;
detail["Type"] = 0x2106; // 设备数据
// Msg
nlohmann::json msg;
msg["DataType"] = 0x0D; //内部定值
// DataArray对象数组逐个填充DZ_Value 严格按 set_values 顺序
nlohmann::json dataArray = nlohmann::json::array();
//拼接逻辑
// 6) 入队发送
queue_data_t connect_info;
connect_info.strTopic = Topic_Reply_Topic;
connect_info.strText = j.dump(); // 序列化为字符串
{
std::lock_guard<std::mutex> lk(queue_data_list_mutex);
queue_data_list.push_back(std::move(connect_info));
}
// 调试打印
std::cout << "[send_internal_value_reply] queued JSON:\n" << j.dump(4) << std::endl;
// 7) 发送后更新终端状态(按你现有规则)
if (dev.isbusy > 0) {
dev.isbusy--;
}
if (dev.isbusy == 0) {
dev.guid.clear();
dev.busytype = 0;
dev.internal_values.clear();//清理本次定值记录
dev.dz_internal_info_list.clear();//清理本次定值描述记录
}
return true;
}

View File

@@ -743,9 +743,34 @@ int parse_device_cfg_web()
///////////////////////////////////////////////////////////////////////////////用例这里将局部的map拷贝到全局map后续根据协议台账修改
// 先清空全局 container再逐个拷贝 map 中的 terminal_dev
std::lock_guard<std::mutex> lock(ledgermtx);
terminal_devlist.clear();
for (const auto& kv : terminal_dev_map) {
terminal_devlist.push_back(kv.second); // kv.second 是对象,不用判断指针
terminal_dev dev = kv.second; // kv.second 是对象,不用判断指针
// ======= [新增] 对 terminal_dev 中 web 未返回/未设置字段做统一初始化,避免脏值 =======
dev.guid.clear(); // [新增] 业务 guid 初始为空
dev.busytype = 0; // [新增] 业务类型(状态机)默认 0
dev.isbusy = 0; // [新增] 未进行业务
dev.busytimecount = 0; // [新增] 业务计时清零
dev.internal_values.clear(); // [新增] 内部定值清空,等后续业务真实填充
// ------------------------------------------------------------------------------------
// ======= [新增] 对每个监测点做必要的内部结构初始化 =======
for (auto &mon : dev.line) {
// 暂态事件容器显式清理(虽然默认构造已空,但这里确保无脏数据)
mon.qvvrevent.qvvrdata.clear(); // [新增]
mon.qvvrevent.qvvrfile.clear(); // [新增]
// 定值列表清理,等待后续配置/采集填充
mon.set_values.clear(); // [新增]
}
// ------------------------------------------------------------------------------------
terminal_devlist.push_back(dev);
}
// 判断监测点接线类型

View File

@@ -91,7 +91,6 @@ public:
std::string terminal_connect; //监测点接线方式
std::string timestamp; //更新时间
std::string status; //监测点状态
double PT1; // 电压变比1
double PT2; // 电压变比2
double CT1; // 电流变比1
@@ -101,6 +100,7 @@ public:
//定值list
std::list<float> set_values;
std::vector<DZ_TAB_STRUCT> dz_info_list; //定值信息列表
};
//终端台账
@@ -113,7 +113,9 @@ public:
int busytimecount; //业务进行计时
//内部定值list
std::list<float> internal_values;
std::list<float> internal_values;
std::vector<NameFixValue> &dz_internal_info_list; //内部定值信息列表
std::vector<DZ_kzz_bit> control_words;
std::string terminal_id;
std::string terminal_name;