<修改>
1、调整vscode配置,终端打印历史行数增加; 2、增加信号类型ao,作为参数,区分param定值,定值有定值区 3、信号中的指向数据的指针使用vector,用于存储定值时,存在多个定值区; 4、webserver中同步增加ao类型信号处理 5、调整各配置文件,增加ao类型,调整param类型
This commit is contained in:
parent
8d4c7eebb4
commit
1468207cae
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ¶m_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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
@ -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();
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ¶m, 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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 += `
|
||||
|
|
|
|||
Loading…
Reference in New Issue