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