mirror of
https://github.com/emqx/neuron.git
synced 2026-10-18 05:36:19 +08:00
cid: parse all
This commit is contained in:
+15
-2
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user