areaDetector 1-8
|
00001 /* PerkinElmer.h 00002 * 00003 * This is a driver the PerkinElmer Image Plates 00004 * Models: XRD0820 00005 * XRF0822 00006 * 00007 * 00008 * Author: Brian Tieman 00009 * 00010 * Created: 07/24/2008 00011 * 00012 * Current author: Mark Rivers 00013 * 00014 */ 00015 00016 #ifndef PERKINELMER_H 00017 #define PERKINELMER_H 00018 00019 #include <sys/stat.h> 00020 00021 #include <stddef.h> 00022 #include <stdlib.h> 00023 #include <stdarg.h> 00024 #include <math.h> 00025 #include <stdio.h> 00026 #include <errno.h> 00027 #include <string.h> 00028 00029 #include <epicsTime.h> 00030 #include <epicsThread.h> 00031 #include <epicsEvent.h> 00032 #include <epicsExit.h> 00033 #include <epicsMutex.h> 00034 #include <epicsString.h> 00035 #include <epicsStdio.h> 00036 #include <epicsMutex.h> 00037 #include <cantProceed.h> 00038 #include <iocsh.h> 00039 #include <epicsExport.h> 00040 00041 #include "ADDriver.h" 00042 00043 #include <windows.h> 00044 #include "Acq.h" 00045 00046 //______________________________________________________________________________________________ 00047 00048 static const char *driverName = "PerkinElmer"; 00049 00050 //______________________________________________________________________________________________ 00051 00052 00053 typedef enum 00054 { 00055 PE_ACQUIRE_ACQUISITION, 00056 PE_ACQUIRE_OFFSET, 00057 PE_ACQUIRE_GAIN 00058 } PEAcquisitionMode_t; 00059 00060 // We add an additional mode to ADImageMode = PEImageAverage 00061 00062 typedef enum 00063 { 00064 PEImageSingle = ADImageSingle, 00065 PEImageMultiple = ADImageMultiple, 00066 PEImageContinuous = ADImageContinuous, 00067 PEImageAverage 00068 } PEImageMode_t; 00069 00070 typedef enum 00071 { 00072 PE_INTERNAL_TRIGGER, 00073 PE_EXTERNAL_TRIGGER, 00074 PE_FREE_RUNNING, 00075 PE_SOFT_TRIGGER 00076 } PETimingMode_t; 00077 00078 #define TIME0 0 00079 #define TIME0_STR "66.5ms" 00080 #define TIME1 1 00081 #define TIME1_STR "79.9ms" 00082 #define TIME2 2 00083 #define TIME2_STR "99.8ms" 00084 #define TIME3 3 00085 #define TIME3_STR "133.2ms" 00086 #define TIME4 4 00087 #define TIME4_STR "199.9ms" 00088 #define TIME5 5 00089 #define TIME5_STR "400.0ms" 00090 #define TIME6 6 00091 #define TIME6_STR "999.8ms" 00092 #define TIME7 7 00093 #define TIME7_STR "1999.8ms" 00094 00095 00096 #define GAIN0 0 00097 #define GAIN0_STR "0.25pF" 00098 #define GAIN1 1 00099 #define GAIN1_STR "0.5pF" 00100 #define GAIN2 2 00101 #define GAIN2_STR "1pF" 00102 #define GAIN3 3 00103 #define GAIN3_STR "2pF" 00104 #define GAIN4 4 00105 #define GAIN4_STR "4pF" 00106 #define GAIN5 5 00107 #define GAIN5_STR "8pF" 00108 00109 typedef enum 00110 { 00111 PE_STATUS_OK, 00112 PE_STATUS_INITIALIZING, 00113 PE_STATUS_RUNNING_OFFSET, 00114 PE_STATUS_RUNNING_GAIN, 00115 PE_STATUS_ERROR 00116 } PEStatus_t; 00117 00118 typedef enum 00119 { 00120 NOT_AVAILABLE, 00121 AVAILABLE 00122 } Avalability_t; 00123 00124 typedef enum 00125 { 00126 NO, 00127 YES 00128 } YesNo_t; 00129 00130 //______________________________________________________________________________________________ 00131 00132 class PerkinElmer; 00133 00136 class PerkinElmer : public ADDriver 00137 { 00138 public: 00139 PerkinElmer(const char *portName, int IDType, const char *IDValue, 00140 int maxBuffers, size_t maxMemory, 00141 int priority, int stackSize); 00142 00143 /* These are the methods that we override from ADDriver */ 00144 virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); 00145 virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); 00146 void report(FILE *fp, int details); 00147 00148 // These should really be private, but they are called from C so must be public 00149 void endFrameCallback(HACQDESC hAcqDesc); 00150 void endAcqCallback(HACQDESC hAcqDesc); 00151 void acquireStopTask(void); 00152 ~PerkinElmer(); 00153 00154 protected: 00155 int PE_SystemID; 00156 #define PE_FIRST_PARAM PE_SystemID 00157 int PE_Initialize; 00158 int PE_CorrectionsDirectory; 00159 int PE_AcquireOffset; 00160 int PE_NumOffsetFrames; 00161 int PE_CurrentOffsetFrame; 00162 int PE_UseOffset; 00163 int PE_OffsetAvailable; 00164 int PE_AcquireGain; 00165 int PE_NumGainFrames; 00166 int PE_CurrentGainFrame; 00167 int PE_UseGain; 00168 int PE_GainAvailable; 00169 int PE_GainFile; 00170 int PE_LoadGainFile; 00171 int PE_SaveGainFile; 00172 int PE_UsePixelCorrection; 00173 int PE_PixelCorrectionAvailable; 00174 int PE_PixelCorrectionFile; 00175 int PE_LoadPixelCorrectionFile; 00176 int PE_Gain; 00177 int PE_DwellTime; 00178 int PE_NumFrameBuffers; 00179 int PE_Trigger; 00180 int PE_SyncTime; 00181 int PE_FrameBufferIndex; 00182 int PE_ImageNumber; 00183 int PE_SkipFrames; 00184 int PE_NumFramesToSkip; 00185 #define PE_LAST_PARAM PE_NumFramesToSkip 00186 00187 00188 private: 00189 int IDType_; 00190 char *IDValue_; 00191 HACQDESC hAcqDesc_; 00192 epicsEventId acquireStopEvent_; 00193 epicsUInt16 *pAcqBuffer_; 00194 epicsUInt16 *pOffsetBuffer_; 00195 DWORD *pGainBuffer_; 00196 epicsUInt16 *pBadPixelMap_; 00197 int *pPixelCorrectionList_; 00198 unsigned int uiNumFrameBuffers_; 00199 unsigned int uiNumBuffersInUse_; 00200 int iAcqMode_; 00201 // Keep a copy of parmeters for Acquistion_EnumSensors 00202 unsigned int uiNumSensors_; 00203 // Keep a copy of parmeters for Acquisition_GetCommChannel 00204 unsigned int uiChannelType_; 00205 int iChannelNum_; 00206 // Keep a copy of parmeters from Acquisition_GetConfiguration 00207 unsigned int uiDevFrames_; 00208 unsigned int uiRows_; 00209 unsigned int uiColumns_; 00210 unsigned int uiDataType_; 00211 unsigned int uiSortFlags_; 00212 CHwHeaderInfo cHwHeaderInfo_; 00213 CHwHeaderInfoEx cHwHeaderInfoEx_; 00214 BOOL bEnableIRQ_; 00215 DWORD dwAcqType_; 00216 DWORD dwSystemID_; 00217 DWORD dwSyncMode_; 00218 DWORD dwHwAccess_; 00219 DWORD dwBoardType_; 00220 double dAcqTimeReq_; 00221 double dAcqTimeAct_; 00222 int iTrigModeReq_; 00223 int iTrigModeAct_; 00224 00225 bool initializeDetector (void); 00226 void setBinning(void); 00227 void reportSensors(FILE *fp, int details); 00228 00229 void acquireStart(void); 00230 void acquireStop(void); 00231 void acquireOffsetImage(void); 00232 void acquireGainImage(void); 00233 00234 asynStatus loadGainFile(void); 00235 asynStatus saveGainFile(void); 00236 asynStatus loadPixelCorrectionFile(); 00237 00238 asynStatus PerkinElmer::setTriggerMode(void); 00239 asynStatus PerkinElmer::setExposureTime(void); 00240 00241 }; 00242 00243 //______________________________________________________________________________________________ 00244 #define PE_SystemIDString "PE_SYSTEMID" 00245 #define PE_InitializeString "PE_INITIALIZE" 00246 #define PE_CorrectionsDirectoryString "PE_CORRECTIONS_DIRECTORY" 00247 #define PE_AcquireOffsetString "PE_ACQUIRE_OFFSET" 00248 #define PE_NumOffsetFramesString "PE_NUM_OFFSET_FRAMES" 00249 #define PE_CurrentOffsetFrameString "PE_CURRENT_OFFSET_FRAME" 00250 #define PE_UseOffsetString "PE_USE_OFFSET" 00251 #define PE_OffsetAvailableString "PE_OFFSET_AVAILABLE" 00252 #define PE_AcquireGainString "PE_ACQUIRE_GAIN" 00253 #define PE_NumGainFramesString "PE_NUM_GAIN_FRAMES" 00254 #define PE_CurrentGainFrameString "PE_CURRENT_GAIN_FRAME" 00255 #define PE_UseGainString "PE_USE_GAIN" 00256 #define PE_GainAvailableString "PE_GAIN_AVAILABLE" 00257 #define PE_GainFileString "PE_GAIN_FILE" 00258 #define PE_LoadGainFileString "PE_LOAD_GAIN_FILE" 00259 #define PE_SaveGainFileString "PE_SAVE_GAIN_FILE" 00260 #define PE_UsePixelCorrectionString "PE_USE_PIXEL_CORRECTION" 00261 #define PE_PixelCorrectionAvailableString "PE_PIXEL_CORRECTION_AVAILABLE" 00262 #define PE_PixelCorrectionFileString "PE_PIXEL_CORRECTION_FILE" 00263 #define PE_LoadPixelCorrectionFileString "PE_LOAD_PIXEL_CORRECTION_FILE" 00264 #define PE_GainString "PE_GAIN" 00265 #define PE_DwellTimeString "PE_DWELL_TIME" 00266 #define PE_NumFrameBuffersString "PE_NUM_FRAME_BUFFERS" 00267 #define PE_TriggerString "PE_TRIGGER" 00268 #define PE_SyncTimeString "PE_SYNC_TIME" 00269 #define PE_FrameBufferIndexString "PE_FRAME_BUFFER_INDEX" 00270 #define PE_ImageNumberString "PE_IMAGE_NUMBER" 00271 #define PE_SkipFramesString "PE_SKIP_FRAMES" 00272 #define PE_NumFramesToSkipString "PE_NUM_FRAMES_TO_SKIP" 00273 00274 #define NUM_PERKIN_ELMER_PARAMS (&PE_LAST_PARAM - &PE_FIRST_PARAM + 1) 00275 //______________________________________________________________________________________________ 00276 00277 #endif