1、调整vscode配置,终端打印历史行数增加;
2、增加信号类型ao,作为参数,区分param定值,定值有定值区
3、信号中的指向数据的指针使用vector,用于存储定值时,存在多个定值区;
4、webserver中同步增加ao类型信号处理
5、调整各配置文件,增加ao类型,调整param类型
This commit is contained in:
ypc 2026-05-15 14:47:16 +08:00
parent 8d4c7eebb4
commit 1468207cae
26 changed files with 5227 additions and 3548 deletions

View File

@ -1,4 +1,5 @@
{
"makefile.makefilePath": "/mnt/RTU/release/",
"cmake.sourceDirectory": "/mnt/RTU/libiec61850-1.5.3/demos/beaglebone"
"cmake.sourceDirectory": "/mnt/RTU/libiec61850-1.5.3/demos/beaglebone",
"terminal.integrated.scrollback": 10000
}

View File

@ -163,9 +163,9 @@ typedef int (*icp67_search_frame_cb)(uint8_t *p_data, uint16_t len, uint16_t *p_
typedef int (*icp67_decode_cb)(stru_icp67 *p_icp67, uint8_t *p_rx, uint16_t rx_len);
typedef void (*icp67_timer_handler_cb)(stru_icp67 *p_icp67);
typedef void (*icp67_param_get_cb)(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num);
typedef void (*icp67_param_pop_out_cb)(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data);
typedef void (*icp67_param_set_cb)(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num);
typedef void (*icp67_ao_get_cb)(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num);
typedef void (*icp67_ao_pop_out_cb)(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data);
typedef void (*icp67_ao_set_cb)(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num);
typedef void (*icp67_iec_point_tbl_get_cb)(stru_icp67 *p_icp67, uint16_t info_addr);
typedef void (*icp67_iec_point_tbl_pop_out_cb)(stru_icp67 *p_icp67, uint16_t info_addr, uint16_t num, uint8_t *p_data);
typedef void (*icp67_time_set_cb)(stru_icp67 *p_icp67, stru_ti_5 *p_time);
@ -198,9 +198,9 @@ typedef void (*icp67_mx_change_cb)(stru_icp67 *p_icp67, stru_mx_info *p_data);
typedef struct
{
icp67_param_get_cb param_get_cb; // 内部参数读取回调函数
icp67_param_pop_out_cb param_pop_out_cb; // 内部参数读取出回调函数
icp67_param_set_cb param_set_cb; // 外部修改参数设置的回调函数
icp67_ao_get_cb ao_get_cb; // 内部参数读取回调函数
icp67_ao_pop_out_cb ao_pop_out_cb; // 内部参数读取出回调函数
icp67_ao_set_cb ao_set_cb; // 外部修改参数设置的回调函数
icp67_iec_point_tbl_get_cb iec_point_tbl_get_cb; // 内部IEC表读取回调函数
icp67_iec_point_tbl_pop_out_cb iec_point_tbl_pop_out_cb; // 内部IEC表读取出回调函数
icp67_time_set_cb time_set_cb; // 时间设置回调函数
@ -233,9 +233,9 @@ typedef struct
}stru_genneral_method;
extern void icp67_set_param_get_cb(icp67_param_get_cb *p_cb); // 设置参数获取回调函数
extern void icp67_set_param_pop_out_cb(icp67_param_pop_out_cb cb); // 设置参数数据返回回调函数
extern void icp67_set_param_set_cb(icp67_param_set_cb *p_cb); // 设置参数设置回调函数
extern void icp67_set_ao_get_cb(icp67_ao_get_cb *p_cb); // 设置参数获取回调函数
extern void icp67_set_ao_pop_out_cb(icp67_ao_pop_out_cb cb); // 设置参数数据返回回调函数
extern void icp67_set_ao_set_cb(icp67_ao_set_cb *p_cb); // 设置参数设置回调函数
extern void icp67_set_iec_point_tbl_get_cb(icp67_iec_point_tbl_get_cb *p_cb); // 设置iec点表获取回调函数
extern void icp67_set_iec_point_tbl_pop_out_cb(icp67_iec_point_tbl_pop_out_cb cb); // 设置iec点表数据返回回调函数
extern void icp67_set_time_set_cb(icp67_time_set_cb *p_cb); // 设置时间设置回调函数
@ -292,6 +292,6 @@ typedef struct _icp67
void icp67_init(stru_icp67 *p_icp67, icp67_send_cb send_cb, void *arg);
int icp67_set_param_cfg_md5(stru_icp67 *p_icp67, uint8_t *p_md5);
int icp67_set_ao_cfg_md5(stru_icp67 *p_icp67, uint8_t *p_md5);

View File

@ -75,7 +75,8 @@ typedef struct
char saddr[MMS_M_STR_LEN];
char desc[MMS_M_STR_LEN];
uint8_t data_type;
void *p_data;
// void *p_data;
std::vector<void *> vec_p_data;
}stru_mms_m_gen_signal;
typedef struct
@ -92,7 +93,8 @@ typedef struct
double max;
double step;
char unit[MMS_M_STR_LEN];
void *p_default;
// void *p_default;
std::vector<void *> vec_p_default;
}stru_mms_m_param_signal;
typedef struct
@ -101,10 +103,12 @@ typedef struct
uint16_t mx_num;
uint16_t co_num;
uint16_t ao_num;
uint16_t param_num;
stru_mms_m_gen_signal *p_st_sig;
stru_mms_m_gen_signal *p_mx_sig;
stru_mms_m_ctrl_signal *p_co_sig;
stru_mms_m_param_signal *p_ao_sig;
stru_mms_m_param_signal *p_param_sig;
}stru_mms_m_config;
@ -174,6 +178,7 @@ char *mms_m_out_reason_str(int reason);
void *mms_m_create_data_ptr(uint8_t type);
int mms_m_set_data_value(void *srt, void *dst, uint8_t type);
int mms_m_get_data_value_str(void *data, uint8_t type, char *str);
int mms_m_set_data_by_str(void *data, uint8_t type, const char *str);
#ifdef __cplusplus
}

View File

@ -253,11 +253,13 @@ typedef struct
{
stru_self_ptl_cfg_base base;
uint8_t type;
std::string default_value;
uint8_t num;
std::string unit;
std::string min;
std::string max;
std::string step;
std::vector<std::string> val;
std::vector<std::string> default_value;
}stru_self_ptl_cfg_param;
// 所有配置信息
@ -269,7 +271,10 @@ typedef struct
std::vector<stru_self_ptl_cfg_base> co_vec;
std::vector<stru_self_ptl_cfg_base> dd_vec;
uint8_t ao_md5[16];
uint8_t param_md5[16];
std::vector<stru_self_ptl_cfg_param> ao_vec;
std::vector<stru_self_ptl_cfg_param> param_vec;
}stru_self_ptl_cfg;
@ -321,11 +326,11 @@ typedef struct
float max; // 最大值
float step; // 步长
std::string unit; // 单位
std::string default_value; // 默认值字符串
// 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);
typedef void (*signal_change_cb)(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data);
@ -335,16 +340,24 @@ int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t dat
// 数据中心in信号注册并链接out信号接口
int dc_signal_in(const std::string &saddr, const std::string &desc, const std::string &link_saddr, uint8_t data_type, void **p_data);
int dc_signal_ao(const std::string &saddr, const std::string &desc, uint8_t data_type, const stru_signal_param &param, uint8_t ctrl_type, void *p_data, void *p_default_data, signal_change_cb cb);
int dc_signal_ao_link_with_callback(const std::string &saddr, uint8_t data_type, void **p_data, signal_change_cb cb);
int dc_signal_ao_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
int dc_signal_ao_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data);
// 数据中心参数信号注册接口
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, const stru_signal_param &param, uint8_t ctrl_type, void *p_data, signal_change_cb cb);
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, const stru_signal_param &param, uint8_t ctrl_type, std::vector<void *> &vec_p_data, std::vector<void *> &vec_p_default_data, signal_change_cb cb);
// 数据中心参数链接信号接口
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_link_with_callback(const std::string &saddr, uint8_t data_type, std::vector<void *> &vec_p_data, signal_change_cb cb);
// 数据中心参数设置接口
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(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, uint8_t setting_zone, void *p_data);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, uint8_t setting_zone, void *p_data);
// 数据中心遥控信号注册接口
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb);
@ -356,16 +369,18 @@ int dc_signal_yk_link_with_callback(const std::string &saddr, uint8_t data_type,
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);
int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, std::vector<void *> &vec_p_data);
// 数据中心获取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, std::vector<void *> &vec_p_data);
int dc_get_ao_siganl_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param &param, uint8_t &ctrl_type, std::vector<void *> &vec_p_data, std::vector<void *> &vec_p_default_data);
// 数据中心获取参数信号信息接口
int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param &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 &param, uint8_t &ctrl_type, std::vector<void *> &vec_p_data, std::vector<void *> &vec_p_default_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, std::vector<void *> &vec_p_data);
// 数据中心获取信号值字符串接口
std::string dc_get_signal_val(void *p_data, uint8_t data_type);
@ -376,6 +391,8 @@ int dc_set_out_signal_val(const std::string &saddr, void *set_data);
// 数据中心根据数据类型创建数据指针接口
void *dc_create_data_ptr_by_type(uint8_t data_type);
void dc_delete_signal_data(void *p_data, uint8_t data_type);
// 数据中心根据数据类型ID获取数据类型字符串接口
std::string dc_get_data_type_str_by_id(uint8_t data_type);

View File

@ -4,8 +4,8 @@
#include <map>
LOCAL void icp67_param_get(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num);
LOCAL void icp67_param_set(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num);
LOCAL void icp67_ao_get(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num);
LOCAL void icp67_ao_set(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num);
LOCAL void icp67_iec_point_tbl_get(stru_icp67 *p_icp67, uint16_t info_addr);
LOCAL void icp67_time_set(stru_icp67 *p_icp67, stru_ti_5 *p_data);
LOCAL void icp67_self_check_get(stru_icp67 *p_icp67);
@ -20,9 +20,9 @@ LOCAL void icp67_file_write_end_confirm(stru_icp67 *p_icp67, uint8_t result, uin
LOCAL stru_genneral_method g_genneral_method =
{
.param_get_cb = icp67_param_get,
.param_pop_out_cb = NULL,
.param_set_cb = icp67_param_set,
.ao_get_cb = icp67_ao_get,
.ao_pop_out_cb = NULL,
.ao_set_cb = icp67_ao_set,
.iec_point_tbl_get_cb = icp67_iec_point_tbl_get,
.iec_point_tbl_pop_out_cb = NULL,
.time_set_cb = icp67_time_set,
@ -59,19 +59,19 @@ stru_genneral_method* icp67_get_genneral_method()
return &g_genneral_method;
}
void icp67_set_param_get_cb(icp67_param_get_cb *p_cb)
void icp67_set_ao_get_cb(icp67_ao_get_cb *p_cb)
{
(*p_cb) = g_genneral_method.param_get_cb;
(*p_cb) = g_genneral_method.ao_get_cb;
}
void icp67_set_param_pop_out_cb(icp67_param_pop_out_cb cb)
void icp67_set_ao_pop_out_cb(icp67_ao_pop_out_cb cb)
{
g_genneral_method.param_pop_out_cb = cb;
g_genneral_method.ao_pop_out_cb = cb;
}
void icp67_set_param_set_cb(icp67_param_set_cb *p_cb)
void icp67_set_ao_set_cb(icp67_ao_set_cb *p_cb)
{
(*p_cb) = g_genneral_method.param_set_cb;
(*p_cb) = g_genneral_method.ao_set_cb;
}
void icp67_set_iec_point_tbl_get_cb(icp67_iec_point_tbl_get_cb *p_cb)
@ -206,11 +206,11 @@ void icp67_set_mx_change_cb(icp67_mx_change_cb cb)
LOCAL void icp67_param_get(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num)
LOCAL void icp67_ao_get(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num)
{
if(NULL == p_icp67 || NULL == p_data || num == 0)
{
LOG_E("icp67_param_get: invalid input parameter\n");
LOG_E("icp67_ao_get: invalid input parameter\n");
return;
}
@ -240,11 +240,11 @@ LOCAL void icp67_param_get(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16
}
LOCAL void icp67_param_set(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num)
LOCAL void icp67_ao_set(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num)
{
if(NULL == p_icp67 || NULL == p_data || num == 0)
{
LOG_E("icp67_param_set: invalid input parameter\n");
LOG_E("icp67_ao_set: invalid input parameter\n");
return;
}

View File

@ -96,12 +96,12 @@ LOCAL int icp67_decode_ti_1(stru_icp67 *p_icp67, uint8_t *p_rx, uint16_t rx_len)
uint16_t pos = 0;
stru_genneral_method *p_genneral_method = icp67_get_genneral_method();
for(uint8_t i = 0; p_genneral_method && p_genneral_method->param_pop_out_cb && i < p_asdu->num; i++)
for(uint8_t i = 0; p_genneral_method && p_genneral_method->ao_pop_out_cb && i < p_asdu->num; i++)
{
stru_ti_1_2_data_info *p_info = (stru_ti_1_2_data_info *)&p_asdu->data[pos];
pos += sizeof(stru_ti_1_2_data_info) + p_info->data_len;
p_genneral_method->param_pop_out_cb(p_icp67, p_info->data_addr, p_info->data_type, p_info->data_len, p_info->data);
p_genneral_method->ao_pop_out_cb(p_icp67, p_info->data_addr, p_info->data_type, p_info->data_len, p_info->data);
}
icp67_rtx_flag_set(p_icp67, ICP67_RX_FLAG, 0, 0);
@ -999,7 +999,7 @@ void icp67_init(stru_icp67 *p_icp67, icp67_send_cb send_cb, void *arg)
p_icp67->tm_cnt = 0;
}
int icp67_set_param_cfg_md5(stru_icp67 *p_icp67, uint8_t *p_md5)
int icp67_set_ao_cfg_md5(stru_icp67 *p_icp67, uint8_t *p_md5)
{
if(NULL == p_icp67 || NULL == p_md5)
{

View File

@ -13,7 +13,9 @@
typedef struct
{
int quality;
void *p_val;
// void *p_val;
std::vector<void *> vec_p_val;
std::vector<void *> vec_p_default;
stru_mms_m_time time;
}stru_point_value;
@ -44,7 +46,9 @@ typedef struct
float max_value;
float step_value;
std::string unit;
void *p_default;
// std::vector<void *> vec_p_data;
// std::vector<void *> vec_p_default;
}stru_point_item;
typedef struct
@ -54,6 +58,7 @@ typedef struct
std::vector<stru_point_item> mx;
std::vector<stru_point_item> co;
std::vector<stru_point_item> ao;
std::vector<stru_point_item> param;
}stru_point_page;

View File

@ -150,7 +150,7 @@ static void mms_m_show_MmsValue(MmsValue* mms_value)
}
static int mms_m_get_mmsValue(MmsValue *mms_value, stru_point_item &item)
static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val)
{
if(NULL == mms_value)
{
@ -163,29 +163,29 @@ static int mms_m_get_mmsValue(MmsValue *mms_value, stru_point_item &item)
switch(mms_type)
{
case MMS_STRUCTURE:
return mms_m_get_mmsValue(MmsValue_getElement(mms_value, 0), item);
return mms_m_get_mmsValue(MmsValue_getElement(mms_value, 0), type, p_val);
case MMS_BOOLEAN:
item.type = MMS_BOOLEAN;
type = MMS_BOOLEAN;
// item.value.val.b = MmsValue_getBoolean(mms_value);
*(uint8_t *)item.value.p_val = MmsValue_getBoolean(mms_value);
*(uint8_t *)p_val = MmsValue_getBoolean(mms_value);
break;
case MMS_BIT_STRING:
// LOG_I("MMS_BIT_STRING %s\r\n", MmsValue_toString(mms_value));
break;
case MMS_INTEGER:
item.type = MMS_INTEGER;
type = MMS_INTEGER;
// item.value.val.l = MmsValue_toInt32(mms_value);
*(int32_t *)item.value.p_val = MmsValue_toInt32(mms_value);
*(int32_t *)p_val = MmsValue_toInt32(mms_value);
break;
case MMS_UNSIGNED:
item.type = MMS_UNSIGNED;
type = MMS_UNSIGNED;
// item.value.val.lu = MmsValue_toUint32(mms_value);
*(uint32_t *)item.value.p_val = MmsValue_toUint32(mms_value);
*(uint32_t *)p_val = MmsValue_toUint32(mms_value);
break;
case MMS_FLOAT:
item.type = MMS_FLOAT;
type = MMS_FLOAT;
// item.value.val.f = MmsValue_toFloat(mms_value);
*(float *)item.value.p_val = MmsValue_toFloat(mms_value);
*(float *)p_val = MmsValue_toFloat(mms_value);
break;
default:
LOG_E("mms_m_get_mmsValue Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value));
@ -390,7 +390,9 @@ static void mms_m_send_read_ao(stru_mms_m_obj &obj, stru_mms_m_event &event)
mms_m_show_MmsValue(p_value);
}
if(0 != mms_m_get_mmsValue(p_value, *p_item))
void *p_val = event.set_zone >= p_item->value.vec_p_val.size() ? NULL : p_item->value.vec_p_val[event.set_zone];
if(0 != mms_m_get_mmsValue(p_value, p_item->type, p_val))
{
LOG_E("get mms value failed");
MmsValue_delete(p_value);
@ -398,8 +400,8 @@ static void mms_m_send_read_ao(stru_mms_m_obj &obj, stru_mms_m_event &event)
}
mms_m_get_local_time(out_val.time);
out_val.p_value = it->value.p_val;
out_val.type = it->type;
out_val.p_value = p_val;
out_val.type = p_item->type;
out_val.quality = 0;
snprintf(out_val.name, sizeof(out_val.name) - 1, "%s", it->name.c_str());
@ -689,7 +691,7 @@ static void mms_m_send_call_all(stru_mms_m_obj &obj)
mms_m_show_MmsValue(p_value);
}
if(0 != mms_m_get_mmsValue(p_value, *it))
if(0 != mms_m_get_mmsValue(p_value, it->type, it->value.vec_p_val[0]))
{
LOG_E("get mms value failed");
MmsValue_delete(p_value);
@ -697,7 +699,7 @@ static void mms_m_send_call_all(stru_mms_m_obj &obj)
}
mms_m_get_local_time(out_val.time);
out_val.p_value = it->value.p_val;
out_val.p_value = it->value.vec_p_val[0];
out_val.type = it->type;
out_val.quality = 0;
@ -801,6 +803,8 @@ static int mms_m_get_MmsValue(stru_point_value &point_value, stru_mms_m_out_valu
}
std::string temp_str;
void *p_val = point_value.vec_p_val[0];
switch(MmsValue_getType(p_mms_values))
{
case MMS_STRUCTURE:
@ -822,28 +826,28 @@ static int mms_m_get_MmsValue(stru_point_value &point_value, stru_mms_m_out_valu
if (MmsValue_getBoolean(p_mms_values))
{
// point_value.val.b = true;
*(uint8_t *)point_value.p_val = 1;
*(uint8_t *)p_val = 1;
}
else
{
// point_value.val.b = false;
*(uint8_t *)point_value.p_val = 0;
*(uint8_t *)p_val = 0;
}
break;
case MMS_INTEGER:
out_val.type = MMS_INTEGER;
// point_value.val.l = MmsValue_toInt32(p_mms_values);
*(int32_t *)point_value.p_val = MmsValue_toInt32(p_mms_values);
*(int32_t *)p_val = MmsValue_toInt32(p_mms_values);
break;
case MMS_UNSIGNED:
out_val.type = MMS_UNSIGNED;
// point_value.val.lu = MmsValue_toUint32(p_mms_values);
*(uint32_t *)point_value.p_val = MmsValue_toUint32(p_mms_values);
*(uint32_t *)p_val = MmsValue_toUint32(p_mms_values);
break;
case MMS_FLOAT:
out_val.type = MMS_FLOAT;
// point_value.val.f = MmsValue_toFloat(p_mms_values);
*(float *)point_value.p_val = MmsValue_toFloat(p_mms_values);
*(float *)p_val = MmsValue_toFloat(p_mms_values);
break;
case MMS_BINARY_TIME:
temp_str.clear();
@ -924,7 +928,8 @@ static void mms_m_report_callback(void* parameter, ClientReport report)
memset(&out_value, 0, sizeof(out_value));
memset(&point_value, 0, sizeof(point_value));
char temp[256] = {0};
point_value.p_val = (void *)temp;
// point_value.p_val = (void *)temp;
point_value.vec_p_val.push_back((void *)temp);
mms_m_get_MmsValue(point_value, out_value, mms_value, tm_flag, p_obj->debug_print_flag);
@ -934,7 +939,7 @@ static void mms_m_report_callback(void* parameter, ClientReport report)
}
out_value.reason = reason;
out_value.p_value = point_value.p_val;
out_value.p_value = point_value.vec_p_val[0];
out_value.app_fd = p_obj->obj_fd;
out_value.time = point_value.time;
@ -1830,7 +1835,7 @@ int mms_m_out_get_signal_info(int app_fd, stru_mms_m_config *p_config)
strncpy(sig.saddr, point.name.c_str(), sizeof(sig.saddr));
strncpy(sig.desc, point.desc.c_str(), sizeof(sig.desc));
sig.data_type = point.type;
sig.p_data = point.value.p_val;
sig.vec_p_data.push_back(point.value.vec_p_val[0]);
}
p_config->mx_num = obj.p_cfg->point.mx.size();
@ -1851,7 +1856,7 @@ int mms_m_out_get_signal_info(int app_fd, stru_mms_m_config *p_config)
strncpy(sig.saddr, point.name.c_str(), sizeof(sig.saddr));
strncpy(sig.desc, point.desc.c_str(), sizeof(sig.desc));
sig.data_type = point.type;
sig.p_data = point.value.p_val;
sig.vec_p_data.push_back(point.value.vec_p_val[0]);
}
p_config->co_num = obj.p_cfg->point.co.size();
@ -1871,7 +1876,7 @@ int mms_m_out_get_signal_info(int app_fd, stru_mms_m_config *p_config)
strncpy(co_sig.sig.saddr, point.name.c_str(), sizeof(co_sig.sig.saddr));
strncpy(co_sig.sig.desc, point.desc.c_str(), sizeof(co_sig.sig.desc));
co_sig.sig.data_type = point.type;
co_sig.sig.p_data = point.value.p_val;
co_sig.sig.vec_p_data.push_back(point.value.vec_p_val[0]);
co_sig.ctrl_type = point.ctrl_model;
}
@ -1892,7 +1897,8 @@ int mms_m_out_get_signal_info(int app_fd, stru_mms_m_config *p_config)
strncpy(ao_sig.sig.saddr, point.name.c_str(), sizeof(ao_sig.sig.saddr));
strncpy(ao_sig.sig.desc, point.desc.c_str(), sizeof(ao_sig.sig.desc));
ao_sig.sig.data_type = point.type;
ao_sig.sig.p_data = point.value.p_val;
ao_sig.sig.vec_p_data.push_back(point.value.vec_p_val[0]);
ao_sig.vec_p_default.push_back(point.value.vec_p_default[0]);
ao_sig.ctrl_type = point.ctrl_model;
ao_sig.min = point.min_value;
@ -1901,6 +1907,39 @@ int mms_m_out_get_signal_info(int app_fd, stru_mms_m_config *p_config)
strncpy(ao_sig.unit, point.unit.c_str(), sizeof(ao_sig.unit));
}
p_config->param_num = obj.p_cfg->point.param.size();
p_config->p_param_sig = new stru_mms_m_param_signal[p_config->param_num];
if(NULL == p_config->p_param_sig)
{
LOG_E("Failed to allocate memory for PARAM signal\n");
p_config->param_num = 0;
return -1;
}
for(int i = 0; i < p_config->param_num; i++)
{
stru_point_item &point = obj.p_cfg->point.param[i];
stru_mms_m_param_signal &param_sig = p_config->p_param_sig[i];
strncpy(param_sig.sig.saddr, point.name.c_str(), sizeof(param_sig.sig.saddr));
strncpy(param_sig.sig.desc, point.desc.c_str(), sizeof(param_sig.sig.desc));
param_sig.sig.data_type = point.type;
param_sig.ctrl_type = point.ctrl_model;
param_sig.min = point.min_value;
param_sig.max = point.max_value;
param_sig.step = point.step_value;
strncpy(param_sig.unit, point.unit.c_str(), sizeof(param_sig.unit));
for(size_t j = 0; j < point.value.vec_p_val.size(); j++)
{
param_sig.sig.vec_p_data.push_back(point.value.vec_p_val[j]);
param_sig.vec_p_default.push_back(point.value.vec_p_default[j]);
}
}
return 0;
}
@ -2206,6 +2245,70 @@ int mms_m_get_data_value_str(void *data, uint8_t type, char *str)
return 0;
}
int mms_m_set_data_by_str(void *data, uint8_t type, const char *str)
{
if(NULL == data || NULL == str)
{
LOG_E("Invalid data pointer, data %p, str %p\n", data, str);
return -1;
}
switch(type)
{
case _MMS_M_data_type_bool:
if(0 == strcasecmp(str, "true") || 0 == strcmp(str, "1"))
{
*(uint8_t *)data = 1;
}
else if(0 == strcasecmp(str, "false") || 0 == strcmp(str, "0"))
{
*(uint8_t *)data = 0;
}
else
{
LOG_E("Invalid boolean string: %s\n", str);
return -1;
}
break;
case _MMS_M_data_type_int8:
*(int8_t *)data = (int8_t)atoi(str);
break;
case _MMS_M_data_type_int16:
*(int16_t *)data = (int16_t)atoi(str);
break;
case _MMS_M_data_type_int32:
*(int32_t *)data = (int32_t)atoi(str);
break;
case _MMS_M_data_type_int64:
*(int64_t *)data = (int64_t)atol(str);
break;
case _MMS_M_data_type_uint8:
*(uint8_t *)data = (uint8_t)atoi(str);
break;
case _MMS_M_data_type_uint16:
*(uint16_t *)data = (uint16_t)atoi(str);
break;
case _MMS_M_data_type_uint32:
*(uint32_t *)data = (uint32_t)atoi(str);
break;
case _MMS_M_data_type_uint64:
*(uint64_t *)data = (uint64_t)atol(str);
break;
case _MMS_M_data_type_float:
*(float *)data = (float)atof(str);
break;
case _MMS_M_data_type_double:
*(double *)data = atof(str);
break;
case _MMS_M_data_type_string:
strncpy((char *)data, str, MMS_M_STR_LEN);
break;
default:
return -1;
}
return 0;
}
static struct _mms_m_resaon_str
{
ReasonForInclusion reason;

View File

@ -10,7 +10,10 @@ static const char *ELE_St = "St";
static const char *ELE_Mx = "Mx";
static const char *ELE_Co = "Co";
static const char *ELE_Ao = "Ao";
static const char *ELE_Param = "Param";
static const char *ELE_Item = "Item";
static const char *ELE_SubItem = "SubItem";
static const char *KEY_NO = "no";
static const char *KEY_NAME = "name";
@ -28,6 +31,8 @@ static const char *KEY_MIN_VAL = "minVal";
static const char *KEY_MAX_VAL = "maxVal";
static const char *KEY_STEP_VAL = "stepVal";
static const char *KEY_UNIT = "unit";
static const char *KEY_VAL = "val";
static const char *KEY_DEFAULT_VAL = "default";
@ -169,18 +174,9 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector<stru_point_item> &it
item_list.back().set_value = NULL;
item_list.back().control = NULL;
stru_point_item *p_item = &item_list.back();
// stru_point_item *p_item = &item_list.back();
if(NULL != (str = item->Attribute(KEY_DEFAULT_VAL)))
{
p_item->p_default = mms_m_create_data_ptr(p_item->type);
if(NULL != p_item->p_default)
{
mms_m_set_data_value(p_item->p_default, (void *)str, p_item->type);
}
}
p_item->value.p_val = mms_m_create_data_ptr(p_item->type);
// p_item->value.p_val = mms_m_create_data_ptr(p_item->type);
}
@ -244,13 +240,15 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
return -1;
}
tinyxml2::XMLElement *st, *mx, *co, *ao, *item;
tinyxml2::XMLElement *st, *mx, *co, *ao, *param, *item = NULL, *sub_item = NULL;
if(NULL != (st = point->FirstChildElement(ELE_St)))
{
for(item = st->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{
parse_cfg_item(item, point_page.st, ied);
point_page.st.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.st.back().type));
}
}
@ -259,6 +257,8 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
for(item = mx->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{
parse_cfg_item(item, point_page.mx, ied);
point_page.mx.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.mx.back().type));
}
}
@ -267,6 +267,8 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
for(item = co->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{
parse_cfg_item(item, point_page.co, ied);
point_page.co.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.co.back().type));
}
}
@ -275,6 +277,40 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p
for(item = ao->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{
parse_cfg_item(item, point_page.ao, ied);
point_page.ao.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.ao.back().type));
point_page.ao.back().value.vec_p_default.push_back(mms_m_create_data_ptr(point_page.ao.back().type));
}
}
if(NULL != (param = point->FirstChildElement(ELE_Param)))
{
for(item = param->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item))
{
parse_cfg_item(item, point_page.param, ied);
for(sub_item = item->FirstChildElement(ELE_SubItem); sub_item; sub_item = sub_item->NextSiblingElement(ELE_SubItem))
{
const char *val = sub_item->Attribute(KEY_VAL);
const char *def = sub_item->Attribute(KEY_DEFAULT_VAL);
void *p_val = mms_m_create_data_ptr(point_page.param.back().type);
void *p_def = mms_m_create_data_ptr(point_page.param.back().type);
if(NULL != val)
{
mms_m_set_data_by_str(p_val, point_page.param.back().type, val);
}
if(NULL != def)
{
mms_m_set_data_by_str(p_def, point_page.param.back().type, def);
}
point_page.param.back().value.vec_p_default.push_back(p_def);
point_page.param.back().value.vec_p_val.push_back(p_val);
}
}
}

View File

@ -8,9 +8,12 @@ LOCAL const char *ele_St = "St";
LOCAL const char *ele_Mx = "Mx";
LOCAL const char *ele_Co = "Co";
LOCAL const char *ele_Dd = "Dd";
LOCAL const char *ele_Ao = "Ao";
LOCAL const char *ele_Param = "Param";
LOCAL const char *ele_Signal = "Signal";
LOCAL const char *ele_Item = "Item";
// LOCAL const char *ele_SubItem = "SubItem";
LOCAL const char *attr_count = "count";
LOCAL const char *attr_md5 = "md5";
@ -19,13 +22,14 @@ LOCAL const char *attr_saddr = "saddr";
LOCAL const char *attr_desc = "desc";
LOCAL const char *attr_inf = "inf";
LOCAL const char *attr_type = "type";
LOCAL const char *attr_default = "default";
LOCAL const char *attr_unit = "unit";
LOCAL const char *attr_min = "min";
LOCAL const char *attr_max = "max";
LOCAL const char *attr_step = "step";
LOCAL const char *attr_num = "num";
LOCAL const char *attr_value = "value";
LOCAL const char *attr_default = "default";
LOCAL stru_self_ptl_cfg g_self_ptl_cfg = {.init = false};
@ -84,14 +88,14 @@ LOCAL int parse_base(tinyxml2::XMLElement *root)
continue;
}
tinyxml2::XMLElement *item_ele = parent_ele->FirstChildElement(ele_Item);
while (item_ele != nullptr)
tinyxml2::XMLElement *signal_ele = parent_ele->FirstChildElement(ele_Signal);
while (signal_ele != nullptr)
{
stru_self_ptl_cfg_base cfg_base;
const char *saddr = item_ele->Attribute(attr_saddr);
const char *desc = item_ele->Attribute(attr_desc);
const char *saddr = signal_ele->Attribute(attr_saddr);
const char *desc = signal_ele->Attribute(attr_desc);
int inf = 0;
if(tinyxml2::XMLError::XML_SUCCESS != item_ele->QueryIntAttribute(attr_inf, &inf))
if(tinyxml2::XMLError::XML_SUCCESS != signal_ele->QueryIntAttribute(attr_inf, &inf))
{
MY_LOG_E("failed to parse attribute %s in element %s, inf get failed", attr_inf, local_parse.type.c_str());
continue;
@ -108,8 +112,7 @@ LOCAL int parse_base(tinyxml2::XMLElement *root)
cfg_base.inf = inf;
local_parse.p_vec->push_back(cfg_base);
item_ele = item_ele->NextSiblingElement(ele_Item);
signal_ele = signal_ele->NextSiblingElement(ele_Signal);
}
if(local_parse.p_vec->size() != count)
@ -123,6 +126,96 @@ LOCAL int parse_base(tinyxml2::XMLElement *root)
return 0;
}
int parse_ao(tinyxml2::XMLElement *root)
{
tinyxml2::XMLElement *parent_ele = root->FirstChildElement(ele_Ao);
if (parent_ele == nullptr)
{
MY_LOG_E("not found element %s", ele_Ao);
return -1;
}
const char *count_str = parent_ele->Attribute(attr_count);
int count = 0;
if (count_str != nullptr)
{
count = atoi(count_str);
}
else
{
MY_LOG_E("not found attribute %s in element %s", attr_count, ele_Ao);
return -1;
}
const char *md5_str = parent_ele->Attribute(attr_md5);
if(nullptr == md5_str)
{
MY_LOG_E("not found attribute %s in element %s", attr_md5, ele_Ao);
return -1;
}
else
{
if(strlen(md5_str) != 32)
{
MY_LOG_E("invalid md5 string %s in element %s", md5_str, ele_Ao);
return -1;
}
for(int i = 0; i < 16; i++)
{
std::string byte_str = md5_str + i*2;
byte_str[2] = '\0';
g_self_ptl_cfg.ao_md5[i] = (uint8_t)strtoul(byte_str.c_str(), nullptr, 16);
}
}
tinyxml2::XMLElement *signal_ele = parent_ele->FirstChildElement(ele_Signal);
while(nullptr != signal_ele)
{
stru_self_ptl_cfg_param cfg_ao;
const char *saddr = signal_ele->Attribute(attr_saddr);
const char *desc = signal_ele->Attribute(attr_desc);
int inf = 0;
if(tinyxml2::XMLError::XML_SUCCESS != signal_ele->QueryIntAttribute(attr_inf, &inf))
{
MY_LOG_E("failed to parse attribute %s in element %s, inf get failed", attr_inf, ele_Ao);
continue;
}
const char *type = signal_ele->Attribute(attr_type);
const char *unit = signal_ele->Attribute(attr_unit);
const char *min = signal_ele->Attribute(attr_min);
const char *max = signal_ele->Attribute(attr_max);
const char *step = signal_ele->Attribute(attr_step);
const char *value = signal_ele->Attribute(attr_value);
const char *default_value = signal_ele->Attribute(attr_default);
cfg_ao.base.saddr = saddr == nullptr ? "" : saddr;
cfg_ao.base.desc = desc == nullptr ? "" : desc;
cfg_ao.base.inf = inf;
cfg_ao.type = dc_get_data_type_id_by_str(type == nullptr ? "" : type);
cfg_ao.unit = unit == nullptr ? "" : unit;
cfg_ao.min = min == nullptr ? "" : min;
cfg_ao.max = max == nullptr ? "" : max;
cfg_ao.step = step == nullptr ? "" : step;
cfg_ao.val.push_back(value == nullptr ? "" : value);
cfg_ao.default_value.push_back(default_value == nullptr ? "" : default_value);
g_self_ptl_cfg.ao_vec.push_back(cfg_ao);
if(inf == 0 && cfg_ao.type == DATA_TYPE_C64)
{
MY_LOG_I("saddr %s, desc %s", cfg_ao.base.saddr.c_str(), cfg_ao.base.desc.c_str());
}
signal_ele = signal_ele->NextSiblingElement(ele_Signal);
}
MY_LOG_I("ao signals: %d", (int)g_self_ptl_cfg.ao_vec.size());
return 0;
}
int parse_param(tinyxml2::XMLElement *root)
{
tinyxml2::XMLElement *parent_ele = root->FirstChildElement(ele_Param);
@ -165,30 +258,30 @@ int parse_param(tinyxml2::XMLElement *root)
}
}
tinyxml2::XMLElement *item_ele = parent_ele->FirstChildElement(ele_Item);
while (item_ele != nullptr)
tinyxml2::XMLElement *signal_ele = parent_ele->FirstChildElement(ele_Signal);
while (signal_ele != nullptr)
{
stru_self_ptl_cfg_param cfg_param;
const char *saddr = item_ele->Attribute(attr_saddr);
const char *desc = item_ele->Attribute(attr_desc);
const char *saddr = signal_ele->Attribute(attr_saddr);
const char *desc = signal_ele->Attribute(attr_desc);
int inf = 0;
if(tinyxml2::XMLError::XML_SUCCESS != item_ele->QueryIntAttribute(attr_inf, &inf))
if(tinyxml2::XMLError::XML_SUCCESS != signal_ele->QueryIntAttribute(attr_inf, &inf))
{
MY_LOG_E("failed to parse attribute %s in element %s, inf get failed", attr_inf, ele_Param);
continue;
}
const char *type = item_ele->Attribute(attr_type);
const char *default_value = item_ele->Attribute(attr_default);
const char *unit = item_ele->Attribute(attr_unit);
const char *min = item_ele->Attribute(attr_min);
const char *max = item_ele->Attribute(attr_max);
const char *step = item_ele->Attribute(attr_step);
const char *type = signal_ele->Attribute(attr_type);
const char *unit = signal_ele->Attribute(attr_unit);
const char *min = signal_ele->Attribute(attr_min);
const char *max = signal_ele->Attribute(attr_max);
const char *step = signal_ele->Attribute(attr_step);
const char *num = signal_ele->Attribute(attr_num);
cfg_param.base.saddr = saddr != nullptr ? saddr : "";
cfg_param.base.desc = desc != nullptr ? desc : "";
cfg_param.base.inf = inf;
cfg_param.type = dc_get_data_type_id_by_str(type != nullptr ? type : "");
cfg_param.default_value = default_value != nullptr ? default_value : "";
cfg_param.num = num != nullptr ? atoi(num) : 0;
cfg_param.unit = unit != nullptr ? unit : "";
cfg_param.min = min != nullptr ? min : "";
cfg_param.max = max != nullptr ? max : "";
@ -196,13 +289,29 @@ int parse_param(tinyxml2::XMLElement *root)
g_self_ptl_cfg.param_vec.push_back(cfg_param);
item_ele = item_ele->NextSiblingElement(ele_Item);
tinyxml2::XMLElement *item_ele = signal_ele->FirstChildElement(ele_Item);
while(item_ele != nullptr)
{
const char *val = item_ele->Attribute(attr_value);
const char *default_val = item_ele->Attribute(attr_default);
if(val != nullptr)
{
g_self_ptl_cfg.param_vec.back().val.push_back(val);
}
if(default_val != nullptr)
{
g_self_ptl_cfg.param_vec.back().default_value.push_back(default_val);
}
item_ele = item_ele->NextSiblingElement(ele_Item);
}
signal_ele = signal_ele->NextSiblingElement(ele_Signal);
}
if(g_self_ptl_cfg.param_vec.size() != count)
{
MY_LOG_E("count mismatch for element %s, expected %d, actual %d",
ele_Param, count, (int)g_self_ptl_cfg.param_vec.size());
ele_Signal, count, (int)g_self_ptl_cfg.param_vec.size());
return -1;
}
@ -239,6 +348,12 @@ int self_ptl_cfg_parse(const std::string &path)
return -1;
}
if(parse_ao(root) != 0)
{
MY_LOG_E("Failed to parse ao elements");
return -1;
}
// 解析param
if(parse_param(root) != 0)
{

View File

@ -4,3 +4,6 @@
#include "mySystem.h"
#include "dc_signal.h"
#define DC_PARAM_PATH "/mnt/RTU/test/file/PARAM/param.xml"
void dc_param_cfg_parse();

View File

@ -15,7 +15,9 @@ typedef struct stru_signal
std::string saddr; // 短地址
std::string desc; // 描述
uint8_t data_type; // 数据类型
void *p_data; // 数据指针
// void *p_data; // 数据指针
std::vector<void *> vec_p_data; // 数据指针列表(支持多条目)
std::vector<void *> vec_p_default_data; // 默认值指针列表(支持多条目)
std::vector<std::string> link_saddrs;
// stru_signal_ctrl ctrl; // 信号扩展信息
uint8_t ctrl_type; // 信号控制类型
@ -24,6 +26,29 @@ typedef struct stru_signal
}stru_signal;
// 参数分组信息用于XML序列化
typedef struct
{
std::string saddr;
std::string desc;
uint8_t data_type;
int num;
float min, max, step;
std::string unit;
std::vector<std::string> val;
std::vector<std::string> default_val;
} dc_param_group_info;
void dc_param_group_add(const dc_param_group_info &group);
std::vector<dc_param_group_info> dc_param_group_get_all();
void dc_param_group_clear();
void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::string &str);
bool dc_get_param_cfg_change();
void dc_set_param_cfg_change(bool change);
void dc_param_cfg_check();

View File

@ -1,5 +1,7 @@
#include "mySystem.h"
#include "myLog.h"
#include "dc_param.h"
#include "dc_signal.h"
@ -8,6 +10,8 @@
int app_datacenter_init1(void *arg)
{
dc_param_cfg_parse();
return 0;
}
@ -53,6 +57,7 @@ void *app_datacenter(void *arg)
if(event & EV_TIMER3)
{
dc_param_cfg_check();
p_app->run_cnt++;
}
}

View File

@ -1,3 +1,311 @@
#include "dc_param.h"
#include "tinyxml2.h"
LOCAL const char* DC_PARAM_PATH = "/mnt/RTU/test/file/PRAM/param.xml";
void dc_param_cfg_parse()
{
using namespace tinyxml2;
XMLDocument doc;
if (XML_SUCCESS != doc.LoadFile(DC_PARAM_PATH))
{
MY_LOG_E("failed to load param file: %s", DC_PARAM_PATH);
return;
}
dc_param_group_clear();
XMLElement *root = doc.RootElement();
if (nullptr == root)
{
MY_LOG_E("param file has no root element");
return;
}
// 解析 Ao 段:单值参数(一份值 + 一份缺省值)
XMLElement *ao_elem = root->FirstChildElement("Ao");
if (ao_elem)
{
for (XMLElement *sig = ao_elem->FirstChildElement("Signal"); sig != nullptr;
sig = sig->NextSiblingElement("Signal"))
{
const char *saddr = sig->Attribute("saddr");
const char *desc = sig->Attribute("desc");
const char *type_str = sig->Attribute("type");
if (nullptr == saddr || nullptr == desc || nullptr == type_str)
{
MY_LOG_E("Ao Signal missing required attributes, skipping");
continue;
}
uint8_t data_type = dc_get_data_type_id_by_str(type_str);
if (0 == data_type)
{
MY_LOG_E("unknown data type %s for saddr %s", type_str, saddr);
continue;
}
float min = sig->FloatAttribute("min", 0.0f);
float max = sig->FloatAttribute("max", 0.0f);
float step = sig->FloatAttribute("step", 0.0f);
const char *unit = sig->Attribute("unit");
dc_param_group_info group;
group.saddr = std::string(saddr);
group.desc = std::string(desc);
group.data_type = data_type;
group.min = min;
group.max = max;
group.step = step;
group.unit = unit ? std::string(unit) : std::string();
group.num = -1;
std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
// Ao 段:从 Signal 属性读取单值
const char *val = sig->Attribute("value");
const char *default_val = sig->Attribute("default");
void *p_data = dc_create_data_ptr_by_type(data_type);
if (p_data)
{
if (val && strlen(val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(val));
else if (default_val && strlen(default_val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(default_val));
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())
{
stru_signal_param param;
param.min = group.min;
param.max = group.max;
param.step = group.step;
param.unit = group.unit;
dc_signal_param(group.saddr, group.desc, group.data_type, param,
SIGNAL_CTRL_TYPE::SBO_NORMAL,
vec_p_data, vec_p_default_data, nullptr);
}
dc_param_group_add(group);
}
}
// 解析 Param 段:多值参数(多份值 + 多份缺省值)
XMLElement *param_elem = root->FirstChildElement("Param");
if (param_elem)
{
for (XMLElement *sig = param_elem->FirstChildElement("Signal"); sig != nullptr;
sig = sig->NextSiblingElement("Signal"))
{
const char *saddr = sig->Attribute("saddr");
const char *desc = sig->Attribute("desc");
const char *type_str = sig->Attribute("type");
if (nullptr == saddr || nullptr == desc || nullptr == type_str)
{
MY_LOG_E("Param Signal missing required attributes, skipping");
continue;
}
uint8_t data_type = dc_get_data_type_id_by_str(type_str);
if (0 == data_type)
{
MY_LOG_E("unknown data type %s for saddr %s", type_str, saddr);
continue;
}
float min = sig->FloatAttribute("min", 0.0f);
float max = sig->FloatAttribute("max", 0.0f);
float step = sig->FloatAttribute("step", 0.0f);
const char *unit = sig->Attribute("unit");
dc_param_group_info group;
group.saddr = std::string(saddr);
group.desc = std::string(desc);
group.data_type = data_type;
group.min = min;
group.max = max;
group.step = step;
group.unit = unit ? std::string(unit) : std::string();
std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
int num = sig->IntAttribute("num", -1);
if (num >= 1)
{
int item_count = 0;
for (XMLElement *item = sig->FirstChildElement("Item"); item != nullptr;
item = item->NextSiblingElement("Item"))
{
const char *val = item->Attribute("value");
const char *default_val = item->Attribute("default");
void *p_data = dc_create_data_ptr_by_type(data_type);
if (p_data)
{
if (val && strlen(val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(val));
else if (default_val && strlen(default_val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(default_val));
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);
}
item_count++;
}
group.num = item_count;
}
else
{
group.num = -1;
}
if (!vec_p_data.empty())
{
stru_signal_param param;
param.min = group.min;
param.max = group.max;
param.step = group.step;
param.unit = group.unit;
dc_signal_param(group.saddr, group.desc, group.data_type, param,
SIGNAL_CTRL_TYPE::SBO_NORMAL,
vec_p_data, vec_p_default_data, nullptr);
}
dc_param_group_add(group);
}
}
// 兼容旧格式Signal 直接作为 root 子元素(无 Ao/Param 分组)
if (!ao_elem && !param_elem)
{
for (XMLElement *sig = root->FirstChildElement("Signal"); sig != nullptr;
sig = sig->NextSiblingElement("Signal"))
{
const char *saddr = sig->Attribute("saddr");
const char *desc = sig->Attribute("desc");
const char *type_str = sig->Attribute("type");
if (nullptr == saddr || nullptr == desc || nullptr == type_str)
{
MY_LOG_E("Signal missing required attributes, skipping");
continue;
}
uint8_t data_type = dc_get_data_type_id_by_str(type_str);
if (0 == data_type)
{
MY_LOG_E("unknown data type %s for saddr %s", type_str, saddr);
continue;
}
float min = sig->FloatAttribute("min", 0.0f);
float max = sig->FloatAttribute("max", 0.0f);
float step = sig->FloatAttribute("step", 0.0f);
const char *unit = sig->Attribute("unit");
dc_param_group_info group;
group.saddr = std::string(saddr);
group.desc = std::string(desc);
group.data_type = data_type;
group.min = min;
group.max = max;
group.step = step;
group.unit = unit ? std::string(unit) : std::string();
std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
int num = sig->IntAttribute("num", -1);
if (num >= 1)
{
int item_count = 0;
for (XMLElement *item = sig->FirstChildElement("Item"); item != nullptr;
item = item->NextSiblingElement("Item"))
{
const char *val = item->Attribute("value");
const char *default_val = item->Attribute("default");
void *p_data = dc_create_data_ptr_by_type(data_type);
if (p_data)
{
if (val && strlen(val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(val));
else if (default_val && strlen(default_val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(default_val));
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);
}
item_count++;
}
group.num = item_count;
}
else
{
group.num = -1;
const char *val = sig->Attribute("value");
const char *default_val = sig->Attribute("default");
void *p_data = dc_create_data_ptr_by_type(data_type);
if (p_data)
{
if (val && strlen(val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(val));
else if (default_val && strlen(default_val) > 0)
dc_set_signal_val_from_str(p_data, data_type, std::string(default_val));
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())
{
stru_signal_param param;
param.min = group.min;
param.max = group.max;
param.step = group.step;
param.unit = group.unit;
dc_signal_param(group.saddr, group.desc, group.data_type, param,
SIGNAL_CTRL_TYPE::SBO_NORMAL,
vec_p_data, vec_p_default_data, nullptr);
}
dc_param_group_add(group);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -157,7 +157,7 @@ void iec61850m_init()
}
}
void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data)
void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
std::string value = "";
if(p_data)
@ -232,7 +232,17 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
for(uint16_t i = 0; i < cfg.st_num; i++)
{
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_st_sig[i].data_type];
ret |= dc_signal_out(cfg.p_st_sig[i].saddr, cfg.p_st_sig[i].desc, type_local, cfg.p_st_sig[i].p_data);
std::string saddr = cfg.p_st_sig[i].saddr;
std::string desc = cfg.p_st_sig[i].desc;
void *p_data = cfg.p_st_sig[i].vec_p_data.empty() ? nullptr : cfg.p_st_sig[i].vec_p_data[0];
if(p_data == nullptr)
{
MY_LOG_E("st saddr %s, desc %s, p_data %p", saddr.c_str(), desc.c_str(), p_data);
return -1;
}
ret |= dc_signal_out(saddr, desc, type_local, p_data);
}
if(ret != 0)
@ -244,7 +254,15 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
for(uint16_t i = 0; i < cfg.mx_num; i++)
{
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_mx_sig[i].data_type];
ret |= dc_signal_out(cfg.p_mx_sig[i].saddr, cfg.p_mx_sig[i].desc, type_local, cfg.p_mx_sig[i].p_data);
void *p_data = cfg.p_mx_sig[i].vec_p_data.empty() ? nullptr : cfg.p_mx_sig[i].vec_p_data[0];
if(p_data == nullptr)
{
MY_LOG_E("mx saddr %s, desc %s, p_data %p", cfg.p_mx_sig[i].saddr, cfg.p_mx_sig[i].desc, p_data);
return -1;
}
ret |= dc_signal_out(cfg.p_mx_sig[i].saddr, cfg.p_mx_sig[i].desc, type_local, p_data);
}
if(ret != 0)
@ -257,7 +275,15 @@ int iec61850m_signal_init(stru_mms_m_config &cfg)
{
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_co_sig[i].sig.data_type];
uint8_t ctrl_type_local = g_mms_m_ctrl_type_to_local_ctrl_type[cfg.p_co_sig[i].ctrl_type];
ret |= dc_signal_yk(cfg.p_co_sig[i].sig.saddr, cfg.p_co_sig[i].sig.desc, type_local, ctrl_type_local, cfg.p_co_sig[i].sig.p_data, iec61850m_signal_change_callback);
void *p_data = cfg.p_co_sig[i].sig.vec_p_data.empty() ? nullptr : cfg.p_co_sig[i].sig.vec_p_data[0];
if(p_data == nullptr)
{
MY_LOG_E("co saddr %s, desc %s, p_data %p", cfg.p_co_sig[i].sig.saddr, cfg.p_co_sig[i].sig.desc, p_data);
return -1;
}
ret |= dc_signal_yk(cfg.p_co_sig[i].sig.saddr, cfg.p_co_sig[i].sig.desc, type_local, ctrl_type_local, p_data, iec61850m_signal_change_callback);
}
if(ret != 0)
@ -273,10 +299,38 @@ 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.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) : "";
// 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);
void *p_data = cfg.p_ao_sig[i].sig.vec_p_data.empty() ? nullptr : cfg.p_ao_sig[i].sig.vec_p_data[0];
void *p_def_data = cfg.p_ao_sig[i].vec_p_default.empty() ? nullptr : cfg.p_ao_sig[i].vec_p_default[0];
if(p_data == nullptr || p_def_data == nullptr)
{
MY_LOG_E("ao saddr %s, desc %s, p_data %p, p_def_data %p", cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, p_data, p_def_data);
return -1;
}
ret |= dc_signal_ao(cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, type_local, param, cfg.p_ao_sig[i].ctrl_type, p_data, p_def_data, iec61850m_signal_change_callback);
}
if(ret != 0)
{
LOG_E("dc_signal_ao failed, ret %d", ret);
return -1;
}
for(uint16_t i = 0; i < cfg.param_num; i++)
{
stru_signal_param param;
param.min = cfg.p_param_sig[i].min;
param.max = cfg.p_param_sig[i].max;
param.step = cfg.p_param_sig[i].step;
param.unit = cfg.p_param_sig[i].unit;
uint8_t type_local = g_mms_m_type_to_local_type[cfg.p_param_sig[i].sig.data_type];
ret |= dc_signal_param(cfg.p_param_sig[i].sig.saddr, cfg.p_param_sig[i].sig.desc, type_local, param, cfg.p_param_sig[i].ctrl_type, cfg.p_param_sig[i].sig.vec_p_data, cfg.p_param_sig[i].vec_p_default, iec61850m_signal_change_callback);
}
if(ret != 0)

View File

@ -5,7 +5,7 @@
#include "myIcp67.h"
#include "self_ptl.h"
void param_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data);
void ao_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data);
void iec_point_tbl_pop_out(stru_icp67 *p_icp67, uint16_t info_addr, uint16_t num, uint8_t *p_data);
void self_check_pop_out(stru_icp67 *p_icp67, stru_data_info *p_data, uint16_t addr);
void dir_pop_out(stru_icp67 *p_icp67, uint8_t *p_name, uint8_t len, uint32_t attr, uint32_t size, uint8_t follow);

View File

@ -55,9 +55,9 @@ typedef struct
typedef struct
{
stru_self_ptl_cfg_param *p_param;
void *p_data;
void *p_default_data;
stru_signal_ctrl *p_ctrl;
std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
}stru_self_ptl_cfg_param_data;
@ -68,6 +68,7 @@ typedef struct
std::vector<stru_self_ptl_cfg_base_data> co_vec;
std::vector<stru_self_ptl_cfg_base_data> dd_vec;
std::vector<stru_self_ptl_cfg_param_data> ao_vec;
std::vector<stru_self_ptl_cfg_param_data> param_vec;
}stru_self_ptl_cfg_data;

View File

@ -48,9 +48,9 @@ typedef struct
uint16_t tx_cnt;
uint16_t per_cnt;
uint16_t offset;
}stru_local_param_get;
}stru_local_ao_get;
LOCAL stru_local_param_get g_local_param_get;
LOCAL stru_local_ao_get g_local_ao_get;
typedef struct
{
@ -106,7 +106,7 @@ LOCAL int file_write(const char *file_name, uint32_t offset, uint8_t *p_data, ui
LOCAL int file_read(const char *file_name, uint32_t offset, uint8_t *p_data, uint16_t len);
LOCAL int file_size_get(const char *file_name, uint32_t *p_size);
LOCAL void test_param_get(stru_icp67 *p_icp67, stru_genneral_method *p_method);
LOCAL void test_ao_get(stru_icp67 *p_icp67, stru_genneral_method *p_method);
LOCAL void test_iec_point_tbl_get(stru_icp67 *p_icp67, stru_genneral_method *p_method);
LOCAL void test_time_set(stru_icp67 *p_icp67, stru_genneral_method *p_method);
LOCAL void test_self_check_get(stru_icp67 *p_icp67, stru_genneral_method *p_method);
@ -130,7 +130,7 @@ std::map<uint16_t, iec_point_tbl_decode> g_map_iec_point_tbl_decode =
typedef void (* local_test)(stru_icp67 *p_icp67, stru_genneral_method *p_method);
std::map<uint8_t, local_test> g_map_local_test =
{
{1, test_param_get},
{1, test_ao_get},
{3, test_iec_point_tbl_get},
{5, test_time_set},
{6, test_self_check_get},
@ -139,32 +139,37 @@ std::map<uint8_t, local_test> g_map_local_test =
};
void param_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data)
void ao_pop_out(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data)
{
if(NULL == p_icp67 || NULL == p_data)
{
LOG_E("param_pop_out: invalid parameter");
LOG_E("ao_pop_out: invalid parameter");
return;
}
stru_self_ptl_cfg_data *p_app_cfg_data = self_ptl_cfg_data_ptr_get();
uint16_t pos = g_local_param_get.offset + g_local_param_get.rx_cnt;
stru_self_ptl_cfg_param_data *p_param_data = &p_app_cfg_data->param_vec[pos];
uint16_t pos = g_local_ao_get.offset + g_local_ao_get.rx_cnt;
stru_self_ptl_cfg_param_data *p_ao_data = &p_app_cfg_data->ao_vec[pos];
if(p_param_data->p_param->base.inf == addr && p_param_data->p_param->type == type)
if(p_ao_data->p_param->base.inf == addr && p_ao_data->p_param->type == type && dc_get_data_type_len(type) == len)
{
// dc_signal_param_set_val(p_param_data->p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, type, p_data);
// dc_signal_param_set_val(p_param_data->p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, type, p_data);
// dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::SELECT, type, p_data);
// dc_signal_param_set_val(p_ao_data->p_param->base.saddr, SIGNAL_CTRL_STEP::DIRECT, type, p_data);
dc_signal_param_set_val_without_check(p_param_data->p_param->base.saddr, type, p_data);
if(0 != dc_signal_ao_set_val_without_check(p_ao_data->p_param->base.saddr, type, (void *)p_data))
{
LOG_E("dc_signal_ao_set_val_without_check failed,saddr %s, desc %s, inf %d, type %d",
p_ao_data->p_param->base.saddr.c_str(), p_ao_data->p_param->base.desc.c_str(), p_ao_data->p_param->base.inf, type);
}
}
g_local_param_get.rx_cnt++;
if(g_local_param_get.rx_cnt == g_local_param_get.tx_cnt)
g_local_ao_get.rx_cnt++;
if(g_local_ao_get.rx_cnt == g_local_ao_get.tx_cnt)
{
g_local_param_get.offset += g_local_param_get.tx_cnt;
g_local_ao_get.offset += g_local_ao_get.tx_cnt;
g_flag[1] = 1;
}
@ -892,19 +897,19 @@ LOCAL int file_size_get(const char *file_name, uint32_t *p_size)
}
LOCAL void test_param_get(stru_icp67 *p_icp67, stru_genneral_method *p_method)
LOCAL void test_ao_get(stru_icp67 *p_icp67, stru_genneral_method *p_method)
{
stru_self_ptl_cfg_data *p_app_cfg_data = self_ptl_cfg_data_ptr_get();
uint16_t cnt = 0;
if(g_local_param_get.offset >= p_app_cfg_data->param_vec.size())
if(g_local_ao_get.offset >= p_app_cfg_data->ao_vec.size())
{
for(uint16_t i = 0; i < p_app_cfg_data->param_vec.size(); i++)
for(uint16_t i = 0; i < p_app_cfg_data->ao_vec.size(); i++)
{
stru_self_ptl_cfg_param_data *p_data = &p_app_cfg_data->param_vec[i];
stru_self_ptl_cfg_param_data *p_data = &p_app_cfg_data->ao_vec[i];
std::string val = dc_get_signal_val(p_data->p_data, p_data->p_param->type);
std::string val = dc_get_signal_val(p_data->vec_p_data[0], p_data->p_param->type);
stru_self_ptl_cfg_base *p_base = &p_data->p_param->base;
@ -916,27 +921,26 @@ LOCAL void test_param_get(stru_icp67 *p_icp67, stru_genneral_method *p_method)
}
uint16_t i = 0;
if(p_app_cfg_data->param_vec[g_local_param_get.offset].p_param->type == DATA_TYPE_C32)
if(p_app_cfg_data->ao_vec[g_local_ao_get.offset].p_param->type == DATA_TYPE_C32)
{
g_local_param_get.per_cnt = 10;
g_local_ao_get.per_cnt = 10;
}
stru_ti_1_2_data data[g_local_param_get.per_cnt] = {0};
for(i = g_local_param_get.offset; cnt < g_local_param_get.per_cnt && i < p_app_cfg_data->param_vec.size(); i++,cnt++)
stru_ti_1_2_data data[g_local_ao_get.per_cnt] = {0};
for(i = g_local_ao_get.offset; cnt < g_local_ao_get.per_cnt && i < p_app_cfg_data->ao_vec.size(); i++,cnt++)
{
data[cnt].data_addr = p_app_cfg_data->param_vec[i].p_param->base.inf;
data[cnt].data_type = p_app_cfg_data->param_vec[i].p_param->type;
data[cnt].data_len = dc_get_data_type_len(p_app_cfg_data->param_vec[i].p_param->type);
data[cnt].data_addr = p_app_cfg_data->ao_vec[i].p_param->base.inf;
data[cnt].data_type = p_app_cfg_data->ao_vec[i].p_param->type;
data[cnt].data_len = dc_get_data_type_len(p_app_cfg_data->ao_vec[i].p_param->type);
}
g_flag[1] = 0;
g_local_param_get.rx_cnt = 0;
g_local_param_get.tx_cnt = cnt;
g_local_ao_get.rx_cnt = 0;
g_local_ao_get.tx_cnt = cnt;
LOG_I("param_get: i %d, cnt %d, tx_cnt %d, offset %d, size %d", i, cnt, g_local_param_get.tx_cnt, g_local_param_get.offset, p_app_cfg_data->param_vec.size());
p_method->param_get_cb(p_icp67, data, cnt);
LOG_I("ao_get: i %d, cnt %d, tx_cnt %d, offset %d, size %d", i, cnt, g_local_ao_get.tx_cnt, g_local_ao_get.offset, p_app_cfg_data->ao_vec.size());
p_method->ao_get_cb(p_icp67, data, cnt);
}
LOCAL void test_iec_point_tbl_get(stru_icp67 *p_icp67, stru_genneral_method *p_method)
@ -1118,19 +1122,20 @@ LOCAL void cmd_self_ptl(int argc, char *argv[])
g_flag[1] = 1;
stru_icp67 *p_icp67 = self_ptl_icp67_ptr_get();
g_local_param_get.offset = 0;
g_local_param_get.per_cnt = 40;
g_local_ao_get.offset = 0;
g_local_ao_get.per_cnt = 40;
}
else if(argc == 3)
{
stru_self_ptl_cfg_data *p_cfg = self_ptl_cfg_data_ptr_get();
for(uint16_t i = 0; i < p_cfg->param_vec.size(); i++)
for(uint16_t i = 0; i < p_cfg->ao_vec.size(); i++)
{
stru_self_ptl_cfg_param_data *p_data = &p_cfg->param_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;
std::string val = dc_get_signal_val(p_data->p_data, 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, 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(), p_data->p_param->default_value.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

@ -27,9 +27,9 @@ stru_self_ptl g_self_ptl =
{
.method =
{
.param_get_cb = NULL,
.param_pop_out_cb = param_pop_out,
.param_set_cb = NULL,
.ao_get_cb = NULL,
.ao_pop_out_cb = ao_pop_out,
.ao_set_cb = NULL,
.iec_point_tbl_get_cb = NULL,
.iec_point_tbl_pop_out_cb = iec_point_tbl_pop_out,
.time_set_cb = NULL,
@ -476,15 +476,20 @@ LOCAL int self_ptl_cfg_init()
stru_self_ptl_cfg_data *p_cfg_data = &g_self_ptl_cfg_data;
p_cfg_data->st_vec.reserve(p_cfg->st_vec.size() + 1);
for(uint32_t i = 0; i < p_cfg->st_vec.size(); i++)
{
uint8_t *p_u8 = new uint8_t;
uint8_t *p_u8_last = new uint8_t;
(*p_u8) = 0;
(*p_u8_last) = 0;
p_cfg_data->st_vec.push_back({&p_cfg->st_vec[i], p_u8, p_u8_last});
}
p_cfg_data->mx_vec.reserve(p_cfg->mx_vec.size() + 1);
for(uint32_t i = 0; i < p_cfg->mx_vec.size(); i++)
{
float *p_f = new float;
@ -494,6 +499,7 @@ LOCAL int self_ptl_cfg_init()
p_cfg_data->mx_vec.push_back({&p_cfg->mx_vec[i], p_f, p_f_last});
}
p_cfg_data->co_vec.reserve(p_cfg->co_vec.size() + 1);
for(uint32_t i = 0; i < p_cfg->co_vec.size(); i++)
{
uint8_t *p_u8 = new uint8_t;
@ -502,7 +508,8 @@ LOCAL int self_ptl_cfg_init()
(*p_u8_last) = 0;
stru_signal_ctrl *p_ctrl = new stru_signal_ctrl;
if(nullptr == p_ctrl) {
if(nullptr == p_ctrl)
{
LOG_E("self_ptl_cfg_init new stru_signal_ctrl failed");
return -1;
}
@ -520,6 +527,7 @@ LOCAL int self_ptl_cfg_init()
p_cfg_data->co_vec.push_back({&p_cfg->co_vec[i], p_u8, p_u8_last, p_ctrl});
}
p_cfg_data->dd_vec.reserve(p_cfg->dd_vec.size() + 1);
for(uint32_t i = 0; i < p_cfg->dd_vec.size(); i++)
{
float *p_f = new float;
@ -529,23 +537,54 @@ LOCAL int self_ptl_cfg_init()
p_cfg_data->dd_vec.push_back({&p_cfg->dd_vec[i], p_f, p_f_last});
}
for(uint32_t i = 0; i < p_cfg->param_vec.size(); i++)
MY_LOG_I("ao signals: %d", (int)p_cfg->ao_vec.size());
p_cfg_data->ao_vec.reserve(p_cfg->ao_vec.size() + 1);
for(uint32_t i = 0; i < p_cfg->ao_vec.size(); i++)
{
stru_self_ptl_cfg_param *p_param = &p_cfg->param_vec[i];
void *p_data = dc_create_data_ptr_by_type(p_param->type);
if(nullptr == p_data)
stru_self_ptl_cfg_param *p_ao = &p_cfg->ao_vec[i];
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);
LOG_E("self_ptl_cfg_init dc_create_data_ptr_by_type failed, type:%d", p_ao->type);
return -1;
}
void *p_default_data = dc_create_data_ptr_by_type(p_param->type);
if(nullptr == p_default_data)
p_ctrl->type = SIGNAL_CTRL_TYPE::SBO_NORMAL;
p_ctrl->step = SIGNAL_CTRL_STEP::READY;
p_ctrl->data_type = p_ao->type;
p_ctrl->p_data = dc_create_data_ptr_by_type(p_ao->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);
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.push_back({p_ao, p_ctrl});
void *p_data = dc_create_data_ptr_by_type(p_ao->type);
if(nullptr == p_data)
{
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_data.push_back(p_data);
void *p_default_data = dc_create_data_ptr_by_type(p_ao->type);
if(nullptr == p_default_data)
{
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);
for(uint32_t i = 0; i < p_cfg->param_vec.size(); i++)
{
stru_self_ptl_cfg_param *p_param = &p_cfg->param_vec[i];
stru_signal_ctrl *p_ctrl = new stru_signal_ctrl;
if(nullptr == p_ctrl)
{
@ -563,7 +602,26 @@ LOCAL int self_ptl_cfg_init()
return -1;
}
p_cfg_data->param_vec.push_back({p_param, p_data, p_default_data, p_ctrl});
p_cfg_data->param_vec.push_back({p_param, p_ctrl});
for(uint8_t i = 0; i < p_param->num; i++)
{
void *p_val_data = dc_create_data_ptr_by_type(p_param->type);
if(nullptr == p_val_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.back().vec_p_data.push_back(p_val_data);
void *p_default_val_data = dc_create_data_ptr_by_type(p_param->type);
if(nullptr == p_default_val_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.back().vec_p_default_data.push_back(p_default_val_data);
}
}
return 0;
@ -584,13 +642,13 @@ void self_ptl_init()
return;
}
icp67_set_param_cfg_md5(p_icp67, p_self_cfg->param_md5);
icp67_set_ao_cfg_md5(p_icp67, p_self_cfg->ao_md5);
stru_genneral_method *p_method = &g_self_ptl.method;
icp67_set_param_get_cb(&p_method->param_get_cb);
icp67_set_param_pop_out_cb(p_method->param_pop_out_cb);
icp67_set_param_set_cb(&p_method->param_set_cb);
icp67_set_ao_get_cb(&p_method->ao_get_cb);
icp67_set_ao_pop_out_cb(p_method->ao_pop_out_cb);
icp67_set_ao_set_cb(&p_method->ao_set_cb);
icp67_set_iec_point_tbl_get_cb(&p_method->iec_point_tbl_get_cb);
icp67_set_iec_point_tbl_pop_out_cb(p_method->iec_point_tbl_pop_out_cb);
icp67_set_time_set_cb(&p_method->time_set_cb);
@ -657,7 +715,7 @@ void extract_saddr(const std::string &str, std::string &param, std::string &term
}
}
void self_ptl_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data)
void self_ptl_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data)
{
std::string value = "";
if(p_data)
@ -700,15 +758,15 @@ void self_ptl_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, u
{
}
else if(signal_type == "param")
else if(signal_type == "ao")
{
if(step == SIGNAL_CTRL_STEP::DIRECT)
{
if(g_self_ptl.method.param_set_cb)
if(g_self_ptl.method.ao_set_cb)
{
for(uint32_t i = 0; i < p_self_cfg_data->param_vec.size(); i++)
for(uint32_t i = 0; i < p_self_cfg_data->ao_vec.size(); i++)
{
stru_self_ptl_cfg_param_data *p = &p_self_cfg_data->param_vec.at(i);
stru_self_ptl_cfg_param_data *p = &p_self_cfg_data->ao_vec.at(i);
if(p->p_param && p->p_param->base.saddr == saddr)
{
uint8_t temp[256] = {0};
@ -716,15 +774,40 @@ void self_ptl_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, u
p_data_info->data_addr = p->p_param->base.inf;
p_data_info->data_type = p->p_param->type;
p_data_info->data_len = dc_get_data_type_len(p->p_param->type);
std::string val = dc_get_signal_val(p->p_data, p->p_param->type);
std::string val = dc_get_signal_val(p->vec_p_data[0], p->p_param->type);
strcpy((char *)p_data_info->data, val.c_str());
g_self_ptl.method.param_set_cb(p_icp67, temp, 1);
g_self_ptl.method.ao_set_cb(p_icp67, temp, 1);
break;
}
}
}
}
}
else if(signal_type == "param")
{
if(step == SIGNAL_CTRL_STEP::DIRECT)
{
// if(g_self_ptl.method.param_set_cb)
// {
// for(uint32_t i = 0; i < p_self_cfg_data->param_vec.size(); i++)
// {
// stru_self_ptl_cfg_param_data *p = &p_self_cfg_data->param_vec.at(i);
// if(p->p_param && p->p_param->base.saddr == saddr)
// {
// uint8_t temp[256] = {0};
// stru_ti_1_2_data_info *p_data_info = (stru_ti_1_2_data_info *)temp;
// p_data_info->data_addr = p->p_param->base.inf;
// p_data_info->data_type = p->p_param->type;
// p_data_info->data_len = dc_get_data_type_len(p->p_param->type);
// std::string val = dc_get_signal_val(p->vec_p_data[setting_zone], p->p_param->type);
// strcpy((char *)p_data_info->data, val.c_str());
// g_self_ptl.method.param_set_cb(p_icp67, temp, 1);
// break;
// }
// }
// }
}
}
}
LOCAL float safeStringToFloat(const std::string& str)
@ -755,8 +838,6 @@ int self_ptl_do_signal_out(stru_app *p_app)
goto ERR;
}
// LOG_I("***********st_info_size %d", p_app_cfg->st_info_vec.size());
for(uint32_t i = 0; i < p_app_cfg_data->st_vec.size(); i++)
{
p = &p_app_cfg_data->st_vec.at(i);
@ -813,6 +894,26 @@ int self_ptl_do_signal_out(stru_app *p_app)
goto ERR;
}
for(uint32_t i = 0; i < p_app_cfg_data->ao_vec.size(); i++)
{
stru_self_ptl_cfg_param_data *p_ao = &p_app_cfg_data->ao_vec.at(i);
if(p_ao && p_ao->p_param)
{
stru_signal_param param;
param.min = safeStringToFloat(p_ao->p_param->min);
param.max = safeStringToFloat(p_ao->p_param->max);
param.step = safeStringToFloat(p_ao->p_param->step);
param.unit = p_ao->p_param->unit;
ret |= dc_signal_ao(p_ao->p_param->base.saddr, p_ao->p_param->base.desc, p_ao->p_param->type, param, SIGNAL_CTRL_TYPE::SBO_NORMAL, p_ao->vec_p_data[0], p_ao->vec_p_default_data[0], self_ptl_signal_change_callback);
}
}
if(ret != 0)
{
goto ERR;
}
for(uint32_t i = 0; i < p_app_cfg_data->param_vec.size(); i++)
{
stru_self_ptl_cfg_param_data *p_param = &p_app_cfg_data->param_vec.at(i);
@ -822,10 +923,11 @@ 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.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);
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->vec_p_data, p_param->vec_p_default_data, self_ptl_signal_change_callback);
}
}
@ -845,12 +947,6 @@ int app_self_ptl_init1(void *arg)
{
stru_app *p_app = (stru_app *)arg;
// if(0 != parse_cfg_files())
// {
// MY_LOG_E("self ptl parse_cfg_files failed");
// return -1;
// }
self_ptl_cfg_init();
self_ptl_init();

View File

@ -9,7 +9,9 @@ typedef struct
std::string desc;
uint8_t data_type;
uint8_t ctrl_type;
void *p_data;
// void *p_data;
std::vector<void *> vec_p_data;
std::vector<void *> vec_p_default_data;
stru_signal_ctrl *p_ctrl;
stru_signal_param *p_param;
}stru_ws_signal;
@ -17,6 +19,7 @@ typedef struct
LOCAL std::vector<stru_ws_signal> g_ws_out_signals;
LOCAL std::vector<stru_ws_signal> g_ws_in_signals;
LOCAL std::vector<stru_ws_signal> g_ws_yk_signals;
LOCAL std::vector<stru_ws_signal> g_ws_ao_signals;
LOCAL std::vector<stru_ws_signal> g_ws_param_signals;
@ -48,13 +51,16 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
return;
}
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p_signals->reserve(p_signals->size() + 1);
p_signals->push_back({saddr, "", 0, 0});
p = &p_signals->back();
if(0 != dc_get_out_signal_info(saddr, p->desc, p->data_type, &p->p_data))
if(0 != dc_get_out_signal_info(saddr, p->desc, p->data_type, p->vec_p_data))
{
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;
}
@ -69,12 +75,15 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
return;
}
p_signals->push_back({saddr, "", 0, 0, nullptr, nullptr, nullptr});
p_signals->push_back({saddr, "", 0, 0});
p = &p_signals->back();
if(0 != dc_get_in_signal_info(saddr, p->desc, p->data_type, &p->p_data))
if(0 != dc_get_in_signal_info(saddr, p->desc, p->data_type, p->vec_p_data))
{
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;
}
@ -88,17 +97,19 @@ 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, nullptr, nullptr, nullptr});
p_signals->push_back({saddr, "", 0, 0});
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))
if(0 != dc_get_yk_signal_info(saddr, p->desc, p->data_type, p->ctrl_type, p->vec_p_data))
{
LOG_E("add_signals: dc_get_yk_signal_info failed, saddr = %s", saddr.c_str());
delete p->p_ctrl;
p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back();
return;
}
@ -112,6 +123,51 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
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->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back();
return;
}
}
else if(signal_type == "ao")
{
p_signals = &g_ws_ao_signals;
if(0 == signal_is_exist(saddr, g_ws_ao_signals))
{
LOG_E("add_signals: signal is already exist, saddr = %s", saddr.c_str());
return;
}
p_signals->push_back({saddr, "", 0, 0});
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_ao_siganl_info(saddr, p->desc, p->data_type, *p->p_param, p->ctrl_type, p->vec_p_data, p->vec_p_default_data))
{
LOG_E("add_signals: dc_get_ao_siganl_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->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->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back();
return;
}
@ -125,17 +181,19 @@ 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, nullptr, nullptr, nullptr});
p_signals->push_back({saddr, "", 0, 0});
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))
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))
{
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;
}
@ -150,6 +208,8 @@ void add_signal(const std::string& saddr, const std::string& signal_type)
delete p->p_ctrl;
delete p->p_param;
p->vec_p_data.clear();
p->vec_p_default_data.clear();
p_signals->pop_back();
return;
}
@ -177,6 +237,10 @@ void del_signal(const std::string& saddr, const std::string& signal_type)
{
p_signals = &g_ws_yk_signals;
}
else if(signal_type == "ao")
{
p_signals = &g_ws_ao_signals;
}
else if(signal_type == "param")
{
p_signals = &g_ws_param_signals;
@ -201,6 +265,9 @@ void del_signal(const std::string& saddr, const std::string& signal_type)
delete p_signal->p_param;
}
p_signal->vec_p_data.clear();
p_signal->vec_p_default_data.clear();
p_signals->erase(p_signals->begin() + i);
return;
}
@ -209,7 +276,7 @@ void del_signal(const std::string& saddr, const std::string& signal_type)
LOG_E("del_signal: not found saddr = %s", saddr.c_str());
}
void set_signal_data(const std::string& saddr, const std::string& signal_type, const std::string& signal_data)
void set_signal_data(const std::string& saddr, const std::string& signal_type, const uint8_t setting_zone, const std::string& signal_data)
{
std::vector<stru_ws_signal> *p_signals = nullptr;
@ -290,6 +357,53 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c
}
}
}
else if(signal_type == "ao")
{
p_signals = &g_ws_ao_signals;
for(uint32_t i = 0; i < p_signals->size(); i++)
{
stru_ws_signal *p_signal = &p_signals->at(i);
if(p_signal->saddr == saddr)
{
if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::DIRECT_NORMAL)
{
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
}
LOG_I("saddr %s, direct, value %s success !!!", saddr.c_str(), signal_data.c_str());
return;
}
else if(p_signal->ctrl_type == SIGNAL_CTRL_TYPE::SBO_NORMAL)
{
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_ao_set_val select failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
}
LOG_I("saddr %s, select, value %s success !!!", saddr.c_str(), signal_data.c_str());
if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str()))
{
LOG_E("set_signal_data: dc_signal_ao_set_val direct failed, saddr = %s, signal_data = %s", saddr.c_str(), signal_data.c_str());
return;
}
LOG_I("saddr %s, direct, value %s success !!!", saddr.c_str(), signal_data.c_str());
return;
}
else
{
LOG_E("p_signal->ctrl_type is invalid, p_signal->ctrl_type = %d");
return;
}
}
}
}
else if(signal_type == "param")
{
p_signals = &g_ws_param_signals;
@ -301,7 +415,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->p_ctrl, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (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;
@ -312,7 +426,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->p_ctrl, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, setting_zone, (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;
@ -320,7 +434,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->p_ctrl, (void *)signal_data.c_str()))
if(0 != dc_signal_param_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, setting_zone, (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;
@ -373,10 +487,11 @@ void ws_recv(const char* p_rx, uint16_t rx_len)
cJSON *saddr = cJSON_GetObjectItem(root, "saddr");
cJSON *signal_type = cJSON_GetObjectItem(root, "signal_type");
cJSON *signal_data = cJSON_GetObjectItem(root, "signal_data");
cJSON *setting_zone = cJSON_GetObjectItem(root, "setting_zone");
cJSON *curd = cJSON_GetObjectItem(root, "curd");
std::string saddr_str = "", signal_type_str = "", signal_data_str = "", curd_str = "";
std::string saddr_str = "", signal_type_str = "", signal_data_str = "", setting_zone_str = "", curd_str = "";
if(saddr && cJSON_IsString(saddr) && saddr->valuestring)
{
@ -393,6 +508,11 @@ void ws_recv(const char* p_rx, uint16_t rx_len)
signal_data_str = signal_data->valuestring;
}
if(setting_zone && cJSON_IsString(setting_zone) && setting_zone->valuestring)
{
setting_zone_str = setting_zone->valuestring;
}
if(curd && cJSON_IsString(curd) && curd->valuestring)
{
curd_str = curd->valuestring;
@ -427,7 +547,7 @@ void ws_recv(const char* p_rx, uint16_t rx_len)
}
else if(0 == curd_str.compare("set"))
{
set_signal_data(saddr_str, signal_type_str, signal_data_str);
set_signal_data(saddr_str, signal_type_str, atoi(setting_zone_str.c_str()), signal_data_str);
}
}
@ -435,10 +555,10 @@ void ws_recv(const char* p_rx, uint16_t rx_len)
void ws_task()
{
if(g_ws_out_signals.empty() && g_ws_in_signals.empty() && g_ws_yk_signals.empty() && g_ws_param_signals.empty())
{
return;
}
// if(g_ws_out_signals.empty() && g_ws_in_signals.empty() && g_ws_yk_signals.empty() && g_ws_ao_signals.empty() && g_ws_param_signals.empty())
// {
// return;
// }
const char ctrl_type_str[][16] = {"NONE", "DIRECT_NORMAL", "SBO_NORMAL"};
@ -467,7 +587,7 @@ void ws_task()
cJSON_AddItemToObject(item, "desc", cJSON_CreateString(p_signal->desc.c_str()));
cJSON_AddItemToObject(item, "type", cJSON_CreateString(dc_get_data_type_str_by_id(p_signal->data_type).c_str()));
std::string val = dc_get_signal_val(p_signal->p_data, 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_AddItemToArray(out_arr, item);
}
@ -489,7 +609,7 @@ void ws_task()
cJSON_AddItemToObject(item, "saddr", cJSON_CreateString(p_signal->saddr.c_str()));
cJSON_AddItemToObject(item, "desc", cJSON_CreateString(p_signal->desc.c_str()));
cJSON_AddItemToObject(item, "type", cJSON_CreateString(dc_get_data_type_str_by_id(p_signal->data_type).c_str()));
std::string val = dc_get_signal_val(p_signal->p_data, 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_AddItemToArray(in_arr, item);
}
@ -510,12 +630,50 @@ void ws_task()
cJSON_AddItemToObject(item, "saddr", cJSON_CreateString(p_signal->saddr.c_str()));
cJSON_AddItemToObject(item, "desc", cJSON_CreateString(p_signal->desc.c_str()));
cJSON_AddItemToObject(item, "type", cJSON_CreateString(dc_get_data_type_str_by_id(p_signal->data_type).c_str()));
std::string val = dc_get_signal_val(p_signal->p_data, 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, "ctrl_type", cJSON_CreateString(ctrl_type_str[p_signal->ctrl_type]));
cJSON_AddItemToArray(yk_arr, item);
}
cJSON *ao_arr = cJSON_CreateArray();
cJSON_AddItemToObject(root, "ao", ao_arr);
for(uint32_t i = 0; i < g_ws_ao_signals.size(); i++)
{
stru_ws_signal *p_signal = &g_ws_ao_signals.at(i);
cJSON *item = cJSON_CreateObject();
if(nullptr == item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
return;
}
cJSON_AddItemToObject(item, "saddr", cJSON_CreateString(p_signal->saddr.c_str()));
cJSON_AddItemToObject(item, "desc", cJSON_CreateString(p_signal->desc.c_str()));
cJSON_AddItemToObject(item, "type", cJSON_CreateString(dc_get_data_type_str_by_id(p_signal->data_type).c_str()));
// 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, "ctrl_type", cJSON_CreateString(ctrl_type_str[p_signal->ctrl_type]));
if(p_signal->p_param)
{
cJSON_AddItemToObject(item, "min", cJSON_CreateString(std::to_string(p_signal->p_param->min).c_str()));
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()));
// cJSON_AddItemToObject(item, "default", cJSON_CreateString(p_signal->p_param->default_value.c_str()));
}
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);
}
cJSON *param_arr = cJSON_CreateArray();
cJSON_AddItemToObject(root, "param", param_arr);
@ -533,8 +691,8 @@ void ws_task()
cJSON_AddItemToObject(item, "saddr", cJSON_CreateString(p_signal->saddr.c_str()));
cJSON_AddItemToObject(item, "desc", cJSON_CreateString(p_signal->desc.c_str()));
cJSON_AddItemToObject(item, "type", cJSON_CreateString(dc_get_data_type_str_by_id(p_signal->data_type).c_str()));
std::string val = dc_get_signal_val(p_signal->p_data, p_signal->data_type);
cJSON_AddItemToObject(item, "val", cJSON_CreateString(val.c_str()));
// 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, "ctrl_type", cJSON_CreateString(ctrl_type_str[p_signal->ctrl_type]));
if(p_signal->p_param)
{
@ -542,16 +700,29 @@ 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()));
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_AddItemToObject(item, "default", cJSON_CreateString(p_signal->p_param->default_value.c_str()));
}
for(uint32_t j = 0; j < p_signal->vec_p_data.size(); j++)
{
cJSON *setting_zone_item = cJSON_CreateObject();
if(nullptr == setting_zone_item)
{
LOG_E("ws_task: cJSON_CreateObject failed");
cJSON_Delete(root);
return;
}
std::string setting_zone_str = std::to_string(j);
cJSON_AddItemToObject(setting_zone_item, "setting_zone", cJSON_CreateString(setting_zone_str.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(item, setting_zone_item);
}
cJSON_AddItemToArray(param_arr, item);
}

View File

@ -18,7 +18,7 @@
</Co>
<Dd>
</Dd>
<Param>
<Ao>
<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"/>
@ -35,5 +35,7 @@
<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"/>
</Ao>
<Param>
</Param>
</Root>

File diff suppressed because it is too large Load Diff

View File

@ -24,12 +24,15 @@
<Item no="3" type="2" ctlModel="4" name="co3" desc="遥控04" LDev="CTRL" LNode="TC4CSWI1" DoName="Pos" fc="0"/>
<Item no="4" type="2" ctlModel="4" name="co4" desc="低频保护软压板" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/>
</Co>
<!-- <Ao desc="参数">
<Item no="0" type="5" name="ao0" desc="参数01" LDev="PROT" LNode="GGIO1" DoName="SPCSO1" fc="0"/>
<>
<Item no="1" type="5" name="ao1" desc="参数02" LDev="PROT" LNode="GGIO1" DoName="SPCSO2" fc="0"/>
<Ao desc="参数">
<Item no="0" type="5" ctlModel="4" name="ao0" desc="参数01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp" fc="2" min="1" max="30" step="1" unit=""/>
<Item no="1" type="5" ctlModel="4" name="ao1" desc="参数02" LDev="PROT" LNode="LPHD1" DoName="DeviceName" fc="2" min="" max="" step="" unit=""/>
</Ao>
<Param > -->
<Param desc="定值">
<Item no="0" type="5" ctlModel="4" name="param0" desc="定值01" LDev="PROT" LNode="LPHD1" DoName="SettingGrp" fc="2" min="0.05" max="150" step="0.001" unit="A" num="2">
<SubItem value="15" default="15"/>
<SubItem value="27" default="27"/>
</Item>
</Param>
</Point>
</Root>

View File

@ -1,13 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<param>
<Signal no="0" saddr="self_ptl.param.TERM_ID" desc="生产-终端ID" type="c32" value="T301404JY120202407654329" min="" max="" unit="" default="T301404JY120202407654329" />
<Signal no="1" saddr="self_ptl.param.PA_104" desc="104规约-公共地址" type="u16" num="1" min="1" max="65535" unit="" >
<item no="0" value="" default="1" />
</Signal>
<Signal no="2" saddr="self_ptl.param.PA_101" desc="101规约-公共地址" type="u16" num="2" min="1" max="65535" unit="" />
<item no="0" value="" />
<item no="1" value="" />
</signal>
</param>
<Ao/>
<Param/>
</param>

View File

@ -65,14 +65,15 @@
<option value="out">out</option>
<option value="in">in</option>
<option value="yk">yk</option>
<option value="ao">ao</option>
<option value="param">param</option>
</select>
</div>
<div class="form-group">
<label>curd *</label>
<select id="curd">
<option value="set">set</option>
<option value="add">add</option>
<option value="set">set</option>
<option value="del">del</option>
</select>
</div>
@ -123,6 +124,16 @@
</div>
</div>
<div class="table-container">
<div class="table-title">AO 信号</div>
<div class="table-wrapper">
<table class="signalTable">
<thead><tr><th>#</th><th>saddr</th><th>desc</th><th>数据类型</th><th>val</th><th>ctrl_type</th><th>min</th><th>max</th><th>step</th><th>unit</th><th>default</th></tr></thead>
<tbody id="aoBody"></tbody>
</table>
</div>
</div>
<div class="table-container">
<div class="table-title">PARAM 信号</div>
<div class="table-wrapper">
@ -145,6 +156,7 @@
out: document.getElementById('outBody'),
in: document.getElementById('inBody'),
yk: document.getElementById('ykBody'),
ao: document.getElementById('aoBody'),
param: document.getElementById('paramBody')
};
@ -177,7 +189,7 @@
// 每次收到数据,直接清空对应表格,重新渲染
function parseData(root) {
const types = ['out', 'in', 'yk', 'param'];
const types = ['out', 'in', 'yk', 'ao', 'param'];
types.forEach(type => {
const arr = root[type];
const body = tableBodies[type];
@ -208,6 +220,19 @@
if (type === 'yk') {
html += `<td>${item.ctrl_type || '-'}</td>`;
}
// ao 增加完整参数列
if (type === 'ao') {
html += `
<td>${item.ctrl_type || '-'}</td>
<td>${item.min || '-'}</td>
<td>${item.max || '-'}</td>
<td>${item.step || '-'}</td>
<td>${item.unit || '-'}</td>
<td>${item.default || '-'}</td>
`;
}
// param 增加完整参数列
if (type === 'param') {
html += `