00001
00032 #ifndef _SCHEDULE_H
00033 #define _SCHEDULE_H
00034
00035 #include "timestamp.h"
00036
00037 #define MAXBLOCKS 4
00038 #define MAXVALUES 64
00039 #define GET_BLOCK(I) ((I)>>6)&0x02)
00040 #define GET_VALUE(I) ((I)&0x3f)
00041
00042 typedef unsigned long SCHEDULEINDEX;
00043 #define GET_CALENDAR(N) (((N)>>20)&0x0f)
00044 #define GET_MINUTE(N) ((N)&0x0fffff)
00045 #define SET_CALENDAR(N,X) (N)|=(((X)&0x0f)<<20)
00046 #define SET_MINUTE(N,X) (N)|=((X)&0x0fffff)
00047
00049 typedef struct s_schedule SCHEDULE;
00050 struct s_schedule {
00051
00052 double value;
00053 char name[64];
00054 char definition[65536];
00055 char blockname[MAXBLOCKS][64];
00056 unsigned char block;
00057 unsigned char index[14][366*24*60];
00058 unsigned char dtnext[14][366*24*60];
00059 double data[MAXBLOCKS*MAXVALUES];
00060 unsigned int weight[MAXBLOCKS*MAXVALUES];
00061 double sum[MAXBLOCKS];
00062 double abs[MAXBLOCKS];
00063 unsigned int count[MAXBLOCKS];
00064 unsigned int minutes[MAXBLOCKS];
00065 TIMESTAMP next_t;
00066 double duration;
00067 double fraction;
00068 int flags;
00069 SCHEDULE *next;
00070 };
00071
00072 typedef enum {
00073 XS_UNKNOWN = 0x00,
00074 XS_DOUBLE = 0x01,
00075 XS_COMPLEX = 0x02,
00076 XS_LOADSHAPE= 0x04,
00077 XS_ENDUSE = 0x08,
00078 XS_SCHEDULE = 0x10,
00079 XS_ALL = 0x1f,
00080 } XFORMSOURCE;
00081 typedef struct s_schedulexform {
00082 double *source;
00083 XFORMSOURCE source_type;
00084 void *source_addr;
00085 double *target;
00086 struct s_object_list *target_obj;
00087 struct s_property_map *target_prop;
00088 double scale;
00089 double bias;
00090 struct s_schedulexform *next;
00091 } SCHEDULEXFORM;
00092
00093 #define SN_NORMAL 0x0001
00094 #define SN_ABSOLUTE 0x0002
00095 #define SN_WEIGHTED 0x0004
00096 #define SN_BOOLEAN 0x8000
00097 #define SN_NONZERO 0x4000
00098 #define SN_POSITIVE 0x2000
00100 #ifdef __cplusplus
00101 extern "C" {
00102 #endif
00103
00104 SCHEDULE *schedule_getnext(SCHEDULE *sch);
00105 SCHEDULE *schedule_find_byname(char *name);
00106 SCHEDULE *schedule_create(char *name, char *definition);
00107 SCHEDULE *schedule_new(void);
00108 void schedule_add(SCHEDULE *sch);
00109 int schedule_validate(SCHEDULE *sch, int flags);
00110 int schedule_normalize(SCHEDULE *sch, int flags);
00111 SCHEDULEINDEX schedule_index(SCHEDULE *sch, TIMESTAMP ts);
00112 double schedule_value(SCHEDULE *sch, SCHEDULEINDEX index);
00113 long schedule_dtnext(SCHEDULE *sch, SCHEDULEINDEX index);
00114 TIMESTAMP schedule_sync(SCHEDULE *sch, TIMESTAMP t);
00115 TIMESTAMP schedule_syncall(TIMESTAMP t);
00116 TIMESTAMP scheduletransform_syncall(TIMESTAMP t, XFORMSOURCE restrict);
00117 int schedule_test(void);
00118 void schedule_dump(SCHEDULE *sch, char *file);
00119
00120 int schedule_add_xform(XFORMSOURCE stype, double *source, double *target, double scale, double bias, struct s_object_list *obj, struct s_property_map *prop);
00121 SCHEDULEXFORM *scheduletransform_getnext(SCHEDULEXFORM *xform);
00122
00123 #ifdef __cplusplus
00124 }
00125 #endif
00126
00127 #endif