File: AltaCcdAcqParams.cpp

package info (click to toggle)
libapogee3 3.2%2B20221221183454-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,284 kB
  • sloc: cpp: 26,737; sh: 8; makefile: 3
file content (429 lines) | stat: -rw-r--r-- 12,973 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
/*! 
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright(c) 2010 Apogee Instruments, Inc. 
* \class AltaCcdAcqParams
* \brief derived class for managing the Alta's ADCs,
*         horizontal pattern files, and roi parameters 
* 
*/ 

#include "AltaCcdAcqParams.h" 
#include "apgHelper.h" 
#include "ApgLogger.h" 
#include "CameraIo.h" 
#include "CamHelpers.h" 
#include "ApnCamData.h"
#include "CamCfgMatrix.h"
#include "indimacros.h"

#include <sstream>

namespace
{
    // values for configuring the camera's pixel A to D converter
    const uint16_t AD9842_GAIN_MASK = 0x3FF;
    const uint16_t AD9842_GAIN_BIT = 0x4000;
    const uint16_t AD9842_OFFSET_MASK = 0xFF;
    const uint16_t AD9842_OFFSET_BIT = 0x2000;
    const uint16_t AD9842_RESET = 0x48;
}

//////////////////////////// 
// CTOR 
AltaCcdAcqParams::AltaCcdAcqParams(std::shared_ptr<CApnCamData> & camData,
                           std::shared_ptr<CameraIo> & camIo,  
                           std::shared_ptr<PlatformData> & platformData) : 
                                                                CcdAcqParams(camData,camIo,platformData),
                                                                m_fileName(__FILE__),
                                                                m_Adc12BitGain(0),
                                                                m_Adc12BitOffset(0)
{ 

}

//////////////////////////// 
// DTOR 
AltaCcdAcqParams::~AltaCcdAcqParams() 
{ 

} 

//////////////////////////// 
// INIT
void AltaCcdAcqParams::Init()
{
    if( CamCfg::ApnAdType_Alta_Twelve == m_CamData->m_MetaData.AlternativeADType )
    {
        PrimeAdc();

        Set12BitGain(  
            static_cast<uint16_t>(m_CamData->m_MetaData.DefaultGainLeft) );
        
        Set12BitOffset( 
            static_cast<uint16_t>(m_CamData->m_MetaData.DefaultOffsetLeft) );
    }

    SetSpeed( Apg::AdcSpeed_Normal );
}

//////////////////////////// 
// PRIME    ADC
void AltaCcdAcqParams::PrimeAdc()
{
    //reseting the ADC - john remmington fix
    m_CamIo->WriteReg( CameraRegs::AD_CONFIG_DATA, AD9842_RESET );
	m_CamIo->WriteReg( CameraRegs::CMD_B, CameraRegs::CMD_B_AD_CONFIG_BIT );

    m_CamIo->WriteReg( CameraRegs::AD_CONFIG_DATA,  m_CamData->m_MetaData.AdCfg );
    m_CamIo->WriteReg( CameraRegs::CMD_B, CameraRegs::CMD_B_AD_CONFIG_BIT );
}

//////////////////////////// 
//  SET   ADC      RESOLUTION
void AltaCcdAcqParams::SetResolution( 
            const Apg::Resolution res )
{
    switch( res )
    {
        case Apg::Resolution_SixteenBit:
            SetSpeed( Apg::AdcSpeed_Normal );
        break;

        case Apg::Resolution_TwelveBit:
          SetSpeed( Apg::AdcSpeed_Fast );
        break;

        default:
        {
            std::stringstream msg;
            msg << "Invalid adc resolution, " << res;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }
        break;
    }

}

//////////////////////////// 
//  SET   ADC      SPEED
void AltaCcdAcqParams::SetSpeed( const Apg::AdcSpeed speed )
{
    // Reset the camera
    m_CamIo->Reset( false );

    switch( speed )
    {
        case Apg::AdcSpeed_Fast:
            //checking pre-conditions
            if( CamCfg::ApnAdType_Alta_Twelve != m_CamData->m_MetaData.AlternativeADType)
            {
                std::stringstream msg;
                msg << "Invalid adc type " << m_CamData->m_MetaData.AlternativeADType;
                msg << " for 12bit conversion.";
                apgHelper::throwRuntimeException(m_fileName, msg.str(), 
                    __LINE__, Apg::ErrorType_InvalidOperation );
            }

            if( CamModel::ETHERNET == m_CamIo->GetInterfaceType() )
            {
                 std::string vinfo = apgHelper::mkMsg( m_fileName, 
                    "Apg::Resolution_TwelveBit not supported on alta ethernet interface.", 
                    __LINE__);
                ApgLogger::Instance().Write(ApgLogger::LEVEL_RELEASE,"warn",vinfo);

                //exit here...
                return;
            }

            //ensure the number of cols to bin are ok
            if( GetNumCols2Bin() > GetMaxFastBinCols() )
            {
                std::stringstream msg;
                msg << "Resetting imaging columns to " << GetMaxFastBinCols();
                msg << " because current bin value of " << GetNumCols2Bin();
                msg << " is not supported in fast mode.";
                std::string vinfo = apgHelper::mkMsg( m_fileName, msg.str(), __LINE__);
                ApgLogger::Instance().Write(ApgLogger::LEVEL_RELEASE,"warn",vinfo);

                SetNumCols2Bin( GetMaxFastBinCols() );
            }

            m_CamIo->ReadOrWriteReg(CameraRegs::OP_A, 
                CameraRegs::OP_A_DIGITIZATION_RES_BIT);
        break;

        case Apg::AdcSpeed_Normal:
            //checking pre-conditions
            if( CamCfg::ApnAdType_Alta_Sixteen != m_CamData->m_MetaData.PrimaryADType )
            {
                std::stringstream msg;
                msg << "Invalid adc type " << m_CamData->m_MetaData.PrimaryADType;
                msg << " for 16bit conversion.";
                apgHelper::throwRuntimeException(m_fileName, msg.str(), 
                    __LINE__, Apg::ErrorType_InvalidOperation );
            }

             //ensure the number of cols to bin are ok
            if( GetNumCols2Bin() > GetMaxNormalBinCols() )
            {
                std::stringstream msg;
                msg << "Resetting imaging columns to " << GetMaxNormalBinCols();
                msg << " because current bin value of " << GetNumCols2Bin();
                msg << " is not supported in nomral mode.";
                std::string vinfo = apgHelper::mkMsg( m_fileName, msg.str(), __LINE__);
                ApgLogger::Instance().Write(ApgLogger::LEVEL_RELEASE,"warn",vinfo);

                SetNumCols2Bin( GetMaxNormalBinCols() );
            }

            m_CamIo->ReadAndWriteReg( CameraRegs::OP_A, 
                    static_cast<uint16_t>(~CameraRegs::OP_A_DIGITIZATION_RES_BIT) );
        break;

        default:
        {
            std::stringstream msg;
            msg << "Invalid adc speed " << speed;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }
        break;
    }

    // reload all of the pattern files for given speed and binning
    // not 100% sure if we still need to this, because we are only
    // loading the roi for the given speed in gen2 cameras (Ascent, AltaF, AltaG)
    // but this was what was done before so not going to change it now
    CcdAcqParams::LoadAllPatternFiles( speed, GetNumCols2Bin() );

     // Reset the camera and start flushing
    m_CamIo->Reset( true );

    //store the speed value
    m_speed = speed;

    //resoultion and speed are tied together
    m_AdcRes = ( Apg::AdcSpeed_Fast == speed ?  
        Apg::Resolution_TwelveBit : Apg::Resolution_SixteenBit);
}

//////////////////////////// 
// SET   12BIT   GAIN
void AltaCcdAcqParams::Set12BitGain( const uint16_t gain ) 
{
    uint16_t NewVal = 0x0;
    uint16_t StartVal = gain & AD9842_GAIN_MASK;
    uint16_t FirstBit = 0;

    for ( int32_t i=0; i<10; ++i )
    {
	    FirstBit = ( StartVal & 0x0001 );
	    NewVal |= ( FirstBit << (10-i) );
	    StartVal = StartVal >> 1;
    }

    NewVal |= AD9842_GAIN_BIT;

    m_CamIo->WriteReg( CameraRegs::AD_CONFIG_DATA, NewVal );
    m_CamIo->WriteReg( CameraRegs::CMD_B, 0x8000 );

    m_Adc12BitGain = gain & AD9842_GAIN_MASK;
}


//////////////////////////// 
// SET   12BIT   OFFSET
void AltaCcdAcqParams::Set12BitOffset( const uint16_t offset )
{
    uint16_t NewVal = 0x0;
    uint16_t StartVal = offset & AD9842_OFFSET_MASK;
    uint16_t FirstBit = 0;

    for ( int32_t i=0; i<8; i++ )
    {
	    FirstBit = ( StartVal & 0x0001 );
	    NewVal |= ( FirstBit << (10-i) );
	    StartVal = StartVal >> 1;
    }

    NewVal |= AD9842_OFFSET_BIT;

    m_CamIo->WriteReg( CameraRegs::AD_CONFIG_DATA, NewVal );
    m_CamIo->WriteReg( CameraRegs::CMD_B, CameraRegs::CMD_B_AD_CONFIG_BIT);

    m_Adc12BitOffset = offset;
}

//////////////////////////// 
// GET  16BIT      GAIN
double AltaCcdAcqParams::Get16bitGain()
{
    return m_CamData->m_MetaData.ReportedGainSixteenBit;
}

//////////////////////////// 
// IS      ADS        SIM     MODE         ON    
bool AltaCcdAcqParams::IsAdsSimModeOn()
{
    //reading from the mirror, b/c the registers cannot always be read
    return( (m_CamIo->ReadMirrorReg(CameraRegs::OP_B) & CameraRegs::OP_B_AD_SIMULATION_BIT) ? true : false);
}

//////////////////////////// 
//      SET     ADC        GAIN 
void AltaCcdAcqParams::SetAdcGain( uint16_t gain, int32_t ad, int32_t channel )
{
    INDI_UNUSED(channel);
    //channel is a no op on altas
    switch( ad )
    {
        case 1:
            return this->Set12BitGain( gain );
        break;

        default:
        {
            std::stringstream msg;
            msg << "Cannot SetAdcGain invalid adc value " << ad;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }    
        break;
    }
}

//////////////////////////// 
//      GET     ADC        GAIN 
uint16_t AltaCcdAcqParams::GetAdcGain( const int32_t ad, const  int32_t channel )
{
    INDI_UNUSED(channel);
    //channel is a no op on altas
    switch( ad )
    {
        case 0:
            return static_cast<uint16_t>( Get16bitGain() );
        break;

        case 1:
            return Get12BitGain();
        break;

        default:
        {
            std::stringstream msg;
            msg << "Cannot GetAdcGain invalid adc value " << ad;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }    
        break;
    }

    //should never reach here
    return 0;
}

//////////////////////////// 
//      SET     ADC        OFFSET
void AltaCcdAcqParams::SetAdcOffset( uint16_t offset, int32_t ad, int32_t channel )
{
    INDI_UNUSED(channel);
    //channel is a no op on altas
    switch( ad )
    {
        case 1:
            return Set12BitOffset( offset );
        break;

        default:
        {
            std::stringstream msg;
            msg << "Cannot SetAdcOffset invalid adc value " << ad;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }    
        break;
    }
}

//////////////////////////// 
//      GET     ADC        OFFSET
uint16_t AltaCcdAcqParams::GetAdcOffset( int32_t ad, int32_t channel )
{
    INDI_UNUSED(channel);
    //channel is a no op on altas
    switch( ad )
    {
        case 1:
            return Get12BitOffset();
        break;

        default:
        {
            std::stringstream msg;
            msg << "Cannot GetAdcOffset invalid adc value " << ad;
            apgHelper::throwRuntimeException( m_fileName, msg.str(), 
                __LINE__, Apg::ErrorType_InvalidUsage );
        }    
        break;
    }

    //should never reach here
    return 0;
}

//////////////////////////// 
//          GET    TOTAL    CCD    COLS
uint16_t AltaCcdAcqParams::GetTotalCcdCols()
{
    return m_CamData->m_MetaData.TotalColumns;
}

//////////////////////////// 
//      CALC   H     POST  ROI     SKIP
uint16_t AltaCcdAcqParams::CalcHPostRoiSkip(const uint16_t HPreRoiSkip,
                                               const uint16_t UnbinnedRoiCols )
{
    return (m_CamData->m_MetaData.TotalColumns -
		      m_CamData->m_MetaData.ClampColumns - 
              HPreRoiSkip - 
              UnbinnedRoiCols);
}

//////////////////////////// 
//      IS     COL        CALC   GOOD
bool AltaCcdAcqParams::IsColCalcGood( const uint16_t UnbinnedRoiCols,
                                     const uint16_t PreRoiSkip, const uint16_t PostRoiSkip)
{
    const uint16_t TotalCols = UnbinnedRoiCols + 
        PreRoiSkip + PostRoiSkip + m_CamData->m_MetaData.ClampColumns;

    return ( TotalCols == GetTotalCcdCols() ? true : false );
}

//////////////////////////// 
// GET     PIXEL      SHIFT
uint16_t AltaCcdAcqParams::GetPixelShift()
{
    if( IsAdsSimModeOn() )
    {
        return 0;
    }
    else
    {
        return( Apg::Resolution_TwelveBit == m_AdcRes ? 
            m_CamData->m_MetaData.AlternativeADLatency : 
            m_CamData->m_MetaData.PrimaryADLatency);
    }
}

//////////////////////////// 
//       GET        H          PATTERN
CamCfg::APN_HPATTERN_FILE AltaCcdAcqParams::GetHPattern( const Apg::AdcSpeed speed,
            const CcdAcqParams::HPatternType ptype )
{
    return DefaultGetHPattern( speed, ptype );
}