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

kstars

CameraIO_LinuxISA.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 #include "CameraIO_Linux.h"
00031 #include "ApogeeLinux.h"
00032 
00033 const int NUM_POSITIONS = 6;
00034 const int NUM_STEPS_PER_FILTER = 48;
00035 const int STEP_DELAY = 10;
00036 
00037 const unsigned char Steps[] = { 0x10, 0x30, 0x20, 0x60, 0x40, 0xc0, 0x80, 0x90 };
00038 const int NUM_STEPS = sizeof ( Steps );
00039 
00041 // Construction/Destruction
00043 
00044 void CCameraIO::InitDefaults()
00045 {
00047     // Camera Settings
00048         
00049         m_HighPriority = true;
00050         m_PPRepeat = 1; 
00051         m_DataBits = 16;    
00052         m_FastShutter = false;
00053         m_MaxBinX = 8;
00054         m_MaxBinY = 63;
00055         m_MaxExposure = 10485.75;
00056         m_MinExposure = 0.01;
00057         m_GuiderRelays = false;
00058         m_Timeout = 2.0;
00059 
00061     // Cooler Settings
00062 
00063         m_TempControl = true;
00064         m_TempCalibration = 160;
00065         m_TempScale = 2.1;  
00066         
00068     // Exposure Settings
00069 
00070         m_BinX = 1;
00071         m_BinY = 1;     
00072         m_StartX = 0;
00073         m_StartY = 0;   
00074         m_NumX = 1;
00075         m_NumY = 1;     
00076     
00078     // Geometry Settings
00079     
00080         m_Columns = 0;
00081         m_Rows = 0; 
00082         m_SkipC = 0;
00083         m_SkipR = 0;        
00084         m_HFlush = 1;
00085         m_VFlush = 1;   
00086         m_BIC = 4;
00087         m_BIR = 4;          
00088         m_ImgColumns = 0;
00089         m_ImgRows = 0;
00090 
00092     // CCD Settings
00093         
00094         memset( m_Sensor, 0, 256 );
00095         m_Color = false;
00096         m_Noise = 0.0;              
00097         m_Gain = 0.0;               
00098         m_PixelXSize = 0.0;     
00099         m_PixelYSize = 0.0;     
00100 
00102     // Internal variables
00103 
00104                 fileHandle = 0;
00105         m_RegisterOffset = 0;
00106         m_Interface = Camera_Interface_ISA; 
00107         m_SensorType = Camera_SensorType_CCD;
00108 }
00109 
00110 
00111  
00112 bool CCameraIO::InitDriver(unsigned short camnum) 
00113 { 
00114     char deviceName[64];
00115 
00116         sprintf(deviceName,"%s%d",APOGEE_ISA_DEVICE,camnum);
00117         fileHandle = ::open(deviceName,O_RDONLY);
00118         if (fileHandle == -1) return false;
00119     return true; 
00120 } 
00121  
00122 long CCameraIO::Write( unsigned short reg, unsigned short val ) 
00123 { 
00124         int status;
00125 
00126         struct apIOparam request;
00127     unsigned short realreg = ( reg << 1 ) & 0xE;    // limit input to our address range  
00128         request.reg = realreg;
00129         request.param1=(int)val;
00130         status=ioctl(fileHandle,APISA_WRITE_USHORT,(unsigned long)&request);
00131         return 0;
00132 } 
00133  
00134 long CCameraIO::Read( unsigned short reg, unsigned short& val ) 
00135 { 
00136     unsigned short realreg; 
00137         int retval, status;
00138         struct apIOparam request;
00139 
00140     switch ( reg ) 
00141     { 
00142     case Reg_ImageData: 
00143         realreg = RegISA_ImageData; 
00144         break; 
00145     case Reg_TempData: 
00146         realreg = RegISA_TempData; 
00147         break; 
00148     case Reg_Status: 
00149         realreg = RegISA_Status; 
00150         break; 
00151     case Reg_CommandReadback: 
00152         realreg = RegISA_CommandReadback; 
00153         break; 
00154     default: 
00155         assert( 1 );    // application program bug 
00156         val = 0; 
00157         return 0; 
00158     } 
00159 
00160         request.reg = realreg;
00161         request.param1=(unsigned long)&retval;
00162         status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00163         val = (unsigned short)retval;
00164     return 0; 
00165 } 
00166  
00167 // Returns 0 if successfull, 1 if Line_Done poll timed out. 
00168 long CCameraIO::ReadLine( long SkipPixels, long Pixels,unsigned short* pLineBuffer )
00169 { 
00170     int j;
00171     int retval, status;
00172     struct apIOparam request;
00173 
00174     if ( !m_TDI ) 
00175     { 
00177         // Clock out the line 
00178         m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;     // set bit to 1 
00179         Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00180          
00181         m_RegShadow[ Reg_Command ] &= ~RegBit_StartNextLine;    // set bit to 0 
00182         Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00184     } 
00185  
00186         request.reg = RegISA_ImageData;
00187         request.param1=(unsigned long)&retval;
00188 
00189     for (j = 0; j < SkipPixels; j++) 
00190     { 
00191              status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00192     } 
00193     for (j = 0; j < Pixels; j++) 
00194     { 
00195              status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00196          *pLineBuffer++ = (unsigned short)retval; 
00197     } 
00199     // Assert done reading line 
00200     m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;   // set bit to 1 
00201     Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00202      
00203     m_RegShadow[ Reg_Command ] &= ~RegBit_DoneReading;  // set bit to 0 
00204     Write( Reg_Command, m_RegShadow[ Reg_Command ] ); 
00206  
00207     if ( !m_TDI ) 
00208     { 
00210         // Wait until camera is done 
00211         clock_t StopTime = clock() + CLOCKS_PER_SEC;    // wait at most one second 
00212         while ( true ) 
00213         { 
00214             unsigned short val = 0; 
00215             Read( Reg_Status, val ); 
00216             if ( ( val & RegBit_LineDone ) != 0 ) break;// Line done 
00217              
00218             if ( clock() > StopTime ) return 1;     // Timed out 
00219         } 
00220     } 
00221  
00222     return 0; 
00223 } 
00224  
00225 
00226  
00227 long CCameraIO::ReadImage( unsigned short* pImageBuffer )
00228 {
00229         m_RegShadow[ Reg_Command ] |= RegBit_FIFOCache;         // set bit to 1
00230         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00231 
00232         long XEnd = long( m_ExposureNumX );
00233         long SkipC = long( m_ExposureSkipC );
00234         for (long i = 0; i < m_ExposureSkipR; i++)
00235         {
00236                 if( InternalReadLine( false, SkipC, XEnd, NULL ) ) return 1;
00237         }
00238 
00239         long YEnd = long( m_ExposureNumY );
00240         unsigned short* pLineBuffer = pImageBuffer;
00241         for (long i = 0; i < YEnd; i++)
00242         {
00243                 if ( InternalReadLine( true, SkipC, XEnd, pLineBuffer ) ) return 1;
00244                 pLineBuffer += XEnd;
00245         }
00246 
00247         m_RegShadow[ Reg_Command ] &= !RegBit_FIFOCache;        // set bit to 0
00248         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00249 
00250         return 0;
00251 }
00252 
00253 
00254 
00255 // Returns 0 if successfull, 1 if Line_Done poll timed out.
00256 long CCameraIO::InternalReadLine( bool KeepData, long SkipC, long XEnd, unsigned short* pLineBuffer )
00257 {
00258       struct apIOparam request;
00259       int retval, status;
00260 
00262         // Clock out the line
00263         m_RegShadow[ Reg_Command ] |= RegBit_StartNextLine;             // set bit to 1
00264         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00265 
00266         m_RegShadow[ Reg_Command ] &= !RegBit_StartNextLine;    // set bit to 0
00267         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00269 
00270         request.reg = RegISA_ImageData;
00271         request.param1=(unsigned long)&retval;
00272 
00273         for (long j = 0; j < SkipC; j++)
00274              status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00275 
00276         if ( KeepData )
00277         {
00278                 for (long j = 0; j < XEnd; j++) {
00279                   status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00280                   *pLineBuffer++ = (unsigned short)retval;
00281                 }
00282         }
00283         else
00284         {
00285                 for (long j = 0; j < XEnd; j++)
00286                   status=ioctl(fileHandle,APISA_READ_USHORT,(unsigned long)&request);
00287         }
00288 
00290         // Assert done reading line
00291         m_RegShadow[ Reg_Command ] |= RegBit_DoneReading;       // set bit to 1
00292         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00293 
00294         m_RegShadow[ Reg_Command ] &= !RegBit_DoneReading;      // set bit to 0
00295         Write( Reg_Command, m_RegShadow[ Reg_Command ] );
00297 
00299         // Wait until camera is done clocking
00300         clock_t StopTime = clock() + CLOCKS_PER_SEC;    // wait at most one second
00301         while ( true )
00302         {
00303                 unsigned short val = 0;
00304                 Read( Reg_Status, val );
00305                 if ( ( val & RegBit_LineDone ) != 0 ) break;// Line done
00306 
00307                 clock_t CurrentTime = clock();
00308                 if ( CurrentTime > StopTime ) return 1;         // Timed out
00309         }
00310 
00311         return 0;
00312 }
00313 
00314 
00315 
00316 
00317 
00318 
00319 

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