From 0e629185be606c109d6eaf9c712120d23dafe375 Mon Sep 17 00:00:00 2001 From: ypc <15051963820@163.com> Date: Wed, 17 Jun 2026 09:53:00 +0800 Subject: [PATCH] =?UTF-8?q?<=E4=BF=AE=E6=94=B9>=201=E3=80=81=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=8F=82=E6=95=B0=E5=AE=9A=E5=80=BC=E7=9A=84=E7=BC=BA?= =?UTF-8?q?=E7=9C=81=E5=80=BC=E6=96=B9=E6=A1=88=EF=BC=8C=E8=AE=A4=E4=B8=BA?= =?UTF-8?q?=E7=BC=BA=E7=9C=81=E5=80=BC=E4=BB=85=E5=9C=A8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=EF=BC=8C=E5=9C=A8=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E4=B8=AD=E4=B8=8D=E5=BA=94=E8=AF=A5=E6=9C=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mimo/plan/libdatacenter缺陷修复方案.md | 39 +++++ mimo/plan/参数缺省值重构方案.md | 47 ++++++ mimo/问题处理文档.md | 39 +++++ release/inc/myDatacenter.h | 8 +- src/system/libdatacenter/src/dc_param.cpp | 16 +- src/system/libdatacenter/src/dc_signal.cpp | 179 +++++---------------- src/system/libiec61850m/src/iec61850m.cpp | 15 +- src/system/libiec61850s/src/iec61850s.cpp | 4 +- src/system/libself_ptl/inc/self_ptl.h | 1 - src/system/libself_ptl/src/method.cpp | 5 +- src/system/libself_ptl/src/self_ptl.cpp | 13 +- src/system/libweb_server/src/ws_method.cpp | 21 +-- 12 files changed, 184 insertions(+), 203 deletions(-) create mode 100644 mimo/plan/libdatacenter缺陷修复方案.md create mode 100644 mimo/plan/参数缺省值重构方案.md diff --git a/mimo/plan/libdatacenter缺陷修复方案.md b/mimo/plan/libdatacenter缺陷修复方案.md new file mode 100644 index 0000000..24eb539 --- /dev/null +++ b/mimo/plan/libdatacenter缺陷修复方案.md @@ -0,0 +1,39 @@ +# libdatacenter 缺陷修复方案 + +## 缺陷 1 & 2: AO/Param 重注册持锁外 delete + +**问题**: `dc_signal_ao`(line 1123) 和 `dc_signal_param`(line 1347-1348) 在 re-registration 路径中, +`dc_delete_signal_data` 在 `dc_signal_add_to_map` 锁外执行,use-after-free 风险。 + +**修复**: 将 re-registration 路径重构为在 `signal_ao.mtx`/`signal_param.mtx` 锁内完成 delete+replace。 +具体:先加锁,再 delete 旧数据并替换新指针,unlock。 + +## 缺陷 3: 回调向量无锁写入 + +**问题**: `change_cb_list.push_back` 和 `out_change_cb_list.push_back` 在多处无锁调用。 + +**修复**: 在 `dc_signal_add_to_map` 末尾或调用点加 `dc_signal_map.mtx` 保护 push_back。 + +## 缺陷 4: YK 跳过值校验 + +**问题**: `dc_signal_yk_set_status` 只调 `dc_check_ctrl_valid`,不调 `dc_check_val_valid`。 + +**修复**: DIRECT 步骤增加 `dc_check_val_valid` 调用。 + +## 缺陷 5: strncpy 安全 + +**问题**: IP/MAC/C 类型用 `strncpy(dst,src,len)`,源串=len时不补\0。 + +**修复**: 改为 `memcpy(dst, src, len)`。 + +## 涉及文件 + +| 文件 | 改动 | +|------|------| +| `src/system/libdatacenter/src/dc_signal.cpp` | 5处修改 | + +## 验证 + +```bash +./release/build.sh +``` diff --git a/mimo/plan/参数缺省值重构方案.md b/mimo/plan/参数缺省值重构方案.md new file mode 100644 index 0000000..4808a65 --- /dev/null +++ b/mimo/plan/参数缺省值重构方案.md @@ -0,0 +1,47 @@ +# 参数缺省值重构方案 + +**原则**:缺省值只存在于 `param.xml`,运行时不再存储。 + +## 改动清单 + +### T1: 移除 `stru_signal.vec_p_default_data` +**文件**: `dc_signal.h` +- 删除 `std::vector vec_p_default_data;` 字段 + +### T2: 移除 API 中的默认值参数及返回值 +**文件**: `myDatacenter.h`, `dc_signal.cpp` +- `dc_signal_ao()` — 删除 `void *p_default_data` 参数 +- `dc_signal_param()` — 删除 `void **p_default_data` 参数 +- `dc_get_ao_signal_info()` — 删除 `void **p_default_data` 输出参数 +- `dc_get_param_signal_info()` — 删除 `std::vector *p_vec_p_default_data` 输出参数 +- 删除 `dc_signal_ao_add_check()` / `dc_signal_param_add_check()`(不复存在) + +### T3: `dc_param.cpp` 不创建默认值 +**文件**: `dc_param.cpp` +- `dc_param_register_signals()` 中删除 `p_default_data` 创建和传参 +- 值优先级:self_param.xml value > param.xml value > param.xml default(逻辑不变,只是不再单独创建 default 指针) + +### T4: `self_ptl` 不再创建/传递默认值 +**文件**: `self_ptl.cpp`, `self_ptl.h` +- `stru_self_ptl_cfg_param_data` 删除 `vec_p_default_data` +- `self_ptl_cfg_init()` 删除 `p_default_data`/`p_default_val_data` 创建 +- `self_ptl_do_signal_out()` 删除默认值传参 +- `method.cpp` CLI 展示不再读取 `vec_p_default_data` + +### T5: `ws_method` 去掉默认值 +**文件**: `ws_method.cpp`, `ws_method.h` +- `stru_ws_signal` 删除 `vec_p_default_data` +- 删除所有默认值读写 + +### T6: `iec61850m` 不再创建默认值 +**文件**: `iec61850m.cpp` +- 删除 `dc_create_data_ptr_by_type` 调用 + `p_default` 赋值 + +### T7: `dc_param_cfg_check()` 不写 default 字段 +**文件**: `dc_signal.cpp` +- `self_param.xml` 只写 `value`,不写 `default` + +## 验证 +```bash +./release/build.sh +``` diff --git a/mimo/问题处理文档.md b/mimo/问题处理文档.md index 196b5ef..c266e38 100644 --- a/mimo/问题处理文档.md +++ b/mimo/问题处理文档.md @@ -248,3 +248,42 @@ **状态**:✅ 已完成 **涉及文件**:`self_ptl.cpp`, `method.cpp`, `myDatacenter.h`, `dc_signal.cpp` + +--- + +## 2026-06-16: libdatacenter 缺陷修复 + +**来源**:[libdatacenter模块分析](./工程/libdatacenter模块分析.md) + +### 修复项 + +1. **缺陷1&2: AO/Param 重注册持锁外 delete** — `dc_signal_ao` 和 `dc_signal_param` 的 re-registration 路径中 `dc_delete_signal_data` 改为在 `signal_ao.mtx`/`signal_param.mtx` 锁内执行,消除 use-after-free 风险。 + +2. **缺陷3: 回调向量无锁写入** — `out_change_cb_list`/`change_cb_list` 的 `push_back` 加对应的 `stru_signal_map.mtx` 锁保护。 + +3. **缺陷4: YK 跳过值校验** — `dc_signal_yk_set_status` 的 DIRECT 步骤增加 `dc_check_val_valid` 调用,与 AO/Param 行为一致。 + +4. **缺陷5: strncpy 安全** — IP/MAC/C 类型 `dc_set_signal_val` 中的 `strncpy` 改为 `memcpy`,避免源串等于缓冲区长时无 `\0` 终止。 + +**状态**:✅ 已完成 +**涉及文件**:`src/system/libdatacenter/src/dc_signal.cpp` + +--- + +## 2026-06-16: 参数缺省值重构 + +**来源**:设计讨论——缺省值应只存在于配置文件,不应在运行时存储。 + +### 完成项 + +1. **移除 `stru_signal.vec_p_default_data`** — 默认值不再存储于运行时结构中 +2. **移除 API 默认值参数** — `dc_signal_ao()` / `dc_signal_param()` 不再接收 `p_default_data`;`dc_get_ao_signal_info()` / `dc_get_param_signal_info()` 不再输出默认值 +3. **删除 `dc_signal_{ao,param}_add_check()`** — 不再需要比较默认值变化 +4. **dc_param.cpp 不再创建默认值** — 初始化时只从 `param.xml`/`self_param.xml` 读值并注册 +5. **self_ptl 不再创建/传默认值** — 删除 `vec_p_default_data` 创建和传参 +6. **ws_method 去掉默认值** — 删除读取/展示/序列化 +7. **iec61850m 不再创建默认值** — 删除 `p_default[]` 创建 +8. **self_param.xml 不写 default 字段** — `dc_param_cfg_check()` 只写 `value` + +**状态**:✅ 已完成 +**涉及文件**:`dc_signal.h/cpp`, `myDatacenter.h`, `dc_param.cpp`, `self_ptl.h/cpp`, `method.cpp`, `ws_method.cpp`, `iec61850m.cpp`, `iec61850s.cpp` diff --git a/release/inc/myDatacenter.h b/release/inc/myDatacenter.h index c6297ab..1d3d3a0 100644 --- a/release/inc/myDatacenter.h +++ b/release/inc/myDatacenter.h @@ -66,7 +66,7 @@ int dc_signal_in(const std::string &saddr, const std::string &desc, const std::s int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc, const std::string &link_saddr, void **p_data, out_signal_change_cb cb, const std::string &module_id); -int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id); +int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id); int dc_signal_ao_link_with_callback(const std::string &saddr, void **p_data, signal_change_cb cb, const std::string &module_id); @@ -75,7 +75,7 @@ int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_s int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data, const std::string &module_id); // 数据中心参数信号注册接口 -int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int num, signal_change_cb cb, const std::string &module_id); +int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, int num, signal_change_cb cb, const std::string &module_id); // 数据中心参数链接信号接口 int dc_signal_param_link_with_callback(const std::string &saddr, void **p_data, int num, signal_change_cb cb, const std::string &module_id); @@ -100,10 +100,10 @@ int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t // 数据中心获取in信号信息接口 int dc_get_in_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data); -int dc_get_ao_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, void **p_data, void **p_default_data); +int dc_get_ao_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, void **p_data); // 数据中心获取参数信号信息接口 -int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, std::vector *p_vec_p_data, std::vector *p_vec_p_default_data); +int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, std::vector *p_vec_p_data); // 数据中心获取遥控信号信息接口 int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, uint8_t &ctrl_type, void **p_data); diff --git a/src/system/libdatacenter/src/dc_param.cpp b/src/system/libdatacenter/src/dc_param.cpp index d573753..43be6a9 100644 --- a/src/system/libdatacenter/src/dc_param.cpp +++ b/src/system/libdatacenter/src/dc_param.cpp @@ -219,11 +219,11 @@ static int dc_param_register_signals(const std::string ¶m_path, dc_set_signal_val_from_str(p_default_data, data_type, std::string(default_val)); } - if (p_data && p_default_data) + if (p_data) { dc_signal_ao(saddr, desc, data_type, SIGNAL_CTRL_TYPE::SBO_NORMAL, - p_data, p_default_data, nullptr, MODULE_DATACENTER); + p_data, nullptr, MODULE_DATACENTER); } } } @@ -255,7 +255,6 @@ static int dc_param_register_signals(const std::string ¶m_path, if (num < 1) continue; std::vector vec_p_data; - std::vector vec_p_default_data; for (XMLElement *item = sig->FirstChildElement("Item"); item != nullptr; item = item->NextSiblingElement("Item")) @@ -283,20 +282,13 @@ static int dc_param_register_signals(const std::string ¶m_path, vec_p_data.push_back(p_data); } - void *p_default_data = dc_create_data_ptr_by_type(data_type); - if (p_default_data) - { - if (default_val && strlen(default_val) > 0) - dc_set_signal_val_from_str(p_default_data, data_type, std::string(default_val)); - vec_p_default_data.push_back(p_default_data); - } } - if (!vec_p_data.empty() && vec_p_data.size() == vec_p_default_data.size()) + if (!vec_p_data.empty()) { dc_signal_param(saddr, desc, data_type, SIGNAL_CTRL_TYPE::SBO_NORMAL, - vec_p_data.data(), vec_p_default_data.data(), num, nullptr, MODULE_DATACENTER); + vec_p_data.data(), num, nullptr, MODULE_DATACENTER); } } } diff --git a/src/system/libdatacenter/src/dc_signal.cpp b/src/system/libdatacenter/src/dc_signal.cpp index 6c5dfb6..e00fdfd 100644 --- a/src/system/libdatacenter/src/dc_signal.cpp +++ b/src/system/libdatacenter/src/dc_signal.cpp @@ -161,7 +161,7 @@ int dc_get_in_signal_info(const std::string &saddr, std::string &desc, uint8_t & return -1; } -int dc_get_ao_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, void **p_data, void **p_default_data) +int dc_get_ao_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, void **p_data) { stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_ao); if(p_signal == nullptr) @@ -194,23 +194,11 @@ int dc_get_ao_signal_info(const std::string &saddr, std::string &desc, uint8_t & return -1; } - if(!p_signal->vec_p_default_data.empty() && nullptr != p_signal->vec_p_default_data[0]) - { - if(p_default_data != nullptr) - { - (*p_default_data) = p_signal->vec_p_default_data[0]; - } - } - else - { - MY_LOG_E("saddr %s vec_p_default_data is empty or vec_p_default_data[0] is nullptr", saddr.c_str()); - return -1; - } return 0; } -int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, std::vector *p_vec_p_data, std::vector *p_vec_p_default_data) +int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param *p_param, uint8_t &ctrl_type, std::vector *p_vec_p_data) { stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param); if(p_signal == nullptr) @@ -242,19 +230,7 @@ int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_ } } - for(size_t i = 0; i < p_signal->vec_p_default_data.size(); i++) - { - if(nullptr == p_signal->vec_p_default_data[i]) - { - MY_LOG_E("saddr %s vec_p_default_data[%ld] is nullptr", saddr.c_str(), i); - return -1; - } - if(p_vec_p_default_data != nullptr) - { - p_vec_p_default_data->push_back(p_signal->vec_p_default_data[i]); - } - } return 0; } @@ -391,78 +367,9 @@ LOCAL void dc_signal_apply_metadata(stru_signal &signal) } } -LOCAL bool dc_signal_ao_add_check(stru_signal *p_signal, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_default_data) -{ - if(p_signal == nullptr || p_default_data == nullptr) - { - LOG_E("p_signal or p_default_data is nullptr"); - return false; - } - bool change = false; - if(p_signal->desc != desc) - { - p_signal->desc = desc; - change = true; - } - if(p_signal->data_type != data_type) - { - p_signal->data_type = data_type; - change = true; - } - - if(p_signal->ctrl_type != ctrl_type) - { - p_signal->ctrl_type = ctrl_type; - change = true; - } - - if(0 != dc_data_compare(p_signal->data_type, p_default_data, p_signal->vec_p_default_data[0])) - { - change = true; - } - - return change; -} - -LOCAL bool dc_signal_param_add_check(stru_signal *p_signal, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_default_data, uint8_t num) -{ - bool change = false; - - if(p_signal->desc != desc) - { - p_signal->desc = desc; - printf("desc=%s\n", p_signal->desc.c_str()); - change = true; - } - - if(p_signal->data_type != data_type) - { - p_signal->data_type = data_type; - printf("data_type=%d\n", p_signal->data_type); - change = true; - } - - // if(p_signal->ctrl_type != ctrl_type) - // { - // p_signal->ctrl_type = ctrl_type; - // printf("ctrl_type=%d\n", p_signal->ctrl_type); - // change = true; - // } - - for(size_t i = 0; i < num; i++) - { - if(0 != dc_data_compare(p_signal->data_type, p_default_data[i], p_signal->vec_p_default_data[i])) - { - // printf(" zone %d: val=%s def=%s, %p, %p\n", i+1, dc_get_signal_val(p_signal->vec_p_data[i], p_signal->data_type).c_str(), dc_get_signal_val(p_signal->vec_p_default_data[i], p_signal->data_type).c_str(), p_signal->vec_p_data[i], p_signal->vec_p_default_data[i]); - change = true; - } - } - - return change; -} LOCAL int dc_check_ctrl_val_valid(const stru_signal_ctrl &ctrl, const void *p_data) @@ -1096,17 +1003,17 @@ int dc_signal_in_with_callback(const std::string &saddr, const std::string &desc return dc_signal_add_to_map(signal, g_datacenter.signal_in); } -int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb, const std::string &module_id) +int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb, const std::string &module_id) { - if(p_data == nullptr || p_default_data == nullptr) + if(p_data == nullptr) { - MY_LOG_E("p_data or p_default_data is nullptr"); + MY_LOG_E("p_data is nullptr"); return -1; } XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length()); stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_ao); - if(p_signal != nullptr && !p_signal->vec_p_data.empty() && !p_signal->vec_p_default_data.empty() && nullptr != p_signal->vec_p_data[0] && nullptr != p_signal->vec_p_default_data[0]) + if(p_signal != nullptr && !p_signal->vec_p_data.empty() && nullptr != p_signal->vec_p_data[0]) { // Always copy old value to new pointer when data type matches if(p_signal->data_type == data_type) @@ -1114,16 +1021,12 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data dc_set_signal_val(p_data, data_type, p_signal->vec_p_data[0]); } - if(true == dc_signal_ao_add_check(p_signal, desc, data_type, ctrl_type, p_default_data)) { - dc_set_param_cfg_change(true); + std::lock_guard lock(g_datacenter.signal_ao.mtx); + dc_delete_signal_data(p_signal->vec_p_data[0], data_type); + p_signal->vec_p_data[0] = p_data; + p_signal->change_cb_list.push_back({module_id, cb}); } - - // delete p_signal->vec_p_data[0]; - dc_delete_signal_data(p_signal->vec_p_data[0], data_type); - p_signal->vec_p_data[0] = p_data; - - p_signal->change_cb_list.push_back({module_id, cb}); return 0; } @@ -1143,7 +1046,6 @@ int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data if(p_signal != nullptr ) { p_signal->vec_p_data.push_back(p_data); - p_signal->vec_p_default_data.push_back(p_default_data); if(cb) { @@ -1295,7 +1197,7 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty return -1; } -int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, void **p_default_data, int data_num, signal_change_cb cb, const std::string &module_id) +int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void **p_data, int data_num, signal_change_cb cb, const std::string &module_id) { // 先从参数表里解析,调用参数注册 // 程序注册时,从参数表里去查找,同一个信息,使用参数表中的保存的数据值,在线程初始化时,通知所有链接此信号的信号 @@ -1309,9 +1211,9 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d for(int i = 0; i < data_num; i++) { - if(p_data[i] == nullptr || p_default_data[i] == nullptr) + if(p_data[i] == nullptr) { - LOG_E("p_data[%d] or p_default_data[%d] is nullptr", i, i); + LOG_E("p_data[%d] is nullptr", i); return -1; } } @@ -1331,34 +1233,24 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d } // dc_set_signal_val(p_data, data_type, p_signal->p_data); - bool check_result = dc_signal_param_add_check(p_signal, desc, data_type, ctrl_type, p_default_data, data_num); - if (check_result) + dc_set_param_cfg_change(true); { - dc_set_param_cfg_change(true); - } - else - { - printf("[SIGNAL_PARAM_REPLACE] add_check=false -> metadata unchanged\n"); - } + std::lock_guard lock(g_datacenter.signal_param.mtx); - for(size_t i = 0; i < data_num; i++) - { - // delete p_signal->vec_p_data[i]; - dc_delete_signal_data(p_signal->vec_p_data[i], data_type); - dc_delete_signal_data(p_signal->vec_p_default_data[i], data_type); - // p_signal->vec_p_data[i] = vec_p_data[i]; - } - - p_signal->vec_p_data.clear(); - p_signal->vec_p_default_data.clear(); + for(size_t i = 0; i < p_signal->vec_p_data.size(); i++) + { + dc_delete_signal_data(p_signal->vec_p_data[i], data_type); + } - for(size_t i = 0; i < data_num; i++) - { - p_signal->vec_p_data.push_back(p_data[i]); - p_signal->vec_p_default_data.push_back(p_default_data[i]); + p_signal->vec_p_data.clear(); + + for(size_t i = 0; i < data_num; i++) + { + p_signal->vec_p_data.push_back(p_data[i]); + } + + p_signal->change_cb_list.push_back({module_id, cb}); } - - p_signal->change_cb_list.push_back({module_id, cb}); return 0; } @@ -1380,7 +1272,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d for(size_t i = 0; i < data_num; i++) { p_signal->vec_p_data.push_back(p_data[i]); - p_signal->vec_p_default_data.push_back(p_default_data[i]); + } if(cb) @@ -1596,6 +1488,12 @@ int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, str { if(0 == dc_check_ctrl_valid(p_signal, step, ctrl, p_data)) { + if(0 != dc_check_val_valid(p_signal, 0, p_data)) + { + LOG_E("YK val check failed, saddr=%s", saddr.c_str()); + return -1; + } + if(step == SIGNAL_CTRL_STEP::SELECT) { dc_set_signal_val(ctrl.p_data, ctrl.data_type, p_data); @@ -1872,17 +1770,17 @@ LOCAL int dc_set_signal_val(void *p_data, uint8_t data_type, void *set_data) *(double*)p_data = *(double*)set_data; break; case DATA_TYPE_IP: - strncpy((char *)p_data, (char *)set_data, 4); + memcpy(p_data, set_data, 4); break; case DATA_TYPE_MAC: - strncpy((char *)p_data, (char *)set_data, 6); + memcpy(p_data, set_data, 6); break; case DATA_TYPE_C8: case DATA_TYPE_C32: case DATA_TYPE_C64: case DATA_TYPE_C128: case DATA_TYPE_STR: - strncpy((char *)p_data, (char *)set_data, dc_get_data_type_len(data_type)); + memcpy(p_data, set_data, dc_get_data_type_len(data_type)); break; case DATA_TYPE_C1: *(char*)p_data = *(char*)set_data; @@ -2187,7 +2085,6 @@ void dc_param_cfg_check(const std::string &path) sig_elem->SetAttribute("step", p_ao->param.step); sig_elem->SetAttribute("unit", p_ao->param.unit.c_str()); sig_elem->SetAttribute("value", dc_get_signal_val(p_ao->vec_p_data[0], p_ao->data_type).c_str()); - sig_elem->SetAttribute("default", dc_get_signal_val(p_ao->vec_p_default_data[0], p_ao->data_type).c_str()); ao_elem->InsertEndChild(sig_elem); } @@ -2218,12 +2115,10 @@ void dc_param_cfg_check(const std::string &path) for(int i = 0; i < p_param->vec_p_data.size(); i++) { std::string val = dc_get_signal_val(p_param->vec_p_data[i], p_param->data_type); - std::string def = dc_get_signal_val(p_param->vec_p_default_data[i], p_param->data_type); XMLElement *item_elem = doc.NewElement("Item"); item_elem->SetAttribute("index", i+1); item_elem->SetAttribute("value", val.c_str()); - item_elem->SetAttribute("default", def.c_str()); sig_elem->InsertEndChild(item_elem); } diff --git a/src/system/libiec61850m/src/iec61850m.cpp b/src/system/libiec61850m/src/iec61850m.cpp index 2ab3021..73a69c7 100644 --- a/src/system/libiec61850m/src/iec61850m.cpp +++ b/src/system/libiec61850m/src/iec61850m.cpp @@ -504,16 +504,16 @@ LOCAL int iec61850m_ao_signal_init(int num, stru_point_item *p_item) return -1; } - if(NULL == p->value.p_val[0] || NULL == p->value.p_default[0]) + if(NULL == p->value.p_val[0]) { - MY_LOG_E("p->value.p_val[0] or p->value.p_default[0] is null, p_val %p, p_default %p, type %d", p->value.p_val[0], p->value.p_default[0], p->type); + MY_LOG_E("p->value.p_val[0] is null, type %d", p->type); return -1; } uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], p->value.p_default[0], iec61850m_signal_ao_change_callback, MODULE_IEC61850M)) + if(0 != dc_signal_ao(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val[0], iec61850m_signal_ao_change_callback, MODULE_IEC61850M)) { MY_LOG_E("dc_signal_ao failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type); return -1; @@ -540,7 +540,7 @@ LOCAL int iec61850m_param_signal_init(int num, stru_point_item *p_item) uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; - if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, p->value.p_default, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback, MODULE_IEC61850M)) + if(0 != dc_signal_param(p->saddr, p->desc, local_type, ctrl_type, p->value.p_val, MMS_M_MAX_VAL_NUM, iec61850m_signal_param_change_callback, MODULE_IEC61850M)) { MY_LOG_E("dc_signal_param failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type); return -1; @@ -584,18 +584,13 @@ LOCAL int iec61850m_signal_init(stru_cfg &cfg) uint8_t local_type = g_mms_m_type_to_local_type[p->type]; p->value.p_val[0] = dc_create_data_ptr_by_type(local_type); - if(item.p_item == cfg.point.p_ao) - { - p->value.p_default[0] = dc_create_data_ptr_by_type(local_type); - } + if(item.p_item == cfg.point.p_param) { - p->value.p_default[0] = dc_create_data_ptr_by_type(local_type); for(int j = 1; j < MMS_M_MAX_VAL_NUM; j++) { p->value.p_val[j] = dc_create_data_ptr_by_type(local_type); - p->value.p_default[j] = dc_create_data_ptr_by_type(local_type); } } } diff --git a/src/system/libiec61850s/src/iec61850s.cpp b/src/system/libiec61850s/src/iec61850s.cpp index 135dae9..9bde60b 100644 --- a/src/system/libiec61850s/src/iec61850s.cpp +++ b/src/system/libiec61850s/src/iec61850s.cpp @@ -324,7 +324,7 @@ LOCAL int iec61850s_setting_signals_init(std::vector &ve return -1; } - if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, NULL, NULL)) + if(0 != dc_get_ao_signal_info(setting.base.saddr, desc, setting.base.type, nullptr, setting.base.ctrl_model, NULL)) { MY_LOG_E("dc_get_ao_signal_info failed, saddr: %s, desc: %s", setting.base.saddr, desc.c_str()); return -1; @@ -401,7 +401,7 @@ LOCAL int iec61850s_param_signals_init(std::vector &vec_ std::string desc = ""; std::vector p_data_vec; - if(0 != dc_get_param_signal_info(param.base.saddr, desc, param.base.type, nullptr, param.base.ctrl_model, &p_data_vec, nullptr)) + if(0 != dc_get_param_signal_info(param.base.saddr, desc, param.base.type, nullptr, param.base.ctrl_model, &p_data_vec)) { MY_LOG_E("dc_get_param_signal_info failed, saddr: %s, desc: %s", param.base.saddr, desc.c_str()); return -1; diff --git a/src/system/libself_ptl/inc/self_ptl.h b/src/system/libself_ptl/inc/self_ptl.h index 74f241d..9651db4 100644 --- a/src/system/libself_ptl/inc/self_ptl.h +++ b/src/system/libself_ptl/inc/self_ptl.h @@ -61,7 +61,6 @@ typedef struct stru_self_ptl_cfg_param *p_param; stru_signal_ctrl *p_ctrl; std::vector vec_p_data; - std::vector vec_p_default_data; }stru_self_ptl_cfg_param_data; diff --git a/src/system/libself_ptl/src/method.cpp b/src/system/libself_ptl/src/method.cpp index 745c0df..dfe02e1 100644 --- a/src/system/libself_ptl/src/method.cpp +++ b/src/system/libself_ptl/src/method.cpp @@ -1160,9 +1160,8 @@ LOCAL void cmd_self_ptl(int argc, char *argv[]) stru_self_ptl_cfg_param_data *p_data = &p_cfg->ao_vec[i]; stru_self_ptl_cfg_base *p_base = &p_data->p_param->base; std::string val = dc_get_signal_val(p_data->vec_p_data[0], p_data->p_param->type); - std::string default_val = dc_get_signal_val(p_data->vec_p_default_data[0], p_data->p_param->type); - printf("no %06d, saddr %s, desc %s, inf %04x, type %04d, len %04d, val %s, default %s\n", - i, p_base->saddr.c_str(), p_base->desc.c_str(), p_base->inf, p_data->p_param->type, dc_get_data_type_len(p_data->p_param->type), val.c_str(), default_val.c_str()); + printf("no %06d, saddr %s, desc %s, inf %04x, type %04d, len %04d, val %s\n", + i, p_base->saddr.c_str(), p_base->desc.c_str(), p_base->inf, p_data->p_param->type, dc_get_data_type_len(p_data->p_param->type), val.c_str()); } } } diff --git a/src/system/libself_ptl/src/self_ptl.cpp b/src/system/libself_ptl/src/self_ptl.cpp index 472c9c0..4c43101 100644 --- a/src/system/libself_ptl/src/self_ptl.cpp +++ b/src/system/libself_ptl/src/self_ptl.cpp @@ -697,13 +697,7 @@ LOCAL int self_ptl_cfg_init() } p_cfg_data->ao_vec.back().vec_p_data.push_back(p_data); - void *p_default_data = dc_create_data_ptr_by_type(p_ao->type); - if(nullptr == p_default_data) - { - MY_LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", p_ao->type); - return -1; - } - p_cfg_data->ao_vec.back().vec_p_default_data.push_back(p_default_data); + } p_cfg_data->param_vec.reserve(p_cfg->param_vec.size() + 1); @@ -746,7 +740,6 @@ LOCAL int self_ptl_cfg_init() MY_LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", p_param->type); return -1; } - p_cfg_data->param_vec.back().vec_p_default_data.push_back(p_default_val_data); } } @@ -1013,7 +1006,7 @@ int self_ptl_do_signal_out(stru_app *p_app) stru_self_ptl_cfg_param_data *p_ao = &p_app_cfg_data->ao_vec.at(i); if(p_ao && p_ao->p_param) { - ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback, MODULE_SELF_PTL); + ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], self_ptl_signal_change_callback, MODULE_SELF_PTL); } } @@ -1028,7 +1021,7 @@ int self_ptl_do_signal_out(stru_app *p_app) if(p_param && p_param->p_param) { ret |= dc_signal_param(p_param->p_param->base.saddr, p_param->p_param->base.desc, p_param->p_param->type, - SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->vec_p_default_data.data(), p_param->p_param->num, self_ptl_signal_change_callback, MODULE_SELF_PTL); + SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->vec_p_data.data(), p_param->p_param->num, self_ptl_signal_change_callback, MODULE_SELF_PTL); } } diff --git a/src/system/libweb_server/src/ws_method.cpp b/src/system/libweb_server/src/ws_method.cpp index b5c5337..be2898c 100644 --- a/src/system/libweb_server/src/ws_method.cpp +++ b/src/system/libweb_server/src/ws_method.cpp @@ -12,7 +12,6 @@ typedef struct uint8_t data_type; uint8_t ctrl_type; std::vector vec_p_data; - std::vector vec_p_default_data; stru_signal_ctrl *p_ctrl; stru_signal_param *p_param; std::string last_val; @@ -110,7 +109,6 @@ LOCAL void add_out_signal(stru_ws_session &s, const std::string& saddr) LOG_E("add_signals: dc_get_out_signal_info failed, saddr = %s", saddr.c_str()); p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -136,7 +134,6 @@ LOCAL void add_in_signal(stru_ws_session &s, const std::string& saddr) LOG_E("add_signals: dc_get_in_signal_info failed, saddr = %s", saddr.c_str()); p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -164,7 +161,6 @@ LOCAL void add_yk_signal(stru_ws_session &s, const std::string& saddr) delete p->p_ctrl; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -180,7 +176,6 @@ LOCAL void add_yk_signal(stru_ws_session &s, const std::string& saddr) delete p->p_ctrl; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -203,22 +198,18 @@ LOCAL void add_ao_signal(stru_ws_session &s, const std::string& saddr) p = &p_signals->back(); void *p_data = nullptr; - void *p_default_data = nullptr; - if(0 != dc_get_ao_signal_info(saddr, p->desc, p->data_type, p->p_param, p->ctrl_type, &p_data, &p_default_data)) + if(0 != dc_get_ao_signal_info(saddr, p->desc, p->data_type, p->p_param, p->ctrl_type, &p_data)) { LOG_E("add_signals: dc_get_ao_signal_info failed, saddr = %s", saddr.c_str()); delete p->p_ctrl; delete p->p_param; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } p->vec_p_data.push_back(p_data); - p->vec_p_default_data.push_back(p_default_data); - p->p_ctrl->type = p->ctrl_type; p->p_ctrl->step = SIGNAL_CTRL_STEP::READY; p->p_ctrl->data_type = p->data_type; @@ -230,7 +221,6 @@ LOCAL void add_ao_signal(stru_ws_session &s, const std::string& saddr) delete p->p_ctrl; delete p->p_param; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -251,14 +241,13 @@ LOCAL void add_param_signal(stru_ws_session &s, const std::string& saddr) p_signals->back().p_param = new stru_signal_param; p = &p_signals->back(); - if(0 != dc_get_param_signal_info(saddr, p->desc, p->data_type, p->p_param, p->ctrl_type, &p->vec_p_data, &p->vec_p_default_data)) + if(0 != dc_get_param_signal_info(saddr, p->desc, p->data_type, p->p_param, p->ctrl_type, &p->vec_p_data)) { LOG_E("add_signals: dc_get_param_signal_info failed, saddr = %s", saddr.c_str()); delete p->p_ctrl; delete p->p_param; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -274,7 +263,6 @@ LOCAL void add_param_signal(stru_ws_session &s, const std::string& saddr) delete p->p_ctrl; delete p->p_param; p->vec_p_data.clear(); - p->vec_p_default_data.clear(); p_signals->pop_back(); return; } @@ -298,7 +286,6 @@ LOCAL void del_signal(std::vector &signals, const std::string& s } p_signal->vec_p_data.clear(); - p_signal->vec_p_default_data.clear(); signals.erase(signals.begin() + i); return; @@ -743,8 +730,6 @@ LOCAL int make_ao_signal_json(stru_ws_session &s, cJSON *root, bool &has_change) std::string val = dc_get_signal_val(p_signal->vec_p_data[0], p_signal->data_type); cJSON_AddItemToObject(item, "val", cJSON_CreateString(val.c_str())); - std::string default_val = dc_get_signal_val(p_signal->vec_p_default_data[0], p_signal->data_type); - cJSON_AddItemToObject(item, "default_val", cJSON_CreateString(default_val.c_str())); cJSON_AddItemToArray(ao_arr, item); @@ -801,8 +786,6 @@ LOCAL int make_param_signal_json(stru_ws_session &s, cJSON *root, bool &has_chan cJSON_AddItemToObject(setting_zone_item, "id", cJSON_CreateString(id.c_str())); std::string val = dc_get_signal_val(p_signal->vec_p_data[j], p_signal->data_type); cJSON_AddItemToObject(setting_zone_item, "val", cJSON_CreateString(val.c_str())); - std::string default_val = dc_get_signal_val(p_signal->vec_p_default_data[j], p_signal->data_type); - cJSON_AddItemToObject(setting_zone_item, "default_val", cJSON_CreateString(default_val.c_str())); cJSON_AddItemToArray(setting_zone_arr, setting_zone_item); }