Skip to content

Commit

Permalink
Merge pull request #2268 from gc87/attributes
Browse files Browse the repository at this point in the history
fix: support iec61850 data format
  • Loading branch information
fengzeroz authored Nov 11, 2024
2 parents d60e929 + 08eea75 commit abd58af
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 11 deletions.
6 changes: 4 additions & 2 deletions include/neuron/define.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
#define NEU_MSG_MAX_SIZE 2048

#define NEU_TAG_META_LENGTH 20
#define NEU_TAG_META_SIZE 8
#define NEU_TAG_META_SIZE 32

#define NEU_LOG_LEVEL_DEBUG "debug"
#define NEU_LOG_LEVEL_INFO "info"
Expand All @@ -64,11 +64,13 @@

#define NEU_CID_LNCLASS_LEN 12
#define NEU_CID_LNTYPE_LEN 32
#define NEU_CID_LNPREFIX_LEN 10
#define NEU_CID_LNINST_LEN 2
#define NEU_CID_IED_NAME_LEN 32
#define NEU_CID_LDEVICE_LEN 32
#define NEU_CID_LNO_NAME_LEN 32
#define NEU_CID_LNO_TYPE_LEN 32
#define NEU_CID_INST_LEN 32
#define NEU_CID_INST_LEN 16
#define NEU_CID_SDI_NAME_LEN 16
#define NEU_CID_DO_NAME_LEN 32
#define NEU_CID_DO_ID_LEN 32
Expand Down
2 changes: 2 additions & 0 deletions include/neuron/utils/cid.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ typedef struct {
typedef struct {
char lnclass[NEU_CID_LNCLASS_LEN];
char lntype[NEU_CID_LNTYPE_LEN];
char lnprefix[NEU_CID_LNPREFIX_LEN];
char lninst[NEU_CID_LNINST_LEN];

cid_dataset_t *datasets;
int n_datasets;
Expand Down
17 changes: 12 additions & 5 deletions src/parser/neu_json_rw.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,21 @@ int neu_json_encode_read_paginate_resp(void *json_object, void *param)
}
}

void *attributes_object = neu_json_encode_new();
for (int k = 0; k < p_tag->n_meta; k++) {
tag_elems[if_precision + 9 + k].name = p_tag->metas[k].name;
tag_elems[if_precision + 9 + k].t = p_tag->metas[k].t;
tag_elems[if_precision + 9 + k].v = p_tag->metas[k].value;
neu_json_elem_t meta_elem = { 0 };
meta_elem.name = p_tag->metas[k].name;
meta_elem.t = p_tag->metas[k].t;
meta_elem.v = p_tag->metas[k].value;
neu_json_encode_field(attributes_object, &meta_elem, 1);
}

tag_array = neu_json_encode_array(tag_array, tag_elems,
9 + if_precision + p_tag->n_meta);
tag_elems[if_precision + 9].name = "attributes";
tag_elems[if_precision + 9].t = NEU_JSON_OBJECT;
tag_elems[if_precision + 9].v.val_object = attributes_object;

tag_array =
neu_json_encode_array(tag_array, tag_elems, 10 + if_precision);

free(p_tag->datatag.name);
free(p_tag->datatag.address);
Expand Down
31 changes: 27 additions & 4 deletions src/utils/cid.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,11 @@ void neu_cid_to_msg(char *driver, cid_t *cid, neu_req_add_gtag_t *cmd)
tag->address = calloc(1, NEU_TAG_ADDRESS_LEN);
tag->description = strdup("");
snprintf(tag->address, NEU_TAG_ADDRESS_LEN - 1,
"%s%s/%s$%s$%s$%s", cid->ied.name,
"%s%s/%s%s%s$%s$%s$%s", cid->ied.name,
cid->ied.ldevices[i].inst,
cid->ied.ldevices[i].lns[j].lnclass, "CO",
cid->ied.ldevices[i].lns[j].lnprefix,
cid->ied.ldevices[i].lns[j].lnclass,
cid->ied.ldevices[i].lns[j].lninst, "CO",
cid->ied.ldevices[i].lns[j].ctrls[k].do_name,
cid->ied.ldevices[i].lns[j].ctrls[k].sdi_name);
}
Expand Down Expand Up @@ -391,11 +393,28 @@ static int parse_lnode(xmlNode *xml_ldevice, cid_ldevice_t *ldev,
(char *) xmlGetProp(lnode, (const xmlChar *) "lnClass");
char *ln_type =
(char *) xmlGetProp(lnode, (const xmlChar *) "lnType");
char *ln_prefix =
(char *) xmlGetProp(lnode, (const xmlChar *) "prefix");
if (NULL == ln_prefix) {
ln_prefix = strdup("");
}

char *ln_inst =
(char *) xmlGetProp(lnode, (const xmlChar *) "inst");
if (NULL == ln_inst) {
ln_inst = strdup("");
}

if (strlen(ln_class) >= NEU_CID_LNCLASS_LEN ||
strlen(ln_type) >= NEU_CID_LNTYPE_LEN) {
strlen(ln_type) >= NEU_CID_LNTYPE_LEN ||
strlen(ln_prefix) >= NEU_CID_LNPREFIX_LEN ||
strlen(ln_inst) >= NEU_CID_LNINST_LEN) {
xmlFree(ln_class);
xmlFree(ln_type);
nlog_warn("LN class/type is too long %d", (int) lnode->line);
xmlFree(ln_prefix);
xmlFree(ln_inst);
nlog_warn("LN class/type/prefix/inst is too long %d",
(int) lnode->line);
return -1;
} else {
ldev->n_lns += 1;
Expand All @@ -412,8 +431,12 @@ static int parse_lnode(xmlNode *xml_ldevice, cid_ldevice_t *ldev,

strcpy(ln->lnclass, ln_class);
strcpy(ln->lntype, ln_type);
strcpy(ln->lnprefix, ln_prefix);
strcpy(ln->lninst, ln_inst);
xmlFree(ln_class);
xmlFree(ln_type);
xmlFree(ln_prefix);
xmlFree(ln_inst);

xmlNode *child = lnode->children;
while (child != NULL) {
Expand Down

0 comments on commit abd58af

Please sign in to comment.