1 // CameraIO.cpp: implementation of the CCameraIO class.
3 // Copyright (c) 2000 Apogee Instruments Inc.
4 //////////////////////////////////////////////////////////////////////
9 #include <sys/resource.h>
10 #include <sys/ioctl.h>
19 #define _ASSERT assert
20 #define REALTIME_PRIORITY_CLASS 1
21 #define GetCurrentProcess getpid
22 #define LOBYTE(x) ((x) & 0xff)
23 #define HIBYTE(x) ((x >> 8) & 0xff)
31 #include "CameraIO_Linux.h"
32 #include "ApogeeLinux.h"
34 const int NUM_POSITIONS
= 6;
35 const int NUM_STEPS_PER_FILTER
= 48;
36 const int STEP_DELAY
= 10;
38 const unsigned char Steps
[] = { 0x10, 0x30, 0x20, 0x60, 0x40, 0xc0, 0x80, 0x90 };
39 const int NUM_STEPS
= sizeof ( Steps
);
41 //////////////////////////////////////////////////////////////////////
42 // Construction/Destruction
43 //////////////////////////////////////////////////////////////////////
45 void CCameraIO::InitDefaults()
47 ////////////////////////////////////////////////////////////
50 m_HighPriority
= true;
53 m_FastShutter
= false;
56 m_MaxExposure
= 10485.75;
58 m_GuiderRelays
= false;
61 ////////////////////////////////////////////////////////////
65 m_TempCalibration
= 160;
68 ////////////////////////////////////////////////////////////
78 ////////////////////////////////////////////////////////////
92 ////////////////////////////////////////////////////////////
95 memset( m_Sensor
, 0, 256 );
102 ////////////////////////////////////////////////////////////
103 // Internal variables
106 m_RegisterOffset
= 0;
107 m_Interface
= Camera_Interface_ISA
;
108 m_SensorType
= Camera_SensorType_CCD
;
113 bool CCameraIO::InitDriver(unsigned short camnum
)
117 sprintf(deviceName
,"%s%d",APOGEE_ISA_DEVICE
,camnum
);
118 fileHandle
= ::open(deviceName
,O_RDONLY
);
119 if (fileHandle
== -1) return false;
123 long CCameraIO::Write( unsigned short reg
, unsigned short val
)
127 struct apIOparam request
;
128 unsigned short realreg
= ( reg
<< 1 ) & 0xE; // limit input to our address range
129 request
.reg
= realreg
;
130 request
.param1
=(int)val
;
131 status
=ioctl(fileHandle
,APISA_WRITE_USHORT
,(unsigned long)&request
);
135 long CCameraIO::Read( unsigned short reg
, unsigned short& val
)
137 unsigned short realreg
;
139 struct apIOparam request
;
144 realreg
= RegISA_ImageData
;
147 realreg
= RegISA_TempData
;
150 realreg
= RegISA_Status
;
152 case Reg_CommandReadback
:
153 realreg
= RegISA_CommandReadback
;
156 assert( 1 ); // application program bug
161 request
.reg
= realreg
;
162 request
.param1
=(unsigned long)&retval
;
163 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
164 val
= (unsigned short)retval
;
168 // Returns 0 if successfull, 1 if Line_Done poll timed out.
169 long CCameraIO::ReadLine( long SkipPixels
, long Pixels
,unsigned short* pLineBuffer
)
173 struct apIOparam request
;
177 /////////////////////////////////////
178 // Clock out the line
179 m_RegShadow
[ Reg_Command
] |= RegBit_StartNextLine
; // set bit to 1
180 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
182 m_RegShadow
[ Reg_Command
] &= ~RegBit_StartNextLine
; // set bit to 0
183 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
184 /////////////////////////////////////
187 request
.reg
= RegISA_ImageData
;
188 request
.param1
=(unsigned long)&retval
;
190 for (j
= 0; j
< SkipPixels
; j
++)
192 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
194 for (j
= 0; j
< Pixels
; j
++)
196 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
197 *pLineBuffer
++ = (unsigned short)retval
;
199 /////////////////////////////////////
200 // Assert done reading line
201 m_RegShadow
[ Reg_Command
] |= RegBit_DoneReading
; // set bit to 1
202 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
204 m_RegShadow
[ Reg_Command
] &= ~RegBit_DoneReading
; // set bit to 0
205 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
206 /////////////////////////////////////
210 /////////////////////////////////////
211 // Wait until camera is done
212 clock_t StopTime
= clock() + CLOCKS_PER_SEC
; // wait at most one second
215 unsigned short val
= 0;
216 Read( Reg_Status
, val
);
217 if ( ( val
& RegBit_LineDone
) != 0 ) break;// Line done
219 if ( clock() > StopTime
) return 1; // Timed out
228 long CCameraIO::ReadImage( unsigned short* pImageBuffer
)
230 m_RegShadow
[ Reg_Command
] |= RegBit_FIFOCache
; // set bit to 1
231 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
233 long XEnd
= long( m_ExposureNumX
);
234 long SkipC
= long( m_ExposureSkipC
);
235 for (long i
= 0; i
< m_ExposureSkipR
; i
++)
237 if( InternalReadLine( false, SkipC
, XEnd
, NULL
) ) return 1;
240 long YEnd
= long( m_ExposureNumY
);
241 unsigned short* pLineBuffer
= pImageBuffer
;
242 for (long i
= 0; i
< YEnd
; i
++)
244 if ( InternalReadLine( true, SkipC
, XEnd
, pLineBuffer
) ) return 1;
248 m_RegShadow
[ Reg_Command
] &= !RegBit_FIFOCache
; // set bit to 0
249 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
256 // Returns 0 if successfull, 1 if Line_Done poll timed out.
257 long CCameraIO::InternalReadLine( bool KeepData
, long SkipC
, long XEnd
, unsigned short* pLineBuffer
)
259 struct apIOparam request
;
262 /////////////////////////////////////
263 // Clock out the line
264 m_RegShadow
[ Reg_Command
] |= RegBit_StartNextLine
; // set bit to 1
265 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
267 m_RegShadow
[ Reg_Command
] &= !RegBit_StartNextLine
; // set bit to 0
268 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
269 /////////////////////////////////////
271 request
.reg
= RegISA_ImageData
;
272 request
.param1
=(unsigned long)&retval
;
274 for (long j
= 0; j
< SkipC
; j
++)
275 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
279 for (long j
= 0; j
< XEnd
; j
++) {
280 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
281 *pLineBuffer
++ = (unsigned short)retval
;
286 for (long j
= 0; j
< XEnd
; j
++)
287 status
=ioctl(fileHandle
,APISA_READ_USHORT
,(unsigned long)&request
);
290 /////////////////////////////////////
291 // Assert done reading line
292 m_RegShadow
[ Reg_Command
] |= RegBit_DoneReading
; // set bit to 1
293 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
295 m_RegShadow
[ Reg_Command
] &= !RegBit_DoneReading
; // set bit to 0
296 Write( Reg_Command
, m_RegShadow
[ Reg_Command
] );
297 /////////////////////////////////////
299 /////////////////////////////////////
300 // Wait until camera is done clocking
301 clock_t StopTime
= clock() + CLOCKS_PER_SEC
; // wait at most one second
304 unsigned short val
= 0;
305 Read( Reg_Status
, val
);
306 if ( ( val
& RegBit_LineDone
) != 0 ) break;// Line done
308 clock_t CurrentTime
= clock();
309 if ( CurrentTime
> StopTime
) return 1; // Timed out