00001 #include "cmwfwList.h"
00002 #include "cmwfwPoller.h"
00003 #include "cmwfwIOValue.h"
00004 #include "cmwfwIOPMapper.h"
00005 #include "cmwfwDeviceServer.h"
00006 #include "cmwfwDeviceAdapter.h"
00007
00008
00009 extern cmwfwIOPMapper framework_iop_mapper;
00010 void* pollThrRoutine(void*);
00011
00012
00013
00014 #define FILE "source file:cmwfwPoller.cc"
00015 #define ID "Contact Steen JENSEN, PS/CO"
00016 #define PROGRAM "Middleware server framework"
00017 #define T(a,b,c,d,e) TRACE(a,"%s(%s): %s %s %s %s\n",myname,FILE,b,c,d,e)
00018 #define E(a,b,c,d) ERROR("%s:%s(%s):ERROR: %s %s %s %s - %s\n",PROGRAM,myname,FILE,a,b,c,d,ID)
00019
00020
00021
00022
00023
00024
00025
00035 cmwfwPoller::cmwfwPoller(){
00036 char* myname = "cmwfwPoller::cmwfwPoller";
00037 T(CMWFW_TRACE_CALLS,"Entering","","","");
00038 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00039 };
00040
00041
00042
00052 cmwfwPoller::~cmwfwPoller(){
00053 char* myname = "cmwfwPoller::~cmwfwPoller";
00054 T(CMWFW_TRACE_CALLS,"Entering","","","");
00055 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00056 };
00057
00058
00067 void cmwfwPoller::processIOP(const cmwfwIOPoint& iop){
00068 char* myname = "cmwfwPoller::processIOP";
00069 T(CMWFW_TRACE_CALLS,"Entering","","","");
00070
00071 int did_update = 0;
00072 int updated_with_error = 0;
00073 cmwfwIOValue* iov_ptr1 = 0;
00074 cmwfwIOValue* iov_ptr2 = 0;
00075 cmwfwIOError* ioe_ptr = 0;
00076 cmwfwData data_being_filled;
00077 cmwfwValueQualifier vq_being_set;
00078 cmwfwDeviceServer* srv_ptr = framework_iop_mapper.getServer(iop);
00079 cmwfwDeviceAdapter* adp_ptr = framework_iop_mapper.getAdapter(iop);
00080 char* dn = iop.getDeviceName();
00081 char* cn = iop.getClassName();
00082 char* pn = iop.getPropertyName();
00083 char* cs = iop.getCycleSelector();
00084 cmwfwIOPoint iop_no_cs(dn,cn,pn,0);
00085
00086 if( !srv_ptr ){
00087 char* dn = iop.getDeviceName();
00088 char* e = "Unable to update clients for ";
00089 char* errmess = new char[strlen(dn) + strlen(e) + 5];
00090 if(!errmess)heaperr(85);
00091 strcat(errmess,e);
00092 strcat(errmess,dn);
00093 throw cmwfwBadParameter(errmess);
00094 exit(-1);
00095 };
00096 if( !adp_ptr ){
00097 char* dn = iop.getDeviceName();
00098 char* e = "Unable to retrieve data for ";
00099 char* errmess = new char[strlen(dn) + strlen(e) + 5];
00100 if(!errmess)heaperr(94);
00101 strcat(errmess,e);
00102 strcat(errmess,dn);
00103 throw cmwfwBadParameter(errmess);
00104 exit(-1);
00105 };
00106
00107 srv_ptr->iovalues->lock();
00108 iov_ptr1 = srv_ptr->getIOValue(iop,false);
00109 if(cs)
00110 iov_ptr2 = srv_ptr->getIOValue(iop_no_cs,false);
00111
00112 if( (!iov_ptr1) && (!iov_ptr2) ){
00113 srv_ptr->iovalues->unlock();
00114 T(CMWFW_TRACE_CALLS,"Returning - no iovalues","","","");
00115 return;
00116 };
00117
00118 try{
00119 adp_ptr->cmwfw_poll(iop,data_being_filled,vq_being_set);
00120 }
00121 catch(cmwfwIOError err){
00122 if(iov_ptr1)
00123 iov_ptr1->update(err);
00124 if(iov_ptr2)
00125 iov_ptr1->update(err);
00126 srv_ptr->iovalues->unlock();
00127 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00128 return;
00129 };
00130 if(iov_ptr1){
00131 iov_ptr1->update(data_being_filled,vq_being_set);
00132 };
00133 if(iov_ptr2){
00134 iov_ptr2->update(data_being_filled,vq_being_set);
00135 }
00136 srv_ptr->iovalues->unlock();
00137 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00138 return;
00139 };
00140
00141
00142
00143
00154 void cmwfwPoller::poll(const cmwfwIOPoint& iop){
00155 char* myname = "cmwfwPoller::poll(iopoint)";
00156 T(CMWFW_TRACE_CALLS,"Entering","","","");
00157
00158 cmwfwIOPoint* res = 0;
00159
00160 if(find(iop,res)){
00161 if(!res)
00162 processIOP(iop);
00163 else
00164 processIOP(*res);
00165 };
00166
00167 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00168 };
00169
00170
00171
00172
00183 void cmwfwPoller::poll(){
00184 char* myname = "cmwfwPoller::poll";
00185 T(CMWFW_TRACE_CALLS,"Entering","","","");
00186
00187 bool stat = false;
00188 int stop = 0;
00189 cmwfwIOPoint* iop_ptr = 0;
00190
00191 iopoints->lock();
00192 iopoints->resetCurrent(false);
00193 stat = iopoints->getFirst(&iop_ptr,false);
00194 if(stat){
00195 processIOP(*iop_ptr);
00196 };
00197 while(stat){
00198 stat = iopoints->getNext(&iop_ptr,false);
00199 if(stat){
00200 processIOP(*iop_ptr);
00201 };
00202 };
00203 iopoints->unlock();
00204
00205 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00206 };
00207
00208
00209
00210
00211
00221 void cmwfwPoller::poll(cmwfwList<cmwfwIOPoint*>& list){
00222 char* myname = "cmwfwPoller::poll(iopoint list)";
00223 T(CMWFW_TRACE_CALLS,"Entering","","","");
00224
00225 cmwfwIOPoint* iop_ptr = 0;
00226
00227 list.resetCurrent();
00228 list.getFirst(&iop_ptr);
00229 while(iop_ptr){
00230 processIOP(*iop_ptr);
00231 list.getNext(&iop_ptr);
00232 };
00233
00234 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00235 };
00236
00237
00247 void cmwfwPoller::heaperr(int line){
00248 char* myname = "cmwfwPoller";
00249 T(CMWFW_TRACE_CALLS,"Entering","","","");
00250
00251 char l[30];
00252 itoa(line,l);
00253 E("Out of heap in line ",l,"","");
00254 T(CMWFW_TRACE_CALLS,"Exiting due to heap allocation error","","","");
00255 throw cmwfwInternalError(FILE,line,"Out of heap memory");
00256 exit(-1);
00257 };
00258
00259