//#include "tabela.h"
//#include "proba.h"
#include "vme.h"
//#define PTS_ADDR 0x025F0000
//#define PTS_ADDR 0x26000000
#include "PtsModule.h"
#define PTS_ADDR 0x61000000
#include <windows.h>
#include <formatio.h>
#include <analysis.h>
#include "toolbox.h"
#include <cvirte.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdint.h>
#include <signal.h>
#include <utility.h>
#include <ansi_c.h>
#include <userint.h>
#include "toolbox.h"
#include "sa02lib.h"
#include "CAEN_V729.h"
#include "CAEN_V729_CVI.h"
#include "icfa.h"
#include "MIKRO.h"
const int dsize = 144*4;
#include "H1D.h"
#include "H2D.h"
#include "H3D.h"
#include "HDraw.h"
#include "dataio.h"
#include "sa02lib.h"
#include "sa02_CVI.h"
int ProcessUserEvent(int pID, int rID,int mode);
const char palaser[0xFF]="\"C:\\home\\software\\daq\\LaserDriver-Ver2.0\\Particulars LASER control.exe\"";
#define MAX_THREADS 10
const char slowcname[20][20]= {"TMON0","TMON1","VDD","V2P","V2N","VSS","VTH1","VTH2", "VCC12", "VCC15" ,"VCC25", "V38P" };
const int chart_control[4]= {P1_CHART_1,P1_CHART_2,P1_CHART_3,P1_CHART_4};
const int hapd_serials [4]= { P1_SERIAL_1, P1_SERIAL_2, P1_SERIAL_3, P1_SERIAL_4 };
const int fpga_serials [4]= { P1_SERIAL_FPGA_1, P1_SERIAL_FPGA_2, P1_SERIAL_FPGA_3, P1_SERIAL_FPGA_4 };
const int hapd_onoff [4]= { P1_ONOFF_1, P1_ONOFF_2, P1_ONOFF_3, P1_ONOFF_4 };
const int p2graph [4]= { P2_GRAPH_1, P2_GRAPH_2, P2_GRAPH_3, P2_GRAPH_4 };
#define PTS_ADDR 0x61000000
#define MIKRO_COM 4
#define MIKRO_X 1
#define MIKRO_Y 2
#define MIKRO_Z 3
#define TRUE 1
#define FALSE 0
#define TIMEOUT 3
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
uint32_t gVME_CONTROLLER=WIENER_VMEMM;
uint32_t gCAEN_V288=0;
uint32_t gBELLEPTS=PTS_ADDR;
uint32_t gMIKRO_PORT=MIKRO_COM;
uint32_t gMIKRO_X=MIKRO_X, gMIKRO_Y=MIKRO_Y, gMIKRO_Z=MIKRO_Y;
uint32_t gCENTER_X=176000, gCENTER_Y=170000;
double gCENTER_KX=6./300, gCENTER_KY=3./300;
uint32_t gCAEN_V729=0;
uint32_t gCAEN_V1495=0;
uint32_t gFEBParamRead=0;
uint32_t gFEBMask=0xF;
uint32_t gTriggerType=2;
char gFEBParam[0xFF]="";
uint32_t uInterf = 0;
RUNINFO runinfo;
RUNREC runrec;
ENDREC endrec;
POSREC posrec;
EVTREC evtrec;
EVTREC evtrec1;
DATREC datrec;
MONREC monrec;
ITERATORREC iteratorrec;
typedef struct {
int chip;
int ch;
int chx;
int chy;
} EID2HAPDY;
EID2HAPDY eid2hapdxy[144];
// Variables
static int p1h, pID, rID, tfID;
static int p2h;
static int p3h;
static int p4h;
static int p5h;
static int pm1;
static int daq_on,loop_on;
static CmtThreadPoolHandle poolHandle = 0;
static CmtTSQHandle pTSQ = 0;
static int pTSQData[2];
double datay[10000];
double datax[10000];
double datayfit[10000];
//const int mux_map[4]={ 1,3,0,2};
int ctrl_c=0;
int integer_val=0;
FILE *gFp=NULL;
//***********************VARIABLE ZA BRANJE NAPETOSTI***********************//
#include "CAENV288.h"
#define ReadOperationalParam 0x02 //N470
#define TurnChanelOn 0x0a //N470
#define TurnChanelOff 0x0b //N470
#define ReadStatus 0x01 //SYS403
#define ReadParameters 0x02 //SYS403
int hvmon=0;
int hvmonFirst=0;
int32_t vset[24], iset[24];
// reads the run number from the first line in the file
int GetRunNumberFromFile(char *fname) {
char line[MAX_PATHNAME_LEN];
int ndim= MAX_PATHNAME_LEN;
int current_run = -1;
FILE *fp = NULL;
ssize_t size;
if ( GetFileInfo
(fname
,&size
) ) fp
= fopen(fname
,"r");
if (fp) {
if (fgets(line
,ndim
,fp
)!= NULL
) current_run
= atoi(line
);
}
return current_run;
}
int IncreaseRunNumberInFile(char *fname) {
int current_run = GetRunNumberFromFile(fname);
FILE
*fp
= fopen(fname
,"w");
if (fp) {
}
return current_run+1;
}
//**************************** get station parameters from ini file
int readIni(char *fname) {
FILE *fp = NULL;
char cmd[0xFF],val[0xFF];
int ndim=400;
char line[ndim];
ssize_t size;
if ( GetFileInfo
(fname
,&size
) ) fp
= fopen(fname
,"r");
if (!fp) {
sprintf(line
, "%s not found. Using default values.\n",fname
);
MessagePopup ("Info", line);
return -1;
}
while (fgets(line
,ndim
,fp
)!=NULL
) {
if (cmd[0]=='#') continue;
if ( strstr(cmd
,"VME_CONTROLLER")!= NULL
) {
if ( strstr(val
,"WIENER_VMUSB")!= NULL
) gVME_CONTROLLER
=WIENER_VMUSB
;
if ( strstr(val
,"WIENER_VMEMM")!= NULL
) gVME_CONTROLLER
=WIENER_VMEMM
;
if ( strstr(val
,"CAEN_V1718") != NULL
) gVME_CONTROLLER
=CAEN_V1718
;
if ( strstr(val
,"SIS3153_USB") != NULL
) gVME_CONTROLLER
=SIS3153_USB
;
}
if ( strstr(cmd
,"CAEN_V288" )!= NULL
) gCAEN_V288
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"BELLEPTS") != NULL
) gBELLEPTS
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"CAEN_V1495") != NULL
) gCAEN_V1495
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"MIKRO_PORT")!= NULL
) gMIKRO_PORT
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"MIKRO_X") != NULL
) gMIKRO_X
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"MIKRO_Y") != NULL
) gMIKRO_Y
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"MIKRO_Z") != NULL
) gMIKRO_Z
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"CENTER_X") != NULL
) gCENTER_X
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"CENTER_Y") != NULL
) gCENTER_Y
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"CENTER_KX") != NULL
) gCENTER_KX
=strtod(val
,NULL
);
if ( strstr(cmd
,"CENTER_KY") != NULL
) gCENTER_KY
=strtod(val
,NULL
);
if ( strstr(cmd
,"CAEN_V729") != NULL
) gCAEN_V729
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"FEBParam") != NULL
) sprintf(gFEBParam
,"%s", val
);
if ( strstr(cmd
,"FEBMask") != NULL
) gFEBMask
=strtoul(val
,NULL
,0);
if ( strstr(cmd
,"TriggerType") != NULL
) gTriggerType
=strtoul(val
,NULL
,0);
}
return 0;
}
//**************************** missing declarations in the library
char strbuf[0xFF];
int gLog=0;
int sa02Printf(const char *format, ...) {
va_list aptr;
int ret;
FILE *flog;
SetCtrlVal(p1h,P1_STDIO,strbuf);
if (gLog) {
flog
= fopen ("stdio.log", "a");
}
return(ret);
}
int CVICALLBACK sa02timeout (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
switch (event) {
case EVENT_TIMER_TICK:
sa02TimerOut = TRUE;
sa02Printf("sa02timeout\n");
//sa02Printf("TIMEOUT %s in line %d\n", __FILE__ , __LINE__);
break;
}
return 0;
}
void sa02Timerast (int signumber) {
sa02TimerOut = TRUE;
sa02Printf("TIMEOUT !!!\n");
SetCtrlAttribute (p1h, P1_DAQ_TIMEOUT, ATTR_ENABLED, 0);
}
void sa02Tmlnk (int tout) {
sa02TimerOut = FALSE;
SetCtrlAttribute (p1h, P1_DAQ_TIMEOUT, ATTR_INTERVAL,
(float)tout/100.);
SetCtrlAttribute (p1h, P1_DAQ_TIMEOUT, ATTR_ENABLED, 1);
// ResetTimer (p1h, P1_DAQ_TIMEOUT);
}
void sa02Tmulk ( void ) {
SetCtrlAttribute (p1h, P1_DAQ_TIMEOUT, ATTR_ENABLED, 0);
}
//****************************
int EscapeString(const char *i, char *o) {
unsigned int iptr=0, optr = 0;
// walk though the input string
for (iptr
= 0; iptr
< strlen(i
); iptr
++, optr
++) {
// search for
if ( (i[iptr]=='\\') ) {
sa02Printf("Escape String %d %d \n",i[iptr] , i[iptr]==92 ) ;
//sa02Printf("Escape String %d %d \n",i[iptr] , ( (i[iptr] == 92) || (i[iptr] == 42) )) ;
o[optr] = i[iptr];
optr++;
}
o[optr] = i[iptr];
}
o[optr] = '\0';
return 0;
}
int p1plothandle=0;
int p2plothandle[4]= {0,0,0,0};
int p3plothandle=0;
int plothandle=0;
int phandle[4]= {0,0,0,0};
int plothandle2dfit=0;
int plothandleslix=0;
int plothandlesliy=0;
int plothandlefit=0;
void SigInt (int sig) {
ctrl_c = 1;
sa02TimerOut=1;
}
//int sa02Verbose=0;
int module_header(int recid,uint32_t *data,int len) {
data[0] = recid;
data[1] = (len >0)? len : 0 ;
return data[1]+2;
}
int PrintData(uint32_t *rdata, int count) {
int j;
uint32_t i;
for (j=0; j<count; j++) {
uint32_t recid = rdata[j++];
uint32_t len = rdata[j++];
sa02Printf(" recid=0x%0x len=%d pos=%d(maxpos %d) val=",recid, len, j, count);
if (len>2) {
sa02Printf("\n");
}
for (i=0; i<len; i++) {
if (j< count) {
sa02Printf("0x%0x\t", rdata[j]);
}
if (i%4==3) {
sa02Printf("\n");
}
j++;
}
sa02Printf("\n");
if (len) {
j--;
}
}
return 0;
}
//-------------------------------------------------------------------------
int CVICALLBACK PlotSliceY (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
int nslice,i;
int h2=(int) callbackData;
switch (event) {
case EVENT_COMMIT: {
int ny = H2DGetNbinsY(h2);
double miny = H2DGetMinY(h2);
double stepy = H2DGetStepY(h2);
GetCtrlVal(panel,P1_NSLIX,&nslice);
for (i=0; i < ny; i++ ) {
datax[i]=H2DGetBinContent(h2,nslice,i);
}
if (ny>0) {
if (plothandleslix) {
DeleteGraphPlot (p1h, P1_GRAPHY, plothandleslix, VAL_IMMEDIATE_DRAW);
}
plothandleslix = PlotWaveform (p1h, P1_GRAPHY, datax, ny,
VAL_DOUBLE, 1.0, 0.0, miny,
stepy, VAL_FAT_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1,
VAL_BLUE);
}
}
break;
}
return 0;
}
int CVICALLBACK PlotSliceX (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
int nslice,i;
int h2=(int) callbackData;
switch (event) {
case EVENT_COMMIT: {
int nx = H2DGetNbinsX(h2);
double minx = H2DGetMinX(h2);
double stepx = H2DGetStepX(h2);
GetCtrlVal(panel,P1_NSLIY,&nslice);
for (i=0; i < nx; i++ ) {
datax[i]=H2DGetBinContent(h2,i,nslice);
}
if (nx>0) {
if (plothandlesliy) {
DeleteGraphPlot (p1h, P1_GRAPHX, plothandlesliy, VAL_IMMEDIATE_DRAW);
}
plothandlesliy = PlotWaveform (p1h, P1_GRAPHX, datax, nx,
VAL_DOUBLE, 1.0, 0.0, minx,
stepx, VAL_FAT_LINE,
VAL_EMPTY_SQUARE, VAL_SOLID, 1,
VAL_BLUE);
}
}
break;
}
return 0;
}
void plot1d(int npoints, double x0, double dx) {
sa02Printf("TEST %d\n", npoints);
if (npoints>0) {
if (plothandle) {
DeleteGraphPlot (p1h, P1_GRAPH, plothandle, VAL_IMMEDIATE_DRAW);
}
plothandle = PlotWaveform (p1h, P1_GRAPH, datay, npoints, VAL_DOUBLE,
1.0, 0.0, x0, dx, VAL_CONNECTED_POINTS,
VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
}
}
/*
void plotxy(int h2d){
if (plothandlexy > 0 ) DeleteGraphPlot (p2h, P2_GRAPHXY, plothandlexy, VAL_IMMEDIATE_DRAW);
RangeColors(H2DGetMin(h2d),H2DGetMax(h2d));
plothandlexy = PlotScaledIntensity (p2h, P2_GRAPHXY, H2DGetData(h2d),
H2DGetNbinsX(h2d), H2DGetNbinsY(h2d), VAL_DOUBLE,
H2DGetStepY(h2d),H2DGetMinY(h2d),H2DGetStepX(h2d),H2DGetMinX(h2d),
colormap->array,
colormap->HiColor,
colormap->numberofColors, 1, 0);
ProcessSystemEvents ();
}
*/
int CVICALLBACK ZoomToFebCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
int feb=-1;
float xmin=0, xmax=0;
switch (event) {
case EVENT_COMMIT:
GetCtrlVal(panel,control,&feb);
switch (feb) {
case -1:
xmin=0;
xmax=144*4-1;
break;
default:
xmin = feb *144;
xmax =xmin+144 -1;
break;
}
SetAxisRange (p1h, P1_GRAPH2D, VAL_MANUAL, xmin, xmax, VAL_NO_CHANGE, 0.0, 1.0);
break;
}
return 0;
}
void plot2d(int h2d, int nslice) {
if (nslice < 0 ) {
nslice=0;
}
if (plothandle2dfit > 0 ) {
DeleteGraphPlot (p1h, P1_GRAPH2D, plothandle2dfit, VAL_IMMEDIATE_DRAW);
plothandle2dfit=0;
}
H2DDraw(h2d,p1h, P1_GRAPH2D, &p1plothandle);
if (sa02Verbose > 2) {
sa02Printf("min %f max %f x:min %f step%f y:min %f step%f\n",
H2DGetMin(h2d),H2DGetMax(h2d), H2DGetMinX(h2d),
H2DGetStepX(h2d),H2DGetMinY(h2d), H2DGetStepY(h2d));
}
SetCtrlVal(p1h, P1_NSLIY, nslice);
PlotSliceX(p1h,P1_GRAPHY,EVENT_COMMIT, NULL,0,0);
PlotSliceY(p1h,P1_GRAPHY,EVENT_COMMIT, NULL,0,0);
ProcessSystemEvents ();
}
void SetDimming(int state) {
SetCtrlAttribute (p1h, P1_MULTIFPGAWRITE, ATTR_DIMMED, state);
SetCtrlAttribute (p1h, P1_DAQ, ATTR_DIMMED, state);
SetCtrlAttribute (p1h, P1_READOUT, ATTR_DIMMED, state);
SetCtrlAttribute (p1h, P1_FPGAWRITE, ATTR_DIMMED, state);
SetCtrlVal (p1h, P1_LED, state);
SetCtrlAttribute (p2h, P2_DAQ, ATTR_DIMMED, state);
SetCtrlAttribute (p2h, P2_RUNSCRIPT, ATTR_DIMMED, state);
SetCtrlAttribute (p3h, P3_DAQ, ATTR_DIMMED, state);
SetCtrlAttribute (p4h, P4_DAQ, ATTR_DIMMED, state);
SetCtrlAttribute (p1h, P1_STOP, ATTR_DIMMED, !state);
SetCtrlAttribute (p2h, P2_STOP, ATTR_DIMMED, !state);
SetCtrlAttribute (p3h, P3_STOP, ATTR_DIMMED, !state);
SetCtrlAttribute (p4h, P4_STOP, ATTR_DIMMED, !state);
}
uint16_t GetConnectedFebMask(void) {
uint16_t mask=0;
int ison;
for (int i=0; i<4; i++) {
GetCtrlVal(p1h,hapd_onoff[i], &ison);
mask |= (ison << i);
}
sa02Printf("Connected FEBs mask, 0x%0x\n",mask);
return mask;
}
int CVICALLBACK daq(void *functionData) {
char title[256], serial[64];
int daqmode=1;
#define MAXSIZE 10000
int h2=0;
int maxsize = MAXSIZE;
uint32_t *rdata;
uint32_t response[2]= {0,0};
uint32_t fixeddata =0;
int testfixeddata =0;
uint32_t data =0;
uint32_t data0 =0;
uint32_t dataoff =0;
uint32_t dataon =0;
uint32_t cmd =0;
uint32_t chip =0;
uint32_t asicpar =0;
uint32_t asicshft=0;
uint32_t dstep =0;
uint32_t sendswtrg =0;
uint32_t tpenb =0;
uint32_t trglen;
uint16_t mask;
//uint32_t boardnumber_current=0;
// uint32_t hdr[10];
unsigned int aborttimeout =0;
int append =0;
int remap =0;
int neve =0;
int towrite =0;
int toread =0;
int ch =0;
int output =0;
int externalcmd =0;
int i=0,j=0, ir;
int ich;
//int ison;
char sfixeddata[0xFF]="";
char scmd[0xFF]="";
char filename[0xFF]="";
char externalcommand[0xFF]="";
FILE *fp=NULL;
int nbtotal=0;
time_t t,told, tstart;
int ncount=0;
int nerrors=0;
int readerror=0;
//int writeevents=0;
double fraction=0;
int board;
double t0;
rdata
= malloc(sizeof(uint32_t)*maxsize
);
// intercept routine
if (signal (SIGINT, SigInt) == SIG_ERR) {
}
mask=GetConnectedFebMask();
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
GetCtrlVal(p1h,P1_APPEND,&append); // append the data to the file filename
GetCtrlVal(p1h,P1_FRACTION, &fraction);
GetCtrlVal(p1h,P1_ABORTTOUT, &aborttimeout);
GetCtrlVal( p1h,P1_EXTERNALCMD, externalcommand);
GetCtrlVal( p1h,P1_EXTCMD, &externalcmd);
GetCtrlVal(p1h,P1_FIXEDDATA, sfixeddata);
fixeddata
= strtoul (sfixeddata
,NULL
,0);
GetCtrlVal(p1h,P1_TESTFIXEDDATA, &testfixeddata);
GetCtrlVal(p1h,P1_TOREAD, &toread);
GetCtrlVal(p1h,P1_NEVE, &neve);
GetCtrlVal(p1h,P1_DSTEP, &dstep );
GetCtrlVal(p1h,P1_SENDSWTRIG,&sendswtrg);
GetCtrlVal(p1h,P1_INTTRGLEN, &trglen);
GetCtrlVal(p1h,P1_DAQMODE, &daqmode);
Sa02DaqMode (daqmode);
Sa02SelectTriggerWithMaskAndLength (sendswtrg, mask, trglen);
GetCtrlVal(p1h,P1_CHIP,&chip);
GetCtrlVal(p1h,P1_CHANNEL,&ch);
GetCtrlVal(p1h,P1_DATA,&data);
data0=data;
GetCtrlVal(p1h,P1_SCANTYPE,&towrite);
switch (towrite) {
case 1:
GetCtrlVal(p1h,P1_WRITECMD,scmd);
if (strcmp(scmd
,"MUXASIC")==0) {
remap=1;
}
cmd =sa02GetCmdCode(scmd);
break;
case 3:
GetCtrlVal(p1h,P1_CHANNELOFF,scmd);
GetCtrlVal(p1h,P1_CHANNELON,scmd);
chip =data/36;
ch =data%36;
case 2:
GetCtrlVal(p1h,P1_ASICPAR,scmd);
if (strlen(scmd
)) cmd
= sa02GetAsicCode
(scmd
,&asicpar
, &asicshft
);
break;
}
if (remap) {
data = sa02MuxMap(data);
sa02Printf("MUX %d\n",data);
}
GetCtrlVal(p1h,P1_TPENB,&tpenb);
//ReplaceAxisItem (p1h, P1_GRAPH2D, VAL_LEFT_YAXIS, 0, scmd, data0);
if (sa02Verbose) {
sa02Printf("Data in the file:%s\n", filename);
}
if (gFp) {
fp=gFp;
}
else {
if (append) {
}
else {
}
}
output=1;
// run header
runinfo.id= RUNINFO_ID; // run record ID
runinfo.len= sizeof(runinfo);
runinfo.cmd= cmd;
runinfo.x0 = data;
runinfo.dx = dstep;
runinfo.nx = neve;
runinfo.chip= chip;
runinfo.ch = ch;
runinfo.neve= toread;
runinfo.writemode= towrite;
sa02Printf("RUNINFO x0=%d nx=%d dx=%d\n", runinfo.x0,runinfo.dx,runinfo.nx);
nbtotal
+=fwrite(&runinfo
, 1,sizeof(runinfo
),fp
); //gzip
}
else {
if (sa02Verbose) {
sa02Printf("Data are not written to the file!\n");
}
}
if (!neve & (towrite || toread) ) {
neve=1;
}
tstart=t;
told=t;
t0 = Timer();
title[0] = 0;
for (i=0; i<4; i++) {
int febon=0;
Sa02TestPulseEnable(i, tpenb); // Enable/disable test pulse
sa02GetSerial(i, serial);
GetCtrlVal(p1h,hapd_onoff[i], &febon);
if (strstr(serial
,"0x00000000000000")!=NULL
&& febon
) {
char txt[0xFF];
sprintf(txt
, "FEB %d not connected or firmware not loaded? Serial number error! Switch Off FEB!",i
);
MessagePopup ("Error", txt);
return -1;
}
sprintf(title
,"%s FEB%d=%s", title
, i
, serial
);
}
///////////////////////////////////////////////////////////////
int icfa_visible=0;
int icfa_add=0;
GetPanelAttribute (p6h, ATTR_VISIBLE, &icfa_visible);
GetCtrlVal (p6h, MINIRICH_ADD, &icfa_add);
if (icfa_visible) {
icfa_Init();
icfa_Histo();
}
///////////////////////////////////////////////////////////////
SetCtrlAttribute (p1h, P1_GRAPH2D, ATTR_LABEL_TEXT , title);
H2DInit(h2, "h2d",title, 144*4, 0,1,neve,data0, dstep);
H2DSetTitleY(h2,scmd);
sa02Printf("H2D nx=%d ny=%d i=%d neve=%d\n", H2DGetNbinsX(h2),H2DGetNbinsY(h2), i, neve);
plot2d(h2,1);
for (i=0; i<neve; i++) {
int nb = sizeof(uint32_t);
int count=0;
for (board=0; board<4; board++) {
switch (towrite) {
case 1: {
rdata[count+2]= data;
rdata[count+3]= sa02Cmd(board, cmd, data, chip, ch,1,response);
count+=module_header(cmd,&rdata[count],2 );
break;
}
case 2: {
uint32_t datal = asicpar & (data << asicshft);
rdata[count+2] = data;
rdata[count+3] = sa02AsicWrite(board, cmd, datal, chip, ch, asicpar,asicshft);
count+=module_header(cmd ,&rdata[count],2); // recid cmd
break;
}
case 3: {
rdata[count+2] = chip*36+ch;
rdata[count+3] = sa02AsicWrite(board, cmd, dataon, chip, ch, asicpar,asicshft); // switch on the channel
count+=module_header(cmd ,&rdata[count],2); // recid cmd
break;
}
}
if (towrite==3) {
SetCtrlVal(p1h,P1_SETVALUE, chip*36+ch );
}
else {
SetCtrlVal(p1h,P1_SETVALUE, data);
}
}
Sa02SetNeve(toread);
sa02Reset();
// for ( j=0; j< toread; j++)
{
int eventerror = 0;
if ( (count +2 +dsize) >= maxsize) {
maxsize*=2;
sa02Printf("Increasing data buffer to %d elements\n", maxsize);
rdata
=realloc(rdata
,sizeof(uint32_t)*maxsize
);
}
do {
if (sendswtrg == 1) Sa02SoftwareTrigger();
nb = sa02Read(mask, &rdata[count+2] );
}
while ( nb==0 && !ctrl_c);
if (nb==0) sa02Printf("nb==0 LINE=%d\n",__LINE__);
if (testfixeddata && nb>0) {
int len = nb / sizeof(uint32_t);
for (ir=0; ir<len; ir++) {
if ( rdata[count+2+ir]!=fixeddata ) {
sa02Printf("INSERT INTO fixederror VALUES ( '%d', '%d','%d','%d','0x%08x','0x%08x' ) \n", t, t-tstart, i*toread+j, ir, rdata[count+2+ir], fixeddata );
eventerror++;
}
}
}
if (eventerror) {
readerror++;
if (readerror==3) {
ctrl_c = 1;
system("date >> firmware.lock");
}
}
else {
readerror= 0;
}
for (ich=0; ich<144*4; ich++) {
int xch = (143 - ich%144) + ich/144*144;
H2DFillBin(h2, xch,i,rdata[count+2+ich]);
}
if (icfa_visible) icfa_Event(&rdata[count+2], icfa_add );
/*
for (ich=0; ich<144; ich++) {
// id=(35-ich/4)+gBoardNumber*36;
// shft=(ich%4)*8;
id=(17-ich/8)+sa02BoardNumber*18;
shft=(ich%8)*4;
// if ( rdata[count+2+id] & (0xFF <<shft) ) {
if ( rdata[count+2+id] & (0xF <<shft) ) {
H2DFillBin(h2, ich,i,1);
}
if (sa02Verbose>2) {
sa02Printf("%02X ",(rdata[count+2+id]>> shft)& 0xF );
// sa02Printf("%02X ",(rdata[count+2+id]>> shft)& 0xFF );
}
}
*/
if (sa02Verbose>2) sa02Printf("\n" );
if (nb>=0) count+=module_header(0x3,&rdata[count],nb/sizeof(uint32_t)); // recid 0x3
if (ctrl_c) {
sa02Printf("ctrl_c detected ....\n");
break;
}
if (t!=told ) {
double done= (double) (i)/neve;
EstimatedFinish(p1h, P1_PROGRESS, P1_ETA, tstart, done);
plot2d(h2,i-1);
GetPanelAttribute (p6h, ATTR_VISIBLE, &icfa_visible);
if (icfa_visible) icfa_Draw();
SetCtrlVal(p1h,P1_CUREVE, j);
sa02Printf
("%d events in %2.2f min (%d s) TIMEOUTS=%d %s",ncount
, (double)(t
-tstart
)/60.
,t
-tstart
, nerrors
, ctime(&t
));
}
if (aborttimeout && (t-tstart)>aborttimeout) {
sa02Printf("Abort timeout reached ....\n");
ctrl_c=1;
break;
}
told=t;
if (nb==0) {
nerrors++;
//j--; /// kako potem pride cez zeljeno stevil ozadetkov?
}
else {
ncount++;
}
}
if (externalcmd) {
char ecmd[256];
sprintf(ecmd
,"%s %u %u %u %u",externalcommand
,(unsigned int) tstart
,data
, rdata
[2], rdata
[3]);
if (sa02Verbose) {
sa02Printf("Executing external command %s\n",ecmd);
}
}
if (output && Random(0,1)<fraction) {
evtrec.id = EVTREC_ID;
evtrec.len=count*sizeof(uint32_t)+ sizeof(evtrec);
evtrec.nev=i;
nb
= (int) fwrite( &evtrec
, 1, sizeof(evtrec
),fp
); //gzip
if (count) {
nb
+= (int) fwrite(&rdata
[0],1,count
*sizeof(uint32_t),fp
); //gzip
}
if (nb!= (int) evtrec.len) {
sa02Printf("Error writing! %d!=%d\n",nb,evtrec.len);
}
nbtotal+= nb;
}
if (sa02Verbose==1) {
sa02Printf
("[%d/%d] %u \t", i
,count
, (unsigned int) time(NULL
));
PrintData(rdata,count);
}
if (towrite ==3) {
sa02AsicWrite(board, cmd, dataoff, chip, ch, asicpar, asicshft);
ch += dstep;
if (ch>35) {
ch-=36;
chip++;
}
}
else {
data += dstep;
}
if (ctrl_c ) {
if (!testfixeddata) {
sa02Printf("Ctrl+C Program interrupted ....\n");
}
break;
}
}
plot2d(h2, i-1);
if (icfa_visible) icfa_Draw();
if (output) {
sprintf(scmd
,"channel;daqtime=%f", Timer
()-t0
);
H2DSetTitleX(h2,scmd);
H2DWrite2File(h2,fp);
if (!gFp) {
}
}
if (sa02Verbose>1) sa02Printf("%d bytes written to file %s\n", nbtotal, filename);
if (toread
&& !testfixeddata
) sa02Printf
("%d events in %2.2f min (%f s) TIMEOUTS=%d %s",ncount
, (double)(Timer
()-t0
)/60.
,Timer
()-t0
, nerrors
, ctime(&t
));
return 0;
}
int CVICALLBACK quit (int panel, int event, void *callbackData,
int eventData1, int eventData2) {
switch (event) {
case EVENT_CLOSE:
// Stop timer callbacks
SuspendTimerCallbacks();
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK Exit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
switch (event) {
case EVENT_COMMIT:
quit(0,0,NULL,0,0);
}
return 0;
}
int SetParametersFromFile( const char *fname) {
uint32_t gdata;
uint32_t cdata;
sa02AsicGlobalRegister *greg = (sa02AsicGlobalRegister *) &gdata ;
sa02AsicChannelRegister *creg = (sa02AsicChannelRegister *) &cdata ;
unsigned short cregdata[8*144*4];
unsigned short gregdata[7*4*4];
#define NDIM 400
int ndim=NDIM;
char line[NDIM];
char cmd[NDIM];
char sasic[NDIM];
char v0[NDIM];
char v1[NDIM];
int asic=0, ch=0;
int gval=0, cval=0;
int board=0;
int row=0;
uint32_t sa02code;
int i;
ssize_t size;
FILE *fp = NULL;
if ( GetFileInfo
(fname
,&size
) ) fp
= fopen(fname
,"r");
if (!fp) {
sa02Printf("Error! Cannot open file %s\n",fname);
return -1;
}
for (i=0; i<8*144*4; i++) {
cregdata[i]=0;
}
for (i=0; i<7*4*4; i++) {
gregdata[i]=0;
}
gdata=0;
cdata=0;
ResetTextBox(p3h,P3_FPGAPAR,"");
while (fgets(line
,ndim
,fp
)!=NULL
) {
int nb
= sscanf(line
,"%s%s%s%s",cmd
,sasic
,v0
,v1
);
if (nb<1 || cmd[0]=='#') {
continue;
}
if (sa02Verbose>2) {
sa02Printf("%d %s",nb,line);
}
sa02code = sa02GetCmdCode(cmd);
if (strcmp(cmd
,"MUXASIC")==0) {
asic = sa02MuxMap(asic);
}
switch (nb) {
case 1: {
if ( sa02code ) {
SetCtrlVal(p3h,P3_FPGAPAR,line);
break;
}
break;
}
case 2: {
if ( sa02code ) {
SetCtrlVal(p3h,P3_FPGAPAR,line);
break;
}
if (strcmp(cmd
,"param_board")==0) {
board= asic;
}
if (strcmp(cmd
,"load_global")==0) {
row= asic+1;
greg->id=13;
/*
SetTableCellVal (p3h, P3_GREG, MakePoint (1,row), greg->phasecmps);
SetTableCellVal (p3h, P3_GREG, MakePoint (2,row), greg->gain);
SetTableCellVal (p3h, P3_GREG, MakePoint (3,row), greg->shapingtime);
SetTableCellVal (p3h, P3_GREG, MakePoint (4,row), greg->comparator);
SetTableCellVal (p3h, P3_GREG, MakePoint (5,row), greg->vrdrive);
SetTableCellVal (p3h, P3_GREG, MakePoint (6,row), greg->monitor);
SetTableCellVal (p3h, P3_GREG, MakePoint (7,row), greg->id);
*/
gregdata[(board*4+asic)*7] = greg->phasecmps;
gregdata[(board*4+asic)*7+1] = greg->gain;
gregdata[(board*4+asic)*7+2] = greg->shapingtime;
gregdata[(board*4+asic)*7+3] = greg->comparator;
gregdata[(board*4+asic)*7+4] = greg->vrdrive;
gregdata[(board*4+asic)*7+5] = greg->monitor;
gregdata[(board*4+asic)*7+6] = greg->id;
break;
}
break;
}
case 3: {
if ( sa02code) {
SetCtrlVal(p3h,P3_FPGAPAR,line);
break;
}
if (strcmp(cmd
,"param_global")==0) {
gdata = 0;
break;
}
if (strcmp(cmd
,"phasecmps")==0) {
greg->phasecmps = gval;
break;
}
greg->gain = gval;
break;
}
if (strcmp(cmd
,"shapingtime")==0) {
greg->shapingtime = gval;
break;
}
if (strcmp(cmd
,"comparator")==0) {
greg->comparator = gval;
break;
}
if (strcmp(cmd
,"vrdrive")==0) {
greg->vrdrive = gval;
break;
}
if (strcmp(cmd
,"monitor")==0) {
greg->monitor = gval;
break;
}
if (strcmp(cmd
,"load_ch")==0) {
row = board*144+asic*36+ch+1;
/*
SetTableCellVal (p3h, P3_CREG, MakePoint (1,row), asic);
SetTableCellVal (p3h, P3_CREG, MakePoint (2,row), ch);
SetTableCellVal (p3h, P3_CREG, MakePoint (3,row), creg->decaytime);
SetTableCellVal (p3h, P3_CREG, MakePoint (4,row), creg->offset);
SetTableCellVal (p3h, P3_CREG, MakePoint (5,row), creg->fineadj_unipol);
SetTableCellVal (p3h, P3_CREG, MakePoint (6,row), creg->fineadj_diff);
SetTableCellVal (p3h, P3_CREG, MakePoint (7,row), creg->tpenb);
SetTableCellVal (p3h, P3_CREG, MakePoint (8,row), creg->kill);
*/
cregdata[(row -1)*8] = (unsigned short) asic;
cregdata[(row -1)*8+1] = (unsigned short) ch;
cregdata[(row -1)*8+2] = creg->decaytime;
cregdata[(row -1)*8+3] = creg->offset;
cregdata[(row -1)*8+4] = creg->fineadj_unipol;
cregdata[(row -1)*8+5] = creg->fineadj_diff;
cregdata[(row -1)*8+6] = creg->tpenb;
cregdata[(row -1)*8+7] = creg->kill;
cdata=0;
break;
}
if (strcmp(cmd
,"select")==0) {
sa02Printf ("%s not implemeted yet\n", cmd);
break;
}
break;
}
case 4: {
if (strcmp(cmd
,"param_ch")==0) {
cdata = 0;
break;
}
if (strcmp(cmd
,"decaytime")==0) {
creg->decaytime = cval;
break;
}
if (strcmp(cmd
,"offset")==0) {
creg->offset = cval;
break;
}
if (strcmp(cmd
,"fineadj_unipol")==0) {
creg->fineadj_unipol = cval;
break;
}
if (strcmp(cmd
,"fineadj_diff")==0) {
creg->fineadj_diff = cval;
break;
}
creg->tpenb = cval;
break;
}
creg->kill = cval;
break;
}
break;
}
}
}
SetTableCellRangeVals (p3h, P3_CREG, MakeRect (1, 1, 144*4, 8), cregdata, VAL_ROW_MAJOR);
SetTableCellRangeVals (p3h, P3_GREG, MakeRect (1, 1, 4*4, 7) , gregdata, VAL_ROW_MAJOR);
sa02Printf("Parameters loaded from file %s to Parameter Panel \n", fname);
return 0;
}
void CVICALLBACK MenuCB(int menubar, int menuItem, void *callbackData, int panel) {
switch (menuItem) {
case MENU_OPERATIO_CAEN_V729:
DisplayPanel(p4h);
break;
case MENU_OPERATIO_SA02CFG :
DisplayPanel(p3h);
break;
case MENU_OPERATIO_2DSCAN:
DisplayPanel(p2h);
break;
case MENU_OPERATIO_LASER:
DisplayPanel(p5h);
break;
case MENU_MINIRICH:
DisplayPanel(p6h);
break;
case MENU_OPERATIO_EXIT :
quit(0,0,NULL,0,0);
//loop_on=0;
break;
case MENU_HELP :
sa02Help();
break;
}
}
int CVICALLBACK daq_readonly(void *functionData) {
int h2=0;
uint32_t trglen;
uint32_t data[10000];
uint16_t mask;
//int ison;
//int *fdata= (int *) functionData;
int nbit,neve,nb,ch,i,j,sendswtrg;
time_t t,told, tstart;
//int gBoardNumber=0;
int ploteachevent =0;
GetCtrlVal(p1h,P1_PLOTEACHEVENT, &ploteachevent);
GetCtrlVal(p1h,P1_TOREAD , &neve);
GetCtrlVal(p1h,P1_NSLIX , &nbit);
if (nbit>7) {
nbit=7;
}
GetCtrlVal(p1h,P1_SENDSWTRIG,&sendswtrg);
GetCtrlVal(p1h,P1_INTTRGLEN, &trglen);
mask=GetConnectedFebMask();
Sa02SelectTriggerWithMaskAndLength (sendswtrg, mask, trglen);
Sa02SetNeve(2);
H2DInit(h2,"hbit","Bit Occupancy", 144*4, 0,1,8,0, 1);
H2DSetTitleX(h2,"channel");
H2DSetTitleY(h2,"Data bit");
tstart=t;
told=t;
for ( j=0; j< neve; j++) {
do {
if (sendswtrg==1) Sa02SoftwareTrigger();
nb = sa02Read(mask, data );
}
while ( nb==0 && !ctrl_c);
if (nb==0) sa02Printf("nb==0 LINE=%d\n",__LINE__);
if (ctrl_c==1) break;
for (ch=0; ch<144*4; ch++) {
int board = ch/144;
int xch = (143 - ch%144) + board *144;
for (i=0; i<8; i++) if (data[ch] & (1<<i) ) H2DFillBin(h2,xch,i,1);
}
/*
for (ch=0; ch<144*4; ch++)
{
id=(35-ch/4)+gBoardNumber*36;
shft=(ch%4)*8;
for (i=0; i<8; i++)
{
if (data[id] & (1<<(i+shft)) )
{
H2DFillBin(h2,ch,i,1);
}
}
if (sa02Verbose>2)
{
sa02Printf("%02X ",(data[id]>> shft)& 0xFF );
}
}
*/
if (sa02Verbose>2) {
sa02Printf("\n" );
}
if (t!=told || ploteachevent) {
sa02Printf
("%d events in %2.2f min (%d s) %s",j
, (double)(t
-tstart
)/60.
,t
-tstart
, ctime(&t
));
GetCtrlVal(p1h,P1_NSLIY,&nbit);
plot2d(h2, nbit);
GetCtrlVal(p1h,P1_PLOTEACHEVENT, &ploteachevent);
SetCtrlVal(p1h,P1_CUREVE, j);
ProcessSystemEvents ();
ProcessSystemEvents ();
}
told=t;
}
plot2d(h2, nbit);
SetCtrlVal(p1h,P1_CUREVE, j);
return 0;
}
int CVICALLBACK LoadParameters (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
char fname[0xFF];
uint16_t mask;
switch (event) {
case EVENT_COMMIT:
mask=GetConnectedFebMask();
sa02Printf("LoadParameters 0x%0x\n", mask);
GetCtrlVal(p3h, P3_INPUTFILE, fname);
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
SetCtrlAttribute (panel, control, ATTR_DIMMED, 1);
sa02LoadParametersFromFile(fname, mask);
SetCtrlAttribute (panel, control, ATTR_DIMMED, 0);
break;
}
return 0;
}
int SlowControl(uint32_t board, FILE *fp) {
uint32_t data;//,step,cmd;//,response[2]= {0,0};
int chip,channel,i;
//double doubleval;
char saddress[0xFF];
double sdata[20];
chip=0;
channel=0;
data=0;
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
sa02Status(board,saddress,sdata);
SetCtrlVal(p1h,fpga_serials[board],saddress);
if (fp) {
fprintf(fp
,"<slowc>\n<id>%d</id>\n", board
);
fprintf(fp
,"<dna>%s</dna>\n",saddress
);
for (i
=0; i
<12; i
++) fprintf(fp
,"<%s>%f</%s>\n",slowcname
[i
],sdata
[i
],slowcname
[i
] );
}
PlotStripChart (p1h, chart_control[board], sdata, 12, 0, 0, VAL_DOUBLE);
return 0;
}
int WriteChannelParameters ( int offset, int fine_offset, int tpenb) {
uint32_t response[2]= {0,0};
uint32_t cdata;
sa02AsicChannelRegister *creg = (sa02AsicChannelRegister *) &cdata ;
unsigned int i=0, j=0;
int row=0;
unsigned short val,asic,ch, board;
uint16_t mask=GetConnectedFebMask();
for (j=0; j<144*4; j++) {
i = j%144;
board = (unsigned short) j/144;
asic=(unsigned short )(i/36);
ch=(unsigned short )(i%36);
row=j+1;
GetTableCellVal (p3h, P3_CREG, MakePoint (1,row), &asic);
GetTableCellVal (p3h, P3_CREG, MakePoint (2,row), &ch);
GetTableCellVal (p3h, P3_CREG, MakePoint (3,row), &val);
creg->decaytime=val;
creg->offset = offset;
creg->fineadj_unipol = fine_offset;
GetTableCellVal (p3h, P3_CREG, MakePoint (6,row), &val);
creg->fineadj_diff = val;
creg->tpenb = tpenb;
//sa02Printf("===%d %d\n",i, tpenb);
GetTableCellVal (p3h, P3_CREG, MakePoint (8,row), &val);
creg->kill = val;
creg->unused=0;
if ( mask &(1<<board)) sa02Cmd(board,SA0x_ASIC0_CREG, cdata, asic, ch,1,response);
if (ctrl_c) {
break;
}
}
return 0;
}
int FebTestAna(void) {
int current_run;
char cmdCommand[0xFF];
current_run = GetRunNumberFromFile("current_run.txt");
sprintf(cmdCommand
,"C:/root/bin/root.exe \"../macros/febreport.cxx(\\\"data\\\", %d )\"", current_run
);
sa02Printf("%s\n",cmdCommand);
LaunchExecutable(cmdCommand);
return 0;
}
int FebTest(void) {
int board=0, j=0, value, step;
FILE *fp;
int ndim=400;
char line[ndim];
int current_run=1;
time_t t;
int start;
int addheader=1;
char filename[0xFF];
char cmdCommand[0xFF];
uint32_t mask=GetConnectedFebMask();
LoadParameters(p3h, P3_LOADPAR,EVENT_COMMIT,NULL,0,0);
fp
= fopen ("current_run.txt","r");
if (fp) {
if (fgets(line
,ndim
,fp
)!=NULL
) current_run
=atoi(line
)+1;
fp= NULL;
}
sprintf(line
,"data\\febtest_%04d.dat",current_run
);
SetCtrlVal(p1h,P1_OUTPUTFILE, line);
SetCtrlVal(p1h,P1_SENDSWTRIG,3 ); // set internal trigger
SendTriggerTypeCB(p1h,P1_TEST, EVENT_COMMIT,NULL, 0,0);
ThresholdLinearityCB (p1h, P1_THRVSADC, EVENT_COMMIT, NULL, 0, 0 );
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
if(fp) {
for (board=0; board<4; board++) if ( mask &(1<<board)) H1DWrite2File(board,fp);
}
sprintf(line
,"data/febslowc_%04d.xml",current_run
);
// SetCtrlVal(p1h, P1_RUNID, current_run);
if (!ctrl_c) for (board=0; board<4; board++) {
if ( mask &(1<<board)) {
for (j=0; j<10; j++) {
SlowControl(board,fp);
ProcessSystemEvents ();
if (ctrl_c) break;
}
}
if (ctrl_c) break;
}
fp
= fopen ("current_run.txt","w");
WriteChannelParameters ( 0,0,0); // Test pulse on all channels
for (board=0; board<4; board++) if ( mask &(1<<board)) SlowControl(board,fp);
SetCtrlVal(p1h,P1_TPENB,1); // enable test pulse
SetCtrlVal(p1h,P1_DATA, 350);
SetCtrlVal(p1h,P1_NEVE, 150);
GetCtrlVal(p1h,P1_DATA, &start);
daq(NULL);
SetCtrlVal(p1h,P1_TPENB,0); // disable test pulse
// coarse offset
step=1;
if (!ctrl_c) for (value=0; value<16; value+=step) {
if (addheader) {
iteratorrec.id = ITERATORREC_ID;
iteratorrec.len = sizeof(iteratorrec);
iteratorrec.value = value;
iteratorrec.n = 16;
iteratorrec.step = step;
iteratorrec.level = 1;
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
fp
= fopen(filename
, "ab");
if(fp) {
fwrite (&iteratorrec
, 1, iteratorrec.
len, fp
);
}
}
WriteChannelParameters ( value,0,1);
SetCtrlVal(p1h,P1_DATA,start - (value%8) * 13 + (value/8)*13*8 );
sa02Printf("offset=>%d\n", value);
daq(NULL);
if (ctrl_c) break;
}
// fine offset
if (!ctrl_c) for (value=0; value<16; value+=step) {
if (addheader) {
iteratorrec.id = ITERATORREC_ID;
iteratorrec.len = sizeof(iteratorrec);
iteratorrec.value = value;
iteratorrec.n = 16;
iteratorrec.step = step;
iteratorrec.level = 1;
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
fp
= fopen(filename
, "ab");
if(fp) {
fwrite (&iteratorrec
, 1, iteratorrec.
len, fp
);
}
}
WriteChannelParameters (0, value,1);
SetCtrlVal(p1h,P1_DATA, start - (value%8) + (value/8)*8 );
sa02Printf("offset=>%d\n", value);
daq(NULL);
if (ctrl_c) break;
}
SetCtrlVal(p1h,P1_DATA, start);
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
sprintf(cmdCommand
,"..\\sa02read -i %s -o data\\febtest_%04d.root", filename
, current_run
);
sa02Printf("%s\n",cmdCommand);
LaunchExecutable(cmdCommand);
//sprintf(cmdCommand ,"C:/root/bin/root.exe ../macros/febreport.cxx(\\\"data/febtest_%04d.root\\\")", current_run);
sprintf(cmdCommand
,"C:/root/bin/root.exe \"../macros/febreport.cxx(\\\"data\\\", %d )\"", current_run
);
sa02Printf("%s\n",cmdCommand);
LaunchExecutable(cmdCommand);
SetCtrlVal(p1h,P1_OUTPUTFILE, line);
//daq(NULL);
return 0;
}
int CVICALLBACK ThresholdLinearityCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
const int kmax= 1024;
const int boardmax= 4;
switch (event) {
case EVENT_COMMIT: {
uint32_t val,retval, board,data,response[2]= {0,0};
int k;
int chip,channel;
double doubleval;
time_t t,told;
char title[0xFF];
char name[0xFF];
int h1=0;
uint16_t mask=GetConnectedFebMask();
chip=0;
channel=0;
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
for (board=0; board<boardmax; board++) if ( mask &(1<<board)) {
char serial[0xFF];
GetCtrlVal(p1h,hapd_serials[board],serial );
sprintf(title
,"VTH1 linearity, position %d sn=%s", board
, serial
);
H1DInit(h1+board, name,title, kmax, 0 ,1);
H1DSetTitleX(h1+board,"VTH1");
H1DSetTitleY(h1+board,"ADC(VTH1)");
SetCtrlAttribute (p1h, P1_GRAPH, ATTR_XNAME, H1DGetTitleX(h1+board) );
SetCtrlAttribute (p1h, P1_GRAPH, ATTR_YNAME, H1DGetTitleY(h1+board) );
//SetCtrlAttribute (p1h, P1_GRAPH, ATTR_LABEL_TEXT , H1DGetTitle(h1+board) );
if (phandle[board]> 0 ) DeleteGraphPlot (p1h, P1_GRAPH, phandle[board], VAL_IMMEDIATE_DRAW);
phandle[board] = 0;
}
for (board=0; board<boardmax; board++) if ( mask &(1<<board)) {
val=sa02Cmd(board, FEB_MUX, data=0x20, chip, channel ,1,response); // set mux to VTH1
told=t;
if (ctrl_c) break;
for (k=0; k<kmax; k++) {
if (ctrl_c) break;
SetCtrlVal(p1h,P1_SETSINGLEVALUE,k);
SetCtrlVal(p1h,P1_CUREVE,k);
retval=sa02Cmd(board, FEB_VTH1 , k , chip, channel ,1, response);
val=sa02Cmd(board, FEB_ADC_READ, data, chip, channel ,1,response);
if (sa02BoardType>2)
doubleval = sa02adc2Vm(val);
else
doubleval = sa02adc2V(val);
// doubleval = (2*((val & 0xFFF) + 0.5)/0x1000 - 1.) * 3.3;
// else
// doubleval = ((val & 0xFFF) + 0.5)/0x1000 * 3.3;
H1DFillBin(h1+board, k, doubleval);
if (t!=told || k==kmax-1 ||k==0 ) {
H1DDraw(h1+board,p1h, P1_GRAPH, &phandle[board]);
sa02Printf("[%d] set VTH1=%d ADC(VTH1)= %6.3f V\n",board, k, doubleval);
SetCtrlVal(p1h,P1_CUREVE, k);
ProcessSystemEvents ();
}
told=t;
}
}
break;
}
}
return 0;
}
int CVICALLBACK MultiFpgaWrite (void *functionData) {
uint32_t val, board,data,step,cmd,response[2]= {0,0};
char scmd[0xFF],sdata[0xFF];
int chip, channel;
char filename[0xFF];
double delay, doubleval=0, x0, dx;
int neve,i,daqexe,addheader;
time_t t,told, tstart;
FILE *fp;
//int h2=0;
int *fdata= (int *) functionData;
datrec.id = DATREC_ID;
datrec.len = sizeof(datrec);
GetCtrlVal(p1h,P1_MULTINEVE , &neve);
GetCtrlVal(p1h,P1_WAIT , &delay);
GetCtrlVal(p1h, P1_SINGLEWRITECMD, scmd);
cmd=sa02GetCmdCode(scmd);
GetCtrlVal(p1h,P1_BOARDNUMBER, &board);
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
GetCtrlVal(p1h, P1_SINGLEDATA, sdata);
// if (strcmp(scmd,"MUXASIC")==0) {
// data = sa02MuxMap(data);
// sa02Printf("MUX %d\n",data);
// }
GetCtrlVal(p1h, P1_SINGLEDATA, sdata);
x0=(double)data;
GetCtrlVal(p1h, P1_DSTEP0, &step);
dx=(double)step;
GetCtrlVal(p1h,P1_SINGLECHIP,&chip);
GetCtrlVal(p1h,P1_SINGLECHANNEL,&channel);
if (fdata[0]==P1_FPGAWRITE) {
neve=1;
}
GetCtrlVal(p1h,P1_DAQEXE,&daqexe);
GetCtrlVal(p1h,P1_ADDHEADER,&addheader);
tstart=t;
told=t;
if (addheader) {
iteratorrec.id = ITERATORREC_ID;
iteratorrec.len = sizeof(iteratorrec);
iteratorrec.value = data;
iteratorrec.n = neve;
iteratorrec.step = step;
iteratorrec.level = 2;
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
fp
= fopen(filename
, "ab");
if(fp) {
fwrite (&iteratorrec
, 1, iteratorrec.
len, fp
);
}
}
for (i=0; i<neve; i++) {
SetCtrlVal(p1h,P1_SETSINGLEVALUE,data);
SetCtrlVal(p1h,P1_CUREVE,i);
val=sa02Cmd(board, cmd, data, chip, channel ,1, response);
if (addheader) {
datrec.cmd =cmd;
datrec.data =data;
datrec.chip =chip;
datrec.channel=channel;
datrec.retval =val;
GetCtrlVal(p1h,P1_OUTPUTFILE, filename);
fp
= fopen(filename
, "ab");
if(fp) {
fwrite (&datrec
, 1, datrec.
len, fp
);
}
}
switch (cmd & (~ FEB_RO)) {
case FEB_ADC_READ:
case FEB_ADC_RESET:
doubleval = sa02adc2V(val);
// doubleval = ((val & 0xFFF) + 0.5)/0x1000 * 3.3;
sa02Printf("ADC %f, 0x%08x\n", doubleval, val ) ;
break;
case FEB_TMON1:
case FEB_TMON0:
doubleval = ( (val >>2 ) & 0xFFF ) * 0.0625;
if (val&0x4000) {
doubleval=-doubleval;
}
sa02Printf("TMON %f 0x%x\n",doubleval, val ) ;
break;
case FEB_VTH1:
case FEB_VTH2:
doubleval = (val & 0xFFFF );
if (cmd & 1)
val=0x20;
else
val=0x30;
val=sa02Cmd(board, FEB_MUX, val, 0, 0 ,1,response);
val=sa02Cmd(board, FEB_ADC_READ, 0, 0, 0, 1,response);
if (sa02BoardType>2)
doubleval = sa02adc2Vm(val);
// doubleval = (2*((val & 0xFFF) + 0.5)/0x1000 - 1.) * 3.3;
else
doubleval = sa02adc2V(val);
// doubleval = ((val & 0xFFF) + 0.5)/0x1000 * 3.3;
sa02Printf("%5d %6.3f\n",data, doubleval);
break;
case SA0x_ASIC0_GREG:
if (cmd & FEB_RO) {
sa02PrintGREG(&val,"Returned GREG data->");
}
break;
case SA0x_ASIC0_CREG:
if (cmd & FEB_RO) {
sa02PrintCREG(&val,"Returned CREG data->");
}
break;
default:
sa02Printf("0x%08X\n",val);
// break;
}
datay[i]=doubleval;
if (delay>0 && fdata[0]==P1_MULTIFPGAWRITE) {
Delay(delay);
}
if (daqexe) {
daq(NULL);
}
if (ctrl_c) {
break;
}
if (t!=told ) {
plot1d(i,x0,dx);
SetCtrlVal(p1h,P1_CUREVE, i);
ProcessSystemEvents ();
}
data+=step;
told=t;
}
plot1d(i,x0,dx);
SetCtrlVal(p1h,P1_CUREVE, i);
return 0;
}
int CVICALLBACK SendSEUTRigger (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
switch (event) {
case EVENT_COMMIT:
Sa02SEUTrigger();
break;
}
return 0;
}
int CVICALLBACK FSelect (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
int status,fcontrol = 0;
char pathName[MAX_PATHNAME_LEN];
char defName[MAX_PATHNAME_LEN];
char fileMessage[100] = "";
switch (event) {
case EVENT_COMMIT:
switch (control) {
case P3_FSELECT:
fcontrol=P3_INPUTFILE;
strcpy(fileMessage
,"Select Parameter file");
break;
case P3_PTSFSELECT:
fcontrol=P3_PTSFIRMWARE;
strcpy(fileMessage
,"Select PTS Firmware file");
break;
}
sa02Printf("MAX_PATHNAME_LEN %d\n",MAX_PATHNAME_LEN);
GetCtrlVal(panel,fcontrol,defName);
status = FileSelectPopup ("",defName,"",
fileMessage, VAL_LOAD_BUTTON, 0,
0, 1, 0, pathName);
if (status>0)
SetCtrlVal(panel,fcontrol,pathName);
break;
}
return 0;
}
int CVICALLBACK Verbose (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
//int * data;
switch (event) {
case EVENT_COMMIT:
GetCtrlVal(panel,control,&sa02Verbose);
break;
}
return 0;
}
int CVICALLBACK Print (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
char dfile[MAX_PATHNAME_LEN];
char name[MAX_PATHNAME_LEN];
int h2=0;
switch (event) {
case EVENT_COMMIT: {
int hours, minutes, seconds;
int month, day, year;
int id=-1;
//int bitmap = 0;
if (panel == p1h) {
switch (control) {
case P1_PRINT:
id= P1_GRAPH;
break;
case P1_PRINT2D:
id= P1_GRAPH2D;
break;
case P1_PRINTX:
id= P1_GRAPHX;
break;
case P1_PRINTY:
id= P1_GRAPHY;
break;
}
h2=0;
}
else {
switch (control) {
case P2_PRINTXY:
id= P2_GRAPH_1;
break;
}
h2=1;
}
GetSystemDate (&month,&day ,&year );
GetSystemTime(&hours, &minutes, &seconds);
if (id>=0) {
if( ( (panel == p1h)&&(control == P1_PRINT2D) ) || ((panel == p2h)&&(control == P2_GRAPH_1))) {
sprintf(dfile
,"data/%d_%d_%d_%d_%d_%s.th2d",year
,month
,day
,hours
,minutes
, name
);
H2DWrite(h2,dfile,"wb");
sa02Printf("sizeof H2D %d \n",sizeof(H2D));
sa02Printf("H2D image saved as %s\n", dfile);
sprintf(name
,"C:\\root\\bin\\root.exe ..\\macros\\H2Dload.cxx(\\\"%s\\\")", dfile
);
LaunchExecutable(name);
}
else {
sprintf(dfile
,"data/%d_%d_%d_%d_%d_%s.bmp",year
,month
,day
,hours
,minutes
, name
);
SaveCtrlDisplayToFile (panel,id, 0, -1, -1, dfile);
sa02Printf("bmp image saved as %s\n", dfile);
}
}
//PrintCtrl (p1h, P1_GRAPH2D, "sa02_CVI", 1, 1);
}
break;
}
return 0;
}
int CVICALLBACK CursorCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
double x=0,y=0;
int ix=0,iy=0;
int h2=(int) callbackData;
switch (event) {
case EVENT_COMMIT:
GetGraphCursor (p1h, P1_GRAPH2D, 1, &x, &y);
if(H2DGetStepX(h2)>0) {
ix=(int)((x-H2DGetMinX(h2))/H2DGetStepX(h2));
}
if(H2DGetStepY(h2)>0) {
iy=(int)((y-H2DGetMinY(h2))/H2DGetStepY(h2));
}
SetCtrlVal(panel,P1_NSLIX,ix);
SetCtrlVal(panel,P1_NSLIY,iy);
sa02Printf("Cursor %f %f h2=%d val=%f min=%f max=%f\n",
x,y,h2,H2DGetBinContent(h2,ix,iy),H2DGetMin(h2),
H2DGetMax(h2) );
break;
}
return 0;
}
int CVICALLBACK HistoInfoCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
double x=0,y=0;
int ix=0,iy=0;
int h2=(int) callbackData;
int b=0;
switch (event) {
case EVENT_COMMIT:
GetGraphCursor (panel, control, 1, &x, &y);
if (panel == p2h ) {
for (b=0; b<4; b++) {
if (control==p2graph[b]) break;
}
h2=100+b;
if(H2DGetStepX(h2)>0) {
ix=(int)((x-H2DGetMinX(h2))/H2DGetStepX(h2));
}
if(H2DGetStepY(h2)>0) {
iy=(int)((y-H2DGetMinY(h2))/H2DGetStepY(h2));
}
sa02Printf("Cursor %f %f h2=%d val=%f min=%f max=%f\n",
x,y,h2,H2DGetBinContent(h2,ix,iy),H2DGetMin(h2),
H2DGetMax(h2) );
}
break;
}
return 0;
}
int GetElectronicChannel(int x, int y, int *chip, int *ch) {
int i=0;
for (i=0; i<144; i++) {
if (eid2hapdxy[i].chx == x && eid2hapdxy[i].chy == y) {
*chip = eid2hapdxy[i].chip;
*ch = eid2hapdxy[i].ch ;
return 0;
}
}
return -1;
}
int SetCMon(int chx,int chy) {
int chip,ch,asic;
uint32_t response[2]= {0,0};
uint32_t board;
uint16_t mask=GetConnectedFebMask();
// GetCtrlVal(p1h,P1_BOARDNUMBER, &board);
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
GetElectronicChannel(chx,chy,&chip,&ch);
asic = sa02MuxMap(chip);
sa02Printf("CHX %d CHY %d ",chx, chy);
sa02Printf("MUX %d ",asic);
sa02Printf("CMON ASIC: %d ch: %d\n",chip, ch);
for (board=0; board<4; board++) {
if (mask & (1<<board)) {
sa02Cmd(board,FEB_MUX , asic, 0, 0 ,2,response);
sa02Cmd(board,SA0x_ASIC0_CMON,0,chip,ch,2,response);
}
}
return 0;
}
int CVICALLBACK HDraw2DCB (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2) {
int ch=0;
int ctrlID=0;
int *plot=0;
int graph=0;
int board=0;
switch (event) {
case EVENT_COMMIT:
for (board=0; board<4; board++) {
// if (panel == p1h){ rID = P1_CH; graph = P1_GRAPH; plot =&p1plothandle;}
if (panel == p2h) {
ctrlID = P2_CH;
graph = p2graph[board];
plot =&p2plothandle[board];
}
// if (panel == p3h){ rID = P3_CH; graph = P3_GRAPH; plot =&p3plothandle;}
// if (panel == p4h){ rID = P4_CH; graph = P4_GRAPH; plot =&p4plothandle;}
GetCtrlVal(panel,ctrlID, &ch);
if (ch) {
H3DDrawSliceXY(100+board,ch-1,panel,graph, plot);
}
else {
H2DDraw(100+board,panel,graph, plot);
}
}
break;
}
return 0;
}
int GetHvMonitor( void ) {
int N470mid = 4;
int SYS403mid = 2;
unsigned short buf[256]= {0};
int retval;
int ii;
// G0,A0,B0,C0,D0,H0,G1,A1,B1,C1,D1,H1,G2,A2,B2,C2,D2,H2,G3,A3,B3,C3,D3,H3
int channels[]= {24, 0, 1, 2, 3, 0,25, 4, 5, 6, 7, 1,26, 8, 9,10,11, 2,27,12,13,14,15, 3}; //channel for SYS403 , then for N470
// int channels[]= {0,1,2,3,4,0,5,6,7,8,9,1,10,11,12,13,14,2,15,16,17,18,19,3}; //channel for SYS403 , then for N470
for (ii=0; ii<256; ii++) buf[ii]=0;
for (ii=0; ii<=23; ii++) {
if ((ii+1)%6==0 && ii!=0) {
buf[0]=(unsigned short) (channels[ii]<<8) | ReadOperationalParam;
if (gCAEN_V288) {
V288_Send(0,N470mid,1,buf);
retval=V288_Receive(0,255, buf);
}
monrec.status[ii] = buf[0]; //status
monrec.vmon[ii] = buf[1]*1000;//zapisano v mV
monrec.imon[ii] = buf[2]*1000;//zapisano v nA
monrec.vset[ii] = buf[3]*1000;//zapisano v mV
monrec.iset[ii] = buf[4]*1000;//zapisano v nA
}
else {
buf[0]=(unsigned short) (channels[ii]<<8) | ReadStatus;
if (gCAEN_V288) {
V288_Send(0,SYS403mid,1,buf);
retval=V288_Receive(0,255,buf);
}
monrec.vmon[ii] = buf[1]*10;//zapisano v mV
monrec.imon[ii] = buf[2]*10;//zapisano v nA
monrec.status[ii] = buf[3]; //status
if (!hvmonFirst) {
buf[0]=(unsigned short) (channels[ii]<<8) | ReadParameters;
if (gCAEN_V288) {
V288_Send(0,SYS403mid,1,buf);
retval=V288_Receive(0,255,buf);
}
vset[ii] = monrec.vset[ii] = buf[7]*10;//zapisano v mV
iset[ii] = monrec.iset[ii] = buf[10]*10;//zapisano v nA
}
monrec.vset[ii] = vset[ii];//zapisano v mV
monrec.iset[ii] = iset[ii];//zapisano v nA
}
//sa02Printf("%04x \t %d \t %d \t %d \t %d *\n",monrec.status[ii],monrec.vmon[ii],monrec.vset[ii],monrec.imon[ii],monrec.iset[ii]);
}
hvmonFirst=1;
return 0;
}
int CVICALLBACK daq_scan(void *functionData) {
int ich,count=0, xyval[4]= {0,0,0,0};
//int c[4]= {0,0,0,0};
//int e[4]= {0,0,0,0};
uint32_t daqmode=1;
uint32_t trglen;
int nb,dsave,fcount=0,fmax=0,status,ch;
unsigned int i;
int hxy=100;
//int h2=0;
time_t t,told, tstart, t0;
uint32_t board;
uint32_t tpenb =0;
uint32_t response[2]= {0,0};
char title[0xFF];
char dfile[MAX_PATHNAME_LEN],dfile0[MAX_PATHNAME_LEN];
#define MAXSIZE 10000
int maxsize = MAXSIZE;
uint32_t sendswtrg=0;
int ncount=0;
uint32_t *rdata;
float dx,dy,gapx,gapy,addgap;
int ix,iy,nx,ny;
int scanunitsx=0,scanunitsy=0;
int x0,y0;
const float fx= (float)(1000 / 0.3595); // 4M scaling factor steps/mm
int daqexe;
int writeevents=0;
double fraction=0;
uint32_t *data;
char serial[4][0xFF];
char hname[0xFF];
time_t cas;
uint16_t mask=GetConnectedFebMask();
runrec.id = RUNREC_ID;
runrec.len = sizeof(runrec);
endrec.id = ENDREC_ID;
endrec.len = sizeof(endrec);
posrec.id = POSREC_ID;
posrec.len = sizeof(posrec);
evtrec.id = EVTREC_ID;
evtrec.len = sizeof(evtrec);
datrec.id = DATREC_ID;
datrec.len = sizeof(datrec);
monrec.id = MONREC_ID;
monrec.len = sizeof(monrec);
SetCtrlAttribute (p2h, P2_DAQ, ATTR_DIMMED, 1);
ctrl_c=0;
GetCtrlVal(p1h,P1_BOARDTYPE,&sa02BoardType);
GetCtrlVal (p1h, P1_SERIAL_1, serial[0]);
GetCtrlVal (p1h, P1_SERIAL_2, serial[1]);
GetCtrlVal (p1h, P1_SERIAL_3, serial[2]);
GetCtrlVal (p1h, P1_SERIAL_4, serial[3]);
sprintf(runrec.
serial,"HAPD=%s,%s,%s,%s", serial
[0],serial
[1],serial
[2],serial
[3]);
GetCtrlVal (p2h, P2_NEVE, &runrec.nev);
GetCtrlVal (p2h, P2_PEDESTAL, &runrec.ped);
GetCtrlVal (p2h, P2_NX, &runrec.nx);
GetCtrlVal (p2h, P2_XSTEP, &runrec.dx);
GetCtrlVal (p2h, P2_XMIN, &runrec.x0);
GetCtrlVal (p2h, P2_NY, &runrec.ny);
GetCtrlVal (p2h, P2_YSTEP, &runrec.dy);
GetCtrlVal (p2h, P2_YMIN, &runrec.y0);
GetCtrlVal ( p1h, P2_TPENB,&tpenb);
GetCtrlVal ( p2h,P2_DAQEXE,&daqexe);
GetCtrlVal(p2h,P2_FRACTION, &fraction);
GetCtrlVal (p2h, P2_SCANUNITSX, &scanunitsx);
GetCtrlVal (p2h, P2_SCANUNITSY, &scanunitsy);
GetCtrlVal (p2h, P2_GAPX, &gapx);
GetCtrlVal (p2h, P2_GAPX, &gapy);
GetCtrlVal (p2h, P2_DX, &dx);
GetCtrlVal (p2h, P2_DX, &dy);
GetCtrlVal (p2h, P2_XC, &x0);
GetCtrlVal (p2h, P2_YC, &y0);
GetCtrlVal (p2h, P2_DIRECTION, &runrec.direction);
SetCtrlAttribute(p1h,P1_TRGHVMON,ATTR_ENABLED,1);
hvmonFirst = 0;
GetCtrlVal(p1h,P1_SENDSWTRIG,&sendswtrg);
GetCtrlVal(p1h,P1_INTTRGLEN, &trglen);
GetCtrlVal(p1h,P1_DAQMODE, &daqmode);
runrec.fver = scanunitsx + scanunitsy*2 ;
if (scanunitsx) {
x0 = (int)(x0 - 5.5 * fx * dx - gapx * fx * 0.5);
}
if (scanunitsy) {
y0 = (int)(y0 - 5.5 * fx * dy - gapy * fx * 0.5);
}
GetCtrlVal(p2h, P2_DSAVE, &dsave);
if (dsave) {
GetCtrlVal (p2h, P2_DFILE, dfile0);
fcount=1;
GetCtrlVal (p2h, P2_NEWF, &fmax);
fmax*=1000000;//fmax in Mega Bytes
}
sa02Printf("---->daq_scan\n");
if (dsave) {
sprintf(dfile
,"%s_file%02d.dat",dfile0
,fcount
);
//gFp = fopen (dfile, "ab");
gFp
= fopen (dfile
, "ab");
if (gFp==NULL) sa02Printf("----> !!! gFp==NULL !!!\n");
if (ferror (gFp
)) sa02Printf
("----> !!! ferror (gFp) after fopen !!!\n");
//time ((time_t *) &runrec.time);
runrec.
time = (uint32_t) cas
;
status
= (int) fwrite (&runrec
, 1, runrec.
len, gFp
);
if(status != runrec.len) sa02Printf("----> !!! status != runrec.len (= %d) !!!\n", status);
if (ferror (gFp
)) sa02Printf
("----> !!! ferror (gFp) = %d !!!\n", ferror (gFp
));
}
for (i=0; i<4; i++) {
sprintf(title
,"HAPD%d Surface Scan single channels", i
);
H3DInit(hxy+i,hname,title, runrec.nx,runrec.x0, runrec.dx,runrec.ny,runrec.y0, runrec.dy, 144, -0.5, 1);
H3DSetTitleZ(hxy+i,"channel");
H2DInit(hxy+i,hname,runrec.serial, runrec.nx,runrec.x0, runrec.dx,runrec.ny,runrec.y0, runrec.dy);
if (scanunitsx) {
H2DSetTitleX(hxy+i,"x (channels)");
H3DSetTitleX(hxy+i,"x (channels)");
}
else {
H2DSetTitleX(hxy+i,"x (stage steps)");
H3DSetTitleX(hxy+i,"x (stage steps)");
}
if (scanunitsy) {
H2DSetTitleY(hxy+i,"y (channels)");
H3DSetTitleY(hxy+i,"y (channels)");
}
else {
H2DSetTitleY(hxy+i,"y (stage steps)");
H3DSetTitleY(hxy+i,"y (stage steps)");
}
}
if (runrec.direction) {
ny = runrec.ny;
nx = runrec.nx;
}
else {
ny = runrec.nx;
nx = runrec.ny;
}
rdata
= malloc(sizeof(uint32_t)*maxsize
);
tstart=t;
told=t-1;
for (iy=0; iy<ny; iy++) {
if (ctrl_c) break;
if (runrec.direction) {
posrec.iy = iy;
posrec.yset=runrec.y0+posrec.iy*runrec.dy;
if (scanunitsy) {
if (posrec.yset>5) {
addgap=gapy * fx;
}
else {
addgap=0;
}
posrec.yset = (int32_t)(y0+dy *fx * posrec.yset + addgap);
}
if (gMIKRO_Y) {
//sa02Printf("MIKRO_MoveTo (2, y);%d\n",y);
MIKRO_MoveTo (MIKRO_Y, posrec.yset);
sa02Printf("->MIKRO_MoveTo (2, y);%d\n",posrec.yset);
}
SetCtrlVal (p2h, P2_Y, posrec.yset);
SetCtrlVal (p2h, P2_IY, posrec.iy);
}
else {
posrec.ix = iy;
posrec.xset=runrec.x0+posrec.ix*runrec.dx;
if (scanunitsx) {
if (posrec.xset>5) {
addgap=gapx * fx;
}
else {
addgap=0;
}
posrec.xset = (int32_t)(x0+dx *fx * posrec.xset + addgap);
}
if (gMIKRO_Y) {
//sa02Printf("MIKRO_MoveTo (2, y);%d\n",y);
MIKRO_MoveTo (MIKRO_X, posrec.xset);
sa02Printf("->MIKRO_MoveTo (1, x);%d\n",posrec.xset);
}
SetCtrlVal (p2h, P2_X, posrec.xset);
SetCtrlVal (p2h, P2_IX, posrec.ix);
}
for (ix=0; ix<nx; ix++) {
if (ctrl_c) break;
if (runrec.direction) {
posrec.ix = ix;
posrec.xset=runrec.x0+posrec.ix*runrec.dx;
if (scanunitsx) {
if (posrec.xset>5) {
addgap=gapx * fx;
}
else {
addgap=0;
}
posrec.xset = (int32_t)(x0+dx *fx * posrec.xset + addgap);
}
if (gMIKRO_X) {
//sa02Printf("MIKRO_MoveTo (1, x);%d\n",posrec.x);
MIKRO_MoveTo (MIKRO_X, posrec.xset);
sa02Printf("->MIKRO_MoveTo (1, x);%d\n",posrec.xset);
}
SetCtrlVal (p2h, P2_X, posrec.xset);
SetCtrlVal (p2h, P2_IX, posrec.ix);
}
else {
posrec.iy = ix;
posrec.yset=runrec.y0+posrec.iy*runrec.dy;
if (scanunitsy) {
if (posrec.yset>5) {
addgap=gapy * fx;
}
else {
addgap=0;
}
posrec.yset = (int32_t)(y0+dy *fx * posrec.yset + addgap);
}
if (gMIKRO_X) {
//sa02Printf("MIKRO_MoveTo (1, x);%d\n",posrec.y);
MIKRO_MoveTo (MIKRO_Y, posrec.yset);
sa02Printf("->MIKRO_MoveTo (2, y);%d\n",posrec.yset);
}
SetCtrlVal (p2h, P2_Y, posrec.yset);
SetCtrlVal (p2h, P2_IY, posrec.iy);
}
if (scanunitsx && scanunitsy) {
SetCMon(runrec.x0+posrec.ix*runrec.dx,runrec.y0+posrec.iy*runrec.dy);
}
if (dsave) {
if (fmax
&& (ftell(gFp
) > fmax
)) {
fcount+=1;
sprintf(dfile
,"%s_file%02d.dat",dfile0
,fcount
);
gFp
= fopen (dfile
, "ab");
}
posrec.
time = (uint32_t) cas
;
status
= (int) fwrite (&posrec
, 1, posrec.
len, gFp
);
}
Sa02DaqMode (daqmode);
Sa02SelectTriggerWithMaskAndLength (sendswtrg, mask, trglen);
for (board=0; board<4; board++) {
if (mask & (1<<board)) {
sa02Cmd( board, FEB_VTH1, runrec.ped, 0,0,1,response);
Sa02TestPulseEnable(board,tpenb); // Enable/disable test pulse
}
}
Sa02SetNeve(runrec.nev);
evtrec.nev=1;
sa02Reset();
if (ctrl_c) break;
if ( (count+2+dsize) >= maxsize) {
maxsize*=2;
sa02Printf("Increasing data buffer to %d elements\n", maxsize);
rdata
=realloc(rdata
,sizeof(uint32_t)*maxsize
);
}
data = &rdata[count+2];
do {
//int k;
//uint32_t inputtriggers;
if (sendswtrg == 1) Sa02SoftwareTrigger();
nb = sa02Read(mask, &rdata[count+2] );
/*
for (k=0; k<4; k++) c[k] = Sa02GetCounter ( k ,&e[k]);
for (k=0; k<4; k++) sa02Printf(" CNTR%d=%d (ERR=%d)\t",k,c[k],e[k]);
sa02Printf("\nsa02Read bytes = %d mask=%d neve=%d (%d # %d)\n", nb, mask, runrec.nev, Sa02GetNeve( &inputtriggers ) , inputtriggers);
*/
}
while ( nb==0 && !ctrl_c);
if (sa02TimerOut || nb==0) sa02Printf("sa02TimerOut || nb==0\n");
for (ich=0; ich<144*4; ich++) {
int brd = ich/144;
int xch = 143 - ich%144;
//sa02Printf("[%d] = %d \n", ich, data[ich]);
if (data[ich]> xyval[brd]) xyval[brd] = data[ich];
if (mask & (1<<brd)) {
H3DFillBin(hxy+ brd, posrec.ix,posrec.iy,xch,data[ich]);
H2DFillBin(hxy+ brd, posrec.ix,posrec.iy,data[ich]);
}
}
sa02Printf("max couts = %d %d %d %d\n", xyval[0],xyval[1],xyval[2],xyval[3]);
if (nb>=0) {
count+=module_header(0x3,&rdata[count],nb/sizeof(uint32_t));
}
/*
for (ich=0; ich<144; ich++) {
// uint32_t mask=0xFF;
// id=(35-ich/4);
// shft=(ich%4)*8;
uint32_t mask=0xF;
id=(17-ich/8)+board*18;
shft=(ich%8)*4;
if ( data[id] & (mask <<shft) ) {
H3DFillBin(hxy, posrec.ix,posrec.iy,ich,1);
H2DFillBin(hxy, posrec.ix,posrec.iy,1);
}
}
*/
if (dsave) {
if (Random(0,1)<fraction) {
writeevents=1;
}
else {
writeevents=0;
}
if (writeevents) {
evtrec.id = EVTREC_ID;
evtrec.len=count*sizeof(uint32_t)+ sizeof(evtrec);
evtrec.nev=i;
status
= (int) fwrite( &evtrec
, 1, sizeof(evtrec
),gFp
);
if (count) {
status
= (int) fwrite(rdata
,1,count
*sizeof(uint32_t),gFp
); //gzip
}
}
if (hvmon) {
time_t thv0,thv1;
GetHvMonitor();
status
= (int) fwrite( &monrec
, 1, sizeof(monrec
),gFp
);
sa02Printf("HvMonitor dt= %d s\n", thv1-thv0 );
hvmon =0;
}
ncount++;
}
if (t!=told ) {
double done= (double) (posrec.ix+posrec.iy*runrec.nx)/(runrec.nx*runrec.ny);
EstimatedFinish(p2h, P2_PROGRESS, P2_ETA, t0, done);
GetCtrlVal(p2h,P2_CH, &ch);
for (board=0; board<4; board++) {
if (ch) {
H3DDrawSliceXY(hxy+board,ch,p2h, p2graph[board], &p2plothandle[board]);
}
else {
H2DDraw(hxy+board,p2h, p2graph[board], &p2plothandle[board]);
}
}
ProcessSystemEvents ();
SetCtrlVal(p2h,P2_CEVE, i);
sa02Printf
("%d events in %2.2f min (%d s) %s",ncount
, (double)(t
-tstart
)/60.
,t
-tstart
, ctime(&t
));
}
told=t;
if (ctrl_c) break;
if (daqexe &0x1) {
daq(NULL);
sa02Cmd( board, FEB_VTH1, runrec.ped, 0,0,1,response);
}
if (daqexe &0x2) {
V729_SetFilePointer(gFp);
V729_daq(NULL);
}
}
}
if (gFp) {
int ii=0, ison=0;
for (ii=0; ii<4; ii++) {
GetCtrlVal(p1h,hapd_onoff[ii], &ison);
if (ison ) {
H3DWrite2File(hxy+ii, gFp);
H2DWrite2File(hxy+ii, gFp);
}
}
}
gFp=NULL;
SetCtrlAttribute(p1h,P1_TRGHVMON,ATTR_ENABLED,0);
return 0;
}
int CVICALLBACK Testing(void *functionData) {
int i;
int N470mid = 4;
int SYS403mid = 2;
unsigned short buf[256]= {0};
int odg;
int channels[]= {0,1,2,3,4,0,5,6,7,8,9,1,10,11,12,13,14,2,15,16,17,18,19,3}; //channel for SYS403 , then for N470
time_t t0,t1;
hvmonFirst=0;
for (i=0; i<256; i++) buf[i]=0;
for (i=0; i<=23; i++) {
if (((i+1)%6)==0&&i!=0) {
buf[0]=(unsigned short) (channels[i]<<8) | ReadOperationalParam;
if (gCAEN_V288) {
V288_Send(0,N470mid,1,buf);
odg=V288_Receive(0,255,buf);
}
monrec.status[i] = buf[0]; //status
monrec.vmon[i] = buf[1]*1000;//zapisano v mV
monrec.imon[i] = buf[2]*1000;//zapisano v nA
monrec.vset[i] = buf[3]*1000;//zapisano v mV
monrec.iset[i] = buf[4]*1000;//zapisano v nA
}
else {
buf[0]=(unsigned short) (channels[i]<<8) | ReadStatus;
if (gCAEN_V288) {
V288_Send(0,SYS403mid,1,buf);
odg=V288_Receive(0,255,buf);
}
monrec.vmon[i] = buf[1]*10;//zapisano v mV
monrec.imon[i] = buf[2]*10;//zapisano v nA
monrec.status[i] = buf[3]; //status
if(!hvmonFirst) {
buf[0]=(unsigned short) (channels[i]<<8) | ReadParameters;
if (gCAEN_V288) {
V288_Send(0,SYS403mid,1,buf);
odg=V288_Receive(0,255,buf);
}
vset[i] = monrec.vset[i] = buf[7]*10;//zapisano v mV
iset[i] = monrec.iset[i] = buf[10]*10;//zapisano v nA
}
monrec.vset[i] = vset[i];//zapisano v mV
monrec.iset[i] = iset[i];//zapisano v nA
}
sa02Printf("%04x \t %.02f V \t %d V \t\t %.02f muA \t %d muA *\n",monrec.status[i],(float)monrec.vmon[i]/1000,monrec.vset[i]/1000,(float)monrec.imon[i]/1000,monrec.iset[i]/1000);
}
sa02Printf
("Cas izvedbe:%g s.\n",difftime(t1
,t0
));
return 0;
}
int CVICALLBACK set_dac(int OnOff) {
int val;
char name[MAX_PATHNAME_LEN];
if (OnOff) {
GetCtrlVal (p5h, P5_DAC_ON, &val);
sprintf(name
,"%s -p %d",palaser
, val
);
sa02Printf("%s\n", name);
GetCtrlVal (p5h, P5_FREQUENCY_ON, &val);
sprintf(name
,"%s -f %d",palaser
, val
);
sa02Printf("%s\n", name);
}
else {
GetCtrlVal (p5h, P5_DAC_OFF, &val);