libsml/sml/include/sml/sml_tree.h

139 lines
3.5 KiB
C

// Copyright 2011 Juri Glass, Mathias Runge, Nadim El Sayed
// DAI-Labor, TU-Berlin
//
// This file is part of libSML.
//
// libSML is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// libSML is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with libSML. If not, see <http://www.gnu.org/licenses/>.
#ifndef _SML_TREE_H
#define _SML_TREE_H
#include "sml_shared.h"
#include "sml_octet_string.h"
#include "sml_value.h"
#include "sml_time.h"
#ifdef __cplusplus
extern "C" {
#endif
#define SML_PROC_PAR_VALUE_TAG_VALUE 0x01
#define SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY 0x02
#define SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY 0x03
#define SML_PROC_PAR_VALUE_TAG_TIME 0x04
// what a messy tupel ...
typedef struct {
octet_string *server_id;
sml_time *sec_index;
u64 *status;
sml_unit *unit_pA;
i8 *scaler_pA;
i64 *value_pA;
sml_unit *unit_R1;
i8 *scaler_R1;
i64 *value_R1;
sml_unit *unit_R4;
i8 *scaler_R4;
i64 *value_R4;
octet_string *signature_pA_R1_R4;
sml_unit *unit_mA;
i8 *scaler_mA;
i64 *value_mA;
sml_unit *unit_R2;
i8 *scaler_R2;
i64 *value_R2;
sml_unit *unit_R3;
i8 *scaler_R3;
i64 *value_R3;
octet_string *signature_mA_R2_R3;
} sml_tupel_entry;
typedef struct {
octet_string *obj_name;
sml_unit *unit;
i8 *scaler;
sml_value *value;
octet_string *value_signature;
} sml_period_entry;
typedef struct {
u8 *tag;
union {
sml_value *value;
sml_period_entry *period_entry;
sml_tupel_entry *tupel_entry;
sml_time *time;
} data;
} sml_proc_par_value;
typedef struct s_tree{
octet_string *parameter_name;
sml_proc_par_value *parameter_value; // optional
struct s_tree **child_list; // optional
int child_list_len;
} sml_tree;
typedef struct {
int path_entries_len;
octet_string **path_entries;
} sml_tree_path;
// SML_TREE
sml_tree *sml_tree_init();
sml_tree *sml_tree_parse(sml_buffer *buf);
void sml_tree_add_tree(sml_tree *base_tree, sml_tree *tree);
void sml_tree_write(sml_tree *tree, sml_buffer *buf);
void sml_tree_free(sml_tree *tree);
// SML_TREE_PATH
sml_tree_path *sml_tree_path_init();
sml_tree_path *sml_tree_path_parse(sml_buffer *buf);
void sml_tree_path_add_path_entry(sml_tree_path *tree_path, octet_string *entry);
void sml_tree_path_write(sml_tree_path *tree_path, sml_buffer *buf);
void sml_tree_path_free(sml_tree_path *tree_path);
// SML_PROC_PAR_VALUE
sml_proc_par_value *sml_proc_par_value_init();
sml_proc_par_value *sml_proc_par_value_parse(sml_buffer *buf);
void sml_proc_par_value_write(sml_proc_par_value *value, sml_buffer *buf);
void sml_proc_par_value_free(sml_proc_par_value *value);
// SML_TUPEL_ENTRY
sml_tupel_entry *sml_tupel_entry_init();
sml_tupel_entry *sml_tupel_entry_parse(sml_buffer *buf);
void sml_tupel_entry_write(sml_tupel_entry *tupel, sml_buffer *buf);
void sml_tupel_entry_free(sml_tupel_entry *tupel);
// SML_PERIOD_ENTRY
sml_period_entry *sml_period_entry_init();
sml_period_entry *sml_period_entry_parse(sml_buffer *buf);
void sml_period_entry_write(sml_period_entry *period, sml_buffer *buf);
void sml_period_entry_free(sml_period_entry *period);
#ifdef __cplusplus
}
#endif
#endif