<修改> 1、调整参数定值的缺省值方案,认为缺省值仅在配置文件中,在程序中不应该有

This commit is contained in:
ypc 2026-06-17 09:53:00 +08:00
parent 2c10cbbe7c
commit 0e629185be
12 changed files with 184 additions and 203 deletions

View File

@ -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
```

View File

@ -0,0 +1,47 @@
# 参数缺省值重构方案
**原则**:缺省值只存在于 `param.xml`,运行时不再存储。
## 改动清单
### T1: 移除 `stru_signal.vec_p_default_data`
**文件**: `dc_signal.h`
- 删除 `std::vector<void *> 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<void *> *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
```

View File

@ -248,3 +248,42 @@
**状态**:✅ 已完成 **状态**:✅ 已完成
**涉及文件**`self_ptl.cpp`, `method.cpp`, `myDatacenter.h`, `dc_signal.cpp` **涉及文件**`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`

View File

@ -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_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); 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_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); 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信号信息接口 // 数据中心获取in信号信息接口
int dc_get_in_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data); 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<void *> *p_vec_p_data, std::vector<void *> *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<void *> *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); int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, uint8_t &ctrl_type, void **p_data);

View File

@ -219,11 +219,11 @@ static int dc_param_register_signals(const std::string &param_path,
dc_set_signal_val_from_str(p_default_data, data_type, std::string(default_val)); 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, dc_signal_ao(saddr, desc, data_type,
SIGNAL_CTRL_TYPE::SBO_NORMAL, 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 &param_path,
if (num < 1) continue; if (num < 1) continue;
std::vector<void *> vec_p_data; std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
for (XMLElement *item = sig->FirstChildElement("Item"); item != nullptr; for (XMLElement *item = sig->FirstChildElement("Item"); item != nullptr;
item = item->NextSiblingElement("Item")) item = item->NextSiblingElement("Item"))
@ -283,20 +282,13 @@ static int dc_param_register_signals(const std::string &param_path,
vec_p_data.push_back(p_data); 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, dc_signal_param(saddr, desc, data_type,
SIGNAL_CTRL_TYPE::SBO_NORMAL, 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);
} }
} }
} }

View File

@ -161,7 +161,7 @@ int dc_get_in_signal_info(const std::string &saddr, std::string &desc, uint8_t &
return -1; 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); stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_ao);
if(p_signal == nullptr) 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; 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; 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<void *> *p_vec_p_data, std::vector<void *> *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<void *> *p_vec_p_data)
{ {
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param); stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_param);
if(p_signal == nullptr) 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; 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) 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); 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; return -1;
} }
XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length()); XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length());
stru_signal *p_signal = dc_find_signal(saddr, g_datacenter.signal_ao); 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 // Always copy old value to new pointer when data type matches
if(p_signal->data_type == data_type) 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]); 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<std::mutex> lock(g_datacenter.signal_ao.mtx);
}
// delete p_signal->vec_p_data[0];
dc_delete_signal_data(p_signal->vec_p_data[0], data_type); dc_delete_signal_data(p_signal->vec_p_data[0], data_type);
p_signal->vec_p_data[0] = p_data; p_signal->vec_p_data[0] = p_data;
p_signal->change_cb_list.push_back({module_id, cb}); p_signal->change_cb_list.push_back({module_id, cb});
}
return 0; 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 ) if(p_signal != nullptr )
{ {
p_signal->vec_p_data.push_back(p_data); p_signal->vec_p_data.push_back(p_data);
p_signal->vec_p_default_data.push_back(p_default_data);
if(cb) if(cb)
{ {
@ -1295,7 +1197,7 @@ int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_ty
return -1; 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++) 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; 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); // 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<std::mutex> lock(g_datacenter.signal_param.mtx);
}
for(size_t i = 0; i < data_num; i++) for(size_t i = 0; i < p_signal->vec_p_data.size(); 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_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_data.clear();
p_signal->vec_p_default_data.clear();
for(size_t i = 0; i < data_num; i++) for(size_t i = 0; i < data_num; i++)
{ {
p_signal->vec_p_data.push_back(p_data[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->change_cb_list.push_back({module_id, cb}); p_signal->change_cb_list.push_back({module_id, cb});
}
return 0; 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++) for(size_t i = 0; i < data_num; i++)
{ {
p_signal->vec_p_data.push_back(p_data[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) 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_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) if(step == SIGNAL_CTRL_STEP::SELECT)
{ {
dc_set_signal_val(ctrl.p_data, ctrl.data_type, p_data); 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; *(double*)p_data = *(double*)set_data;
break; break;
case DATA_TYPE_IP: case DATA_TYPE_IP:
strncpy((char *)p_data, (char *)set_data, 4); memcpy(p_data, set_data, 4);
break; break;
case DATA_TYPE_MAC: case DATA_TYPE_MAC:
strncpy((char *)p_data, (char *)set_data, 6); memcpy(p_data, set_data, 6);
break; break;
case DATA_TYPE_C8: case DATA_TYPE_C8:
case DATA_TYPE_C32: case DATA_TYPE_C32:
case DATA_TYPE_C64: case DATA_TYPE_C64:
case DATA_TYPE_C128: case DATA_TYPE_C128:
case DATA_TYPE_STR: 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; break;
case DATA_TYPE_C1: case DATA_TYPE_C1:
*(char*)p_data = *(char*)set_data; *(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("step", p_ao->param.step);
sig_elem->SetAttribute("unit", p_ao->param.unit.c_str()); 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("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); 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++) 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 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"); XMLElement *item_elem = doc.NewElement("Item");
item_elem->SetAttribute("index", i+1); item_elem->SetAttribute("index", i+1);
item_elem->SetAttribute("value", val.c_str()); item_elem->SetAttribute("value", val.c_str());
item_elem->SetAttribute("default", def.c_str());
sig_elem->InsertEndChild(item_elem); sig_elem->InsertEndChild(item_elem);
} }

View File

@ -504,16 +504,16 @@ LOCAL int iec61850m_ao_signal_init(int num, stru_point_item *p_item)
return -1; 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; return -1;
} }
uint8_t local_type = g_mms_m_type_to_local_type[p->type]; uint8_t local_type = g_mms_m_type_to_local_type[p->type];
uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; 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); MY_LOG_E("dc_signal_ao failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type);
return -1; 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 local_type = g_mms_m_type_to_local_type[p->type];
uint8_t ctrl_type = SIGNAL_CTRL_TYPE::DIRECT_NORMAL; 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); MY_LOG_E("dc_signal_param failed, saddr %s, desc %s, type %d", p->saddr, p->desc, p->type);
return -1; 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]; 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); 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) 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++) 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_val[j] = dc_create_data_ptr_by_type(local_type);
p->value.p_default[j] = dc_create_data_ptr_by_type(local_type);
} }
} }
} }

View File

@ -324,7 +324,7 @@ LOCAL int iec61850s_setting_signals_init(std::vector<stru_mms_s_signal_base> &ve
return -1; 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()); MY_LOG_E("dc_get_ao_signal_info failed, saddr: %s, desc: %s", setting.base.saddr, desc.c_str());
return -1; return -1;
@ -401,7 +401,7 @@ LOCAL int iec61850s_param_signals_init(std::vector<stru_mms_s_signal_base> &vec_
std::string desc = ""; std::string desc = "";
std::vector<void *> p_data_vec; std::vector<void *> 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()); MY_LOG_E("dc_get_param_signal_info failed, saddr: %s, desc: %s", param.base.saddr, desc.c_str());
return -1; return -1;

View File

@ -61,7 +61,6 @@ typedef struct
stru_self_ptl_cfg_param *p_param; stru_self_ptl_cfg_param *p_param;
stru_signal_ctrl *p_ctrl; stru_signal_ctrl *p_ctrl;
std::vector<void *> vec_p_data; std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
}stru_self_ptl_cfg_param_data; }stru_self_ptl_cfg_param_data;

View File

@ -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_param_data *p_data = &p_cfg->ao_vec[i];
stru_self_ptl_cfg_base *p_base = &p_data->p_param->base; 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 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\n",
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());
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());
} }
} }
} }

View File

@ -697,13 +697,7 @@ LOCAL int self_ptl_cfg_init()
} }
p_cfg_data->ao_vec.back().vec_p_data.push_back(p_data); 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); 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); MY_LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", p_param->type);
return -1; 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); stru_self_ptl_cfg_param_data *p_ao = &p_app_cfg_data->ao_vec.at(i);
if(p_ao && p_ao->p_param) 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) 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, 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);
} }
} }

View File

@ -12,7 +12,6 @@ typedef struct
uint8_t data_type; uint8_t data_type;
uint8_t ctrl_type; uint8_t ctrl_type;
std::vector<void *> vec_p_data; std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
stru_signal_ctrl *p_ctrl; stru_signal_ctrl *p_ctrl;
stru_signal_param *p_param; stru_signal_param *p_param;
std::string last_val; 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()); LOG_E("add_signals: dc_get_out_signal_info failed, saddr = %s", saddr.c_str());
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; 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()); LOG_E("add_signals: dc_get_in_signal_info failed, saddr = %s", saddr.c_str());
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; return;
} }
@ -164,7 +161,6 @@ LOCAL void add_yk_signal(stru_ws_session &s, const std::string& saddr)
delete p->p_ctrl; delete p->p_ctrl;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; return;
} }
@ -180,7 +176,6 @@ LOCAL void add_yk_signal(stru_ws_session &s, const std::string& saddr)
delete p->p_ctrl; delete p->p_ctrl;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; return;
} }
@ -203,22 +198,18 @@ LOCAL void add_ao_signal(stru_ws_session &s, const std::string& saddr)
p = &p_signals->back(); p = &p_signals->back();
void *p_data = nullptr; 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()); LOG_E("add_signals: dc_get_ao_signal_info failed, saddr = %s", saddr.c_str());
delete p->p_ctrl; delete p->p_ctrl;
delete p->p_param; delete p->p_param;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; return;
} }
p->vec_p_data.push_back(p_data); 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->type = p->ctrl_type;
p->p_ctrl->step = SIGNAL_CTRL_STEP::READY; p->p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p->p_ctrl->data_type = p->data_type; 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_ctrl;
delete p->p_param; delete p->p_param;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; 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_signals->back().p_param = new stru_signal_param;
p = &p_signals->back(); 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()); LOG_E("add_signals: dc_get_param_signal_info failed, saddr = %s", saddr.c_str());
delete p->p_ctrl; delete p->p_ctrl;
delete p->p_param; delete p->p_param;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; 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_ctrl;
delete p->p_param; delete p->p_param;
p->vec_p_data.clear(); p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back(); p_signals->pop_back();
return; return;
} }
@ -298,7 +286,6 @@ LOCAL void del_signal(std::vector<stru_ws_signal> &signals, const std::string& s
} }
p_signal->vec_p_data.clear(); p_signal->vec_p_data.clear();
p_signal->vec_p_default_data.clear();
signals.erase(signals.begin() + i); signals.erase(signals.begin() + i);
return; 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); 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())); 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); 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())); 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); 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())); 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); cJSON_AddItemToArray(setting_zone_arr, setting_zone_item);
} }