/********************************* iarc_controller.c ******************************/
globals
CArcPCIe *pArcDev = NULL; // handle to ARC controller device driver
unsigned short *raw_data[10]; // 4 * [100 x NAXIS1 x NAXIS2 * sizeof(short)]
ic_open_device( int init_controller, char *dsp_filename ) called at application startup.
set default for iarc_setup.
for( i=0; i<4; i++)
raw_data[i] = malloc(100*2048*2048*sizeof(unsigned short));
FindDevices()
pArcDev = new CArcPCIe();
pArcDev->Open()
if( init_controller ) // note: default is 0.
pArcDev->LoadControllerFile(dsp_filename, true);
pArcDev->Command(TIM_ID, PON); // POWER_ON
pArcDev->Command(TIM_ID, GNL); or GNH // GAIN_LOW or GAIN_HIGH
create thread: readout_permo_thread()
create thread: idh_data_handler_thread()
return 0
ic_close_device() called at application termination.
pArcDev->Close();
pArcDev = NULL;
ic_init_controller( char *dsp_filename ) Called via "init"/ic_init() command.
pArcDev->LoadControllerFile(dsp_filename, true);
pArcDev->Command(TIM_ID, PON);
ic_set_controller_state(READY);
ic_readout( ) .
char *fn, // copied to iarc_setup.str_filename
int ndr_cnt, // copied to iarc_setup.ndr_cnt
int itime_ndr, // copied to iarc_setup.itime_ndrs
int coadd, // copied to iarc_setup.n_coadd_count
enum data_handling_mode_t dhm, // copied to iarc_setup.dhm
int pixtime, // copied to iarc_setup.n_pixel_time
int saveall, // Not used.
int x, int y, int w, int h // Not used.
n_image_count = f( dhm, ndr_cnt, itime_ndr, coadd); // cal image count
// setup call backs.
pArcDev->SetCallbacks(ReadoutCallback, ExposeCallback, FrameCallback);
if(tdl_test(pArcDev) < 0)
error;
update_controller_voltages(pArcDev); // queries controller bias and video board offset values. >
update_fits_cards() - update a FITS data area.
iarc_setup.n_readout_number = 0;
signal pth_cond_readout to continue readout_permo_thread()
This thread contines the readout, call of ic_readout() is the iarc_server so
it can go back serving the socket.
return.
update_controller_voltages( ) Reads controller Bias voltages, and reads 32 Video Offset values.
Data stored in
iarc_setup.voffset, vdd, vdda, vbg, vbp, vdsub, vrst
iarc_setup.offset[0..32].
readout_permo_thread( ) Continue the readout started by ic_readout()
while( 1 )
{
blocks on pth_cond_readout - // signal by ic_readout()
update_controller_voltages(pArcDev); // queries controller bias and video board offset values
update_fits_cards(); // update a FITS data area
// set gain
if(iarc_setup.n_gain_flag == LOW_GAIN)
pArcDev->Command(TIM_ID, GNL
else
pArcDev->Command(TIM_ID, GNH);
idh_start_data_handling() // signal pth_cond_data_handler to continue
// idh_data_handler_thread(), a thead create in ic_open_device.
read time for time stamp.
// Continue to tell controller to start data acquistion
// argument depend on dhm, etc....
pArcDev->Continuous( );
// return from Continuous() or data handleing fails..
prints("IARC STATUS done\n"); // notifies APP via socket GO the
Sm_iarc->status.done_cnt++; // tony also increment shared memory.
} // while(1)
CArcDevice->Continuous( ) what happen in this routine?
/********************************* iarc_data_handler.c ******************************/
idh_data_handler_thread( )
Started by ic_open_device()
Signaled by readout_permo_thread() just before pArcDev->Continuous( ) is called.
while( 1 )
{
block until pth_cond_data_handler is signal (by readout_permo_thread ).
// zero out some local buffers.
while( did_not_process_all_data )
{
// block until new data arives.
block_on_A_less...
// call data hander based on iarc_setup.dhm
RAW handle_data_raw_threaded()
SINGLE handle_data_single_threaded()
DOUBLE handle_data_double_threaded()
RAMP handle_data_ramp_threaded()
break on n_controller_continue==0
}
}
idh_new_data( unsigned short *buffer, int rows, int cols )
The called by FrameCallback() when an new readout is avalible.
copy buffer to pU16buffer (a static array).
signals dh_cond -> wake up idh_data_handler_thread() block_on_A_less..
handle_data_raw_threaded()
call by dh_data_handler_thread when new data arrives and in RAW mode,
add readout are saved to individual files.
Data is in pU16buffer.
descrambleU16 to temp_data_buf[]
data save (raw saves each readout)
send to DV.
handle_data_single_threaded()
call by dh_data_handler_thread when new data arrives and in SINGLE mode,
all readout are coadd and 1 image is saved.
Data is in pU16buffer.
while( frames_handled < iarc_setup.n_readout_number) ) // >
{
sig_buf[] += pU16buffer; // all SINGLE readouts are added
when all data added,
descrambleU32() from sig_buf to ul_temp_data_buf.
data a single file.
send to DV.
}
handle_data_double_threaded()
call by dh_data_handler_thread when new data arrives and in DOUBLE mode,
Pedestals are summed into ped_buf;
Samples are summed into sam_buf;
coad_buf = ped_buf - sam_buf;
descrambleU32( coad_buf to ul_temp_data_buf)
save ul_temp_data_buf to file
send to DV.
handle_data_ramp_threaded()
call by dh_data_handler_thread when new data arrives and in RAMP mode,
copy pU16Buffer to rdata.
Caculates linear regression, y = a + b*x :
sum(y)*sum(x^2) - sum(x)*sum(xy)
a = ----------------------------------
n * sum(x^2) - sum(x)*sum(x)
n * sum(xy) - sum(x)*sum(y)
b = ----------------------------------
n * sum(x^2) - sum(x)*sum(x)
Save 'b'(slope) as fits files.
Send to DV