00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef PERKINELMER_H
00014 #define PERKINELMER_H
00015
00016 #include <sys/stat.h>
00017
00018 #include <stddef.h>
00019 #include <stdlib.h>
00020 #include <stdarg.h>
00021 #include <math.h>
00022 #include <stdio.h>
00023 #include <errno.h>
00024 #include <string.h>
00025
00026 #include <epicsTime.h>
00027 #include <epicsThread.h>
00028 #include <epicsEvent.h>
00029 #include <epicsMutex.h>
00030 #include <epicsString.h>
00031 #include <epicsStdio.h>
00032 #include <epicsMutex.h>
00033 #include <cantProceed.h>
00034
00035 #include "asynNDArrayDriver.h"
00036 #include "NDArray.h"
00037 #include "ADDriver.h"
00038
00039 #include "drvPerkinElmer.h"
00040
00041 #include <windows.h>
00042 #include "Acq.h"
00043
00044
00045
00046 static const char *driverName = "drvPerkinElmer";
00047
00048
00049
00050
00051 typedef enum
00052 {
00053 PE_ACQUIRE_ACQUISITION,
00054 PE_ACQUIRE_OFFSET,
00055 PE_ACQUIRE_GAIN
00056 } PEAcquisitionMode_t;
00057
00058 typedef enum
00059 {
00060 PE_INTERNAL_TRIGGER,
00061 PE_EXTERNAL_TRIGGER,
00062 PE_FREE_RUNNING,
00063 PE_SOFT_TRIGGER
00064 } PETimingMode_t;
00065
00066 #define TIME0 0
00067 #define TIME0_STR "66.5ms"
00068 #define TIME1 1
00069 #define TIME1_STR "79.9ms"
00070 #define TIME2 2
00071 #define TIME2_STR "99.8ms"
00072 #define TIME3 3
00073 #define TIME3_STR "133.2ms"
00074 #define TIME4 4
00075 #define TIME4_STR "199.9ms"
00076 #define TIME5 5
00077 #define TIME5_STR "400.0ms"
00078 #define TIME6 6
00079 #define TIME6_STR "999.8ms"
00080 #define TIME7 7
00081 #define TIME7_STR "1999.8ms"
00082
00083
00084 #define GAIN0 0
00085 #define GAIN0_STR "0.25pF"
00086 #define GAIN1 1
00087 #define GAIN1_STR "0.5pF"
00088 #define GAIN2 2
00089 #define GAIN2_STR "1pF"
00090 #define GAIN3 3
00091 #define GAIN3_STR "2pF"
00092 #define GAIN4 4
00093 #define GAIN4_STR "4pF"
00094 #define GAIN5 5
00095 #define GAIN5_STR "8pF"
00096
00097 typedef enum
00098 {
00099 PE_STATUS_OK,
00100 PE_STATUS_INITIALIZING,
00101 PE_STATUS_RUNNING_OFFSET,
00102 PE_STATUS_RUNNING_GAIN,
00103 PE_STATUS_ERROR
00104 } PEStatus_t;
00105
00106 typedef enum
00107 {
00108 NOT_AVAILABLE,
00109 AVAILABLE
00110 } Avalability_t;
00111
00112 typedef enum
00113 {
00114 NO,
00115 YES
00116 } YesNo_t;
00117
00118
00119
00120 class PerkinElmer;
00121
00122
00125 typedef struct {
00126 unsigned short *pDataBuffer,
00127 *pOffsetBuffer;
00128 DWORD *pGainBuffer;
00129 unsigned int uiRows,
00130 uiColumns,
00131 numBufferFrames;
00132 int iAcqMode,
00133 iUseOffset,
00134 iUseGain,
00135 iUsePixelCorrections,
00136 *pPixelCorrectionList;
00137 short iFastCollectMode;
00138 PerkinElmer *pPerkinElmer;
00139 } AcqData_t;
00140
00141
00144 class PerkinElmer : public ADDriver
00145 {
00146 public:
00147 int imagesRemaining;
00148 epicsEventId startAcquisitionEventId;
00149 epicsEventId stopAcquisitionEventId;
00150 NDArray *pRaw;
00151
00152 PerkinElmer(const char *portName, int maxSizeX, int maxSizeY, NDDataType_t dataType, int maxBuffers, size_t maxMemory,
00153 int priority, int stackSize);
00154
00155
00156 virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
00157 virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
00158
00159 void report(FILE *fp, int details);
00160
00161 void acquireTask ();
00162
00163 void frameCallback (unsigned int buffFrame);
00164 void offsetCallback ();
00165 void gainCallback ();
00166 int getParamADNumImagesCounter();
00167 int getParamPE_ImageNumber();
00168 int getParamPE_FrameBufferIndex();
00169 ~PerkinElmer ();
00170
00171 protected:
00172 int PE_SystemID;
00173 #define PE_FIRST_PARAM PE_SystemID
00174 int PE_Initialize;
00175 int PE_StatusRBV;
00176 int PE_AcquireOffset;
00177 int PE_NumOffsetFrames;
00178 int PE_UseOffset;
00179 int PE_OffsetAvailable;
00180 int PE_AcquireGain;
00181 int PE_NumGainFrames;
00182 int PE_UseGain;
00183 int PE_GainAvailable;
00184 int PE_PixelCorrectionAvailable;
00185 int PE_Gain;
00186 int PE_GainRBV;
00187 int PE_DwellTime;
00188 int PE_DwellTimeRBV;
00189 int PE_NumFrameBuffers;
00190 int PE_NumFrameBuffersRBV;
00191 int PE_SyncMode;
00192 int PE_SyncModeRBV;
00193 int PE_Trigger;
00194 int PE_SyncTime;
00195 int PE_SyncTimeRBV;
00196 int PE_UsePixelCorrection;
00197 int PE_LoadCorrectionFiles;
00198 int PE_SaveCorrectionFiles;
00199 int PE_PixelCorrectionFile;
00200 int PE_PixelCorrectionFileRBV;
00201 int PE_CorrectionsDirectory;
00202 int PE_FrameBufferIndex;
00203 int PE_ImageNumber;
00204 int PE_FastCollectMode;
00205 int PE_SkipLeadingPulses;
00206 int PE_NumPulsesToSkip;
00207 #define PE_LAST_PARAM PE_NumPulsesToSkip
00208
00209
00210 private:
00211 HACQDESC hAcqDesc;
00212 unsigned short *pAcqBuffer,
00213 *pOffsetBuffer,
00214 *pBadPixelMap;
00215 DWORD *pGainBuffer;
00216 DWORD dwBoardType,
00217 dwAcqType,
00218 dwSystemID,
00219 dwSyncMode,
00220 dwHwAccess;
00221 int abortAcq,
00222 iChannelNum,
00223 *pPixelCorrectionList;
00224 BOOL bEnableIRQ,
00225 bSelfInit,
00226 bInitAlways,
00227 bAcquiringOffset,
00228 bAcquiringGain;
00229 UINT uiRows,
00230 uiColumns,
00231 uiDataType,
00232 uiSortFlags,
00233 uiNumSensors,
00234 uiChannelType,
00235 uiPEResult,
00236 uiNumFrameBuffers;
00237 double acqTimeReq,
00238 acqTimeAct;
00239 int trigModeReq,
00240 trigModeAct;
00241
00242 AcqData_t dataAcqStruct;
00243
00244 template <typename epicsType> void computeArray(int maxSizeX, int maxSizeY, unsigned int buffFrame);
00245
00246 int allocateBuffer(void);
00247 int computeImage(unsigned int buffFrame);
00248
00249 void enumSensors (void);
00250 BOOL initializeDetector (void);
00251
00252 void acquireImage (void);
00253 void acquireOffsetImage (void);
00254 void acquireGainImage (void);
00255
00256 void saveCorrectionFiles (void);
00257 void loadCorrectionFiles (void);
00258
00259 void readPixelCorrectionFile (char *pixel_correction_file);
00260 asynStatus PerkinElmer::setTriggerMode(void);
00261 asynStatus PerkinElmer::setExposureTime(void);
00262
00263 };
00264
00265
00266 #define PE_SystemIDString "PE_SYSTEMID"
00267 #define PE_InitializeString "PE_INITIALIZE"
00268 #define PE_StatusRBVString "PE_STATUS_RBV"
00269 #define PE_AcquireOffsetString "PE_ACQUIRE_OFFSET"
00270 #define PE_NumOffsetFramesString "PE_NUM_OFFSET_FRAMES"
00271 #define PE_UseOffsetString "PE_USE_OFFSET"
00272 #define PE_OffsetAvailableString "PE_OFFSET_AVAILABLE"
00273 #define PE_AcquireGainString "PE_ACQUIRE_GAIN"
00274 #define PE_NumGainFramesString "PE_NUM_GAIN_FRAMES"
00275 #define PE_UseGainString "PE_USE_GAIN"
00276 #define PE_GainAvailableString "PE_GAIN_AVAILABLE"
00277 #define PE_PixelCorrectionAvailableString "PE_PIXEL_CORRECTION_AVAILABLE"
00278 #define PE_GainString "PE_GAIN"
00279 #define PE_GainRBVString "PE_GAIN_RBV"
00280 #define PE_DwellTimeString "PE_DWELL_TIME"
00281 #define PE_DwellTimeRBVString "PE_DWELL_TIME_RBV"
00282 #define PE_NumFrameBuffersString "PE_NUM_FRAME_BUFFERS"
00283 #define PE_NumFrameBuffersRBVString "PE_NUM_FRAME_BUFFERS_RBV"
00284 #define PE_SyncModeString "PE_SYNC_MODE"
00285 #define PE_SyncModeRBVString "PE_SYNC_MODE_RBV"
00286 #define PE_TriggerString "PE_TRIGGER"
00287 #define PE_SyncTimeString "PE_SYNC_TIME"
00288 #define PE_SyncTimeRBVString "PE_SYNC_TIME_RBV"
00289 #define PE_UsePixelCorrectionString "PE_USE_PIXEL_CORRECTION"
00290 #define PE_LoadCorrectionFilesString "PE_LOAD_CORRECTION_FILES"
00291 #define PE_SaveCorrectionFilesString "PE_SAVE_CORRECTION_FILES"
00292 #define PE_PixelCorrectionFileString "PE_PIXEL_CORRECTION_FILE"
00293 #define PE_PixelCorrectionFileRBVString "PE_PIXEL_CORRECTION_FILE_RBV"
00294 #define PE_CorrectionsDirectoryString "PE_CORRECTIONS_DIRECTORY"
00295 #define PE_FrameBufferIndexString "PE_FRAME_BUFFER_INDEX"
00296 #define PE_ImageNumberString "PE_IMAGE_NUMBER"
00297 #define PE_FastCollectModeString "PE_FAST_COLLECT_MODE"
00298 #define PE_SkipLeadingPulsesString "PE_SKIP_LEADING_PULSES"
00299 #define PE_NumPulsesToSkipString "PE_NUM_PULSES_TO_SKIP"
00300
00301 #define NUM_PERKIN_ELMER_PARAMS (&PE_LAST_PARAM - &PE_FIRST_PARAM + 1)
00302
00303
00304 #endif