<修改> 1、调整参数定值的缺省值方案,认为缺省值仅在配置文件中,在程序中不应该有
This commit is contained in:
parent
2c10cbbe7c
commit
0e629185be
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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<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);
|
||||
|
|
|
|||
|
|
@ -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<void *> vec_p_data;
|
||||
std::vector<void *> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<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);
|
||||
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<std::mutex> 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<std::mutex> 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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -324,7 +324,7 @@ LOCAL int iec61850s_setting_signals_init(std::vector<stru_mms_s_signal_base> &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<stru_mms_s_signal_base> &vec_
|
|||
std::string desc = "";
|
||||
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());
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ typedef struct
|
|||
stru_self_ptl_cfg_param *p_param;
|
||||
stru_signal_ctrl *p_ctrl;
|
||||
std::vector<void *> vec_p_data;
|
||||
std::vector<void *> vec_p_default_data;
|
||||
}stru_self_ptl_cfg_param_data;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ typedef struct
|
|||
uint8_t data_type;
|
||||
uint8_t ctrl_type;
|
||||
std::vector<void *> vec_p_data;
|
||||
std::vector<void *> 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<stru_ws_signal> &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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue