diff --git a/release/inc/myMms_m.h b/release/inc/myMms_m.h index f1d3ccc..dc52ffd 100644 --- a/release/inc/myMms_m.h +++ b/release/inc/myMms_m.h @@ -25,23 +25,7 @@ enum _MMS_M_EVENT_END }; -enum -{ - _MMS_M_data_type_unknown = 0, - _MMS_M_data_type_bool, - _MMS_M_data_type_int8, - _MMS_M_data_type_int16, - _MMS_M_data_type_int32, - _MMS_M_data_type_int64, - _MMS_M_data_type_uint8, - _MMS_M_data_type_uint16, - _MMS_M_data_type_uint32, - _MMS_M_data_type_uint64, - _MMS_M_data_type_float, - _MMS_M_data_type_double, - _MMS_M_data_type_string, - _MMS_M_data_type_end -}; +#define MMS_M_DATA_STRING_LEN 128 #define MMS_M_STR_LEN 64 #define MMS_M_REF_LEN 128 @@ -113,11 +97,11 @@ typedef struct int app_fd; // 61850客户端句柄 char ied[MMS_M_STR_LEN]; // ied名称 char saddr[MMS_M_STR_LEN]; // 信号短地址 - int value_type; // 数据类型 + uint8_t value_type; // 数据类型 // void *p_val; // 设置值 char val[128]; // char val_str[MMS_M_STR_LEN]; // 字符串类型的值 - int ctrl_type; // 遥控类型 + uint8_t ctrl_type; // 遥控类型 int set_zone; // 定值区 void (*p_func)(void *arg, int ret); // 设置回调函数 // void *arg; // 回调函数参数 diff --git a/release/inc/mySystem.h b/release/inc/mySystem.h index 40d96d9..eb2d52a 100644 --- a/release/inc/mySystem.h +++ b/release/inc/mySystem.h @@ -408,3 +408,4 @@ uint8_t dc_get_data_type_id_by_str(const std::string &data_type_str); uint8_t dc_get_data_type_len(uint8_t data_type); +void dc_set_signal_val_from_str(void *p_data, uint8_t data_type, const std::string &str); \ No newline at end of file diff --git a/src/protocol/libmms_m/src/mms_m.cpp b/src/protocol/libmms_m/src/mms_m.cpp index f0fe5b7..b5c20f5 100644 --- a/src/protocol/libmms_m/src/mms_m.cpp +++ b/src/protocol/libmms_m/src/mms_m.cpp @@ -54,7 +54,7 @@ static void sleep_ms(uint32_t ms) static int mms_m_push_event(stru_mms_m_obj &obj, stru_mms_m_event &event) { - if(event.ctrl_type >= _MMS_M_EVENT_AO_WRITE) + if(event.ctrl_type >= _MMS_M_EVENT_END) { LOG_E("push event ctrl_type(%d) is not support", event.ctrl_type); return -1; @@ -125,23 +125,27 @@ static void mms_m_show_MmsValue(MmsValue* mms_value) break; case MMS_BOOLEAN: bVal = MmsValue_getBoolean(mms_value); - // LOG_I("show_mms_value bVal %d\r\n", bVal); + LOG_I("show_mms_value bVal %d\r\n", bVal); break; case MMS_BIT_STRING: strVal= (char *)MmsValue_toString(mms_value); - // LOG_I("show_mms_value strVal %s\r\n", strVal); + LOG_I("show_mms_value strVal %s\r\n", strVal); break; case MMS_INTEGER: iVal = MmsValue_toInt32(mms_value); - // LOG_I("show_mms_value iVal: %d\n", iVal); + LOG_I("show_mms_value iVal: %d\n", iVal); break; case MMS_UNSIGNED: uVal = MmsValue_toUint32(mms_value); - // LOG_I("show_mms_value uVal: %u\n", uVal); + LOG_I("show_mms_value uVal: %u\n", uVal); break; case MMS_FLOAT: fVal = MmsValue_toFloat(mms_value); - // LOG_I("show_mms_value fVal: %f\n", fVal); + LOG_I("show_mms_value fVal: %f\n", fVal); + break; + case MMS_STRING: + strVal= (char *)MmsValue_toString(mms_value); + LOG_I("show_mms_value strVal %s\r\n", strVal); break; default: LOG_E("show_mms_value Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value)); @@ -152,9 +156,9 @@ static void mms_m_show_MmsValue(MmsValue* mms_value) static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val) { - if(NULL == mms_value) + if(NULL == mms_value || NULL == p_val) { - LOG_E("mms_value is NULL\r\n"); + LOG_E("mms_value or p_val is NULL, mms_value = %p, p_val = %p\r\n", mms_value, p_val); return -1; } @@ -187,6 +191,16 @@ static int mms_m_get_mmsValue(MmsValue *mms_value, uint8_t &type, void *p_val) // item.value.val.f = MmsValue_toFloat(mms_value); *(float *)p_val = MmsValue_toFloat(mms_value); break; + case MMS_VISIBLE_STRING: + type = MMS_VISIBLE_STRING; + // item.value.val.s = MmsValue_toString(mms_value); + strcpy((char *)p_val, MmsValue_toString(mms_value)); + break; + case MMS_STRING: + type = MMS_STRING; + // item.value.val.s = MmsValue_toString(mms_value); + strcpy((char *)p_val, MmsValue_toString(mms_value)); + break; default: LOG_E("mms_m_get_mmsValue Failed to read value (error code: %i)\n", MmsValue_getDataAccessError(mms_value)); return -1; @@ -285,6 +299,62 @@ static int mms_m_send_ao_write(stru_mms_m_obj &obj, stru_mms_m_event &event) return -1; } + MmsValue *p_value = IedConnection_readObject(obj.run.con, &err, p_item->reference.c_str(), (FunctionalConstraint)p_item->fc); + if(NULL != p_value) + { + // if(MMS_M_DEBUG_PRINT_ON == obj.debug_print_flag) + { + mms_m_show_MmsValue(p_value); + } + } + else + { + LOG_E("%s: %s read err:%s(%d)\n", obj.cfg_path.c_str(), p_item->reference.c_str(), mms_m_err_str(err), err); + } + MmsValue_delete(p_value); + + // write + if(0 != mms_m_param_value_sync((*p_item), event)) + { + LOG_E("set value failed"); + return -1; + } + + IedConnection_writeObject(obj.run.con, &err, p_item->reference.c_str(), (FunctionalConstraint)p_item->fc, p_item->set_value); + if(err != IED_ERROR_OK) + { + LOG_E("%s: %s write err:%s(%d)\n", obj.cfg_path.c_str(), p_item->reference.c_str(), mms_m_err_str(err), err); + return -1; + } + return 0; +} + +static int mms_m_send_param_write(stru_mms_m_obj &obj, stru_mms_m_event &event) +{ + std::vector::iterator it; + stru_point_item *p_item = NULL; + IedClientError err; + + for(it = obj.p_cfg->point.param.begin(); it!= obj.p_cfg->point.param.end(); it++) + { + if(it->saddr.compare(event.saddr) == 0) + { + p_item = &(*it); + break; + } + } + if(NULL == p_item) + { + LOG_E("%s: %s not found in cfg\n", obj.cfg_path.c_str(), event.saddr); + return -1; + } + size_t pos = p_item->reference.find("/"); + if(pos == std::string::npos) + { + LOG_E("%s: %s reference is not correct\n", obj.cfg_path.c_str(), p_item->reference.c_str()); + return -1; + } + std::string str_head = p_item->reference.substr(0, pos); std::string str_EditSG = str_head + "/" + g_sgcb_edit_sg; std::string str_CnfEdit = str_head + "/" + g_sgcb_cnf_edit; @@ -668,7 +738,7 @@ static void mms_m_send_set_gi(stru_mms_m_obj &obj) static void mms_m_send_call_all(stru_mms_m_obj &obj) { - std::vector temp_list[2] = {obj.p_cfg->point.st, obj.p_cfg->point.mx}; + std::vector temp_list[3] = {obj.p_cfg->point.st, obj.p_cfg->point.mx, obj.p_cfg->point.ao}; std::vector::iterator it; IedClientError err; @@ -676,7 +746,7 @@ static void mms_m_send_call_all(stru_mms_m_obj &obj) stru_mms_m_out_value out_val; - for(int i = 0; i < 2; i++) + for(int i = 0; i < 3; i++) { for(it = temp_list[i].begin(); it!= temp_list[i].end(); it++) { @@ -2084,53 +2154,25 @@ void *mms_m_create_data_ptr(uint8_t type) switch(type) { - case _MMS_M_data_type_bool: + case MMS_BOOLEAN: p_u8 = new uint8_t; (*p_u8) = 0; return (void *)p_u8; - case _MMS_M_data_type_int8: - p_i8 = new int8_t; - (*p_i8) = 0; - return (void *)p_i8; - case _MMS_M_data_type_int16: - p_i16 = new int16_t; - (*p_i16) = 0; - return (void *)p_i16; - case _MMS_M_data_type_int32: + case MMS_INTEGER: p_i32 = new int32_t; (*p_i32) = 0; return (void *)p_i32; - case _MMS_M_data_type_int64: - p_i64 = new int64_t; - (*p_i64) = 0; - return (void *)p_i64; - case _MMS_M_data_type_uint8: - p_u8 = new uint8_t; - (*p_u8) = 0; - return (void *)p_u8; - case _MMS_M_data_type_uint16: - p_u16 = new uint16_t; - (*p_u16) = 0; - return (void *)p_u16; - case _MMS_M_data_type_uint32: + case MMS_UNSIGNED: p_u32 = new uint32_t; (*p_u32) = 0; return (void *)p_u32; - case _MMS_M_data_type_uint64: - p_u64 = new uint64_t; - (*p_u64) = 0; - return (void *)p_u64; - case _MMS_M_data_type_float: - p_f = new float; - (*p_f) = 0.0f; - return (void *)p_f; - case _MMS_M_data_type_double: + case MMS_FLOAT: p_d = new double; (*p_d) = 0.0; return (void *)p_d; - case _MMS_M_data_type_string: - p_str = new char[MMS_M_STR_LEN]; - memset(p_str, 0, MMS_M_STR_LEN); + case MMS_STRING: + p_str = new char[MMS_M_DATA_STRING_LEN]; + memset(p_str, 0, MMS_M_DATA_STRING_LEN); return (void *)p_str; default: return NULL; @@ -2147,41 +2189,20 @@ int mms_m_set_data_value(void *srt, void *dst, uint8_t type) switch(type) { - case _MMS_M_data_type_bool: + case MMS_BOOLEAN: *(uint8_t *)dst = *(uint8_t *)srt; break; - case _MMS_M_data_type_int8: - *(int8_t *)dst = *(int8_t *)srt; - break; - case _MMS_M_data_type_int16: - *(int16_t *)dst = *(int16_t *)srt; - break; - case _MMS_M_data_type_int32: + case MMS_INTEGER: *(int32_t *)dst = *(int32_t *)srt; break; - case _MMS_M_data_type_int64: - *(int64_t *)dst = *(int64_t *)srt; - break; - case _MMS_M_data_type_uint8: - *(uint8_t *)dst = *(uint8_t *)srt; - break; - case _MMS_M_data_type_uint16: - *(uint16_t *)dst = *(uint16_t *)srt; - break; - case _MMS_M_data_type_uint32: + case MMS_UNSIGNED: *(uint32_t *)dst = *(uint32_t *)srt; break; - case _MMS_M_data_type_uint64: - *(uint64_t *)dst = *(uint64_t *)srt; - break; - case _MMS_M_data_type_float: - *(float *)dst = *(float *)srt; - break; - case _MMS_M_data_type_double: + case MMS_FLOAT: *(double *)dst = *(double *)srt; break; - case _MMS_M_data_type_string: - strncpy((char *)dst, (char *)srt, MMS_M_STR_LEN); + case MMS_STRING: + strncpy((char *)dst, (char *)srt, MMS_M_DATA_STRING_LEN); break; default: return -1; @@ -2201,42 +2222,21 @@ int mms_m_get_data_value_str(void *data, uint8_t type, char *str) switch(type) { - case _MMS_M_data_type_bool: + case MMS_BOOLEAN: b = *(uint8_t *)data > 0 ? true : false; strncpy(str, b ? "true" : "false", MMS_M_STR_LEN); break; - case _MMS_M_data_type_int8: - snprintf(str, MMS_M_STR_LEN, "%d", *(int8_t *)data); - break; - case _MMS_M_data_type_int16: - snprintf(str, MMS_M_STR_LEN, "%d", *(int16_t *)data); - break; - case _MMS_M_data_type_int32: + case MMS_INTEGER: snprintf(str, MMS_M_STR_LEN, "%d", *(int32_t *)data); break; - case _MMS_M_data_type_int64: - snprintf(str, MMS_M_STR_LEN, "%ld", *(int64_t *)data); - break; - case _MMS_M_data_type_uint8: - snprintf(str, MMS_M_STR_LEN, "%u", *(uint8_t *)data); - break; - case _MMS_M_data_type_uint16: - snprintf(str, MMS_M_STR_LEN, "%u", *(uint16_t *)data); - break; - case _MMS_M_data_type_uint32: + case MMS_UNSIGNED: snprintf(str, MMS_M_STR_LEN, "%u", *(uint32_t *)data); break; - case _MMS_M_data_type_uint64: - snprintf(str, MMS_M_STR_LEN, "%lu", *(uint64_t *)data); - break; - case _MMS_M_data_type_float: - snprintf(str, MMS_M_STR_LEN, "%f", *(float *)data); - break; - case _MMS_M_data_type_double: + case MMS_FLOAT: snprintf(str, MMS_M_STR_LEN, "%f", *(double *)data); break; - case _MMS_M_data_type_string: - strncpy(str, (char *)data, MMS_M_STR_LEN); + case MMS_STRING: + strncpy(str, (char *)data, MMS_M_DATA_STRING_LEN); break; default: return -1; @@ -2255,7 +2255,7 @@ int mms_m_set_data_by_str(void *data, uint8_t type, const char *str) switch(type) { - case _MMS_M_data_type_bool: + case MMS_BOOLEAN: if(0 == strcasecmp(str, "true") || 0 == strcmp(str, "1")) { *(uint8_t *)data = 1; @@ -2270,38 +2270,17 @@ int mms_m_set_data_by_str(void *data, uint8_t type, const char *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: + case MMS_INTEGER: *(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: + case MMS_UNSIGNED: *(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: + case MMS_FLOAT: *(double *)data = atof(str); break; - case _MMS_M_data_type_string: - strncpy((char *)data, str, MMS_M_STR_LEN); + case MMS_STRING: + strncpy((char *)data, str, MMS_M_DATA_STRING_LEN); break; default: return -1; diff --git a/src/protocol/libmms_m/src/mms_m_parse_cfg.cpp b/src/protocol/libmms_m/src/mms_m_parse_cfg.cpp index 618e89a..6356863 100644 --- a/src/protocol/libmms_m/src/mms_m_parse_cfg.cpp +++ b/src/protocol/libmms_m/src/mms_m_parse_cfg.cpp @@ -44,12 +44,12 @@ static const char *KEY_DEFAULT_VAL = "default"; -void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &item_list, const std::string &ied) +int parse_cfg_item(tinyxml2::XMLElement *item, std::vector &item_list, const std::string &ied) { if(NULL == item) { LOG_E("item is NULL"); - return; + return -1; } const char *str = NULL; @@ -60,7 +60,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_NO); - return; + return -1; } for(std::vector::iterator it = item_list.begin(); it!= item_list.end(); ++it) @@ -68,7 +68,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it if(it->no == atoi(str)) { LOG_E("item no %s already exists", str); - return; + return -1; } } @@ -82,7 +82,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_SADDR); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_DESC))) @@ -97,7 +97,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_LDEV); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_LNODE))) @@ -107,7 +107,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_LNODE); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_DONAME))) @@ -117,7 +117,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_DONAME); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_FC))) @@ -127,7 +127,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_FC); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_TYPE))) @@ -137,7 +137,7 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it else { LOG_E("no attribute %s in item", KEY_TYPE); - return; + return -1; } if(NULL != (str = item->Attribute(KEY_CTRL_MODEL))) @@ -177,6 +177,8 @@ void parse_cfg_item(tinyxml2::XMLElement *item, std::vector &it // stru_point_item *p_item = &item_list.back(); // p_item->value.p_val = mms_m_create_data_ptr(p_item->type); + + return 0; } @@ -246,7 +248,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p { for(item = st->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) { - parse_cfg_item(item, point_page.st, ied); + if(parse_cfg_item(item, point_page.st, ied) != 0) + { + return -1; + } point_page.st.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.st.back().type)); } @@ -256,7 +261,10 @@ 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); + if(parse_cfg_item(item, point_page.mx, ied) != 0) + { + return -1; + } point_page.mx.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.mx.back().type)); } @@ -266,7 +274,10 @@ 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); + if(parse_cfg_item(item, point_page.co, ied) != 0) + { + return -1; + } point_page.co.back().value.vec_p_val.push_back(mms_m_create_data_ptr(point_page.co.back().type)); } @@ -276,7 +287,10 @@ 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); + if(parse_cfg_item(item, point_page.ao, ied) != 0) + { + return -1; + } 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)); @@ -287,7 +301,10 @@ static int parse_cfg_point(tinyxml2::XMLElement *point, stru_point_page &point_p { for(item = param->FirstChildElement(ELE_Item); item; item = item->NextSiblingElement(ELE_Item)) { - parse_cfg_item(item, point_page.param, ied); + if(parse_cfg_item(item, point_page.param, ied) != 0) + { + return -1; + } for(sub_item = item->FirstChildElement(ELE_SubItem); sub_item; sub_item = sub_item->NextSiblingElement(ELE_SubItem)) { diff --git a/src/system/libdatacenter/inc/dc_signal.h b/src/system/libdatacenter/inc/dc_signal.h index ec20c9e..7c9a741 100644 --- a/src/system/libdatacenter/inc/dc_signal.h +++ b/src/system/libdatacenter/inc/dc_signal.h @@ -30,7 +30,7 @@ typedef struct stru_signal -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); diff --git a/src/system/libdatacenter/src/dc_siganl.cpp b/src/system/libdatacenter/src/dc_siganl.cpp index e230ed4..78d69f7 100644 --- a/src/system/libdatacenter/src/dc_siganl.cpp +++ b/src/system/libdatacenter/src/dc_siganl.cpp @@ -725,7 +725,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, int8_t s8 = *(int8_t*)p_data; if(s8 < (int8_t)param.min || s8 > (int8_t)param.max) { - LOG_E("invalid int8_t value %d, range [%d, %d]", s8, param.min, param.max); + LOG_E("invalid int8_t value %d, range [%f, %f]", s8, param.min, param.max); return -1; } } @@ -740,7 +740,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, uint8_t u8 = *(uint8_t*)p_data; if(u8 < param.min || u8 > param.max) { - LOG_E("invalid uint8_t value %d, range [%d, %d]", u8, param.min, param.max); + LOG_E("invalid uint8_t value %d, range [%f, %f]", u8, param.min, param.max); return -1; } } @@ -770,7 +770,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, uint16_t u16 = *(uint16_t*)p_data; if(u16 < param.min || u16 > param.max) { - LOG_E("invalid uint16_t value %d, range [%d, %d]", u16, param.min, param.max); + LOG_E("invalid uint16_t value %d, range [%f, %f]", u16, param.min, param.max); return -1; } } @@ -785,7 +785,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, int32_t s32 = *(int32_t*)p_data; if(s32 < (int32_t)param.min || s32 > (int32_t)param.max) { - LOG_E("invalid int32_t value %d, range [%d, %d]", s32, param.min, param.max); + LOG_E("invalid int32_t value %d, range [%f, %f]", s32, param.min, param.max); return -1; } } @@ -800,7 +800,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, uint32_t u32 = *(uint32_t*)p_data; if(u32 < param.min || u32 > param.max) { - LOG_E("invalid uint32_t value %d, range [%d, %d]", u32, param.min, param.max); + LOG_E("invalid uint32_t value %d, range [%f, %f]", u32, param.min, param.max); return -1; } } @@ -815,7 +815,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, int64_t l64 = *(int64_t*)p_data; if(l64 < (int64_t)param.min || l64 > (int64_t)param.max) { - LOG_E("invalid int64_t value %lld, range [%lld, %lld]", l64, param.min, param.max); + LOG_E("invalid int64_t value %lld, range [%f, %f]", l64, param.min, param.max); return -1; } } @@ -830,7 +830,7 @@ LOCAL int dc_check_val_valid(const stru_signal *p_signal, uint8_t setting_zone, uint64_t ul64 = *(uint64_t*)p_data; if(ul64 < param.min || ul64 > param.max) { - LOG_E("invalid uint64_t value %llu, range [%llu, %llu]", ul64, param.min, param.max); + LOG_E("invalid uint64_t value %llu, range [%f, %f]", ul64, param.min, param.max); return -1; } } diff --git a/src/system/libiec61850m/src/iec61850m.cpp b/src/system/libiec61850m/src/iec61850m.cpp index c869f3e..ac08a1c 100644 --- a/src/system/libiec61850m/src/iec61850m.cpp +++ b/src/system/libiec61850m/src/iec61850m.cpp @@ -19,7 +19,7 @@ typedef struct }stru_iec61850m_info;; -std::vector g_vec_iec61850m_info = +LOCAL std::vector g_vec_iec61850m_info = { { .fd = -1, @@ -32,8 +32,26 @@ std::vector g_vec_iec61850m_info = } }; +LOCAL std::map g_mms_m_type_to_local_type = { + {MMS_BOOLEAN, DATA_TYPE_U8}, + {MMS_INTEGER, DATA_TYPE_S32}, + {MMS_UNSIGNED, DATA_TYPE_U32}, + {MMS_FLOAT, DATA_TYPE_F32}, + {MMS_STRING, DATA_TYPE_STR}, + {MMS_VISIBLE_STRING, DATA_TYPE_STR}, +}; -LOCAL void mms_send_control(int fd, const char *saddr, int val, int type) +LOCAL std::map g_mms_m_ctrl_type_to_local_ctrl_type = { + {CONTROL_MODEL_STATUS_ONLY, SIGNAL_CTRL_TYPE::NONE}, + {CONTROL_MODEL_DIRECT_NORMAL, SIGNAL_CTRL_TYPE::DIRECT_NORMAL}, + {CONTROL_MODEL_SBO_NORMAL, SIGNAL_CTRL_TYPE::SBO_NORMAL}, + {CONTROL_MODEL_DIRECT_ENHANCED, SIGNAL_CTRL_TYPE::DIRECT_NORMAL}, + {CONTROL_MODEL_SBO_ENHANCED, SIGNAL_CTRL_TYPE::SBO_NORMAL} +}; + + + +LOCAL void mms_send_control(int fd, const char *saddr, const char *val, uint8_t mms_type, uint8_t ctrl_type) { stru_mms_m_event *p_event = NULL; @@ -55,14 +73,11 @@ LOCAL void mms_send_control(int fd, const char *saddr, int val, int type) p_event->app_fd = fd; memset(p_event->ied, 0, MMS_M_STR_LEN); snprintf(p_event->saddr, MMS_M_STR_LEN, "%s", saddr); - p_event->ctrl_type = type; - // p_event->val.b = val == 0 ? false : true; - uint8_t val_b = (val == 0 ? 0 : 1); - - MY_LOG_I("mms_send_control val_b %d, ctrl_type %d", val_b, p_event->ctrl_type); + p_event->ctrl_type = ctrl_type; + p_event->value_type = mms_type; + // p_event->val.b = val == 0 ? false : true; // p_event->p_val = (void *)&val_b; - std::string val_str = std::to_string(val_b); - strncpy(p_event->val, val_str.c_str(), 128); + strncpy(p_event->val, val, 128); // mms_m_set_data_value((void *)p_event->val, (void *)&val_b, _MMS_M_data_type_bool); MY_LOG_I("p_event->val %s", p_event->val); @@ -183,7 +198,8 @@ void iec61850m_init() } } -void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data) + +LOCAL int iec61850m_signal_change_decode(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data, uint8_t &ctrl_type, uint8_t &mms_type) { std::string value = ""; if(p_data) @@ -191,7 +207,20 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, value = dc_get_signal_val(p_data, data_type); } - uint8_t ctrl_type = 0; + for(auto it = g_mms_m_type_to_local_type.begin(); it != g_mms_m_type_to_local_type.end(); it++) + { + if(it->second == data_type) + { + mms_type = it->first; + break; + } + } + + if(mms_type == 0) + { + LOG_E("iec61850m_signal_change_decode, data_type %d not found", data_type); + return -1; + } std::string step_str = ""; switch(step) @@ -205,7 +234,7 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, break; case SIGNAL_CTRL_STEP::DIRECT: step_str = "DIRECT"; - ctrl_type = _MMS_M_EVENT_CO_DIRECT; + ctrl_type = _MMS_M_EVENT_AO_WRITE; break; case SIGNAL_CTRL_STEP::CANCEL: step_str = "CANCEL"; @@ -218,6 +247,19 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, MY_LOG_I("iec61850m_signal_change_callback saddr %s, step %s, data_type %s, value %s", saddr.c_str(), step_str.c_str(), data_type_str.c_str(), value.c_str()); + return 0; +} + +LOCAL void iec61850m_signal_co_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data) +{ + uint8_t mms_type = 0; + uint8_t ctrl_type = 0; + + if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type)) + { + return; + } + for(int i = 0; i < g_vec_iec61850m_info.size(); i++) { stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i]; @@ -227,29 +269,74 @@ void iec61850m_signal_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, { if(p_config->p_co_sig[j].sig.saddr == saddr) { - int val = (int)(*(uint8_t *)p_data); - MY_LOG_I("iec61850m_signal_change_callback val %d, ctrl_type %d", val, ctrl_type); - mms_send_control(p_info->fd, saddr.c_str(), val, ctrl_type); + std::string val = dc_get_signal_val(p_data, data_type); + MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type); + mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type); + } + } + } +} + +LOCAL void iec61850m_signal_ao_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data) +{ + uint8_t mms_type = 0; + uint8_t ctrl_type = 0; + + if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type)) + { + return; + } + + if(ctrl_type != _MMS_M_EVENT_AO_WRITE) + { + return; + } + + for(int i = 0; i < g_vec_iec61850m_info.size(); i++) + { + stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i]; + stru_mms_m_config *p_config = &p_info->mms_config; + + for(uint16_t j = 0; j < p_config->ao_num; j++) + { + if(p_config->p_ao_sig[j].sig.saddr == saddr) + { + std::string val = dc_get_signal_val(p_data, data_type); + MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type); + mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type); + } + } + } +} + +LOCAL void iec61850m_signal_param_change_callback(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, uint8_t setting_zone, void *p_data) +{ + uint8_t mms_type = 0; + uint8_t ctrl_type = 0; + + if(0 != iec61850m_signal_change_decode(saddr, step, data_type, p_data, ctrl_type, mms_type)) + { + return; + } + + for(int i = 0; i < g_vec_iec61850m_info.size(); i++) + { + stru_iec61850m_info *p_info = &g_vec_iec61850m_info[i]; + stru_mms_m_config *p_config = &p_info->mms_config; + + for(uint16_t j = 0; j < p_config->param_num; j++) + { + if(p_config->p_param_sig[j].sig.saddr == saddr) + { + std::string val = dc_get_signal_val(p_data, data_type); + MY_LOG_I("iec61850m_signal_change_callback val %s, ctrl_type %d", val.c_str(), ctrl_type); + mms_send_control(p_info->fd, saddr.c_str(), val.c_str(), mms_type, ctrl_type); } } } } -std::map g_mms_m_type_to_local_type = { - {MMS_BOOLEAN, DATA_TYPE_U8}, - {MMS_INTEGER, DATA_TYPE_S32}, - {MMS_UNSIGNED, DATA_TYPE_U32}, - {MMS_FLOAT, DATA_TYPE_F32}, - {MMS_STRING, DATA_TYPE_C64}, -}; -std::map g_mms_m_ctrl_type_to_local_ctrl_type = { - {CONTROL_MODEL_STATUS_ONLY, SIGNAL_CTRL_TYPE::NONE}, - {CONTROL_MODEL_DIRECT_NORMAL, SIGNAL_CTRL_TYPE::DIRECT_NORMAL}, - {CONTROL_MODEL_SBO_NORMAL, SIGNAL_CTRL_TYPE::SBO_NORMAL}, - {CONTROL_MODEL_DIRECT_ENHANCED, SIGNAL_CTRL_TYPE::DIRECT_NORMAL}, - {CONTROL_MODEL_SBO_ENHANCED, SIGNAL_CTRL_TYPE::SBO_NORMAL} -}; int iec61850m_signal_init(stru_mms_m_config &cfg) { @@ -309,7 +396,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg) 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); + 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_co_change_callback); } if(ret != 0) @@ -328,6 +415,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg) // 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]; + uint8_t ctrl_type_local = g_mms_m_ctrl_type_to_local_ctrl_type[cfg.p_ao_sig[i].ctrl_type]; 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]; @@ -338,7 +426,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg) 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); + ret |= dc_signal_ao(cfg.p_ao_sig[i].sig.saddr, cfg.p_ao_sig[i].sig.desc, type_local, param, ctrl_type_local, p_data, p_def_data, iec61850m_signal_ao_change_callback); } if(ret != 0) @@ -356,7 +444,7 @@ int iec61850m_signal_init(stru_mms_m_config &cfg) 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); + 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_param_change_callback); } if(ret != 0) @@ -501,7 +589,7 @@ LOCAL void cmd_iec61850m(int argc, char *argv[]) int val = atoi(argv[4]); int ctrl_type = atoi(argv[5]); - mms_send_control(fd, saddr.c_str(), val, ctrl_type); + // mms_send_control(fd, saddr.c_str(), val, ctrl_type); } } diff --git a/src/system/libweb_server/src/ws_method.cpp b/src/system/libweb_server/src/ws_method.cpp index 89103d2..2fedb34 100644 --- a/src/system/libweb_server/src/ws_method.cpp +++ b/src/system/libweb_server/src/ws_method.cpp @@ -361,6 +361,8 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c { p_signals = &g_ws_ao_signals; + char temp_data[128] = {0}; + for(uint32_t i = 0; i < p_signals->size(); i++) { stru_ws_signal *p_signal = &p_signals->at(i); @@ -368,7 +370,10 @@ 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_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) + memset(temp_data, 0, sizeof(temp_data)); + dc_set_signal_val_from_str(temp_data, p_signal->data_type, signal_data); + + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)temp_data)) { 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; @@ -379,7 +384,10 @@ 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_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) + memset(temp_data, 0, sizeof(temp_data)); + dc_set_signal_val_from_str(temp_data, p_signal->data_type, signal_data); + + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::SELECT, *p_signal->p_ctrl, (void *)temp_data)) { 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; @@ -387,7 +395,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_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)signal_data.c_str())) + if(0 != dc_signal_ao_set_val(saddr, SIGNAL_CTRL_STEP::DIRECT, *p_signal->p_ctrl, (void *)temp_data)) { 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; @@ -398,7 +406,7 @@ void set_signal_data(const std::string& saddr, const std::string& signal_type, c } else { - LOG_E("p_signal->ctrl_type is invalid, p_signal->ctrl_type = %d"); + LOG_E("p_signal->ctrl_type is invalid, p_signal->ctrl_type = %d", p_signal->ctrl_type); return; } } diff --git a/test/file/MMS/prj.xml b/test/file/MMS/prj.xml index a5cf793..47eff9b 100644 --- a/test/file/MMS/prj.xml +++ b/test/file/MMS/prj.xml @@ -5,31 +5,31 @@ - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - + + - +