add function
This commit is contained in:
@@ -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_INTERFIXEDVALUE;isbusy == 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;
|
||||
}
|
||||
Reference in New Issue
Block a user