1、调整mms_m库中,创建数据时,赋初值;
2、数据中心的数据表中不存放控制数据,控制状态逻辑由调用者申请分别传入;
3、数据中心参数注册时,存放缺省值的字符串数据;
4、数据中心遥控与参数不再初始化控制状态结构体;
5、调整配置文件目录,存入私有规约配置文件,添加iec1014的配置文件
This commit is contained in:
ypc 2026-05-12 15:58:25 +08:00
parent d6dc13937e
commit 8d4c7eebb4
12 changed files with 265 additions and 108 deletions

View File

@ -321,7 +321,8 @@ typedef struct
float max; // 最大值
float step; // 步长
std::string unit; // 单位
void *p_default; // 默认值
std::string default_value; // 默认值字符串
// void *p_default; // 默认值
}stru_signal_param;
typedef void (*signal_change_cb)(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data);
@ -341,7 +342,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
int dc_signal_param_link_with_callback(const std::string &saddr, uint8_t data_type, void **p_data, signal_change_cb cb);
// 数据中心参数设置接口
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data);
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data);
@ -351,8 +352,8 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data
// 数据中心遥控信号链接接口
int dc_signal_yk_link_with_callback(const std::string &saddr, uint8_t data_type, void **p_data, signal_change_cb cb);
// 数据中心遥控控制接口
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data);
// 数据中心遥控控制接口(校验前置,调用前需先调 dc_yk_ctrl_valid
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
// 数据中心获取out信号信息接口
int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data);

View File

@ -2031,32 +2031,68 @@ int mms_m_out_get_value(int fd, mms_m_out_value_cb p_func)
void *mms_m_create_data_ptr(uint8_t type)
{
uint8_t *p_u8 = nullptr;
int8_t *p_i8 = nullptr;
int16_t *p_i16 = nullptr;
uint16_t *p_u16 = nullptr;
int32_t *p_i32 = nullptr;
uint32_t *p_u32 = nullptr;
int64_t *p_i64 = nullptr;
uint64_t *p_u64 = nullptr;
float *p_f = nullptr;
double *p_d = nullptr;
char *p_str = nullptr;
switch(type)
{
case _MMS_M_data_type_bool:
return (void *)new uint8_t;
p_u8 = new uint8_t;
(*p_u8) = 0;
return (void *)p_u8;
case _MMS_M_data_type_int8:
return (void *)new int8_t;
p_i8 = new int8_t;
(*p_i8) = 0;
return (void *)p_i8;
case _MMS_M_data_type_int16:
return (void *)new int16_t;
p_i16 = new int16_t;
(*p_i16) = 0;
return (void *)p_i16;
case _MMS_M_data_type_int32:
return (void *)new int32_t;
p_i32 = new int32_t;
(*p_i32) = 0;
return (void *)p_i32;
case _MMS_M_data_type_int64:
return (void *)new int64_t;
p_i64 = new int64_t;
(*p_i64) = 0;
return (void *)p_i64;
case _MMS_M_data_type_uint8:
return (void *)new uint8_t;
p_u8 = new uint8_t;
(*p_u8) = 0;
return (void *)p_u8;
case _MMS_M_data_type_uint16:
return (void *)new uint16_t;
p_u16 = new uint16_t;
(*p_u16) = 0;
return (void *)p_u16;
case _MMS_M_data_type_uint32:
return (void *)new uint32_t;
p_u32 = new uint32_t;
(*p_u32) = 0;
return (void *)p_u32;
case _MMS_M_data_type_uint64:
return (void *)new uint64_t;
p_u64 = new uint64_t;
(*p_u64) = 0;
return (void *)p_u64;
case _MMS_M_data_type_float:
return (void *)new float;
p_f = new float;
(*p_f) = 0.0f;
return (void *)p_f;
case _MMS_M_data_type_double:
return (void *)new double;
p_d = new double;
(*p_d) = 0.0;
return (void *)p_d;
case _MMS_M_data_type_string:
return (void *)new char[MMS_M_STR_LEN];
p_str = new char[MMS_M_STR_LEN];
memset(p_str, 0, MMS_M_STR_LEN);
return (void *)p_str;
default:
return NULL;
}

View File

@ -6,7 +6,7 @@
#include "mySystem.h"
LOCAL std::string path = "/mnt/RTU/test/file/SYSCONFIG/";
LOCAL std::string path = "/mnt/RTU/test/config/";
LOCAL std::string self_ptl_cfg = "self_ptl.xml";
int app_cfg_parse()

View File

@ -55,7 +55,7 @@ LOCAL stru_uart_para g_uart_para[ENUM_UART_MAX] =
#ifdef RK356x
.device = "/dev/ttyS3",
#else
.device = "/dev/ttyUSB0",
.device = "/dev/ttyUSB1",
#endif
.baudrate = 115200,
.data_bits = 8,

View File

@ -17,7 +17,8 @@ typedef struct stru_signal
uint8_t data_type; // 数据类型
void *p_data; // 数据指针
std::vector<std::string> link_saddrs;
stru_signal_ctrl ctrl; // 信号扩展信息
// stru_signal_ctrl ctrl; // 信号扩展信息
uint8_t ctrl_type; // 信号控制类型
stru_signal_param param; // 信号参数信息
std::vector<signal_change_cb> change_cb_list; // 信号变化回调函数列表
}stru_signal;

View File

@ -109,11 +109,8 @@ int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_
param.max = p_signal->param.max;
param.step = p_signal->param.step;
param.unit = p_signal->param.unit;
if(NULL != param.p_default && NULL != p_signal->param.p_default)
{
dc_set_signal_val(param.p_default, data_type, p_signal->param.p_default);
}
ctrl_type = p_signal->ctrl.type;
param.default_value = p_signal->param.default_value;
ctrl_type = p_signal->ctrl_type;
(*p_data) = p_signal->p_data;
return 0;
@ -129,7 +126,7 @@ int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t &
}
desc = p_signal->desc;
data_type = p_signal->data_type;
ctrl_type = p_signal->ctrl.type;
ctrl_type = p_signal->ctrl_type;
(*p_data) = p_signal->p_data;
return 0;
@ -379,10 +376,7 @@ int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t d
p_signal->change_cb_list.push_back(cb);
}
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
p_signal->ctrl.type = ctrl_type;
p_signal->ctrl.data_type = data_type;
dc_signal_ctrl_data_create(p_signal->ctrl);
p_signal->ctrl_type = ctrl_type;
return 0;
}
@ -570,17 +564,17 @@ LOCAL int dc_check_ctrl_val_valid(const stru_signal_ctrl &ctrl, const void *p_da
return 0;
}
LOCAL int dc_check_ctrl_valid(const stru_signal *p_signal, SIGNAL_CTRL_STEP step, uint8_t data_type, const void *p_data)
LOCAL int dc_check_ctrl_valid(const stru_signal *p_signal, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, const void *p_data)
{
// LOG_I("dc_check_ctrl_valid %s, step %d, data_type %d, p_data %d", p_signal->saddr.c_str(), step, data_type, *(uint8_t *)p_data);
if(p_signal->data_type != data_type)
if(p_signal->data_type != ctrl.data_type)
{
LOG_E("%s data_type %d not match ctrl data_type %d", p_signal->saddr.c_str(), p_signal->data_type, data_type);
LOG_E("%s data_type %d not match ctrl data_type %d", p_signal->saddr.c_str(), p_signal->data_type, ctrl.data_type);
return -1;
}
if(p_signal->ctrl.type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
if(ctrl.type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(step == SIGNAL_CTRL_STEP::DIRECT)
{
@ -588,13 +582,13 @@ LOCAL int dc_check_ctrl_valid(const stru_signal *p_signal, SIGNAL_CTRL_STEP step
}
else
{
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), p_signal->ctrl.type, step);
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), ctrl.type, ctrl.step);
return -1;
}
}
else if(p_signal->ctrl.type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
else if(ctrl.type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(p_signal->ctrl.step == SIGNAL_CTRL_STEP::READY)
if(ctrl.step == SIGNAL_CTRL_STEP::READY)
{
if(step == SIGNAL_CTRL_STEP::SELECT)
{
@ -602,21 +596,21 @@ LOCAL int dc_check_ctrl_valid(const stru_signal *p_signal, SIGNAL_CTRL_STEP step
}
else
{
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), p_signal->ctrl.type, step);
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), ctrl.type, ctrl.step);
return -1;
}
}
else if(p_signal->ctrl.step == SIGNAL_CTRL_STEP::SELECT)
else if(ctrl.step == SIGNAL_CTRL_STEP::SELECT)
{
if(step == SIGNAL_CTRL_STEP::DIRECT)
{
if(0 == dc_check_ctrl_val_valid(p_signal->ctrl, p_data))
if(0 == dc_check_ctrl_val_valid(ctrl, p_data))
{
return 0;
}
else
{
LOG_E("%s ctrl_type %d, direct value not match selected value", p_signal->saddr.c_str(), p_signal->ctrl.type);
LOG_E("%s ctrl_type %d, direct value not match selected value", p_signal->saddr.c_str(), ctrl.type);
return -1;
}
}
@ -626,13 +620,13 @@ LOCAL int dc_check_ctrl_valid(const stru_signal *p_signal, SIGNAL_CTRL_STEP step
}
else
{
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), p_signal->ctrl.type, step);
LOG_E("%s ctrl_type %d, invalid ctrl step %d", p_signal->saddr.c_str(), ctrl.type, ctrl.step);
return -1;
}
}
}
LOG_E("invalid ctrl type %d", p_signal->ctrl.type);
LOG_E("invalid ctrl type %d", ctrl.type);
return -1;
}
@ -871,33 +865,33 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, const void *p_data)
return 0;
}
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data)
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data)
{
XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length());
stru_signal *p_signal = dc_find_signal(hash, g_datacenter.siganl_param);
if(p_signal != nullptr)
{
if(0 == dc_check_ctrl_valid(p_signal, step, data_type, p_data))
if(0 == dc_check_ctrl_valid(p_signal, step, ctrl, p_data))
{
if(0 != dc_check_val_valid(p_signal, p_data))
{
LOG_E("set value failed, saddr: %s", saddr.c_str());
LOG_E("invalid value for saddr %s", saddr.c_str());
return -1;
}
if(step == SIGNAL_CTRL_STEP::SELECT)
{
dc_set_signal_val(p_signal->ctrl.p_data, data_type, p_data);
p_signal->ctrl.step = SIGNAL_CTRL_STEP::SELECT;
dc_set_signal_val(ctrl.p_data, ctrl.data_type, p_data);
ctrl.step = SIGNAL_CTRL_STEP::SELECT;
}
else if(step == SIGNAL_CTRL_STEP::DIRECT)
{
dc_set_signal_val(p_signal->p_data, data_type, p_data);
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
dc_set_signal_val(p_signal->p_data, ctrl.data_type, p_data);
ctrl.step = SIGNAL_CTRL_STEP::READY;
}
else if(step == SIGNAL_CTRL_STEP::CANCEL)
{
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
ctrl.step = SIGNAL_CTRL_STEP::READY;
}
else
{
@ -909,20 +903,22 @@ int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, uin
{
if(cb != nullptr)
{
cb(saddr, step, data_type, p_data);
cb(saddr, step, ctrl.data_type, p_data);
}
}
return 0;
}
else
{
LOG_E("set ctrl failed, saddr: %s", saddr.c_str());
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
LOG_E("saddr %s ctrl invalid", saddr.c_str());
ctrl.step = SIGNAL_CTRL_STEP::READY;
return -1;
}
}
LOG_E("saddr %s not found in param table");
LOG_E("saddr %s not found in param table", saddr.c_str());
return -1;
}
@ -967,10 +963,12 @@ int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data
p_signal->change_cb_list.push_back(cb);
}
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
p_signal->ctrl.type = ctrl_type;
p_signal->ctrl.data_type = data_type;
dc_signal_ctrl_data_create(p_signal->ctrl);
// p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
// p_signal->ctrl.type = ctrl_type;
// p_signal->ctrl.data_type = data_type;
// dc_signal_ctrl_data_create(p_signal->ctrl);
p_signal->ctrl_type = ctrl_type;
return 0;
}
@ -995,27 +993,27 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, uint8_t data_type,
return -1;
}
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data)
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data)
{
XXH128_hash_t hash = XXH3_128bits(saddr.c_str(), saddr.length());
stru_signal *p_signal = dc_find_signal(hash, g_datacenter.siganl_yk);
if(p_signal != nullptr)
{
if(0 == dc_check_ctrl_valid(p_signal, step, data_type, p_data))
if(0 == dc_check_ctrl_valid(p_signal, step, ctrl, p_data))
{
if(step == SIGNAL_CTRL_STEP::SELECT)
{
dc_set_signal_val(p_signal->ctrl.p_data, data_type, p_data);
p_signal->ctrl.step = SIGNAL_CTRL_STEP::SELECT;
dc_set_signal_val(ctrl.p_data, ctrl.data_type, p_data);
ctrl.step = SIGNAL_CTRL_STEP::SELECT;
}
else if(step == SIGNAL_CTRL_STEP::DIRECT)
{
dc_set_signal_val(p_signal->p_data, data_type, p_data);
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
dc_set_signal_val(p_signal->p_data, ctrl.data_type, p_data);
ctrl.step = SIGNAL_CTRL_STEP::READY;
}
else if(step == SIGNAL_CTRL_STEP::CANCEL)
{
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
ctrl.step = SIGNAL_CTRL_STEP::READY;
}
else
{
@ -1027,20 +1025,22 @@ int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, uin
{
if(cb != nullptr)
{
cb(saddr, step, data_type, p_data);
cb(saddr, step, ctrl.data_type, p_data);
}
}
return 0;
}
else
{
LOG_E("set ctrl failed, saddr: %s", saddr.c_str());
p_signal->ctrl.step = SIGNAL_CTRL_STEP::READY;
LOG_E("saddr %s ctrl invalid", saddr.c_str());
ctrl.step = SIGNAL_CTRL_STEP::READY;
return -1;
}
}
LOG_E("saddr %s not found in yk table");
LOG_E("saddr %s not found in yk table", saddr.c_str());
return -1;
}

View File

@ -273,7 +273,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
param.max = cfg.p_ao_sig[i].max;
param.step = cfg.p_ao_sig[i].step;
param.unit = cfg.p_ao_sig[i].unit;
param.p_default = NULL;
param.default_value = cfg.p_ao_sig[i].p_default ? dc_get_signal_val(cfg.p_ao_sig[i].p_default, cfg.p_ao_sig[i].sig.data_type) : "";
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_ao_sig[i].sig.data_type];
ret |= dc_signal_param(cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, type_local, param, cfg.p_ao_sig[i].ctrl_type, cfg.p_ao_sig[i].sig.p_data, iec61850m_signal_change_callback);

View File

@ -49,6 +49,7 @@ typedef struct
stru_self_ptl_cfg_base *p_base;
void *p_data;
void *p_last_data;
stru_signal_ctrl *p_ctrl;
}stru_self_ptl_cfg_base_data;
typedef struct
@ -56,6 +57,7 @@ typedef struct
stru_self_ptl_cfg_param *p_param;
void *p_data;
void *p_default_data;
stru_signal_ctrl *p_ctrl;
}stru_self_ptl_cfg_param_data;

View File

@ -500,7 +500,24 @@ LOCAL int self_ptl_cfg_init()
uint8_t *p_u8_last = new uint8_t;
(*p_u8) = 0;
(*p_u8_last) = 0;
p_cfg_data->co_vec.push_back({&p_cfg->co_vec[i], p_u8, p_u8_last});
stru_signal_ctrl *p_ctrl = new stru_signal_ctrl;
if(nullptr == p_ctrl) {
LOG_E("self_ptl_cfg_init new stru_signal_ctrl failed");
return -1;
}
p_ctrl->type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p_ctrl->data_type = DATA_TYPE_U8;
p_ctrl->p_data = dc_create_data_ptr_by_type(DATA_TYPE_U8);
if(nullptr == p_ctrl->p_data)
{
LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", DATA_TYPE_U8);
return -1;
}
p_cfg_data->co_vec.push_back({&p_cfg->co_vec[i], p_u8, p_u8_last, p_ctrl});
}
for(uint32_t i = 0; i < p_cfg->dd_vec.size(); i++)
@ -529,7 +546,24 @@ LOCAL int self_ptl_cfg_init()
return -1;
}
p_cfg_data->param_vec.push_back({p_param, p_data, p_default_data});
stru_signal_ctrl *p_ctrl = new stru_signal_ctrl;
if(nullptr == p_ctrl)
{
LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", p_param->type);
return -1;
}
p_ctrl->type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p_ctrl->data_type = p_param->type;
p_ctrl->p_data = dc_create_data_ptr_by_type(p_param->type);
if(nullptr == p_ctrl->p_data)
{
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.push_back({p_param, p_data, p_default_data, p_ctrl});
}
return 0;
@ -788,7 +822,7 @@ int self_ptl_do_signal_out(stru_app *p_app)
param.min = safeStringToFloat(p_param->p_param->min);
param.max = safeStringToFloat(p_param->p_param->max);
param.step = safeStringToFloat(p_param->p_param->step);
param.p_default = p_param->p_default_data;
param.default_value = p_param->p_param->default_value;
param.unit = p_param->p_param->unit;
// ret(saddr, p(saddr, p->name, p->type, p->p_data);
ret |= dc_signal_param(p_param->p_param->base.saddr, p_param->p_param->base.desc, p_param->p_param->type, param, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_param->p_data, self_ptl_signal_change_callback);

View File

@ -10,6 +10,7 @@ typedef struct
uint8_t data_type;
uint8_t ctrl_type;
void *p_data;
stru_signal_ctrl *p_ctrl;
stru_signal_param *p_param;
}stru_ws_signal;
@ -34,8 +35,8 @@ int signal_is_exist(const std::string& saddr, const std::vector<stru_ws_signal>&
void add_signal(const std::string& saddr, const std::string& signal_type)
{
std::vector<stru_ws_signal> *p_signals = NULL;
stru_ws_signal *p = NULL;
std::vector<stru_ws_signal> *p_signals = nullptr;
stru_ws_signal *p = nullptr;
if(signal_type == "out")
{
@ -47,12 +48,14 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
return;
}
p_signals->push_back({saddr, "", 0, 0, NULL, NULL});
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p = &p_signals->back();
if(0 != dc_get_out_signal_info(saddr, p->desc, p->data_type, &p->p_data))
{
LOG_E("add_signals: dc_get_out_signal_info failed, saddr = %s", saddr.c_str());
p_signals->pop_back();
return;
}
}
@ -66,12 +69,13 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
return;
}
p_signals->push_back({saddr, "", 0, 0, NULL, NULL});
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p = &p_signals->back();
if(0 != dc_get_in_signal_info(saddr, p->desc, p->data_type, &p->p_data))
{
LOG_E("add_signals: dc_get_in_signal_info failed, saddr = %s", saddr.c_str());
p_signals->pop_back();
return;
}
@ -86,12 +90,29 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
return;
}
p_signals->push_back({saddr, "", 0, 0, NULL, NULL});
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p_signals->back().p_ctrl = new stru_signal_ctrl;
p = &p_signals->back();
if(0 != dc_get_yk_signal_info(saddr, p->desc, p->data_type, p->ctrl_type, &p->p_data))
{
LOG_E("add_signals: dc_get_yk_signal_info failed, saddr = %s", saddr.c_str());
delete p->p_ctrl;
p_signals->pop_back();
return;
}
p->p_ctrl->type = p->ctrl_type;
p->p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p->p_ctrl->data_type = p->data_type;
p->p_ctrl->p_data = dc_create_data_ptr_by_type(p->data_type);
if(nullptr == p->p_ctrl->p_data)
{
LOG_E("add_signals: dc_create_data_ptr_by_type failed, saddr = %s, data_type = %d", saddr.c_str(), p->data_type);
delete p->p_ctrl;
p_signals->pop_back();
return;
}
}
@ -104,13 +125,32 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
LOG_E("add_signals: signal is already exist, saddr = %s", saddr.c_str());
return;
}
p_signals->push_back({saddr, "", 0, 0, NULL, NULL});
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p_signals->back().p_ctrl = new stru_signal_ctrl;
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->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_signals->pop_back();
return;
}
p->p_ctrl->type = p->ctrl_type;
p->p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p->p_ctrl->data_type = p->data_type;
p->p_ctrl->p_data = dc_create_data_ptr_by_type(p->data_type);
if(nullptr == p->p_ctrl->p_data)
{
LOG_E("add_signals: dc_create_data_ptr_by_type failed, saddr = %s, data_type = %d", saddr.c_str(), p->data_type);
delete p->p_ctrl;
delete p->p_param;
p_signals->pop_back();
return;
}
}
@ -123,7 +163,7 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
void del_signal(const std::string& saddr, const std::string& signal_type)
{
std::vector<stru_ws_signal> *p_signals = NULL;
std::vector<stru_ws_signal> *p_signals = nullptr;
if(signal_type == "out")
{
@ -152,7 +192,11 @@ void del_signal(const std::string& saddr, const std::string& signal_type)
stru_ws_signal *p_signal = &p_signals->at(i);
if(p_signal->saddr == saddr)
{
if(signal_type == "param")
if(p_signal->p_ctrl)
{
delete p_signal->p_ctrl;
}
if(p_signal->p_param)
{
delete p_signal->p_param;
}
@ -167,7 +211,7 @@ void del_signal(const std::string& saddr, const std::string& signal_type)
void set_signal_data(const std::string& saddr, const std::string& signal_type, const std::string& signal_data)
{
std::vector<stru_ws_signal> *p_signals = NULL;
std::vector<stru_ws_signal> *p_signals = nullptr;
if(signal_data.empty())
{
@ -209,7 +253,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
{
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, p_signal->data_type, (void *)&ctrl_status))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)&ctrl_status))
{
LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -220,8 +264,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
}
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
// LOG_I("saddr %s, select, value %d", saddr.c_str(), ctrl_status);
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, p_signal->data_type, (void *)&ctrl_status))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)&ctrl_status))
{
LOG_E("set_signal_data: dc_signal_yk_set_status select failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -229,8 +272,8 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
task_sleep_ms(1000);
MY_LOG_I("saddr %s, select value %d success !!!", saddr.c_str(), ctrl_status);
// LOG_I("saddr %s, direct, value %d", saddr.c_str(), ctrl_status);
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, p_signal->data_type, (void *)&ctrl_status))
if(0 != dc_signal_yk_set_status(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)&ctrl_status))
{
LOG_E("set_signal_data: dc_signal_yk_set_status direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -258,7 +301,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
{
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, p_signal->data_type, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -269,7 +312,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
}
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, p_signal->data_type, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_param_set_val select failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -277,7 +320,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), signal_data.c_str());
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, p_signal->data_type, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_param_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
@ -307,14 +350,14 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
void ws_recv(const char* p_rx, uint16_t rx_len)
{
if(NULL == p_rx || 0 == rx_len)
if(nullptr == p_rx || 0 == rx_len)
{
LOG_E("ws_recv: invalid parameter, p_rx = %p, rx_len = %d", p_rx, rx_len);
return;
}
cJSON* root = cJSON_Parse(p_rx);
if(NULL == root)
if(nullptr == root)
{
LOG_E("ws_recv: cJSON_Parse failed, p_rx = %s", p_rx);
return;
@ -400,7 +443,7 @@ void ws_task()
const char ctrl_type_str[][16] = {"NONE", "DIRECT_NORMAL", "SBO_NORMAL"};
cJSON *root = cJSON_CreateObject();
if(NULL == root)
if(nullptr == root)
{
LOG_E("ws_task: cJSON_CreateObject failed");
return;
@ -413,7 +456,7 @@ void ws_task()
{
stru_ws_signal *p_signal = &g_ws_out_signals.at(i);
cJSON *item = cJSON_CreateObject();
if(NULL == item)
if(nullptr == item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
@ -436,7 +479,7 @@ void ws_task()
{
stru_ws_signal *p_signal = &g_ws_in_signals.at(i);
cJSON *item = cJSON_CreateObject();
if(NULL == item)
if(nullptr == item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
@ -457,7 +500,7 @@ void ws_task()
{
stru_ws_signal *p_signal = &g_ws_yk_signals.at(i);
cJSON *item = cJSON_CreateObject();
if(NULL == item)
if(nullptr == item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
@ -480,7 +523,7 @@ void ws_task()
{
stru_ws_signal *p_signal = &g_ws_param_signals.at(i);
cJSON *item = cJSON_CreateObject();
if(NULL == item)
if(nullptr == item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
@ -499,20 +542,21 @@ void ws_task()
cJSON_AddItemToObject(item, "max", cJSON_CreateString(std::to_string(p_signal->p_param->max).c_str()));
cJSON_AddItemToObject(item, "step", cJSON_CreateString(std::to_string(p_signal->p_param->step).c_str()));
cJSON_AddItemToObject(item, "unit", cJSON_CreateString(p_signal->p_param->unit.c_str()));
if(p_signal->p_param->p_default)
{
cJSON_AddItemToObject(item, "default", cJSON_CreateString(dc_get_signal_val(p_signal->p_param->p_default, p_signal->data_type).c_str()));
}
else
{
cJSON_AddItemToObject(item, "default", cJSON_CreateString(""));
}
cJSON_AddItemToObject(item, "default", cJSON_CreateString(p_signal->p_param->default_value.c_str()));
// if(p_signal->p_param->p_default)
// {
// cJSON_AddItemToObject(item, "default", cJSON_CreateString(dc_get_signal_val(p_signal->p_param->p_default, p_signal->data_type).c_str()));
// }
// else
// {
// cJSON_AddItemToObject(item, "default", cJSON_CreateString(""));
// }
}
cJSON_AddItemToArray(param_arr, item);
}
char *p_tx = cJSON_Print(root);
if(NULL == p_tx)
if(nullptr == p_tx)
{
LOG_E("ws_task: cJSON_Print failed");
cJSON_Delete(root);

39
test/config/iec1014.xml Normal file
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<St>
<Item saddr="iec1014.st.1" desc="远方遥信1-手分遥信" link="self_ptl.st.1" inf="1"/>
<Item saddr="iec1014.st.2" desc="远方遥信2-手合遥信" link="self_ptl.st.2" inf="2"/>
<Item saddr="iec1014.st.3" desc="远方遥信3-就地遥信" link="self_ptl.st.3" inf="3"/>
<Item saddr="iec1014.st.4" desc="远方遥信4-远方遥信" link="self_ptl.st.4" inf="4"/>
</St>
<Mx>
<Item saddr="iec1014.mx.1" desc="远方遥信1-经度" link="self_ptl.mx.1" inf="16385"/>
<Item saddr="iec1014.mx.2" desc="远方遥信2-纬度" link="self_ptl.mx.5" inf="16386"/>
<Item saddr="iec1014.mx.3" desc="远方遥信3-海拔" link="self_ptl.mx.9" inf="16387"/>
<Item saddr="iec1014.mx.4" desc="计量-频率" link="self_ptl.mx.38" inf="16388"/>
<Item saddr="iec1014.mx.5" desc="采集板温度" link="self_ptl.mx.64" inf="16390"/>
</Mx>
<Co>
<Item saddr="iec1014.co.1" desc="硬遥控11-交流录波" link="self_ptl.co.11" inf="24577"/>
</Co>
<Dd>
</Dd>
<Param>
<Item saddr="iec1014.param.1" desc="终端类型" link="self_ptl.param.INFO_DEV_TYPE" inf="32769"/>
<Item saddr="iec1014.param.2" desc="终端操作系统" link="self_ptl.param.INFO_PLATFORM" inf="32770"/>
<Item saddr="iec1014.param.3" desc="生产厂商" link="self_ptl.param.HD_SERIAL" inf="32771"/>
<Item saddr="iec1014.param.4" desc="终端硬件版本" link="self_ptl.param.HD_SERIAL" inf="32772"/>
<Item saddr="iec1014.param.5" desc="终端软件版本" link="self_ptl.param.HD_SERIAL" inf="32773"/>
<Item saddr="iec1014.param.6" desc="终端软件版本校验码" link="self_ptl.param.RES_C24_SYS1" inf="32774"/>
<Item saddr="iec1014.param.7" desc="终端通讯规约类型" link="self_ptl.param.INFO_PROTOCOL" inf="32775"/>
<Item saddr="iec1014.param.8" desc="终端出厂型号" link="self_ptl.param.INFO_FACTORYMODEL" inf="32776"/>
<Item saddr="iec1014.param.9" desc="终端ID号" link="self_ptl.param.TERM_ID" inf="32777"/>
<Item saddr="iec1014.param.10" desc="双MAC地址" link="self_ptl.param.DoubleMac" inf="32778"/>
<Item saddr="iec1014.param.11" desc="遥测-交流电流死区" link="self_ptl.param.I_DEAD" inf="32800"/>
<Item saddr="iec1014.param.12" desc="遥测-交流电压死区" link="self_ptl.param.UAC_DEAD" inf="32801"/>
<Item saddr="iec1014.param.13" desc="保护-故障指示灯自动复归投退" link="self_ptl.param.ALARMLED_EN_MOD" inf="34848"/>
<Item saddr="iec1014.param.14" desc="保护-故障指示灯复归时间" link="self_ptl.param.FaultLed_Reset_T" inf="34849"/>
</Param>
</Root>