00001
00002
00003
00005
00006 #include <assert.h>
00007 #include <sys/time.h>
00008 #include <sys/resource.h>
00009 #include <sys/ioctl.h>
00010 #include <string.h>
00011 #include <sched.h>
00012 #include <unistd.h>
00013 #include <fcntl.h>
00014 #include <stdio.h>
00015 #define HANDLE int
00016 #define FALSE 0
00017 #define DWORD long
00018 #define _ASSERT assert
00019 #define REALTIME_PRIORITY_CLASS 1
00020 #define GetCurrentProcess getpid
00021 #define LOBYTE(x) ((x) & 0xff)
00022 #define HIBYTE(x) ((x >> 8) & 0xff)
00023
00024 #define MIRQ1 0x21
00025 #define MIRQ2 0xA1
00026
00027 #include "time.h"
00028
00029
00030 #include "CameraIO_Linux.h"
00031 #include "ApogeeLinux.h"
00032
00033 const int NUM_POSITIONS = 6;
00034 const int NUM_STEPS_PER_FILTER = 48;
00035 const int STEP_DELAY = 10;
00036
00037 const unsigned char Steps[] = { 0x10, 0x30, 0x20, 0x60, 0x40, 0xc0, 0x80, 0x90 };
00038 const int NUM_STEPS = sizeof ( Steps );
00039
00041
00043
00044 void CCameraIO::InitDefaults()
00045 {
00047
00048
00049 m_HighPriority = true;
00050 m_PPRepeat = 1;
00051 m_DataBits = 16;
00052 m_FastShutter = false;
00053 m_MaxBinX = 8;
00054 m_MaxBinY = 63;
00055 m_MaxExposure = 10485.75;
00056 m_MinExposure = 0.01;
00057 m_GuiderRelays = false;
00058 m_Timeout = 2.0;
00059
00061
00062
00063 m_TempControl = true;
00064 m_TempCalibration = 160;
00065 m_TempScale = 2.1;
00066
00068
00069
00070 m_BinX = 1;
00071 m_BinY = 1;
00072 m_StartX = 0;
00073 m_StartY = 0;
00074 m_NumX = 1;
00075 m_NumY = 1;
00076
00078
00079
00080 m_Columns = 0;
00081 m_Rows = 0;
00082 m_SkipC = 0;
00083 m_SkipR = 0;
00084 m_HFlush = 1;
00085 m_VFlush = 1;
00086 m_BIC = 4;
00087 m_BIR = 4;
00088 m_ImgColumns = 0;
00089 m_ImgRows = 0;
00090
00092
00093
00094 memset( m_Sensor, 0, 256 );
00095 m_Color = false;
00096 m_Noise = 0.0;
00097 m_Gain = 0.0;
00098 m_PixelXSize = 0.0;
00099 m_PixelYSize = 0.0;
00100
00102
00103
00104 fileHandle = 0;
00105 m_RegisterOffset = 0;
00106 m_Interface = Camera_Interface_ISA;
00107 m_SensorType = Camera_SensorType_CCD;
00108 }
00109
00110
00111
00112 bool CCameraIO::InitDriver(unsigned short camnum)
00113 {
00114 char deviceName[64];
00115
00116 sprintf(deviceName,"%s%d",APOGEE_ISA_DEVICE,camnum);
00117 fileHandle = ::open(deviceName,O_RDONLY);
00118 if (fileHandle == -1) return false;
00119 return true;
00120 }
00121
00122 long CCameraIO::Write( unsigned short reg, unsigned short val )
00123 {
00124 int status;
00125
00126 struct apIOparam request;
00127 unsigned short realreg = ( reg << 1 ) & 0xE;
00128 request.reg = realreg;
00129 request.param1=(int)val;
00130 status=ioctl(fileHandle,APISA_WRITE_USHORT,(unsigned long)&request);
00131 return 0;
00132 }
00133
00134 long CCameraIO::Read( unsigned short reg, unsigned short& val )
00135 {
00136 unsigned short realreg;
00137 int retval, status;
00138 struct apIOparam request;
00139
00140 switch ( reg )
00141 {
00142 case Reg_ImageData:
00143 realreg = RegISA_ImageData;
00144 break;
00145 case Reg_TempData:
00146 realreg = RegISA_TempData;
00147 break;
00148 case Reg_Status:
00149 realreg = RegISA_Status;
00150 break;
00151 case Reg_CommandReadback:
00152 realreg = RegISA_CommandReadback;
00153 break;
00154 default:
00155 assert( 1 );
00156 val = 0;
00157 return 0;
00158 }
00159
00160 request.reg = realreg;
00161 request.param1=(unsigned long)&retval;
00162 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00163 val = (unsigned short)retval;
00164 return 0;
00165 }
00166
00167
00168 long CCameraIO::ReadLine( long SkipPixels, long Pixels,unsigned short* pLineBuffer )
00169 {
00170 int j;
00171 int retval, status;
00172 struct apIOparam request;
00173
00174 if ( !m_TDI )
00175 {
00177
00178 m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;
00179 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00180
00181 m_RegShadow[ Reg_Command ] &= ~RegBit_StartNextLine;
00182 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00184 }
00185
00186 request.reg = RegISA_ImageData;
00187 request.param1=(unsigned long)&retval;
00188
00189 for (j = 0; j < SkipPixels; j++)
00190 {
00191 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00192 }
00193 for (j = 0; j < Pixels; j++)
00194 {
00195 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00196 *pLineBuffer++ = (unsigned short)retval;
00197 }
00199
00200 m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;
00201 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00202
00203 m_RegShadow[ Reg_Command ] &= ~RegBit_DoneReading;
00204 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00206
00207 if ( !m_TDI )
00208 {
00210
00211 clock_t StopTime = clock() + CLOCKS_PER_SEC;
00212 while ( true )
00213 {
00214 unsigned short val = 0;
00215 Read( Reg_Status, val );
00216 if ( ( val & RegBit_LineDone ) != 0 ) break;
00217
00218 if ( clock() > StopTime ) return 1;
00219 }
00220 }
00221
00222 return 0;
00223 }
00224
00225
00226
00227 long CCameraIO::ReadImage( unsigned short* pImageBuffer )
00228 {
00229 m_RegShadow[ Reg_Command ] |= RegBit_FIFOCache;
00230 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00231
00232 long XEnd = long( m_ExposureNumX );
00233 long SkipC = long( m_ExposureSkipC );
00234 for (long i = 0; i < m_ExposureSkipR; i++)
00235 {
00236 if( InternalReadLine( false, SkipC, XEnd, NULL ) ) return 1;
00237 }
00238
00239 long YEnd = long( m_ExposureNumY );
00240 unsigned short* pLineBuffer = pImageBuffer;
00241 for (long i = 0; i < YEnd; i++)
00242 {
00243 if ( InternalReadLine( true, SkipC, XEnd, pLineBuffer ) ) return 1;
00244 pLineBuffer += XEnd;
00245 }
00246
00247 m_RegShadow[ Reg_Command ] &= !RegBit_FIFOCache;
00248 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00249
00250 return 0;
00251 }
00252
00253
00254
00255
00256 long CCameraIO::InternalReadLine( bool KeepData, long SkipC, long XEnd, unsigned short* pLineBuffer )
00257 {
00258 struct apIOparam request;
00259 int retval, status;
00260
00262
00263 m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;
00264 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00265
00266 m_RegShadow[ Reg_Command ] &= !RegBit_StartNextLine;
00267 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00269
00270 request.reg = RegISA_ImageData;
00271 request.param1=(unsigned long)&retval;
00272
00273 for (long j = 0; j < SkipC; j++)
00274 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00275
00276 if ( KeepData )
00277 {
00278 for (long j = 0; j < XEnd; j++) {
00279 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00280 *pLineBuffer++ = (unsigned short)retval;
00281 }
00282 }
00283 else
00284 {
00285 for (long j = 0; j < XEnd; j++)
00286 status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00287 }
00288
00290
00291 m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;
00292 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00293
00294 m_RegShadow[ Reg_Command ] &= !RegBit_DoneReading;
00295 Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00297
00299
00300 clock_t StopTime = clock() + CLOCKS_PER_SEC;
00301 while ( true )
00302 {
00303 unsigned short val = 0;
00304 Read( Reg_Status, val );
00305 if ( ( val & RegBit_LineDone ) != 0 ) break;
00306
00307 clock_t CurrentTime = clock();
00308 if ( CurrentTime > StopTime ) return 1;
00309 }
00310
00311 return 0;
00312 }
00313
00314
00315
00316
00317
00318
00319