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 #include "threadpool.h"
00018 #include "schedule.h"
00019 #include "enduse.h"
00020
00021
00022 typedef unsigned int OBJECTRANK;
00023 typedef unsigned short OBJECTSIZE;
00024 typedef unsigned int OBJECTNUM;
00025 typedef char * OBJECTNAME;
00026 typedef char FULLNAME[1024];
00028
00029 #define OF_NONE 0x0000
00030 #define OF_HASPLC 0x0001
00031 #define OF_LOCKED 0x0002
00032 #define OF_RECALC 0x0008
00033 #define OF_FOREIGN 0x0010
00034 #define OF_SKIPSAFE 0x0020
00035 #define OF_RERANK 0x4000
00037 typedef struct s_namespace {
00038 FULLNAME name;
00039 struct s_namespace *next;
00040 } NAMESPACE;
00041
00042 typedef struct s_object_list {
00043 OBJECTNUM id;
00044 char32 groupid;
00045 CLASS *oclass;
00046 struct s_object_list *next;
00047 struct s_object_list *parent;
00048 OBJECTRANK rank;
00049 TIMESTAMP clock;
00050 TIMESTAMP valid_to;
00051 double latitude, longitude;
00052 TIMESTAMP in_svc,
00053 out_svc;
00054 OBJECTNAME name;
00055 int tp_affinity;
00056 NAMESPACE *space;
00057 unsigned long flags;
00058
00059 } OBJECT;
00061
00062
00063
00064 typedef struct s_callbacks {
00065 TIMESTAMP *global_clock;
00066 int (*output_verbose)(char *format, ...);
00067 int (*output_message)(char *format, ...);
00068 int (*output_warning)(char *format, ...);
00069 int (*output_error)(char *format, ...);
00070 int (*output_debug)(char *format, ...);
00071 int (*output_test)(char *format, ...);
00072 CLASS *(*register_class)(MODULE *,CLASSNAME,unsigned int,PASSCONFIG);
00073 struct {
00074 OBJECT *(*single)(CLASS*);
00075 OBJECT *(*array)(CLASS*,unsigned int);
00076 OBJECT *(*foreign)(OBJECT *);
00077 } create;
00078 int (*define_map)(CLASS*,...);
00079 CLASS *(*class_getname)(char*);
00080 struct {
00081 FUNCTION *(*define)(CLASS*,FUNCTIONNAME,FUNCTIONADDR);
00082 FUNCTIONADDR (*get)(char*,char*);
00083 } function;
00084 int (*define_enumeration_member)(CLASS*,char*,char*,enumeration);
00085 int (*define_set_member)(CLASS*,char*,char*,unsigned long);
00086 int (*set_dependent)(OBJECT*,OBJECT*);
00087 int (*set_parent)(OBJECT*,OBJECT*);
00088 int (*set_rank)(OBJECT*,unsigned int);
00089 struct {
00090 PROPERTY *(*get_property)(OBJECT*,PROPERTYNAME);
00091 int (*set_value_by_addr)(OBJECT *, void*, char*,PROPERTY*);
00092 int (*get_value_by_addr)(OBJECT *, void*, char*, int size,PROPERTY*);
00093 int (*set_value_by_name)(OBJECT *, char*, char*);
00094 int (*get_value_by_name)(OBJECT *, char*, char*, int size);
00095 OBJECT *(*get_reference)(OBJECT *, char*);
00096 char *(*get_unit)(OBJECT *, char *);
00097 void *(*get_addr)(OBJECT *, char *);
00098 int (*set_value_by_type)(PROPERTYTYPE,void *data,char *);
00099 } properties;
00100 struct {
00101 struct s_findlist *(*objects)(struct s_findlist *,...);
00102 OBJECT *(*next)(struct s_findlist *,OBJECT *obj);
00103 struct s_findlist *(*copy)(struct s_findlist *);
00104 void (*add)(struct s_findlist*, OBJECT*);
00105 void (*del)(struct s_findlist*, OBJECT*);
00106 void (*clear)(struct s_findlist*);
00107 } find;
00108 PROPERTY *(*find_property)(CLASS *, PROPERTYNAME);
00109 void *(*malloc)(size_t);
00110 void (*free)(void*);
00111 struct s_aggregate *(*create_aggregate)(char *aggregator, char *group_expression);
00112
00113 double (*run_aggregate)(struct s_aggregate *aggregate);
00114 void *(*get_module_var)(MODULE *module, char *varname);
00115 int (*depends)(char *name, unsigned char major, unsigned char minor, unsigned short build);
00116 struct {
00117 double (*uniform)(double a, double b);
00118 double (*normal)(double m, double s);
00119 double (*bernoulli)(double p);
00120 double (*pareto)(double m, double a);
00121 double (*lognormal)(double m, double s);
00122 double (*sampled)(unsigned int n, double *x);
00123 double (*exponential)(double l);
00124 RANDOMTYPE (*type)(char *name);
00125 double (*value)(RANDOMTYPE type, ...);
00126 double (*pseudo)(RANDOMTYPE type, unsigned int *state, ...);
00127 double (*triangle)(double a, double b);
00128 double (*beta)(double a, double b);
00129 double (*gamma)(double a, double b);
00130 double (*weibull)(double a, double b);
00131 double (*rayleigh)(double a);
00132 } random;
00133 int (*object_isa)(OBJECT *obj, char *type);
00134 DELEGATEDTYPE* (*register_type)(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00135 int (*define_type)(CLASS*,DELEGATEDTYPE*,...);
00136 struct {
00137 TIMESTAMP (*mkdatetime)(DATETIME *dt);
00138 int (*strdatetime)(DATETIME *t, char *buffer, int size);
00139 double (*timestamp_to_days)(TIMESTAMP t);
00140 double (*timestamp_to_hours)(TIMESTAMP t);
00141 double (*timestamp_to_minutes)(TIMESTAMP t);
00142 double (*timestamp_to_seconds)(TIMESTAMP t);
00143 int (*local_datetime)(TIMESTAMP ts, DATETIME *dt);
00144 TIMESTAMP (*convert_to_timestamp)(char *value);
00145 int (*convert_from_timestamp)(TIMESTAMP ts, char *buffer, int size);
00146 } time;
00147 int (*unit_convert)(char *from, char *to, double *value);
00148 int (*unit_convert_ex)(UNIT *pFrom, UNIT *pTo, double *pValue);
00149 UNIT *(*unit_find)(char *unit_name);
00150 struct {
00151 EXCEPTIONHANDLER *(*create_exception_handler)();
00152 void (*delete_exception_handler)(EXCEPTIONHANDLER *ptr);
00153 void (*throw_exception)(char *msg, ...);
00154 char *(*exception_msg)(void);
00155 } exception;
00156 struct {
00157 GLOBALVAR *(*create)(char *name, ...);
00158 STATUS (*setvar)(char *def,...);
00159 char *(*getvar)(char *name, char *buffer, int size);
00160 GLOBALVAR *(*find)(char *name);
00161 } global;
00162 #ifndef NOLOCKS
00163 int64 *lock_count, *lock_spin;
00164 #endif
00165 struct {
00166 char *(*find_file)(char *name, char *path, int mode);
00167 } file;
00168 struct s_objvar_struct {
00169 complex *(*complex_var)(OBJECT *obj, PROPERTY *prop);
00170 enumeration *(*enum_var)(OBJECT *obj, PROPERTY *prop);
00171 int16 *(*int16_var)(OBJECT *obj, PROPERTY *prop);
00172 int32 *(*int32_var)(OBJECT *obj, PROPERTY *prop);
00173 int64 *(*int64_var)(OBJECT *obj, PROPERTY *prop);
00174 double *(*double_var)(OBJECT *obj, PROPERTY *prop);
00175 char *(*string_var)(OBJECT *obj, PROPERTY *prop);
00176 OBJECT *(*object_var)(OBJECT *obj, PROPERTY *prop);
00177 } objvar;
00178 struct s_objvar_name_struct {
00179 complex *(*complex_var)(OBJECT *obj, char *name);
00180 enumeration *(*enum_var)(OBJECT *obj, char *name);
00181 int16 *(*int16_var)(OBJECT *obj, char *name);
00182 int32 *(*int32_var)(OBJECT *obj, char *name);
00183 int64 *(*int64_var)(OBJECT *obj, char *name);
00184 double *(*double_var)(OBJECT *obj, char *name);
00185 char *(*string_var)(OBJECT *obj, char *name);
00186 OBJECT *(*object_var)(OBJECT *obj, char *name);
00187 } objvarname;
00188 struct {
00189 int (*string_to_property)(PROPERTY *prop, void *addr, char *value);
00190 int (*property_to_string)(PROPERTY *prop, void *addr, char *value, int size);
00191 } convert;
00192 MODULE *(*module_find)(char *name);
00193 OBJECT *(*get_object)(char *name);
00194 int (*name_object)(OBJECT *obj, char *buffer, int len);
00195 int (*get_oflags)(KEYWORD **extflags);
00196 unsigned int (*object_count)(void);
00197 struct {
00198 SCHEDULE *(*create)(char *name, char *definition);
00199 SCHEDULEINDEX (*index)(SCHEDULE *sch, TIMESTAMP ts);
00200 double (*value)(SCHEDULE *sch, SCHEDULEINDEX index);
00201 long (*dtnext)(SCHEDULE *sch, SCHEDULEINDEX index);
00202 SCHEDULE *(*find)(char *name);
00203 } schedule;
00204 struct {
00205 int (*create)(struct s_loadshape *s);
00206 int (*init)(struct s_loadshape *s);
00207 } loadshape;
00208 struct {
00209 int (*create)(struct s_enduse *e);
00210 TIMESTAMP (*sync)(struct s_enduse *e, PASSCONFIG pass, TIMESTAMP t1);
00211 } enduse;
00212 struct {
00213 double (*linear)(double t, double x0, double y0, double x1, double y1);
00214 double (*quadratic)(double t, double x0, double y0, double x1, double y1, double x2, double y2);
00215 } interpolate;
00216 } CALLBACKS;
00218 #ifdef __cplusplus
00219 extern "C" {
00220 #endif
00221
00222 OBJECT *object_create_single(CLASS *oclass);
00223 OBJECT *object_create_array(CLASS *oclass, unsigned int n_objects);
00224 OBJECT *object_create_foreign(OBJECT *obj);
00225 OBJECT *object_remove_by_id(OBJECTNUM id);
00226 int object_init(OBJECT *obj);
00227 int object_commit(OBJECT *obj);
00228 int object_set_dependent(OBJECT *obj, OBJECT *dependent);
00229 int object_set_parent(OBJECT *obj, OBJECT *parent);
00230 void *object_get_addr(OBJECT *obj, char *name);
00231 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00232 PROPERTY *object_prop_in_class(OBJECT *obj, PROPERTY *prop);
00233 int object_set_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value);
00234 int object_set_value_by_addr(OBJECT *obj, void *addr, char *value, PROPERTY *prop);
00235 int object_set_int16_by_name(OBJECT *obj, PROPERTYNAME name, int16 value);
00236 int object_set_int32_by_name(OBJECT *obj, PROPERTYNAME name, int32 value);
00237 int object_set_int64_by_name(OBJECT *obj, PROPERTYNAME name, int64 value);
00238 int object_set_double_by_name(OBJECT *obj, PROPERTYNAME name, double value);
00239 int object_set_complex_by_name(OBJECT *obj, PROPERTYNAME name, complex value);
00240 int object_get_value_by_name(OBJECT *obj, PROPERTYNAME name, char *value, int size);
00241 int object_get_value_by_addr(OBJECT *obj, void *addr, char *value, int size, PROPERTY *prop);
00242 int object_set_value_by_type(PROPERTYTYPE,void *addr, char *value);
00243 OBJECT *object_get_reference(OBJECT *obj, char *name);
00244 int object_isa(OBJECT *obj, char *type);
00245 OBJECTNAME object_set_name(OBJECT *obj, OBJECTNAME name);
00246 OBJECT *object_find_name(OBJECTNAME name);
00247 int object_build_name(OBJECT *obj, char *buffer, int len);
00248 int object_locate_property(void *addr, OBJECT **pObj, PROPERTY **pProp);
00249
00250 int object_get_oflags(KEYWORD **extflags);
00251
00252 TIMESTAMP object_sync(OBJECT *obj, TIMESTAMP to,PASSCONFIG pass);
00253 PROPERTY *object_get_property(OBJECT *obj, PROPERTYNAME name);
00254 OBJECT *object_get_object(OBJECT *obj, PROPERTY *prop);
00255 OBJECT *object_get_object_by_name(OBJECT *obj, char *name);
00256 enumeration *object_get_enum(OBJECT *obj, PROPERTY *prop);
00257 enumeration *object_get_enum_by_name(OBJECT *obj, char *name);
00258 int16 *object_get_int16(OBJECT *obj, PROPERTY *prop);
00259 int16 *object_get_int16_by_name(OBJECT *obj, char *name);
00260 int32 *object_get_int32(OBJECT *obj, PROPERTY *prop);
00261 int32 *object_get_int32_by_name(OBJECT *obj, char *name);
00262 int64 *object_get_int64(OBJECT *obj, PROPERTY *prop);
00263 int64 *object_get_int64_by_name(OBJECT *obj, char *name);
00264 double *object_get_double(OBJECT *pObj, PROPERTY *prop);
00265 double *object_get_double_by_name(OBJECT *pObj, char *name);
00266 complex *object_get_complex(OBJECT *pObj, PROPERTY *prop);
00267 complex *object_get_complex_by_name(OBJECT *pObj, char *name);
00268 double *object_get_double_quick(OBJECT *pObj, PROPERTY *prop);
00269 complex *object_get_complex_quick(OBJECT *pObj, PROPERTY *prop);
00270 char *object_get_string(OBJECT *pObj, PROPERTY *prop);
00271 char *object_get_string_by_name(OBJECT *obj, char *name);
00272 FUNCTIONADDR object_get_function(CLASSNAME classname, FUNCTIONNAME functionname);
00273 char *object_property_to_string(OBJECT *obj, char *name);
00274 char *object_get_unit(OBJECT *obj, char *name);
00275 int object_set_rank(OBJECT *obj, OBJECTRANK rank);
00276
00277 OBJECT *object_find_by_id(OBJECTNUM id);
00278 OBJECT *object_get_first();
00279 OBJECT *object_get_next(OBJECT *obj);
00280 unsigned int object_get_count(void);
00281 int object_dump(char *buffer, int size, OBJECT *obj);
00282 int object_saveall(FILE *fp);
00283 int object_saveall_xml(FILE *fp);
00284
00285 char *object_name(OBJECT *obj);
00286 int convert_from_latitude(double,void*,int);
00287 int convert_from_longitude(double,void*,int);
00288 double convert_to_latitude(char *buffer);
00289 double convert_to_longitude(char *buffer);
00290
00291 PROPERTY *object_flag_property(void);
00292 PROPERTY *object_access_property(void);
00293
00294 NAMESPACE *object_current_namespace();
00295 void object_namespace(char *buffer, int size);
00296 int object_get_namespace(OBJECT *obj, char *buffer, int size);
00297 int object_open_namespace(char *space);
00298 int object_close_namespace();
00299 int object_select_namespace(char *space);
00300 int object_push_namespace(char *space);
00301 NAMESPACE *object_pop_namespace();
00303 #ifdef __cplusplus
00304 }
00305 #endif
00306
00307 #define object_size(X) ((X)?(X)->size:-1)
00308 #define object_id(X) ((X)?(X)->id:-1)
00309 #define object_parent(X) ((X)?(X)->parent:NULL)
00310 #define object_rank(X) ((X)?(X)->name:-1)
00312 #define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL))
00313 #define GETADDR(O,P) (O?((void*)((char*)(O+1)+(unsigned int64)((P)->addr))):NULL)
00314 #define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL)
00315 #define MYPARENT ((((OBJECT*)this)-1)->parent)
00317 #endif
00318