1 // ApnCamera.cpp: implementation of the CApnCamera class.
3 // Copyright (c) 2003, 2004 Apogee Instruments, Inc.
4 //////////////////////////////////////////////////////////////////////
9 #include "ApnCamTable.h"
12 //////////////////////////////////////////////////////////////////////
13 // Construction/Destruction
14 //////////////////////////////////////////////////////////////////////
16 CApnCamera::CApnCamera()
18 m_ApnSensorInfo
= NULL
;
21 CApnCamera::~CApnCamera()
23 if ( m_ApnSensorInfo
!= NULL
)
25 delete m_ApnSensorInfo
;
26 m_ApnSensorInfo
= NULL
;
31 bool CApnCamera::Expose( double Duration
, bool Light
)
34 unsigned short BitsPerPixel(0);
35 unsigned short UnbinnedRoiX
;
36 unsigned short UnbinnedRoiY
;
37 unsigned short PreRoiSkip
, PostRoiSkip
;
38 unsigned short PreRoiRows
, PostRoiRows
;
39 unsigned short PreRoiVBinning
, PostRoiVBinning
;
41 unsigned short RoiRegBuffer
[12];
42 unsigned short RoiRegData
[12];
44 unsigned short TotalHPixels
;
45 unsigned short TotalVPixels
;
48 while ( read_ImagingStatus() != Apn_Status_Flushing
)
53 // Validate the "Duration" parameter
54 if ( Duration
< APN_EXPOSURE_TIME_MIN
)
55 Duration
= APN_EXPOSURE_TIME_MIN
;
57 // Validate the ROI params
58 UnbinnedRoiX
= m_RoiPixelsH
* m_RoiBinningH
;
60 PreRoiSkip
= m_RoiStartX
;
62 PostRoiSkip
= m_ApnSensorInfo
->m_TotalColumns
-
63 m_ApnSensorInfo
->m_ClampColumns
-
67 TotalHPixels
= UnbinnedRoiX
+ PreRoiSkip
+ PostRoiSkip
+ m_ApnSensorInfo
->m_ClampColumns
;
69 if ( TotalHPixels
!= m_ApnSensorInfo
->m_TotalColumns
)
72 UnbinnedRoiY
= m_RoiPixelsV
* m_RoiBinningV
;
74 PreRoiRows
= m_ApnSensorInfo
->m_UnderscanRows
+
77 PostRoiRows
= m_ApnSensorInfo
->m_TotalRows
-
81 TotalVPixels
= UnbinnedRoiY
+ PreRoiRows
+ PostRoiRows
;
83 if ( TotalVPixels
!= m_ApnSensorInfo
->m_TotalRows
)
86 // Calculate the exposure time to program to the camera
87 ExpTime
= ((unsigned long)(Duration
/ APN_TIMER_RESOLUTION
)) + APN_TIMER_OFFSET_COUNT
;
89 Write( FPGA_REG_TIMER_LOWER
, (unsigned short)(ExpTime
& 0xFFFF));
90 ExpTime
= ExpTime
>> 16;
91 Write( FPGA_REG_TIMER_UPPER
, (unsigned short)(ExpTime
& 0xFFFF));
93 m_pvtExposurePixelsV
= m_RoiPixelsV
;
94 m_pvtExposurePixelsH
= m_RoiPixelsH
;
96 if ( m_DataBits
== Apn_Resolution_SixteenBit
)
100 else if ( m_DataBits
== Apn_Resolution_TwelveBit
)
105 if ( PreStartExpose( BitsPerPixel
) != 0 )
110 // Calculate the vertical parameters
111 PreRoiVBinning
= m_ApnSensorInfo
->m_RowOffsetBinning
;
115 // For interline CCDs, set "Fast Dump" mode if the particular array is NOT digitized
116 if ( m_ApnSensorInfo
->m_InterlineCCD
)
118 // use the fast dump feature to get rid of the data quickly.
119 // one row, binning to the original row count
120 // note that we only are not digitized in arrays 1 and 3
121 PreRoiVBinning
= PreRoiRows
;
122 PostRoiVBinning
= PostRoiRows
;
124 PreRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
125 PostRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
131 // Set up the geometry for a full frame device
132 if ( m_ApnSensorInfo
->m_EnableSingleRowOffset
)
134 PreRoiVBinning
+= PreRoiRows
;
135 PostRoiVBinning
= PostRoiRows
;
137 PreRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
138 PostRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
146 RoiRegBuffer
[0] = FPGA_REG_COMMAND_B
;
147 RoiRegData
[0] = FPGA_BIT_CMD_RESET
;
149 // Program the horizontal settings
150 RoiRegBuffer
[1] = FPGA_REG_PREROI_SKIP_COUNT
;
151 RoiRegData
[1] = PreRoiSkip
;
153 RoiRegBuffer
[2] = FPGA_REG_ROI_COUNT
;
154 // Number of ROI pixels. Adjust the 12bit operation here to account for an extra
155 // 10 pixel shift as a result of the A/D conversion.
156 if ( m_DataBits
== Apn_Resolution_SixteenBit
)
158 RoiRegData
[2] = m_pvtExposurePixelsH
+ 1;
160 else if ( m_DataBits
== Apn_Resolution_TwelveBit
)
162 RoiRegData
[2] = m_pvtExposurePixelsH
+ 10;
165 RoiRegBuffer
[3] = FPGA_REG_POSTROI_SKIP_COUNT
;
166 RoiRegData
[3] = PostRoiSkip
;
168 // Program the vertical settings
169 RoiRegBuffer
[4] = FPGA_REG_A1_ROW_COUNT
;
170 RoiRegData
[4] = PreRoiRows
;
171 RoiRegBuffer
[5] = FPGA_REG_A1_VBINNING
;
172 RoiRegData
[5] = PreRoiVBinning
;
174 RoiRegBuffer
[6] = FPGA_REG_A2_ROW_COUNT
;
175 RoiRegData
[6] = m_RoiPixelsV
;
176 RoiRegBuffer
[7] = FPGA_REG_A2_VBINNING
;
177 RoiRegData
[7] = (m_RoiBinningV
| FPGA_BIT_ARRAY_DIGITIZE
);
179 RoiRegBuffer
[8] = FPGA_REG_A3_ROW_COUNT
;
180 RoiRegData
[8] = PostRoiRows
;
181 RoiRegBuffer
[9] = FPGA_REG_A3_VBINNING
;
182 RoiRegData
[9] = PostRoiVBinning
;
185 RoiRegBuffer
[10] = FPGA_REG_COMMAND_B
;
186 RoiRegData
[10] = FPGA_BIT_CMD_RESET
;
188 switch ( m_pvtCameraMode
)
190 case Apn_CameraMode_Normal
:
193 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
194 RoiRegData
[11] = FPGA_BIT_CMD_EXPOSE
;
198 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
199 RoiRegData
[11] = FPGA_BIT_CMD_DARK
;
202 case Apn_CameraMode_TDI
:
203 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
204 RoiRegData
[11] = FPGA_BIT_CMD_TDI
;
206 case Apn_CameraMode_Test
:
209 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
210 RoiRegData
[11] = FPGA_BIT_CMD_EXPOSE
;
214 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
215 RoiRegData
[11] = FPGA_BIT_CMD_DARK
;
218 case Apn_CameraMode_ExternalTrigger
:
219 RoiRegBuffer
[11] = FPGA_REG_COMMAND_A
;
220 RoiRegData
[11] = FPGA_BIT_CMD_TRIGGER_EXPOSE
;
222 case Apn_CameraMode_ExternalShutter
:
226 // Send the instruction sequence to the camera
227 WriteMultiMRMD( RoiRegBuffer
, RoiRegData
, 12 );
229 m_pvtImageInProgress
= true;
230 m_pvtImageReady
= false;
235 bool CApnCamera::ResetSystem()
237 // Reset the camera engine
238 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
241 Write( FPGA_REG_COMMAND_A
, FPGA_BIT_CMD_FLUSH
);
246 bool CApnCamera::PauseTimer( bool PauseState
)
248 unsigned short RegVal
;
251 Read( FPGA_REG_OP_A
, RegVal
);
253 CurrentState
= ( RegVal
& FPGA_BIT_PAUSE_TIMER
) == FPGA_BIT_PAUSE_TIMER
;
255 if ( CurrentState
!= PauseState
)
259 RegVal
|= FPGA_BIT_PAUSE_TIMER
;
263 RegVal
&= ~FPGA_BIT_PAUSE_TIMER
;
265 Write ( FPGA_REG_OP_A
, RegVal
);
271 bool CApnCamera::StopExposure( bool DigitizeData
)
273 if ( m_pvtImageInProgress
)
275 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_END_EXPOSURE
);
277 if ( PostStopExposure( DigitizeData
) != 0 )
287 unsigned short CApnCamera::GetExposurePixelsH()
289 return m_pvtExposurePixelsH
;
292 unsigned short CApnCamera::GetExposurePixelsV()
294 return m_pvtExposurePixelsV
;
297 double CApnCamera::read_InputVoltage()
299 UpdateGeneralStatus();
301 return m_pvtInputVoltage
;
304 long CApnCamera::read_AvailableMemory()
306 long AvailableMemory(0);
308 switch( m_CameraInterface
)
310 case Apn_Interface_NET
:
311 AvailableMemory
= 28 * 1024;
313 case Apn_Interface_USB
:
314 AvailableMemory
= 32 * 1024;
320 return AvailableMemory
;
323 unsigned short CApnCamera::read_FirmwareVersion()
325 unsigned short FirmwareVersion
;
326 Read( FPGA_REG_FIRMWARE_REV
, FirmwareVersion
);
327 return FirmwareVersion
;
330 bool CApnCamera::read_ShutterState()
332 UpdateGeneralStatus();
334 return m_pvtShutterState
;
337 bool CApnCamera::read_DisableShutter()
339 unsigned short RegVal
;
340 Read( FPGA_REG_OP_A
, RegVal
);
341 return ( (RegVal
& FPGA_BIT_DISABLE_SHUTTER
) != 0 );
344 void CApnCamera::write_DisableShutter( bool DisableShutter
)
346 unsigned short RegVal
;
347 Read( FPGA_REG_OP_A
, RegVal
);
349 if ( DisableShutter
)
350 RegVal
|= FPGA_BIT_DISABLE_SHUTTER
;
352 RegVal
&= ~FPGA_BIT_DISABLE_SHUTTER
;
354 Write( FPGA_REG_OP_A
, RegVal
);
357 bool CApnCamera::read_ForceShutterOpen()
359 unsigned short RegVal
;
360 Read( FPGA_REG_OP_A
, RegVal
);
361 return ( (RegVal
& FPGA_BIT_FORCE_SHUTTER
) != 0 );
364 void CApnCamera::write_ForceShutterOpen( bool ForceShutterOpen
)
366 unsigned short RegVal
;
367 Read( FPGA_REG_OP_A
, RegVal
);
369 if ( ForceShutterOpen
)
370 RegVal
|= FPGA_BIT_FORCE_SHUTTER
;
372 RegVal
&= ~FPGA_BIT_FORCE_SHUTTER
;
374 Write( FPGA_REG_OP_A
, RegVal
);
377 bool CApnCamera::read_ShutterAmpControl()
379 unsigned short RegVal
;
380 Read( FPGA_REG_OP_A
, RegVal
);
381 return ( (RegVal
& FPGA_BIT_SHUTTER_AMP_CONTROL
) != 0 );
384 void CApnCamera::write_ShutterAmpControl( bool ShutterAmpControl
)
386 unsigned short RegVal
;
387 Read( FPGA_REG_OP_A
, RegVal
);
389 if ( ShutterAmpControl
)
390 RegVal
|= FPGA_BIT_SHUTTER_AMP_CONTROL
;
392 RegVal
&= ~FPGA_BIT_SHUTTER_AMP_CONTROL
;
394 Write( FPGA_REG_OP_A
, RegVal
);
397 bool CApnCamera::read_ExternalIoReadout()
399 unsigned short RegVal
;
400 Read( FPGA_REG_OP_A
, RegVal
);
401 return ( (RegVal
& FPGA_BIT_SHUTTER_MODE
) != 0 );
404 void CApnCamera::write_ExternalIoReadout( bool ExternalIoReadout
)
406 unsigned short RegVal
;
407 Read( FPGA_REG_OP_A
, RegVal
);
409 if ( ExternalIoReadout
)
410 RegVal
|= FPGA_BIT_SHUTTER_MODE
;
412 RegVal
&= ~FPGA_BIT_SHUTTER_MODE
;
414 Write( FPGA_REG_OP_A
, RegVal
);
417 bool CApnCamera::read_FastSequence()
419 if ( m_ApnSensorInfo
->m_InterlineCCD
== false )
422 unsigned short RegVal
;
423 Read( FPGA_REG_OP_A
, RegVal
);
424 return ( (RegVal
& FPGA_BIT_RATIO
) != 0 );
427 void CApnCamera::write_FastSequence( bool FastSequence
)
429 if ( m_ApnSensorInfo
->m_InterlineCCD
== false )
432 unsigned short RegVal
;
433 Read( FPGA_REG_OP_A
, RegVal
);
437 RegVal
|= FPGA_BIT_RATIO
;
438 Write( FPGA_REG_SHUTTER_CLOSE_DELAY
, 0x0 );
442 RegVal
&= ~FPGA_BIT_RATIO
;
445 Write( FPGA_REG_OP_A
, RegVal
);
448 Apn_NetworkMode
CApnCamera::read_NetworkTransferMode()
450 return m_pvtNetworkTransferMode
;
453 void CApnCamera::write_NetworkTransferMode( Apn_NetworkMode TransferMode
)
455 SetNetworkTransferMode( TransferMode
);
457 m_pvtNetworkTransferMode
= TransferMode
;
460 Apn_CameraMode
CApnCamera::read_CameraMode()
462 return m_pvtCameraMode
;
465 void CApnCamera::write_CameraMode( Apn_CameraMode CameraMode
)
467 unsigned short RegVal
;
470 // If our state isn't going to change, do nothing
471 if ( m_pvtCameraMode
== CameraMode
)
474 // If we didn't return already, then if we know our state is going to
475 // change. If we're in test mode, clear the appropriate FPGA bit(s).
476 switch( m_pvtCameraMode
)
478 case Apn_CameraMode_Normal
:
480 case Apn_CameraMode_TDI
:
482 case Apn_CameraMode_Test
:
483 Read( FPGA_REG_OP_B
, RegVal
);
484 RegVal
&= ~FPGA_BIT_AD_SIMULATION
;
485 Write( FPGA_REG_OP_B
, RegVal
);
487 case Apn_CameraMode_ExternalTrigger
:
489 case Apn_CameraMode_ExternalShutter
:
490 Read( FPGA_REG_OP_A
, RegVal
);
491 RegVal
&= ~FPGA_BIT_SHUTTER_SOURCE
;
492 Write( FPGA_REG_OP_A
, RegVal
);
496 switch ( CameraMode
)
498 case Apn_CameraMode_Normal
:
500 case Apn_CameraMode_TDI
:
502 case Apn_CameraMode_Test
:
503 Read( FPGA_REG_OP_B
, RegVal
);
504 RegVal
|= FPGA_BIT_AD_SIMULATION
;
505 Write( FPGA_REG_OP_B
, RegVal
);
507 case Apn_CameraMode_ExternalTrigger
:
508 Read( FPGA_REG_IO_PORT_ASSIGNMENT
, RegVal
);
510 Write( FPGA_REG_IO_PORT_ASSIGNMENT
, RegVal
);
512 case Apn_CameraMode_ExternalShutter
:
513 Read( FPGA_REG_OP_A
, RegVal
);
514 RegVal
|= FPGA_BIT_SHUTTER_SOURCE
;
515 Write( FPGA_REG_OP_A
, RegVal
);
519 m_pvtCameraMode
= CameraMode
;
522 void CApnCamera::write_DataBits( Apn_Resolution BitResolution
)
524 unsigned short RegVal
;
526 if ( m_CameraInterface
== Apn_Interface_NET
)
528 // The network interface is 16bpp only. Changing the resolution
529 // for network cameras has no effect.
533 if ( m_DataBits
!= BitResolution
)
536 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
538 // Change bit setting after the reset
539 Read( FPGA_REG_OP_A
, RegVal
);
541 if ( BitResolution
== Apn_Resolution_TwelveBit
)
542 RegVal
|= FPGA_BIT_DIGITIZATION_RES
;
544 if ( BitResolution
== Apn_Resolution_SixteenBit
)
545 RegVal
&= ~FPGA_BIT_DIGITIZATION_RES
;
547 Write( FPGA_REG_OP_A
, RegVal
);
549 m_DataBits
= BitResolution
;
553 LoadRoiPattern( m_RoiBinningH
);
556 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
558 Write( FPGA_REG_COMMAND_A
, FPGA_BIT_CMD_FLUSH
);
562 Apn_Status
CApnCamera::read_ImagingStatus()
564 bool Exposing
, Active
, Done
, Flushing
, WaitOnTrigger
;
565 bool DataHalted
, RamError
;
568 UpdateGeneralStatus();
570 // Update the ImagingStatus
575 WaitOnTrigger
= false;
579 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_IMAGING_ACTIVE
) != 0 )
582 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_IMAGE_EXPOSING
) != 0 )
585 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_IMAGE_DONE
) != 0 )
588 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_FLUSHING
) != 0 )
591 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_WAITING_TRIGGER
) != 0 )
592 WaitOnTrigger
= true;
594 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_DATA_HALTED
) != 0 )
597 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_PATTERN_ERROR
) != 0 )
602 m_pvtImagingStatus
= Apn_Status_PatternError
;
608 m_pvtImagingStatus
= Apn_Status_DataError
;
614 m_pvtImagingStatus
= Apn_Status_WaitingOnTrigger
;
618 if ( Done
&& m_pvtImageInProgress
)
620 m_pvtImageReady
= true;
621 m_pvtImagingStatus
= Apn_Status_ImageReady
;
628 m_pvtImagingStatus
= Apn_Status_Exposing
;
630 m_pvtImagingStatus
= Apn_Status_ImagingActive
;
635 m_pvtImagingStatus
= Apn_Status_Flushing
;
637 m_pvtImagingStatus
= Apn_Status_Idle
;
645 switch( m_pvtImagingStatus )
647 case Apn_Status_DataError:
648 OutputDebugString( "ImagingStatus: Apn_Status_DataError" );
650 case Apn_Status_PatternError:
651 OutputDebugString( "ImagingStatus: Apn_Status_PatternError" );
653 case Apn_Status_Idle:
654 OutputDebugString( "ImagingStatus: Apn_Status_Idle" );
656 case Apn_Status_Exposing:
657 OutputDebugString( "ImagingStatus: Apn_Status_Exposing" );
659 case Apn_Status_ImagingActive:
660 OutputDebugString( "ImagingStatus: Apn_Status_ImagingActive" );
662 case Apn_Status_ImageReady:
663 OutputDebugString( "ImagingStatus: Apn_Status_ImageReady" );
665 case Apn_Status_Flushing:
666 OutputDebugString( "ImagingStatus: Apn_Status_Flushing" );
668 case Apn_Status_WaitingOnTrigger:
669 OutputDebugString( "ImagingStatus: Apn_Status_WaitingOnTrigger" );
672 OutputDebugString( "ImagingStatus: UNDEFINED!!" );
677 return m_pvtImagingStatus
;
680 Apn_LedMode
CApnCamera::read_LedMode()
685 void CApnCamera::write_LedMode( Apn_LedMode LedMode
)
687 unsigned short RegVal
;
689 Read( FPGA_REG_OP_A
, RegVal
);
693 case Apn_LedMode_DisableAll
:
694 RegVal
|= FPGA_BIT_LED_DISABLE
;
696 case Apn_LedMode_DisableWhileExpose
:
697 RegVal
&= ~FPGA_BIT_LED_DISABLE
;
698 RegVal
|= FPGA_BIT_LED_EXPOSE_DISABLE
;
700 case Apn_LedMode_EnableAll
:
701 RegVal
&= ~FPGA_BIT_LED_DISABLE
;
702 RegVal
&= ~FPGA_BIT_LED_EXPOSE_DISABLE
;
706 m_pvtLedMode
= LedMode
;
708 Write( FPGA_REG_OP_A
, RegVal
);
711 Apn_LedState
CApnCamera::read_LedState( unsigned short LedId
)
713 Apn_LedState
RetVal(0);
715 if ( LedId
== 0 ) // LED A
716 RetVal
= m_pvtLedStateA
;
718 if ( LedId
== 1 ) // LED B
719 RetVal
= m_pvtLedStateB
;
724 void CApnCamera::write_LedState( unsigned short LedId
, Apn_LedState LedState
)
726 unsigned short RegVal
;
731 if ( LedId
== 0 ) // LED A
733 RegVal
= (m_pvtLedStateB
<< 4); // keep the current settings for LED B
734 RegVal
|= LedState
; // program new settings
735 m_pvtLedStateA
= LedState
;
737 else if ( LedId
== 1 ) // LED B
739 RegVal
= m_pvtLedStateA
; // keep the current settings for LED A
740 RegVal
|= (LedState
<< 4); // program new settings
741 m_pvtLedStateB
= LedState
;
744 Write( FPGA_REG_LED_SELECT
, RegVal
);
747 bool CApnCamera::read_CoolerEnable()
749 return m_pvtCoolerEnable
;
752 void CApnCamera::write_CoolerEnable( bool CoolerEnable
)
756 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RAMP_TO_SETPOINT
);
760 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RAMP_TO_AMBIENT
);
763 m_pvtCoolerEnable
= CoolerEnable
;
766 Apn_CoolerStatus
CApnCamera::read_CoolerStatus()
770 bool CoolerTempRevised
;
773 UpdateGeneralStatus();
775 // Update CoolerStatus
776 CoolerActive
= false;
777 CoolerAtTemp
= false;
778 CoolerTempRevised
= false;
780 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_TEMP_AT_TEMP
) != 0 )
783 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_TEMP_ACTIVE
) != 0 )
786 if ( (m_pvtStatusReg
& FPGA_BIT_STATUS_TEMP_REVISION
) != 0 )
787 CoolerTempRevised
= true;
789 // Now derive our cooler state
792 m_pvtCoolerStatus
= Apn_CoolerStatus_Off
;
796 if ( CoolerTempRevised
)
798 m_pvtCoolerStatus
= Apn_CoolerStatus_Revision
;
803 m_pvtCoolerStatus
= Apn_CoolerStatus_AtSetPoint
;
805 m_pvtCoolerStatus
= Apn_CoolerStatus_RampingToSetPoint
;
810 return m_pvtCoolerStatus
;
813 double CApnCamera::read_CoolerSetPoint()
815 unsigned short RegVal
;
818 Read( FPGA_REG_TEMP_DESIRED
, RegVal
);
822 TempVal
= ( RegVal
- APN_TEMP_SETPOINT_ZERO_POINT
) * APN_TEMP_DEGREES_PER_BIT
;
827 void CApnCamera::write_CoolerSetPoint( double SetPoint
)
829 unsigned short RegVal
;
835 if ( SetPoint
< (APN_TEMP_SETPOINT_MIN
- APN_TEMP_KELVIN_SCALE_OFFSET
) )
836 TempVal
= APN_TEMP_SETPOINT_MIN
;
838 if ( SetPoint
> (APN_TEMP_SETPOINT_MAX
- APN_TEMP_KELVIN_SCALE_OFFSET
) )
839 TempVal
= APN_TEMP_SETPOINT_MAX
;
841 RegVal
= (unsigned short)( (TempVal
/ APN_TEMP_DEGREES_PER_BIT
) + APN_TEMP_SETPOINT_ZERO_POINT
);
843 Write( FPGA_REG_TEMP_DESIRED
, RegVal
);
846 double CApnCamera::read_CoolerBackoffPoint()
848 return ( m_pvtCoolerBackoffPoint
);
851 void CApnCamera::write_CoolerBackoffPoint( double BackoffPoint
)
853 unsigned short RegVal
;
856 TempVal
= BackoffPoint
;
858 // BackoffPoint must be a positive number!
859 if ( BackoffPoint
< 0.0 )
862 if ( BackoffPoint
< (APN_TEMP_SETPOINT_MIN
- APN_TEMP_KELVIN_SCALE_OFFSET
) )
863 TempVal
= APN_TEMP_SETPOINT_MIN
;
865 if ( BackoffPoint
> (APN_TEMP_SETPOINT_MAX
- APN_TEMP_KELVIN_SCALE_OFFSET
) )
866 TempVal
= APN_TEMP_SETPOINT_MAX
;
868 m_pvtCoolerBackoffPoint
= TempVal
;
870 RegVal
= (unsigned short)( TempVal
/ APN_TEMP_DEGREES_PER_BIT
);
872 Write( FPGA_REG_TEMP_BACKOFF
, RegVal
);
875 double CApnCamera::read_CoolerDrive()
877 UpdateGeneralStatus();
879 return m_pvtCoolerDrive
;
882 double CApnCamera::read_TempCCD()
884 // UpdateGeneralStatus();
886 unsigned short TempReg
;
887 unsigned short TempAvg
;
888 unsigned long TempTotal
;
893 if ( m_CameraInterface
== Apn_Interface_NET
) {
897 for ( int i
=0; i
<don
; i
++ )
899 Read( FPGA_REG_TEMP_CCD
, TempReg
);
900 TempTotal
+= TempReg
;
903 TempAvg
= (unsigned short)(TempTotal
/ don
);
905 m_pvtCurrentCcdTemp
= ( (TempAvg
- APN_TEMP_SETPOINT_ZERO_POINT
)
906 * APN_TEMP_DEGREES_PER_BIT
);
908 return m_pvtCurrentCcdTemp
;
911 double CApnCamera::read_TempHeatsink()
913 // UpdateGeneralStatus();
915 unsigned short TempReg
;
916 unsigned short TempAvg
;
917 unsigned long TempTotal
;
922 if ( m_CameraInterface
== Apn_Interface_NET
) {
926 for ( int i
=0; i
<don
; i
++ )
928 Read( FPGA_REG_TEMP_HEATSINK
, TempReg
);
929 TempTotal
+= TempReg
;
932 TempAvg
= (unsigned short)(TempTotal
/ don
);
934 m_pvtCurrentHeatsinkTemp
= ( (TempAvg
- APN_TEMP_HEATSINK_ZERO_POINT
)
935 * APN_TEMP_DEGREES_PER_BIT
);
937 return m_pvtCurrentHeatsinkTemp
;
940 Apn_FanMode
CApnCamera::read_FanMode()
945 void CApnCamera::write_FanMode( Apn_FanMode FanMode
)
947 unsigned short RegVal
;
948 unsigned short OpRegA
;
951 if ( m_pvtFanMode
== FanMode
)
954 if ( m_pvtCoolerEnable
)
956 Read( FPGA_REG_OP_A
, OpRegA
);
957 OpRegA
|= FPGA_BIT_TEMP_SUSPEND
;
958 Write( FPGA_REG_OP_A
, OpRegA
);
962 Read( FPGA_REG_GENERAL_STATUS
, RegVal
);
963 } while ( (RegVal
& FPGA_BIT_STATUS_TEMP_SUSPEND_ACK
) == 0 );
969 case Apn_FanMode_Off
:
970 RegVal
= APN_FAN_SPEED_OFF
;
972 case Apn_FanMode_Low
:
973 RegVal
= APN_FAN_SPEED_LOW
;
975 case Apn_FanMode_Medium
:
976 RegVal
= APN_FAN_SPEED_MEDIUM
;
978 case Apn_FanMode_High
:
979 RegVal
= APN_FAN_SPEED_HIGH
;
983 Write( FPGA_REG_FAN_SPEED_CONTROL
, RegVal
);
985 Read( FPGA_REG_OP_B
, RegVal
);
986 RegVal
|= FPGA_BIT_DAC_SELECT_ZERO
;
987 RegVal
&= ~FPGA_BIT_DAC_SELECT_ONE
;
988 Write( FPGA_REG_OP_B
, RegVal
);
990 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_DAC_LOAD
);
992 m_pvtFanMode
= FanMode
;
994 if ( m_pvtCoolerEnable
)
996 OpRegA
&= ~FPGA_BIT_TEMP_SUSPEND
;
997 Write( FPGA_REG_OP_A
, OpRegA
);
1001 double CApnCamera::read_ShutterStrobePosition()
1003 return m_pvtShutterStrobePosition
;
1006 void CApnCamera::write_ShutterStrobePosition( double Position
)
1008 unsigned short RegVal
;
1010 if ( Position
< APN_STROBE_POSITION_MIN
)
1011 Position
= APN_STROBE_POSITION_MIN
;
1013 RegVal
= (unsigned short)((Position
- APN_STROBE_POSITION_MIN
) / APN_TIMER_RESOLUTION
);
1015 Write( FPGA_REG_SHUTTER_STROBE_POSITION
, RegVal
);
1017 m_pvtShutterStrobePosition
= Position
;
1020 double CApnCamera::read_ShutterStrobePeriod()
1022 return m_pvtShutterStrobePeriod
;
1025 void CApnCamera::write_ShutterStrobePeriod( double Period
)
1027 unsigned short RegVal
;
1029 if ( Period
< APN_STROBE_PERIOD_MIN
)
1030 Period
= APN_STROBE_PERIOD_MIN
;
1032 RegVal
= (unsigned short)((Period
- APN_STROBE_PERIOD_MIN
) / APN_PERIOD_TIMER_RESOLUTION
);
1034 Write( FPGA_REG_SHUTTER_STROBE_PERIOD
, RegVal
);
1036 m_pvtShutterStrobePeriod
= Period
;
1039 double CApnCamera::read_SequenceDelay()
1041 return m_pvtSequenceDelay
;
1044 void CApnCamera::write_SequenceDelay( double Delay
)
1046 unsigned short RegVal
;
1048 if ( Delay
> APN_SEQUENCE_DELAY_LIMIT
)
1049 Delay
= APN_SEQUENCE_DELAY_LIMIT
;
1051 m_pvtSequenceDelay
= Delay
;
1053 RegVal
= (unsigned short)(Delay
/ APN_SEQUENCE_DELAY_RESOLUTION
);
1055 Write( FPGA_REG_SEQUENCE_DELAY
, RegVal
);
1058 bool CApnCamera::read_VariableSequenceDelay()
1060 unsigned short RegVal
;
1061 Read( FPGA_REG_OP_A
, RegVal
);
1062 // variable delay occurs when the bit is 0
1063 return ( (RegVal
& FPGA_BIT_DELAY_MODE
) == 0 );
1066 void CApnCamera::write_VariableSequenceDelay( bool VariableSequenceDelay
)
1068 unsigned short RegVal
;
1070 Read( FPGA_REG_OP_A
, RegVal
);
1072 if ( VariableSequenceDelay
)
1073 RegVal
&= ~FPGA_BIT_DELAY_MODE
; // variable when zero
1075 RegVal
|= FPGA_BIT_DELAY_MODE
; // constant when one
1077 Write( FPGA_REG_OP_A
, RegVal
);
1080 unsigned short CApnCamera::read_ImageCount()
1082 return m_pvtImageCount
;
1085 void CApnCamera::write_ImageCount( unsigned short Count
)
1090 Write( FPGA_REG_IMAGE_COUNT
, Count
);
1092 m_pvtImageCount
= Count
;
1095 void CApnCamera::write_RoiBinningH( unsigned short BinningH
)
1097 // Check to see if we actually need to update the binning
1098 if ( BinningH
!= m_RoiBinningH
)
1101 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
1103 LoadRoiPattern( BinningH
);
1104 m_RoiBinningH
= BinningH
;
1107 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
1110 Write( FPGA_REG_COMMAND_A
, FPGA_BIT_CMD_FLUSH
);
1114 void CApnCamera::write_RoiBinningV( unsigned short BinningV
)
1116 // Check to see if we actually need to update the binning
1117 if ( BinningV
!= m_RoiBinningV
)
1119 m_RoiBinningV
= BinningV
;
1123 void CApnCamera::write_RoiPixelsV( unsigned short PixelsV
)
1125 m_RoiPixelsV
= PixelsV
;
1128 void CApnCamera::write_RoiStartY( unsigned short StartY
)
1130 m_RoiStartY
= StartY
;
1133 unsigned short CApnCamera::read_OverscanColumns()
1135 return m_ApnSensorInfo
->m_OverscanColumns
;
1138 unsigned short CApnCamera::read_MaxBinningV()
1140 if ( m_ApnSensorInfo
->m_ImagingRows
< APN_VBINNING_MAX
)
1141 return m_ApnSensorInfo
->m_ImagingRows
;
1143 return APN_VBINNING_MAX
;
1146 unsigned short CApnCamera::read_SequenceCounter()
1148 unsigned short RegVal
;
1149 Read( FPGA_REG_SEQUENCE_COUNTER
, RegVal
);
1153 unsigned short CApnCamera::read_TDICounter()
1155 unsigned short RegVal
;
1156 Read( FPGA_REG_TDI_COUNTER
, RegVal
);
1160 unsigned short CApnCamera::read_TDIRows()
1162 return m_pvtTDIRows
;
1165 void CApnCamera::write_TDIRows( unsigned short TdiRows
)
1167 if ( TdiRows
== 0 ) // Make sure the TDI row count is at least 1
1170 Write( FPGA_REG_TDI_COUNT
, TdiRows
);
1171 m_pvtTDIRows
= TdiRows
;
1174 double CApnCamera::read_TDIRate()
1176 return m_pvtTDIRate
;
1179 void CApnCamera::write_TDIRate( double TdiRate
)
1181 unsigned short RegVal
;
1183 if ( TdiRate
< APN_TDI_RATE_MIN
)
1184 TdiRate
= APN_TDI_RATE_MIN
;
1186 if ( TdiRate
> APN_TDI_RATE_MAX
)
1187 TdiRate
= APN_TDI_RATE_MAX
;
1189 RegVal
= (unsigned short)( TdiRate
/ APN_TDI_RATE_RESOLUTION
);
1191 Write( FPGA_REG_TDI_RATE
, RegVal
);
1193 m_pvtTDIRate
= TdiRate
;
1196 unsigned short CApnCamera::read_IoPortAssignment()
1198 unsigned short RegVal
;
1199 Read( FPGA_REG_IO_PORT_ASSIGNMENT
, RegVal
);
1200 RegVal
&= FPGA_MASK_IO_PORT_ASSIGNMENT
;
1204 void CApnCamera::write_IoPortAssignment( unsigned short IoPortAssignment
)
1206 IoPortAssignment
&= FPGA_MASK_IO_PORT_ASSIGNMENT
;
1207 Write( FPGA_REG_IO_PORT_ASSIGNMENT
, IoPortAssignment
);
1210 unsigned short CApnCamera::read_IoPortDirection()
1212 unsigned short RegVal
;
1213 Read( FPGA_REG_IO_PORT_DIRECTION
, RegVal
);
1214 RegVal
&= FPGA_MASK_IO_PORT_DIRECTION
;
1218 void CApnCamera::write_IoPortDirection( unsigned short IoPortDirection
)
1220 IoPortDirection
&= FPGA_MASK_IO_PORT_DIRECTION
;
1221 Write( FPGA_REG_IO_PORT_DIRECTION
, IoPortDirection
);
1224 unsigned short CApnCamera::read_IoPortData()
1226 unsigned short RegVal
;
1227 Read( FPGA_REG_IO_PORT_READ
, RegVal
);
1228 RegVal
&= FPGA_MASK_IO_PORT_DATA
;
1232 void CApnCamera::write_IoPortData( unsigned short IoPortData
)
1234 IoPortData
&= FPGA_MASK_IO_PORT_DATA
;
1235 Write( FPGA_REG_IO_PORT_WRITE
, IoPortData
);
1238 unsigned short CApnCamera::read_TwelveBitGain()
1240 return m_pvtTwelveBitGain
;
1243 void CApnCamera::write_TwelveBitGain( unsigned short TwelveBitGain
)
1245 unsigned short NewVal
;
1246 unsigned short StartVal
;
1247 unsigned short FirstBit
;
1250 StartVal
= TwelveBitGain
& 0x3FF;
1252 for ( int i
=0; i
<10; i
++ )
1254 FirstBit
= ( StartVal
& 0x0001 );
1255 NewVal
|= ( FirstBit
<< (10-i
) );
1256 StartVal
= StartVal
>> 1;
1261 Write( FPGA_REG_AD_CONFIG_DATA
, NewVal
);
1262 Write( FPGA_REG_COMMAND_B
, 0x8000 );
1264 m_pvtTwelveBitGain
= TwelveBitGain
& 0x3FF;
1267 double CApnCamera::read_MaxExposureTime()
1269 return APN_EXPOSURE_TIME_MAX
;
1272 double CApnCamera::read_TestLedBrightness()
1274 return m_pvtTestLedBrightness
;
1277 void CApnCamera::write_TestLedBrightness( double TestLedBrightness
)
1279 unsigned short RegVal
;
1280 unsigned short OpRegA
;
1283 if ( TestLedBrightness
== m_pvtTestLedBrightness
)
1286 if ( m_pvtCoolerEnable
)
1288 Read( FPGA_REG_OP_A
, OpRegA
);
1289 OpRegA
|= FPGA_BIT_TEMP_SUSPEND
;
1290 Write( FPGA_REG_OP_A
, OpRegA
);
1294 Read( FPGA_REG_GENERAL_STATUS
, RegVal
);
1295 } while ( (RegVal
& FPGA_BIT_STATUS_TEMP_SUSPEND_ACK
) == 0 );
1299 RegVal
= (unsigned short)( (double)FPGA_MASK_LED_ILLUMINATION
* (TestLedBrightness
/100.0) );
1301 Write( FPGA_REG_LED_DRIVE
, RegVal
);
1303 Read( FPGA_REG_OP_B
, RegVal
);
1304 RegVal
&= ~FPGA_BIT_DAC_SELECT_ZERO
;
1305 RegVal
|= FPGA_BIT_DAC_SELECT_ONE
;
1306 Write( FPGA_REG_OP_B
, RegVal
);
1308 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_DAC_LOAD
);
1310 m_pvtTestLedBrightness
= TestLedBrightness
;
1312 if ( m_pvtCoolerEnable
)
1314 OpRegA
&= ~FPGA_BIT_TEMP_SUSPEND
;
1315 Write( FPGA_REG_OP_A
, OpRegA
);
1326 long CApnCamera::LoadVerticalPattern()
1328 unsigned short RegData
;
1330 // Prime the RAM (Enable)
1331 Read( FPGA_REG_OP_B
, RegData
);
1332 RegData
|= FPGA_BIT_VRAM_ENABLE
;
1333 Write( FPGA_REG_OP_B
, RegData
);
1335 WriteMultiSRMD( FPGA_REG_VRAM_INPUT
,
1336 m_ApnSensorInfo
->m_VerticalPattern
.PatternData
,
1337 m_ApnSensorInfo
->m_VerticalPattern
.NumElements
);
1339 // RAM is now loaded (Disable)
1340 Read( FPGA_REG_OP_B
, RegData
);
1341 RegData
&= ~FPGA_BIT_VRAM_ENABLE
;
1342 Write( FPGA_REG_OP_B
, RegData
);
1348 long CApnCamera::LoadClampPattern()
1350 unsigned short RegData
;
1352 // Prime the RAM (Enable)
1353 Read( FPGA_REG_OP_B
, RegData
);
1354 RegData
|= FPGA_BIT_HCLAMP_ENABLE
;
1355 Write( FPGA_REG_OP_B
, RegData
);
1357 if ( m_DataBits
== Apn_Resolution_SixteenBit
)
1359 WriteHorizontalPattern( &m_ApnSensorInfo
->m_ClampPatternSixteen
,
1360 FPGA_REG_HCLAMP_INPUT
,
1363 else if ( m_DataBits
== Apn_Resolution_TwelveBit
)
1365 WriteHorizontalPattern( &m_ApnSensorInfo
->m_ClampPatternTwelve
,
1366 FPGA_REG_HCLAMP_INPUT
,
1370 // RAM is now loaded (Disable)
1371 Read( FPGA_REG_OP_B
, RegData
);
1372 RegData
&= ~FPGA_BIT_HCLAMP_ENABLE
;
1373 Write( FPGA_REG_OP_B
, RegData
);
1379 long CApnCamera::LoadSkipPattern()
1381 unsigned short RegData
;
1383 // Prime the RAM (Enable)
1384 Read( FPGA_REG_OP_B
, RegData
);
1385 RegData
|= FPGA_BIT_HSKIP_ENABLE
;
1386 Write( FPGA_REG_OP_B
, RegData
);
1388 if ( m_DataBits
== Apn_Resolution_SixteenBit
)
1390 WriteHorizontalPattern( &m_ApnSensorInfo
->m_SkipPatternSixteen
,
1391 FPGA_REG_HSKIP_INPUT
,
1394 else if ( m_DataBits
== Apn_Resolution_TwelveBit
)
1396 WriteHorizontalPattern( &m_ApnSensorInfo
->m_SkipPatternTwelve
,
1397 FPGA_REG_HSKIP_INPUT
,
1401 // RAM is now loaded (Disable)
1402 Read( FPGA_REG_OP_B
, RegData
);
1403 RegData
&= ~FPGA_BIT_HSKIP_ENABLE
;
1404 Write( FPGA_REG_OP_B
, RegData
);
1410 long CApnCamera::LoadRoiPattern( unsigned short binning
)
1412 unsigned short RegData
;
1414 // Prime the RAM (Enable)
1415 Read( FPGA_REG_OP_B
, RegData
);
1416 RegData
|= FPGA_BIT_HRAM_ENABLE
;
1417 Write( FPGA_REG_OP_B
, RegData
);
1419 if ( m_DataBits
== Apn_Resolution_SixteenBit
)
1421 WriteHorizontalPattern( &m_ApnSensorInfo
->m_RoiPatternSixteen
,
1422 FPGA_REG_HRAM_INPUT
,
1425 else if ( m_DataBits
== Apn_Resolution_TwelveBit
)
1427 WriteHorizontalPattern( &m_ApnSensorInfo
->m_RoiPatternTwelve
,
1428 FPGA_REG_HRAM_INPUT
,
1432 // RAM is now loaded (Disable)
1433 Read( FPGA_REG_OP_B
, RegData
);
1434 RegData
&= ~FPGA_BIT_HRAM_ENABLE
;
1435 Write( FPGA_REG_OP_B
, RegData
);
1441 long CApnCamera::WriteHorizontalPattern( APN_HPATTERN_FILE
*Pattern
,
1442 unsigned short RamReg
,
1443 unsigned short Binning
)
1446 unsigned short DataCount
;
1447 unsigned short *DataArray
;
1448 unsigned short Index
;
1449 unsigned short BinNumber
;
1453 BinNumber
= Binning
- 1; // arrays are zero-based
1455 DataCount
= Pattern
->RefNumElements
+
1456 Pattern
->BinNumElements
[BinNumber
] +
1457 Pattern
->SigNumElements
;
1459 DataArray
= (unsigned short *)malloc(DataCount
* sizeof(unsigned short));
1461 for ( i
=0; i
<Pattern
->RefNumElements
; i
++ )
1463 DataArray
[Index
] = Pattern
->RefPatternData
[i
];
1467 for ( i
=0; i
<Pattern
->BinNumElements
[BinNumber
]; i
++ )
1469 DataArray
[Index
] = Pattern
->BinPatternData
[BinNumber
][i
];
1473 for ( i
=0; i
<Pattern
->SigNumElements
; i
++ )
1475 DataArray
[Index
] = Pattern
->SigPatternData
[i
];
1479 WriteMultiSRMD( RamReg
, DataArray
, DataCount
);
1488 long CApnCamera::InitDefaults()
1490 unsigned short RegVal
;
1491 unsigned short CameraID
;
1492 unsigned short ShutterDelay
;
1494 unsigned short PreRoiRows
, PostRoiRows
;
1495 unsigned short PreRoiVBinning
, PostRoiVBinning
;
1496 unsigned short UnbinnedRoiY
; // Vertical ROI pixels
1499 // Read the Camera ID register
1500 Read( FPGA_REG_CAMERA_ID
, CameraID
);
1501 CameraID
&= FPGA_MASK_CAMERA_ID
;
1503 // Look up the ID and dynamically create the m_ApnSensorInfo object
1506 case APN_ALTA_KAF0401E_CAM_ID
:
1507 m_ApnSensorInfo
= new CApnCamData_KAF0401E
;
1509 case APN_ALTA_KAF1602E_CAM_ID
:
1510 m_ApnSensorInfo
= new CApnCamData_KAF1602E
;
1512 case APN_ALTA_KAF0261E_CAM_ID
:
1513 m_ApnSensorInfo
= new CApnCamData_KAF0261E
;
1515 case APN_ALTA_KAF1301E_CAM_ID
:
1516 m_ApnSensorInfo
= new CApnCamData_KAF1301E
;
1518 case APN_ALTA_KAF1401E_CAM_ID
:
1519 m_ApnSensorInfo
= new CApnCamData_KAF1401E
;
1521 case APN_ALTA_KAF1001E_CAM_ID
:
1522 m_ApnSensorInfo
= new CApnCamData_KAF1001E
;
1524 case APN_ALTA_KAF3200E_CAM_ID
:
1525 m_ApnSensorInfo
= new CApnCamData_KAF3200E
;
1527 case APN_ALTA_KAF4202_CAM_ID
:
1528 m_ApnSensorInfo
= new CApnCamData_KAF4202
;
1530 case APN_ALTA_KAF6303E_CAM_ID
:
1531 m_ApnSensorInfo
= new CApnCamData_KAF6303E
;
1533 case APN_ALTA_KAF16801E_CAM_ID
:
1534 m_ApnSensorInfo
= new CApnCamData_KAF16801E
;
1536 case APN_ALTA_TH7899_CAM_ID
:
1537 m_ApnSensorInfo
= new CApnCamData_TH7899
;
1539 case APN_ALTA_CCD4710LS_CAM_ID
:
1540 m_ApnSensorInfo
= new CApnCamData_CCD4710LS
;
1542 case APN_ALTA_CCD4710HS_CAM_ID
:
1543 m_ApnSensorInfo
= new CApnCamData_CCD4710HS
;
1545 case APN_ALTA_CCD4240LS_CAM_ID
:
1546 m_ApnSensorInfo
= new CApnCamData_CCD4240LS
;
1548 case APN_ALTA_CCD4240HS_CAM_ID
:
1549 m_ApnSensorInfo
= new CApnCamData_CCD4240HS
;
1551 case APN_ALTA_CCD5710LS_CAM_ID
:
1552 m_ApnSensorInfo
= new CApnCamData_CCD5710LS
;
1554 case APN_ALTA_CCD5710HS_CAM_ID
:
1555 m_ApnSensorInfo
= new CApnCamData_CCD5710HS
;
1557 case APN_ALTA_CCD3011LS_CAM_ID
:
1558 m_ApnSensorInfo
= new CApnCamData_CCD3011LS
;
1560 case APN_ALTA_CCD3011HS_CAM_ID
:
1561 m_ApnSensorInfo
= new CApnCamData_CCD3011HS
;
1563 case APN_ALTA_CCD5520LS_CAM_ID
:
1564 m_ApnSensorInfo
= new CApnCamData_CCD5520LS
;
1566 case APN_ALTA_CCD5520HS_CAM_ID
:
1567 m_ApnSensorInfo
= new CApnCamData_CCD5520HS
;
1569 case APN_ALTA_CCD4720LS_CAM_ID
:
1570 m_ApnSensorInfo
= new CApnCamData_CCD4720LS
;
1572 case APN_ALTA_CCD4720HS_CAM_ID
:
1573 m_ApnSensorInfo
= new CApnCamData_CCD4720HS
;
1575 case APN_ALTA_CCD7700LS_CAM_ID
:
1576 m_ApnSensorInfo
= new CApnCamData_CCD7700LS
;
1578 case APN_ALTA_CCD7700HS_CAM_ID
:
1579 m_ApnSensorInfo
= new CApnCamData_CCD7700HS
;
1581 case APN_ALTA_CCD4710LS2_CAM_ID
:
1582 m_ApnSensorInfo
= new CApnCamData_CCD4710LS2
;
1584 case APN_ALTA_CCD4710LS3_CAM_ID
:
1585 m_ApnSensorInfo
= new CApnCamData_CCD4710LS3
;
1587 case APN_ALTA_CCD4710LS4_CAM_ID
:
1588 m_ApnSensorInfo
= new CApnCamData_CCD4710LS4
;
1590 case APN_ALTA_CCD4710LS5_CAM_ID
:
1591 m_ApnSensorInfo
= new CApnCamData_CCD4710LS5
;
1598 // we created the object, now set everything
1599 m_ApnSensorInfo
->Initialize();
1601 // Initialize public variables
1602 m_DigitizeOverscan
= false;
1603 m_DataBits
= Apn_Resolution_SixteenBit
;
1605 // Initialize private variables
1606 m_pvtCameraMode
= Apn_CameraMode_Normal
;
1607 m_pvtNetworkTransferMode
= Apn_NetworkMode_Tcp
;
1609 // Initialize variables used for imaging
1612 m_RoiPixelsH
= m_ApnSensorInfo
->m_ImagingColumns
;
1613 m_RoiPixelsV
= m_ApnSensorInfo
->m_ImagingRows
;
1617 printf ("Camera ID is %u\n",CameraID
);
1618 printf("sensor = %s\n", m_ApnSensorInfo
->m_Sensor
);
1619 printf("model = %s\n",m_ApnSensorInfo
->m_CameraModel
);
1620 printf("interline = %u\n",m_ApnSensorInfo
->m_InterlineCCD
);
1621 printf("serialA = %u\n",m_ApnSensorInfo
->m_SupportsSerialA
);
1622 printf("serialB = %u\n",m_ApnSensorInfo
->m_SupportsSerialB
);
1623 printf("ccdtype = %u\n",m_ApnSensorInfo
->m_SensorTypeCCD
);
1624 printf("Tcolumns = %u\n",m_ApnSensorInfo
->m_TotalColumns
);
1625 printf("ImgColumns = %u\n",m_ApnSensorInfo
->m_ImagingColumns
);
1626 printf("ClampColumns = %u\n",m_ApnSensorInfo
->m_ClampColumns
);
1627 printf("PreRoiSColumns = %u\n",m_ApnSensorInfo
->m_PreRoiSkipColumns
);
1628 printf("PostRoiSColumns = %u\n",m_ApnSensorInfo
->m_PostRoiSkipColumns
);
1629 printf("OverscanColumns = %u\n",m_ApnSensorInfo
->m_OverscanColumns
);
1630 printf("TRows = %u\n",m_ApnSensorInfo
->m_TotalRows
);
1631 printf("ImgRows = %u\n",m_ApnSensorInfo
->m_ImagingRows
);
1632 printf("UnderscanRows = %u\n",m_ApnSensorInfo
->m_UnderscanRows
);
1633 printf("OverscanRows = %u\n",m_ApnSensorInfo
->m_OverscanRows
);
1634 printf("VFlushBinning = %u\n",m_ApnSensorInfo
->m_VFlushBinning
);
1635 printf("HFlushDisable = %u\n",m_ApnSensorInfo
->m_HFlushDisable
);
1636 printf("ShutterCloseDelay = %u\n",m_ApnSensorInfo
->m_ShutterCloseDelay
);
1637 printf("PixelSizeX = %lf\n",m_ApnSensorInfo
->m_PixelSizeX
);
1638 printf("PixelSizeY = %lf\n",m_ApnSensorInfo
->m_PixelSizeY
);
1639 printf("Color = %u\n",m_ApnSensorInfo
->m_Color
);
1640 // printf("ReportedGainTwelveBit = %lf\n",m_ApnSensorInfo->m_ReportedGainTwelveBit);
1641 printf("ReportedGainSixteenBit = %lf\n",m_ApnSensorInfo
->m_ReportedGainSixteenBit
);
1642 printf("MinSuggestedExpTime = %lf\n",m_ApnSensorInfo
->m_MinSuggestedExpTime
);
1643 printf("CoolingSupported = %u\n",m_ApnSensorInfo
->m_CoolingSupported
);
1644 printf("RegulatedCoolingSupported = %u\n",m_ApnSensorInfo
->m_RegulatedCoolingSupported
);
1645 printf("TempSetPoint = %lf\n",m_ApnSensorInfo
->m_TempSetPoint
);
1646 // printf("TempRegRate = %u\n",m_ApnSensorInfo->m_TempRegRate);
1647 printf("TempRampRateOne = %u\n",m_ApnSensorInfo
->m_TempRampRateOne
);
1648 printf("TempRampRateTwo = %u\n",m_ApnSensorInfo
->m_TempRampRateTwo
);
1649 printf("TempBackoffPoint = %lf\n",m_ApnSensorInfo
->m_TempBackoffPoint
);
1650 printf("DefaultGainTwelveBit = %u\n",m_ApnSensorInfo
->m_DefaultGainTwelveBit
);
1651 printf("DefaultOffsetTwelveBit = %u\n",m_ApnSensorInfo
->m_DefaultOffsetTwelveBit
);
1652 printf("DefaultRVoltage = %u\n",m_ApnSensorInfo
->m_DefaultRVoltage
);
1656 printf ("RoiPixelsH is %u\n",m_RoiPixelsH
);
1657 printf ("RoiPixelsV is %u\n",m_RoiPixelsV
);
1660 // Issue a clear command, so the registers are zeroed out
1661 // This will put the camera in a known state for us.
1662 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_CLEAR_ALL
);
1665 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
1667 // Load Inversion Masks
1668 Write( FPGA_REG_VRAM_INV_MASK
, m_ApnSensorInfo
->m_VerticalPattern
.Mask
);
1669 Write( FPGA_REG_HRAM_INV_MASK
, m_ApnSensorInfo
->m_RoiPatternSixteen
.Mask
);
1671 // Load Pattern Files
1672 LoadVerticalPattern();
1675 LoadRoiPattern( m_RoiBinningH
);
1677 // Program default camera settings
1678 Write( FPGA_REG_CLAMP_COUNT
, m_ApnSensorInfo
->m_ClampColumns
);
1679 Write( FPGA_REG_PREROI_SKIP_COUNT
, m_ApnSensorInfo
->m_PreRoiSkipColumns
);
1680 Write( FPGA_REG_ROI_COUNT
, m_ApnSensorInfo
->m_ImagingColumns
);
1681 Write( FPGA_REG_POSTROI_SKIP_COUNT
, m_ApnSensorInfo
->m_PostRoiSkipColumns
+
1682 m_ApnSensorInfo
->m_OverscanColumns
);
1684 // Since the default state of m_DigitizeOverscan is false, set the count to zero.
1685 Write( FPGA_REG_OVERSCAN_COUNT
, 0x0 );
1687 // Now calculate the vertical settings
1688 UnbinnedRoiY
= m_RoiPixelsV
* m_RoiBinningV
;
1690 PreRoiRows
= m_ApnSensorInfo
->m_UnderscanRows
+
1693 PostRoiRows
= m_ApnSensorInfo
->m_TotalRows
-
1698 PostRoiVBinning
= 1;
1700 // For interline CCDs, set "Fast Dump" mode if the particular array is NOT digitized
1701 if ( m_ApnSensorInfo
->m_InterlineCCD
)
1703 // use the fast dump feature to get rid of the data quickly.
1704 // one row, binning to the original row count
1705 // note that we only are not digitized in arrays 1 and 3
1706 PreRoiVBinning
= PreRoiRows
;
1707 PostRoiVBinning
= PostRoiRows
;
1709 PreRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
1710 PostRoiVBinning
|= FPGA_BIT_ARRAY_FASTDUMP
;
1716 // Program the vertical settings
1717 Write( FPGA_REG_A1_ROW_COUNT
, PreRoiRows
);
1718 Write( FPGA_REG_A1_VBINNING
, PreRoiVBinning
);
1720 Write( FPGA_REG_A2_ROW_COUNT
, m_RoiPixelsV
);
1721 Write( FPGA_REG_A2_VBINNING
, (m_RoiBinningV
| FPGA_BIT_ARRAY_DIGITIZE
) );
1723 Write( FPGA_REG_A3_ROW_COUNT
, PostRoiRows
);
1724 Write( FPGA_REG_A3_VBINNING
, PostRoiVBinning
);
1726 Write( FPGA_REG_VFLUSH_BINNING
, m_ApnSensorInfo
->m_VFlushBinning
);
1728 double CloseDelay
= (double)m_ApnSensorInfo
->m_ShutterCloseDelay
/ 1000;
1729 ShutterDelay
= (unsigned short)
1730 ( (CloseDelay
- APN_SHUTTER_CLOSE_DIFF
) / APN_TIMER_RESOLUTION
);
1732 Write( FPGA_REG_SHUTTER_CLOSE_DELAY
, ShutterDelay
);
1734 Write( FPGA_REG_IMAGE_COUNT
, 1 );
1735 Write( FPGA_REG_SEQUENCE_DELAY
, 0 );
1737 if ( m_ApnSensorInfo
->m_HFlushDisable
)
1739 Read( FPGA_REG_OP_A
, RegVal
);
1741 RegVal
|= FPGA_BIT_DISABLE_H_CLK
;
1743 Write( FPGA_REG_OP_A
, RegVal
);
1746 // Reset the camera again
1747 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_RESET
);
1750 Write( FPGA_REG_COMMAND_A
, FPGA_BIT_CMD_FLUSH
);
1752 // If we are a USB2 camera, set all the 12bit variables for the 12bit
1754 if ( m_CameraInterface
== Apn_Interface_USB
)
1757 write_TwelveBitGain( m_ApnSensorInfo
->m_DefaultGainTwelveBit
);
1758 WriteTwelveBitOffset();
1761 // Set the Fan State. Setting the private var first to make sure the write_FanMode
1762 // call thinks we're doing a state transition.
1763 // On write_FanMode return, our state will be Apn_FanMode_Medium
1764 m_pvtFanMode
= Apn_FanMode_Off
; // we're going to set this
1765 write_FanMode( Apn_FanMode_Medium
);
1767 // Initialize the LED states and the LED mode. There is nothing to output
1768 // to the device since we issued our CLEAR early in the init() process, and
1769 // we are now in a known state.
1770 m_pvtLedStateA
= Apn_LedState_Expose
;
1771 m_pvtLedStateB
= Apn_LedState_Expose
;
1772 m_pvtLedMode
= Apn_LedMode_EnableAll
;
1774 // Default value for test LED is 0%
1775 m_pvtTestLedBrightness
= 0.0;
1777 // Program our initial cooler values. The only cooler value that we reset
1778 // at init time is the backoff point. Everything else is left untouched, and
1779 // state information is determined from the camera controller.
1780 m_pvtCoolerBackoffPoint
= m_ApnSensorInfo
->m_TempBackoffPoint
;
1781 write_CoolerBackoffPoint( m_pvtCoolerBackoffPoint
);
1782 Write( FPGA_REG_TEMP_RAMP_DOWN_A
, m_ApnSensorInfo
->m_TempRampRateOne
);
1783 Write( FPGA_REG_TEMP_RAMP_DOWN_B
, m_ApnSensorInfo
->m_TempRampRateTwo
);
1784 // the collor code not only determines the m_pvtCoolerEnable state, but
1785 // also implicitly calls UpdateGeneralStatus() as part of read_CoolerStatus()
1786 if ( read_CoolerStatus() == Apn_CoolerStatus_Off
)
1787 m_pvtCoolerEnable
= false;
1789 m_pvtCoolerEnable
= true;
1791 m_pvtImageInProgress
= false;
1792 m_pvtImageReady
= false;
1797 long CApnCamera::InitTwelveBitAD()
1799 Write( FPGA_REG_AD_CONFIG_DATA
, 0x0028 );
1800 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_AD_CONFIG
);
1805 long CApnCamera::WriteTwelveBitOffset()
1807 unsigned short NewVal
;
1808 unsigned short StartVal
;
1809 unsigned short FirstBit
;
1813 StartVal
= m_ApnSensorInfo
->m_DefaultOffsetTwelveBit
& 0xFF;
1815 for ( int i
=0; i
<8; i
++ )
1817 FirstBit
= ( StartVal
& 0x0001 );
1818 NewVal
|= ( FirstBit
<< (10-i
) );
1819 StartVal
= StartVal
>> 1;
1824 Write( FPGA_REG_AD_CONFIG_DATA
, NewVal
);
1825 Write( FPGA_REG_COMMAND_B
, FPGA_BIT_CMD_AD_CONFIG
);
1830 void CApnCamera::UpdateGeneralStatus()
1832 unsigned short StatusReg
;
1833 unsigned short HeatsinkTempReg
;
1834 unsigned short CcdTempReg
;
1835 unsigned short CoolerDriveReg
;
1836 unsigned short VoltageReg
;
1837 unsigned short TdiCounterReg
;
1838 unsigned short SequenceCounterReg
;
1842 // Read the general status register of the device
1843 QueryStatusRegs( StatusReg
,
1849 SequenceCounterReg
);
1851 m_pvtStatusReg
= StatusReg
;
1853 HeatsinkTempReg
&= FPGA_MASK_TEMP_PARAMS
;
1854 CcdTempReg
&= FPGA_MASK_TEMP_PARAMS
;
1855 CoolerDriveReg
&= FPGA_MASK_TEMP_PARAMS
;
1856 VoltageReg
&= FPGA_MASK_INPUT_VOLTAGE
;
1858 if ( CoolerDriveReg
> 3200 )
1859 m_pvtCoolerDrive
= 100.0;
1861 m_pvtCoolerDrive
= ( (double)(CoolerDriveReg
- 600) / 2600.0 ) * 100.0;
1863 m_pvtCurrentCcdTemp
= ( (CcdTempReg
- APN_TEMP_SETPOINT_ZERO_POINT
)
1864 * APN_TEMP_DEGREES_PER_BIT
);
1866 m_pvtCurrentHeatsinkTemp
= ( (HeatsinkTempReg
- APN_TEMP_HEATSINK_ZERO_POINT
)
1867 * APN_TEMP_DEGREES_PER_BIT
);
1869 m_pvtInputVoltage
= VoltageReg
* APN_VOLTAGE_RESOLUTION
;
1871 // Update ShutterState
1872 m_pvtShutterState
= ( (m_pvtStatusReg
& FPGA_BIT_STATUS_SHUTTER_OPEN
) != 0 );
1876 bool CApnCamera::ImageReady()
1878 return m_pvtImageReady
;
1882 void CApnCamera::SignalImagingDone()
1884 m_pvtImageInProgress
= false;