• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kstars

CameraIO_LinuxPPI.cpp

Go to the documentation of this file.
00001 // CameraIO.cpp: implementation of the CCameraIO class.
00002 //
00003 // Copyright (c) 2000 Apogee Instruments Inc.
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 //#include "tcl.h"
00029 //#include "ccd.h"
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 // Construction/Destruction
00044 
00045 void CCameraIO::InitDefaults()
00046 {
00048     // Camera Settings
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     // Cooler Settings
00063 
00064         m_TempControl = true;
00065         m_TempCalibration = 160;
00066         m_TempScale = 2.1;  
00067         
00069     // Exposure Settings
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     // Geometry Settings
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     // CCD Settings
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     // Internal variables
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;    // limit input to our address range  
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 );    // application program bug 
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 // Returns 0 if successfull, 1 if Line_Done poll timed out. 
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         // Clock out the line 
00181         m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;     // set bit to 1 
00182         Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00183          
00184         m_RegShadow[ Reg_Command ] &= ~RegBit_StartNextLine;    // set bit to 0 
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     // Assert done reading line 
00204     m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;   // set bit to 1 
00205     Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00206      
00207     m_RegShadow[ Reg_Command ] &= ~RegBit_DoneReading;  // set bit to 0 
00208     Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00210  
00211     if ( !m_TDI ) 
00212     { 
00214         // Wait until camera is done 
00215         clock_t StopTime = clock() + CLOCKS_PER_SEC;    // wait at most one second 
00216         while ( true ) 
00217         { 
00218             unsigned short val = 0; 
00219             Read( Reg_Status, val ); 
00220             if ( ( val & RegBit_LineDone ) != 0 ) break;// Line done 
00221              
00222             if ( clock() > StopTime ) return 1;     // Timed out 
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;         // set bit to 1
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;        // set bit to 0
00252         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00253 
00254         return 0;
00255 }
00256 
00257 
00258 
00259 // Returns 0 if successfull, 1 if Line_Done poll timed out.
00260 long CCameraIO::InternalReadLine( bool KeepData, long SkipC, long XEnd, unsigned short* pLineBuffer )
00261 {
00262       struct apIOparam request;
00263       int retval, status;
00264 
00266         // Clock out the line
00267         m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;             // set bit to 1
00268         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00269 
00270         m_RegShadow[ Reg_Command ] &= !RegBit_StartNextLine;    // set bit to 0
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         // Assert done reading line
00297         m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;       // set bit to 1
00298         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00299 
00300         m_RegShadow[ Reg_Command ] &= !RegBit_DoneReading;      // set bit to 0
00301         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00303 
00305         // Wait until camera is done clocking
00306         clock_t StopTime = clock() + CLOCKS_PER_SEC;    // wait at most one second
00307         while ( true )
00308         {
00309                 unsigned short val = 0;
00310                 Read( Reg_Status, val );
00311                 if ( ( val & RegBit_LineDone ) != 0 ) break;// Line done
00312 
00313                 clock_t CurrentTime = clock();
00314                 if ( CurrentTime > StopTime ) return 1;         // Timed out
00315         }
00316 
00317         return 0;
00318 }
00319 
00320 
00321 
00322 
00323 
00324 
00325 

kstars

Skip menu "kstars"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • keduca
  • kstars
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal