cid: parse all

This commit is contained in:
fengzero
2024-11-18 11:13:55 +00:00
parent f2ef867b61
commit 00fa869c54
5 changed files with 1194 additions and 526 deletions
+15 -2
View File
@@ -65,19 +65,32 @@
#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_LNINST_LEN 4
#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 16
#define NEU_CID_SDI_NAME_LEN 16
#define NEU_CID_DO_NAME_LEN 32
#define NEU_CID_FCDA_NAME_LEN 32
#define NEU_CID_FCDA_CLASS_LEN 16
#define NEU_CID_FCDA_INST_LEN 4
#define NEU_CID_FCDA_PREFIX_LEN 16
#define NEU_CID_DO_ID_LEN 32
#define NEU_CID_DA_NAME_LEN 32
#define NEU_CID_DATASET_NAME_LEN 32
#define NEU_CID_REPORT_NAME_LEN 32
#define NEU_CID_REPORT_ID_LEN 64
#define NEU_CID_ID_LEN 32
#define NEU_CID_REF_TYPE_LEN 32
#define NEU_CID_IED_NAME_LEN 32
#define NEU_CID_ACCESS_POINT_NAME_LEN 16
#define NEU_CID_LEN4 4
#define NEU_CID_LEN8 8
#define NEU_CID_LEN16 16
#define NEU_CID_LEN32 32
#define NEU_CID_LEN64 64
#define CHECK_NODE_NAME_LENGTH_ERR \
do { \
+221 -44
View File
@@ -28,22 +28,156 @@ extern "C" {
#include "msg.h"
typedef enum {
CO = 0,
ST = 1, // boolean
MX = 2, // float
UNKNOWN = 100,
CO = 0,
ST = 1, // boolean
MX = 2, // float
SP = 3,
SG = 4,
SE = 5,
SV = 6,
CF = 7,
DC = 8,
EX = 9,
F_UNKNOWN = 100,
} cid_fc_e;
typedef struct {
char name[NEU_CID_DO_NAME_LEN];
char lnclass[NEU_CID_LNCLASS_LEN];
cid_fc_e fc;
} cid_do_t;
typedef enum {
BOOLEAN = 0, // BOOLEAN
INT8 = 1, // INT8
INT16 = 2, // INT16
INT24 = 3, // INT24
INT32 = 4, // INT32
INT128 = 5, // INT128
INT8U = 6, // INT8U
INT16U = 7, // INT16U
INT24U = 8, // INT24U
INT32U = 9, // INT32U
FLOAT32 = 10, // FLOAT32
FLOAT64 = 11, // FLOAT64
Enum = 12, // Enum
Dbpos = 13, // Dbpos
Tcmd = 14, // Tcmd
Quality = 15, // Quality
Timestamp = 16, // Timestamp
VisString32 = 17, // VisString32
VisString64 = 18, // VisString64
VisString255 = 19, // VisString255
Octet64 = 20, // Octet64
Struct = 21, // Struct
EntryTime = 22, // EntryTime
Unicode255 = 23, // Unicode255
Check = 24, // Check
T_UNKNOWN = 255,
} cid_basictype_e;
inline static cid_basictype_e decode_basictype(const char *btype)
{
cid_basictype_e ret = T_UNKNOWN;
if (strcmp(btype, "BOOLEAN") == 0) {
ret = BOOLEAN;
} else if (strcmp(btype, "INT8") == 0) {
ret = INT8;
} else if (strcmp(btype, "INT16") == 0) {
ret = INT16;
} else if (strcmp(btype, "INT24") == 0) {
ret = INT24;
} else if (strcmp(btype, "INT32") == 0) {
ret = INT32;
} else if (strcmp(btype, "INT128") == 0) {
ret = INT128;
} else if (strcmp(btype, "INT8U") == 0) {
ret = INT8U;
} else if (strcmp(btype, "INT16U") == 0) {
ret = INT16U;
} else if (strcmp(btype, "INT24U") == 0) {
ret = INT24U;
} else if (strcmp(btype, "INT32U") == 0) {
ret = INT32U;
} else if (strcmp(btype, "FLOAT32") == 0) {
ret = FLOAT32;
} else if (strcmp(btype, "FLOAT64") == 0) {
ret = FLOAT64;
} else if (strcmp(btype, "Enum") == 0) {
ret = Enum;
} else if (strcmp(btype, "Dbpos") == 0) {
ret = Dbpos;
} else if (strcmp(btype, "Tcmd") == 0) {
ret = Tcmd;
} else if (strcmp(btype, "Quality") == 0) {
ret = Quality;
} else if (strcmp(btype, "Timestamp") == 0) {
ret = Timestamp;
} else if (strcmp(btype, "VisString32") == 0) {
ret = VisString32;
} else if (strcmp(btype, "VisString64") == 0) {
ret = VisString64;
} else if (strcmp(btype, "VisString255") == 0) {
ret = VisString255;
} else if (strcmp(btype, "Octet64") == 0) {
ret = Octet64;
} else if (strcmp(btype, "Struct") == 0) {
ret = Struct;
} else if (strcmp(btype, "EntryTime") == 0) {
ret = EntryTime;
} else if (strcmp(btype, "Unicode255") == 0) {
ret = Unicode255;
} else if (strcmp(btype, "Check") == 0) {
ret = Check;
} else {
ret = T_UNKNOWN;
}
return ret;
}
inline static cid_fc_e decode_fc(const char *fc)
{
cid_fc_e ret = F_UNKNOWN;
if (strcmp(fc, "CO") == 0) {
ret = CO;
} else if (strcmp(fc, "ST") == 0) {
ret = ST;
} else if (strcmp(fc, "MX") == 0) {
ret = MX;
} else if (strcmp(fc, "SP") == 0) {
ret = SP;
} else if (strcmp(fc, "SG") == 0) {
ret = SG;
} else if (strcmp(fc, "SE") == 0) {
ret = SE;
} else if (strcmp(fc, "SV") == 0) {
ret = SV;
} else if (strcmp(fc, "CF") == 0) {
ret = CF;
} else if (strcmp(fc, "DC") == 0) {
ret = DC;
} else if (strcmp(fc, "EX") == 0) {
ret = EX;
} else {
ret = F_UNKNOWN;
}
return ret;
}
typedef struct {
char name[NEU_CID_DATASET_NAME_LEN];
cid_do_t *dos;
int n_dos;
char da_name[NEU_CID_LEN32]; // optional
char do_name[NEU_CID_DO_NAME_LEN];
char lnclass[NEU_CID_LNCLASS_LEN];
char prefix[NEU_CID_FCDA_PREFIX_LEN]; // optional
char lninst[NEU_CID_FCDA_INST_LEN];
char ldinst[NEU_CID_LEN8];
cid_fc_e fc;
cid_basictype_e btypes[8]; // for do-[da]
int n_btypes;
} cid_fcda_t;
typedef struct {
char name[NEU_CID_DATASET_NAME_LEN];
cid_fcda_t *fcdas;
int n_fcda;
} cid_dataset_t;
typedef struct {
@@ -55,15 +189,24 @@ typedef struct {
} cid_report_t;
typedef struct {
char do_name[NEU_CID_DO_NAME_LEN];
char sdi_name[NEU_CID_SDI_NAME_LEN];
} cid_ctrl_t;
char sdi_name[NEU_CID_LEN16];
char name[NEU_CID_LEN16];
cid_basictype_e btype;
} cid_dai_t;
typedef struct {
char name[NEU_CID_DO_NAME_LEN];
cid_dai_t *dais;
int n_dais;
} cid_doi_t;
typedef struct {
char lninst[NEU_CID_LNINST_LEN]; // optional
char lnclass[NEU_CID_LNCLASS_LEN];
char lntype[NEU_CID_LNTYPE_LEN];
char lnprefix[NEU_CID_LNPREFIX_LEN];
char lninst[NEU_CID_LNINST_LEN];
char lnprefix[NEU_CID_LNPREFIX_LEN]; // optional
cid_dataset_t *datasets;
int n_datasets;
@@ -71,8 +214,8 @@ typedef struct {
cid_report_t *reports;
int n_reports;
cid_ctrl_t *ctrls;
int n_ctrls;
cid_doi_t *dois;
int n_dois;
} cid_ln_t;
typedef struct {
@@ -82,45 +225,79 @@ typedef struct {
} cid_ldevice_t;
typedef struct {
char name[NEU_CID_IED_NAME_LEN];
char name[NEU_CID_ACCESS_POINT_NAME_LEN];
cid_ldevice_t *ldevices;
int n_ldevices;
} cid_access_point_t;
typedef struct {
char name[NEU_CID_IED_NAME_LEN];
cid_access_point_t *access_points;
int n_access_points;
} cid_ied_t;
typedef enum {
SPC = 0,
DPC = 1,
} cid_tm_cdc_e;
typedef struct {
char name[NEU_CID_DA_NAME_LEN];
cid_fc_e fc;
} cid_tm_da_t;
typedef struct {
char id[NEU_CID_DO_ID_LEN];
cid_tm_cdc_e cdc;
cid_tm_da_t *das;
int n_das;
} cid_tm_do_t;
/// **************** Template **************** ///
typedef struct {
char name[NEU_CID_LNO_NAME_LEN];
char type[NEU_CID_LNO_TYPE_LEN];
char ref_type[NEU_CID_LNO_TYPE_LEN];
} cid_tm_lno_do_t;
typedef struct {
char id[NEU_CID_DO_ID_LEN];
char id[NEU_CID_ID_LEN];
char ln_class[NEU_CID_LNCLASS_LEN];
cid_tm_lno_do_t *dos;
int n_dos;
} cid_tm_lno_t;
} cid_tm_lno_type_t;
typedef struct {
cid_tm_do_t *dos;
int n_dos;
char name[NEU_CID_DA_NAME_LEN];
char ref_type[NEU_CID_REF_TYPE_LEN];
cid_tm_lno_t *lnos;
int n_lnos;
cid_basictype_e btype;
cid_fc_e fc;
} cid_tm_do_da_t;
typedef struct {
char name[NEU_CID_LEN16];
char ref_type[NEU_CID_REF_TYPE_LEN];
} cid_tm_sdo_t;
typedef struct {
char id[NEU_CID_ID_LEN];
cid_tm_do_da_t *das;
int n_das;
cid_tm_sdo_t *sdos;
int n_sdos;
} cid_tm_do_type_t;
typedef struct {
char name[NEU_CID_DA_NAME_LEN];
char ref_type[NEU_CID_REF_TYPE_LEN];
cid_basictype_e btype;
} cid_tm_bda_type_t;
typedef struct {
char id[NEU_CID_ID_LEN];
cid_tm_bda_type_t *bdas;
int n_bdas;
} cid_tm_da_type_t;
typedef struct {
cid_tm_lno_type_t *lnotypes;
int n_lnotypes;
cid_tm_do_type_t *dotypes;
int n_dotypes;
cid_tm_da_type_t *datypes;
int n_datypes;
} cid_template_t;
typedef struct {
+1 -1
View File
@@ -36,11 +36,11 @@ void handle_cid(nng_aio *aio)
neu_http_response(aio, NEU_ERR_IS_BUSY, result_error);
});
}
neu_cid_free(&cid);
} else {
NEU_JSON_RESPONSE_ERROR(NEU_ERR_INVALID_CID, {
neu_http_response(aio, NEU_ERR_INVALID_CID, result_error);
});
}
neu_cid_free(&cid);
})
}
+55
View File
@@ -35,6 +35,8 @@
#include "daemon.h"
#include "version.h"
#include "utils/cid.h"
static bool exit_flag = false;
static neu_manager_t *g_manager = NULL;
zlog_category_t * neuron = NULL;
@@ -190,6 +192,59 @@ int main(int argc, char *argv[])
neuron = zlog_get_category("neuron");
zlog_level_switch(neuron, default_log_level);
cid_t cid = { 0 };
int ret_c = neu_cid_parse("/tmp/UDT_531A_0011.ICD", &cid);
printf("neu_cid_parse ret=%d\n", ret_c);
for (int i = 0; i < cid.ied.n_access_points; i++) {
printf("access_points[%d].name=%s\n", i, cid.ied.access_points[i].name);
for (int j = 0; j < cid.ied.access_points[i].n_ldevices; j++) {
printf("-- access_points[%d].ldevices[%d].inst=%s\n", i, j,
cid.ied.access_points[i].ldevices[j].inst);
for (int k = 0; k < cid.ied.access_points[i].ldevices[j].n_lns;
k++) {
printf(
"---- access_points[%d].ldevices[%d].lns[%d].lnprefix=%s\n",
i, j, k,
cid.ied.access_points[i].ldevices[j].lns[k].lnprefix);
for (int l = 0;
l < cid.ied.access_points[i].ldevices[j].lns[k].n_datasets;
l++) {
printf("------ "
"access_points[%d].ldevices[%d].lns[%d].datasets[%d]"
".name=%s\n",
i, j, k, l,
cid.ied.access_points[i]
.ldevices[j]
.lns[k]
.datasets[l]
.name);
for (int a = 0; a < cid.ied.access_points[i]
.ldevices[j]
.lns[k]
.datasets[l]
.n_fcda;
a++) {
cid_fcda_t *fcda = &cid.ied.access_points[i]
.ldevices[j]
.lns[k]
.datasets[l]
.fcdas[a];
// if (fcda->n_btypes == 0) {
printf("nnn -------- "
"access_points[%d].ldevices[%d].lns[%d]"
".datasets[%d].fcdas[%d].name=%s, n type: %d\n",
i, j, k, l, a, fcda->do_name, fcda->n_btypes);
//}
}
}
}
}
}
neu_cid_free(&cid);
zlog_fini();
return 0;
if (neuron_already_running()) {
if (args.stop) {
rv = neuron_stop();
+902 -479
View File
File diff suppressed because it is too large Load Diff