00001
00007 #ifndef _OBJECT_H
00008 #define _OBJECT_H
00009
00010 #include "complex.h"
00011 #include "timestamp.h"
00012 #include "class.h"
00013 #include "aggregate.h"
00014 #include "exception.h"
00015 #include "globals.h"
00016 #include "random.h"
00017
00018
00019 typedef unsigned int OBJECTRANK;
00020 typedef unsigned short OBJECTSIZE;
00021 typedef unsigned int OBJECTNUM;
00022 typedef char * OBJECTNAME;
00024
00025 #define OF_NONE 0x0000
00026 #define OF_HASPLC 0x0001
00027 #define OF_LOCKED 0x0002
00028 #define OF_RECALC 0x0008
00029 #define OF_RERANK 0x4000
00031 typedef struct s_object_list {
00032 OBJECTSIZE size;
00033 OBJECTNUM id;
00034 CLASS *oclass;
00035 struct s_object_list *next;
00036 struct s_object_list *parent;
00037 OBJECTRANK rank;
00038 TIMESTAMP clock;
00039 double latitude, longitude;
00040 TIMESTAMP in_svc,
00041 out_svc;
00042 OBJECTNAME name;
00043 unsigned long flags;
00044
00045 } OBJECT;
00047
00048
00049
00050 typedef struct s_callbacks {
00051 TIMESTAMP *global_clock;
00052 int (*output_verbose)(char *format, ...);
00053 int (*output_message)(char *format, ...);
00054 int (*output_warning)(char *format, ...);
00055 int (*output_error)(char *format, ...);
00056 int (*output_debug)(char *format, ...);
00057 int (*output_test)(char *format, ...);
00058 CLASS *(*register_class)(MODULE *,CLASSNAME,PASSCONFIG);
00059 OBJECT *(*create_single)(CLASS*,OBJECTSIZE);
00060 OBJECT *(*create_array)(CLASS*,OBJECTSIZE,unsigned int);
00061 int (*define_map)(CLASS*,...);
00062 FUNCTION *(*define_function)(CLASS*,FUNCTIONNAME,FUNCTIONADDR);
00063 int (*define_enumeration_member)(CLASS*,char*,char*,enumeration);
00064 int (*define_set_member)(CLASS*,char*,char*,unsigned long);
00065 int (*set_dependent)(OBJECT*,OBJECT*);
00066 int (*set_parent)(OBJECT*,OBJECT*);
00067 int (*set_rank)(OBJECT*,unsigned int);
00068 struct {
00069 PROPERTY *(*get_property)(OBJECT*,PROPERTYNAME);
00070 int (*set_value_by_addr)(OBJECT *, void*, char*,PROPERTY*);
00071 int (*get_value_by_addr)(OBJECT *, void*, char*, int size,PROPERTY*);
00072 int (*set_value_by_name)(OBJECT *, char*, char*);
00073 int (*get_value_by_name)(OBJECT *, char*, char*, int size);
00074 OBJECT *(*get_reference)(OBJECT *, char*);
00075 char *(*get_unit)(OBJECT *, char *);
00076 } properties;
00077 struct s_findlist *(*find_objects)(struct s_findlist *,...);
00078 OBJECT *(*find_next)(struct s_findlist *,OBJECT *obj);
00079 void *(*malloc)(size_t);
00080 void (*free)(void*);
00081 struct s_aggregate *(*create_aggregate)(char *aggregator, char *group_expression);
00082
00083 double (*run_aggregate)(struct s_aggregate *aggregate);
00084 double *(*get_module_var)(MODULE *module_name, char *varname);
00085 struct {
00086 double (*uniform)(double a, double b);
00087 double (*normal)(double m, double s);
00088 double (*bernoulli)(double p);
00089 double (*pareto)(double m, double a);
00090 double (*lognormal)(double m, double s);
00091 double (*sampled)(unsigned int n, double *x);
00092 double (*exponential)(double l);
00093 RANDOMTYPE (*type)(char *name);
00094 double (*value)(RANDOMTYPE type, ...);
00095 } random;
00096 int (*object_isa)(OBJECT *obj, char *type);
00097 DELEGATEDTYPE* (*register_type)(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00098 int (*define_type)(CLASS*,DELEGATEDTYPE*,...);
00099 struct {
00100 TIMESTAMP (*mkdatetime)(DATETIME *dt);
00101 int (*strdatetime)(DATETIME *t, char *buffer, int size);
00102 double (*timestamp_to_days)(TIMESTAMP t);
00103 double (*timestamp_to_hours)(TIMESTAMP t);
00104 double (*timestamp_to_minutes)(TIMESTAMP t);
00105 double (*timestamp_to_seconds)(TIMESTAMP t);
00106 int (*local_datetime)(TIMESTAMP ts, DATETIME *dt);
00107 TIMESTAMP (*convert_to_timestamp)(char *value);
00108 } time;
00109 int (*unit_convert)(char *from, char *to, double *value);
00110 int (*unit_convert_ex)(UNIT *pFrom, UNIT *pTo, double *pValue);
00111 struct {
00112 EXCEPTIONHANDLER *(*create_exception_handler)();
00113 void (*delete_exception_handler)(EXCEPTIONHANDLER *ptr);
00114 void (*throw_exception)(char *msg, ...);
00115 char *(*exception_msg)(void);
00116 } exception;
00117 struct {
00118 GLOBALVAR *(*create)(char *name, ...);
00119 STATUS (*setvar)(char *def,...);
00120 char *(*getvar)(char *name, char *buffer, int size);
00121 GLOBALVAR *(*find)(char *name);
00122 } global;
00123 #ifndef NOLOCKS
00124 int64 *lock_count, *lock_spin;
00125 #endif
00126 struct {
00127 char *(*find_file)(char *name, char *path, int mode);
00128 } file;
00129 struct s_objvar_struct {
00130 complex *(*complex_var)(OBJECT *obj, PROPERTY *prop);
00131 int16 *(*int16_var)(OBJECT *obj, PROPERTY *prop);
00132 int32 *(*int32_var)(OBJECT *obj, PROPERTY *prop);
00133 int64 *(*int64_var)(OBJECT *obj, PROPERTY *prop);
00134 double *(*double_var)(OBJECT *obj, PROPERTY *prop);
00135 char *(*string_var)(OBJECT *obj, PROPERTY *prop);
00136 OBJECT *(*object_var)(OBJECT *obj, PROPERTY *prop);
00137 } objvar;
00138 struct s_objvar_name_struct {
00139 complex *(*complex_var)(OBJECT *obj, char *name);
00140 int16 *(*int16_var)(OBJECT *obj, char *name);
00141 int32 *(*int32_var)(OBJECT *obj, char *name);
00142 int64 *(*int64_var)(OBJECT *obj, char *name);
00143 double *(*double_var)(OBJECT *obj, char *name);
00144 char *(*string_var)(OBJECT *obj, char *name);
00145 } objvarname;
00146 struct {
00147 int (*string_to_property)(PROPERTY *prop, void *addr, char *value);
00148 int (*property_to_string)(PROPERTY *prop, void *addr, char *value, int size);
00149 } convert;
00150 MODULE *(*module_find)(char *name);
00151 OBJECT *(*get_object)(char *name);
00152 int (*get_oflags)(KEYWORD **extflags);
00153 } CALLBACKS;
00155 #ifdef __cplusplus
00156 extern "C" {
00157 #endif
00158
00159 OBJECT *object_create_single(CLASS *oclass, OBJECTSIZE size);
00160 OBJECT *object_create_array(CLASS *oclass, OBJECTSIZE size, unsigned int n_objects);
00161 OBJECT *object_remove_by_id(OBJECTNUM id);
00162 int object_init(OBJECT *obj);
00163 int object_set_dependent(OBJECT *obj, OBJECT *dependent);
00164 int object_set_parent(OBJECT *obj, OBJECT *parent);
00165 void *object_get_addr(OBJECT *obj, char *name);
00166 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00167 int object_set_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value);
00168 int object_set_value_by_addr(OBJECT *obj, void *addr, char *value, PROPERTY *prop);
00169 int object_set_double_by_name(OBJECT *obj, PROPERTYNAME name, double value);
00170 int object_get_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value, int size);
00171 int object_get_value_by_addr(OBJECT *obj, void *addr, char *value, int size, PROPERTY *prop);
00172 OBJECT *object_get_reference(OBJECT *obj, char *name);
00173 int object_isa(OBJECT *obj, char *type);
00174 void object_set_name(OBJECT *obj, OBJECTNAME name);
00175 OBJECT *object_find_name(OBJECTNAME name);
00176
00177 int object_get_oflags(KEYWORD **extflags);
00178
00179 TIMESTAMP object_sync(OBJECT *obj, TIMESTAMP to,PASSCONFIG pass);
00180 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00181 OBJECT *object_get_object(OBJECT *obj, PROPERTY *prop);
00182 int16 *object_get_int16(OBJECT *obj, PROPERTY *prop);
00183 int16 *object_get_int16_by_name(OBJECT *obj, char *name);
00184 int32 *object_get_int32(OBJECT *obj, PROPERTY *prop);
00185 int32 *object_get_int32_by_name(OBJECT *obj, char *name);
00186 int64 *object_get_int64(OBJECT *obj, PROPERTY *prop);
00187 int64 *object_get_int64_by_name(OBJECT *obj, char *name);
00188 double *object_get_double(OBJECT *pObj, PROPERTY *prop);
00189 double *object_get_double_by_name(OBJECT *pObj, char *name);
00190 complex *object_get_complex(OBJECT *pObj, PROPERTY *prop);
00191 complex *object_get_complex_by_name(OBJECT *pObj, char *name);
00192 double *object_get_double_quick(OBJECT *pObj, PROPERTY *prop);
00193 complex *object_get_complex_quick(OBJECT *pObj, PROPERTY *prop);
00194 char *object_get_string(OBJECT *pObj, PROPERTY *prop);
00195 char *object_get_string_by_name(OBJECT *obj, char *name);
00196 FUNCTIONADDR object_get_function(CLASSNAME classname, FUNCTIONNAME functionname);
00197 char *object_property_to_string(OBJECT *obj, char *name);
00198 char *object_get_unit(OBJECT *obj, char *name);
00199 int object_set_rank(OBJECT *obj, OBJECTRANK rank);
00200
00201 OBJECT *object_find_by_id(OBJECTNUM id);
00202 OBJECT *object_get_first();
00203 OBJECT *object_get_next(OBJECT *obj);
00204 unsigned int object_get_count(void);
00205 int object_dump(char *buffer, int size, OBJECT *obj);
00206 int object_saveall(FILE *fp);
00207 int object_saveall_xml(FILE *fp);
00208
00209 char *object_name(OBJECT *obj);
00210 int convert_from_latitude(double,void*,int);
00211 int convert_from_longitude(double,void*,int);
00212 double convert_to_latitude(char *buffer);
00213 double convert_to_longitude(char *buffer);
00214
00215 PROPERTY *object_flag_property(void);
00216
00217 #ifdef __cplusplus
00218 }
00219 #endif
00220
00221
00222 #define object_size(X) ((X)?(X)->size:-1)
00223 #define object_id(X) ((X)?(X)->id:-1)
00224 #define object_parent(X) ((X)?(X)->parent:NULL)
00225 #define object_rank(X) ((X)?(X)->name:-1)
00227 #define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL))
00228 #define GETADDR(O,P) (O?((void*)((char*)(O+1)+(unsigned int64)((P)->addr))):NULL)
00229 #define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL)
00230 #define MYPARENT ((((OBJECT*)this)-1)->parent)
00232 #endif
00233