areaDetector 1-8
/home/epics/devel/areaDetector/ADApp/perkinElmerSrc/PerkinElmer.h
Go to the documentation of this file.
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