You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/indi/apogee/ApnCamera_USB.cpp

257 lines
5.0 KiB

// ApnCamera_USB.cpp: implementation of the CApnCamera_USB class.
//
// Copyright (c) 2003, 2004 Apogee Instruments, Inc.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ApnCamera_USB.h"
#include "ApogeeUsb.h"
#include "ApogeeUsbErr.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
bool CApnCamera::InitDriver( unsigned long CamIdA,
unsigned short /*CamIdB*/,
unsigned long /*Option*/ )
{
if ( ApnUsbOpen( (unsigned short)CamIdA ) != APN_USB_SUCCESS )
{
return false;
}
m_CameraInterface = Apn_Interface_USB;
// Before trying to initialize, perform a simple loopback test
unsigned short RegData;
unsigned short NewRegData;
RegData = 0x5AA5;
if ( Write( FPGA_REG_SCRATCH, RegData ) != APN_USB_SUCCESS ) return false;
if ( Read( FPGA_REG_SCRATCH, NewRegData ) != APN_USB_SUCCESS ) return false;
if ( RegData != NewRegData ) return false;
RegData = 0xA55A;
if ( Write( FPGA_REG_SCRATCH, RegData ) != APN_USB_SUCCESS ) return false;
if ( Read( FPGA_REG_SCRATCH, NewRegData ) != APN_USB_SUCCESS ) return false;
if ( RegData != NewRegData ) return false;
// The loopback test was successful. Proceed with initialization.
if ( InitDefaults() != 0 )
return false;
return true;
}
bool CApnCamera::CloseDriver()
{
ApnUsbClose();
return true;
}
void CApnCamera::SetNetworkTransferMode( Apn_NetworkMode /*TransferMode*/ )
{
return;
}
bool CApnCamera::GetImageData( unsigned short *pImageBuffer,
unsigned short &Width,
unsigned short &Height,
unsigned long &Count )
{
unsigned short Offset(0);
unsigned short *pTempBuffer;
long i, j;
// Make sure it is okay to get the image data
// The app *should* have done this on its own, but we have to make sure
while ( !ImageReady() )
{
Sleep( 50 );
read_ImagingStatus();
}
Width = m_pvtWidth;
Height = m_pvtHeight;
if ( m_pvtBitsPerPixel == 16 )
Offset = 1;
if ( m_pvtBitsPerPixel == 12 )
Offset = 10;
Width -= Offset; // Calculate the true image width
pTempBuffer = new unsigned short[(Width+Offset) * Height];
ApnUsbGetImage( pTempBuffer );
for ( i=0; i<Height; i++ )
{
for ( j=0; j<Width; j++ )
{
pImageBuffer[(i*Width)+j] = pTempBuffer[(i*(Width+Offset))+j+Offset];
}
}
delete [] pTempBuffer;
Count = read_ImageCount();
SignalImagingDone();
return true;
}
bool CApnCamera::GetLineData( unsigned short */*pLineBuffer*/,
unsigned short &Size )
{
Size = 0;
return false;
}
long CApnCamera::PreStartExpose( unsigned short BitsPerPixel )
{
m_pvtWidth = GetExposurePixelsH();
m_pvtHeight = GetExposurePixelsV();
if ( (BitsPerPixel != 16) && (BitsPerPixel != 12) )
{
// Invalid bit depth request
return 1;
}
m_pvtBitsPerPixel = BitsPerPixel;
if ( BitsPerPixel == 16 )
m_pvtWidth += 1;
if ( BitsPerPixel == 12 )
m_pvtWidth += 10;
if ( ApnUsbStartExp( m_pvtWidth, m_pvtHeight ) != APN_USB_SUCCESS )
{
return 1;
}
return 0;
}
long CApnCamera::PostStopExposure( bool DigitizeData )
{
PUSHORT pRequestData;
if ( !DigitizeData )
{
while ( !ImageReady() )
{
Sleep( 50 );
read_ImagingStatus();
}
pRequestData = new USHORT[m_pvtWidth*m_pvtHeight];
ApnUsbGetImage( pRequestData );
delete [] pRequestData;
SignalImagingDone();
}
// The following code will eventually be the implementation of the STOP
// command for USB. Currently, this does not work correctly.
// if ( ApnUsbStopExp( DigitizeData ) != APN_USB_SUCCESS )
// {
// return 1;
// }
return 0;
}
long CApnCamera::Read( unsigned short reg, unsigned short& val )
{
if ( ApnUsbReadReg( reg, &val ) != APN_USB_SUCCESS )
{
return 1; // Failure
}
return 0;
}
long CApnCamera::Write( unsigned short reg, unsigned short val )
{
if ( ApnUsbWriteReg( reg, val ) != APN_USB_SUCCESS )
{
return 1; // Failure
}
return 0;
}
long CApnCamera::WriteMultiSRMD( unsigned short reg, unsigned short val[], unsigned short count )
{
if ( ApnUsbWriteRegMulti( reg, val, count ) != APN_USB_SUCCESS )
{
return 1;
}
return 0;
}
long CApnCamera::WriteMultiMRMD( unsigned short reg[], unsigned short val[], unsigned short count )
{
if ( ApnUsbWriteRegMultiMRMD( reg, val, count ) != APN_USB_SUCCESS )
{
return 1;
}
return 0;
}
long CApnCamera::QueryStatusRegs( unsigned short& StatusReg,
unsigned short& HeatsinkTempReg,
unsigned short& CcdTempReg,
unsigned short& CoolerDriveReg,
unsigned short& VoltageReg,
unsigned short& TdiCounter,
unsigned short& SequenceCounter )
{
/*unsigned short stat,heat,ccdt,cool,volt,tdic,sequ;*/
if ( ApnUsbReadStatusRegs( &StatusReg,
&HeatsinkTempReg,
&CcdTempReg,
&CoolerDriveReg,
&VoltageReg,
&TdiCounter,
&SequenceCounter ) != APN_USB_SUCCESS )
{
return 1;
}
return 0;
}