00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <iostream>
00010 #include <linuxTITrigPollingService.hxx>
00011
00012 extern "C" {
00013 #include <jvme.h>
00014 #include <tirLib.h>
00015 }
00016
00017
00018 using namespace std;
00019 using namespace codaObject;
00020
00021
00022 static char *tiLocalAddress;
00023
00024
00025
00026
00027
00028
00029
00035 linuxTITrigPollingService::linuxTITrigPollingService(timespec *timeout)
00036 : linuxTITrigPollingThreadId((pthread_t)NULL), linuxTITrigPollingTimeout(timeout),
00037 linuxTITrigPollingPthreadDispatcher(NULL) {
00038
00039
00040 vmeBusToLocalAdrs(VME_ACCESS_MODE, (char*)TI_BASE_ADDR, &tiLocalAddress);
00041 }
00042
00043
00044
00045
00046
00052 void *linuxTITrigPollingService::dispatchInterrupt(void*) {
00053
00054 unsigned int trigType;
00055
00056 while(true) {
00057 nanosleep(linuxTITrigPollingTimeout,NULL);
00058
00059
00060 trigType=tirIntPoll();
00061 if(trigType>=1) {
00062
00063
00064 if(myIntObj!=NULL)myIntObj->interrupt(trigType);
00065
00066
00067 tirIntAck();
00068
00069
00070 }
00071 pthread_testcancel();
00072 }
00073
00074 return(NULL);
00075 }
00076
00077
00078
00079
00080
00086 bool linuxTITrigPollingService::setupInterrupt(void) {
00087
00088
00089
00090 int stat = tirIntInit(TI_BASE_ADDR,TIR_EXT_POLL,0);
00091
00092
00093
00094 return(true);
00095 }
00096
00097
00098
00099
00100
00106 bool linuxTITrigPollingService::enableInterrupt(void) {
00107
00108 if(linuxTITrigPollingPthreadDispatcher==NULL) {
00109
00110 linuxTITrigPollingPthreadDispatcher = new pthreadDispatcher<linuxTITrigPollingService,void*,void*>(this,&linuxTITrigPollingService::dispatchInterrupt,NULL);
00111 if(pthread_create(&linuxTITrigPollingThreadId,NULL,pthreadDispatcher<linuxTITrigPollingService,void*,void*>::dispatchIt,
00112 (void*)linuxTITrigPollingPthreadDispatcher)==0) {
00113
00114
00115 tirWriteCsr(TIR_ENABLED|TIR_EXTERNAL);
00116
00117
00118
00119 } else {
00120
00121 linuxTITrigPollingThreadId=0;
00122 delete(linuxTITrigPollingPthreadDispatcher);
00123 linuxTITrigPollingPthreadDispatcher=NULL;
00124 string err = "?linuxTITrigPollingService...unable to start polling thread";
00125 cerr << err << endl;
00126 myIntObj->daLogMsg(err,DALOG_ERROR);
00127 }
00128
00129 } else {
00130 string err = "?linuxTITrigPollingService::enableInterrupt: attempt to start a second interrupt thread ignored";
00131 cerr << err << endl;
00132 myIntObj->daLogMsg(err,DALOG_ERROR);
00133 }
00134
00135 return(true);
00136 }
00137
00138
00139
00140
00141
00147 bool linuxTITrigPollingService::pauseInterrupt(void) {
00148
00149
00150 tirWriteCsr(0);
00151
00152
00153 return(true);
00154 }
00155
00156
00157
00158
00159
00165 bool linuxTITrigPollingService::resumeInterrupt(void) {
00166
00167
00168 tirWriteCsr(TIR_ENABLED&TIR_EXTERNAL);
00169
00170
00171 return(true);
00172 }
00173
00174
00175
00176
00177
00183 bool linuxTITrigPollingService::deleteInterrupt(void) {
00184
00185
00186 tirWriteCsr(0);
00187
00188
00189
00190 if(linuxTITrigPollingThreadId!=0)pthread_cancel(linuxTITrigPollingThreadId);
00191 linuxTITrigPollingThreadId=0;
00192
00193 if(linuxTITrigPollingPthreadDispatcher!=NULL)delete(linuxTITrigPollingPthreadDispatcher);
00194 linuxTITrigPollingPthreadDispatcher=NULL;
00195
00196 return(true);
00197 }
00198
00199
00200