kstars
ApnCamera_NET.cpp
Go to the documentation of this file.00001
00002
00003
00005
00006 #include "stdafx.h"
00007 #include "ApnCamera_NET.h"
00008
00009 #include <stdio.h>
00010 #include <sys/types.h>
00011 #include <sys/stat.h>
00012
00013 #include "ApogeeNet.h"
00014 #include "ApogeeNetErr.h"
00015
00016
00018
00020
00021
00022
00023 bool CApnCamera::InitDriver( unsigned long CamIdA,
00024 unsigned short CamIdB,
00025 unsigned long Option )
00026 {
00027 char Hostname[25];
00028 BYTE ipAddr[4];
00029 int init;
00030
00031 ipAddr[0] = (BYTE)(CamIdA & 0xFF);
00032 ipAddr[1] = (BYTE)((CamIdA >> 8) & 0xFF);
00033 ipAddr[2] = (BYTE)((CamIdA >> 16) & 0xFF);
00034 ipAddr[3] = (BYTE)((CamIdA >> 24) & 0xFF);
00035
00036 sprintf( Hostname, "%u.%u.%u.%u:%u", ipAddr[3], ipAddr[2], ipAddr[1], ipAddr[0], CamIdB );
00037
00038 if ( ApnNetConnect( Hostname ) != APNET_SUCCESS )
00039 {
00040 return false;
00041 }
00042
00043 m_CameraInterface = Apn_Interface_NET;
00044
00045
00046 unsigned short RegData;
00047 unsigned short NewRegData;
00048
00049 RegData = 0x5AA5;
00050 if ( Write( FPGA_REG_SCRATCH, RegData ) != APNET_SUCCESS ) return false;
00051 if ( Read( FPGA_REG_SCRATCH, NewRegData ) != APNET_SUCCESS ) return false;
00052 if ( RegData != NewRegData ) return false;
00053
00054 RegData = 0xA55A;
00055 if ( Write( FPGA_REG_SCRATCH, RegData ) != APNET_SUCCESS ) return false;
00056 if ( Read( FPGA_REG_SCRATCH, NewRegData ) != APNET_SUCCESS ) return false;
00057 if ( RegData != NewRegData ) return false;
00058 printf("Loopback test successful - ALTA-E detected at %u.%u.%u.%u:%u\n", ipAddr[3], ipAddr[2], ipAddr[1], ipAddr[0]);
00059
00060
00061 init = InitDefaults();
00062 if ( init != 0 ) {
00063 printf("Loopback test successful - InitDefaults FAILED\n");
00064 return false;
00065 }
00066
00067 printf("Loopback test successful - InitDefaults completed\n");
00068 return true;
00069 }
00070
00071
00072 bool CApnCamera::CloseDriver()
00073 {
00074 ApnNetClose();
00075
00076 return true;
00077 }
00078
00079
00080 bool CApnCamera::GetImageData( unsigned short *pImageBuffer,
00081 unsigned short &Width,
00082 unsigned short &Height,
00083 unsigned long &Count )
00084 {
00085 unsigned short Offset;
00086 unsigned short *pTempBuffer;
00087 long i, j;
00088
00089
00090
00091
00092 while ( !ImageReady() )
00093 {
00094 Sleep( 50 );
00095 read_ImagingStatus();
00096 }
00097
00098 Width = m_pvtWidth;
00099 Height = m_pvtHeight;
00100
00101 if ( m_pvtBitsPerPixel == 16 )
00102 Offset = 1;
00103
00104 if ( m_pvtBitsPerPixel == 12 )
00105 Offset = 10;
00106
00107 Width -= Offset;
00108
00109 pTempBuffer = new unsigned short[(Width+Offset) * Height];
00110
00111 ApnNetGetImageTcp( pTempBuffer );
00112
00113 for ( i=0; i<Height; i++ )
00114 {
00115 for ( j=0; j<Width; j++ )
00116 {
00117 pImageBuffer[(i*Width)+j] = pTempBuffer[(i*(Width+Offset))+j+Offset];
00118 }
00119 }
00120
00121 delete [] pTempBuffer;
00122
00123 Count = read_ImageCount();
00124
00125 SignalImagingDone();
00126
00127 return true;
00128 }
00129
00130
00131 bool CApnCamera::GetLineData( unsigned short *pLineBuffer,
00132 unsigned short &Size )
00133 {
00134 Size = 0;
00135
00136 return false;
00137 }
00138
00139
00140 long CApnCamera::PreStartExpose( unsigned short BitsPerPixel )
00141 {
00142 m_pvtWidth = GetExposurePixelsH();
00143 m_pvtHeight = GetExposurePixelsV();
00144
00145 if ( (BitsPerPixel != 16) && (BitsPerPixel != 12) )
00146 {
00147
00148 return 1;
00149 }
00150
00151 m_pvtBitsPerPixel = BitsPerPixel;
00152
00153 if ( BitsPerPixel == 16 )
00154 m_pvtWidth += 1;
00155
00156 if ( BitsPerPixel == 12 )
00157 m_pvtWidth += 10;
00158
00159 if ( ApnNetStartExp( m_pvtWidth, m_pvtHeight ) != APNET_SUCCESS )
00160 {
00161 return 1;
00162 }
00163
00164 return 0;
00165 }
00166
00167
00168 long CApnCamera::PostStopExposure( bool DigitizeData )
00169 {
00170 if ( ApnNetStopExp( DigitizeData ) != APNET_SUCCESS )
00171 {
00172 return 1;
00173 }
00174
00175 if ( !DigitizeData )
00176 {
00177 SignalImagingDone();
00178 }
00179
00180 return 0;
00181 }
00182
00183
00184 void CApnCamera::SetNetworkTransferMode( Apn_NetworkMode TransferMode )
00185 {
00186 switch ( TransferMode )
00187 {
00188 case Apn_NetworkMode_Tcp:
00189 ApnNetSetSpeed( false );
00190 break;
00191 case Apn_NetworkMode_Udp:
00192 ApnNetSetSpeed( true );
00193 break;
00194 }
00195 }
00196
00197
00198 long CApnCamera::Read( unsigned short reg, unsigned short& val )
00199 {
00200 if ( ApnNetReadReg( reg, &val ) != APNET_SUCCESS )
00201 {
00202 return 1;
00203 }
00204 return 0;
00205 }
00206
00207
00208 long CApnCamera::Write( unsigned short reg, unsigned short val )
00209 {
00210 if ( ApnNetWriteReg( reg, val ) != APNET_SUCCESS )
00211 {
00212 return 1;
00213 }
00214
00215 return 0;
00216 }
00217
00218
00219 long CApnCamera::WriteMultiSRMD( unsigned short reg, unsigned short val[], unsigned short count )
00220 {
00221 if ( ApnNetWriteRegMulti( reg, val, count ) != APNET_SUCCESS )
00222 {
00223 return 1;
00224 }
00225
00226 return 0;
00227 }
00228
00229
00230 long CApnCamera::WriteMultiMRMD( unsigned short reg[], unsigned short val[], unsigned short count )
00231 {
00232 if ( ApnNetWriteRegMultiMRMD( reg, val, count ) != APNET_SUCCESS )
00233 {
00234 return 1;
00235 }
00236
00237 return 0;
00238 }
00239
00240
00241 long CApnCamera::QueryStatusRegs( unsigned short& StatusReg,
00242 unsigned short& HeatsinkTempReg,
00243 unsigned short& CcdTempReg,
00244 unsigned short& CoolerDriveReg,
00245 unsigned short& VoltageReg,
00246 unsigned short& TdiCounter,
00247 unsigned short& SequenceCounter )
00248 {
00249 unsigned short RegNumber[7];
00250 unsigned short RegData[7];
00251
00252 RegNumber[0] = 91;
00253 RegNumber[1] = 93;
00254 RegNumber[2] = 94;
00255 RegNumber[3] = 95;
00256 RegNumber[4] = 96;
00257 RegNumber[5] = 104;
00258 RegNumber[6] = 105;
00259
00260 if ( ApnNetReadRegMulti( RegNumber, RegData, 7 ) != APNET_SUCCESS )
00261 {
00262 return 1;
00263 }
00264
00265 StatusReg = RegData[0];
00266 HeatsinkTempReg = RegData[1];
00267 CcdTempReg = RegData[2];
00268 CoolerDriveReg = RegData[3];
00269 VoltageReg = RegData[4];
00270 TdiCounter = RegData[5];
00271 SequenceCounter = RegData[6];
00272
00273 return 0;
00274 }
00275