00001
00017 #include <stdlib.h>
00018 #include <stdio.h>
00019 #include <errno.h>
00020
00021 #include "lock.h"
00022 #include "office.h"
00023 #include "multizone.h"
00024
00025 CLASS *multizone::oclass = NULL;
00026 multizone *multizone::defaults = NULL;
00027
00028 static PASSCONFIG passconfig = PC_BOTTOMUP;
00029 static PASSCONFIG clockpass = PC_BOTTOMUP;
00030
00031
00032 multizone::multizone(MODULE *module)
00033 {
00034 if (oclass==NULL)
00035 {
00036 oclass = gl_register_class(module,"multizone",sizeof(multizone),passconfig);
00037 if (oclass==NULL)
00038 GL_THROW("unable to register object class implemented by %s", __FILE__);
00039
00040 if (gl_publish_variable(oclass,
00041
00042 PT_object, "from", PADDR(from),
00043 PT_object, "to", PADDR(to),
00044 PT_double, "ua", PADDR(ua),
00045 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00046 defaults = this;
00047
00048 memset(this,0,sizeof(multizone));
00049 }
00050 }
00051
00052
00053 int multizone::create(void)
00054 {
00055 memcpy(this,defaults,sizeof(multizone));
00056 return 1;
00057 }
00058
00059
00060 int multizone::init(OBJECT *parent)
00061 {
00062 OBJECT *obj = OBJECTHDR(this);
00063 if (from==NULL)
00064 gl_error("%s (multizone:%d): from zone is not specified", obj->name?obj->name:"unnamed",obj->id);
00065 else if (!gl_object_isa(from,"office"))
00066 gl_error("%s (multizone:%d): from object is not an commercial office space", obj->name?obj->name:"unnamed",obj->id);
00067 if (to==NULL)
00068 gl_error("%s (multizone:%d): to zone is not specified", obj->name?obj->name:"unnamed",obj->id);
00069 else if (!gl_object_isa(to,"office"))
00070 gl_error("%s (multizone:%d): to object is not an commercial office space", obj->name?obj->name:"unnamed",obj->id);
00071 if (ua<=0)
00072 gl_error("%s (multizone:%d): ua must be positive (value is %.2f)", obj->name?obj->name:"unnamed",obj->id,ua);
00073 gl_set_rank(from,obj->rank+1);
00074 gl_set_rank(to,obj->rank+1);
00075 return 1;
00076 }
00077
00078
00079 TIMESTAMP multizone::presync(TIMESTAMP t0, TIMESTAMP t1)
00080 {
00081 TIMESTAMP t2 = TS_NEVER;
00082 return t2;
00083 }
00084
00085
00086 TIMESTAMP multizone::sync(TIMESTAMP t0, TIMESTAMP t1)
00087 {
00088 if (t1>t0 && t0>0)
00089 {
00090 office *pFrom = OBJECTDATA(from,office);
00091 office *pTo = OBJECTDATA(to,office);
00092
00093
00094 double dT = pFrom->zone.current.air_temperature - pTo->zone.current.air_temperature;
00095
00096
00097 double ddT = pFrom->zone.current.temperature_change - pTo->zone.current.temperature_change;
00098
00099
00100 double DT = dT + ddT/2;
00101
00102
00103 double dQ = ua * DT * (t1-t0)/TS_SECOND/3600;
00104
00105 double x;
00106 x = dQ*(t1-t0); LOCKED(from, pFrom->Qz -= x);
00107 LOCKED(to, pTo->Qz += dQ);
00108
00109 if (ddT!=0)
00110
00111
00112 return (TIMESTAMP)(t1+fabs(1/ddT)*3600*TS_SECOND);
00113 else
00114 return TS_NEVER;
00115 }
00116
00117 return TS_NEVER;
00118 }
00119
00120
00121 TIMESTAMP multizone::postsync(TIMESTAMP t0, TIMESTAMP t1)
00122 {
00123 TIMESTAMP t2 = TS_NEVER;
00124 return t2;
00125 }
00126
00128
00130
00131 EXPORT int create_multizone(OBJECT **obj, OBJECT *parent)
00132 {
00133 try
00134 {
00135 *obj = gl_create_object(multizone::oclass);
00136 if (*obj!=NULL)
00137 {
00138 multizone *my = OBJECTDATA(*obj,multizone);
00139 gl_set_parent(*obj,parent);
00140 return my->create();
00141 }
00142 }
00143 catch (char *msg)
00144 {
00145 gl_error("create_multizone: %s", msg);
00146 }
00147 return 1;
00148 }
00149
00150 EXPORT int init_multizone(OBJECT *obj, OBJECT *parent)
00151 {
00152 try
00153 {
00154 if (obj!=NULL)
00155 return OBJECTDATA(obj,multizone)->init(parent);
00156 }
00157 catch (char *msg)
00158 {
00159 gl_error("init_multizone(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00160 }
00161 return 1;
00162 }
00163
00164 EXPORT TIMESTAMP sync_multizone(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass)
00165 {
00166 TIMESTAMP t2 = TS_NEVER;
00167 multizone *my = OBJECTDATA(obj,multizone);
00168 try
00169 {
00170 switch (pass) {
00171 case PC_PRETOPDOWN:
00172 t2 = my->presync(obj->clock,t1);
00173 break;
00174 case PC_BOTTOMUP:
00175 t2 = my->sync(obj->clock,t1);
00176 break;
00177 case PC_POSTTOPDOWN:
00178 t2 = my->postsync(obj->clock,t1);
00179 break;
00180 default:
00181 GL_THROW("invalid pass request (%d)", pass);
00182 break;
00183 }
00184 if (pass==clockpass)
00185 obj->clock = t1;
00186 }
00187 catch (char *msg)
00188 {
00189 gl_error("sync_multizone(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00190 }
00191 return t2;
00192 }