#include "mdaq.h" #include #include #include #include #include #include "gui.h" //#define USE_MIKRO #define USE_DAC #ifdef USE_MIKRO #include "MIKRO.h" #define MIKRO_COM 5 #endif #define MAX_THREADS 10 static int poolHandle = 0; static int panelHandle,tfID, dummy; #define MAXCH 32 #define NCH MAXCH #define ADCRANGE 0x1000 unsigned int adcdata[2][MAXCH][ADCRANGE]; unsigned int datadc[ADCRANGE]; #define TDCRANGE 0x10000 unsigned int tdcdata[2][MAXCH][TDCRANGE]; unsigned int dattdc[TDCRANGE]; #define MAXSIZE ADCRANGE typedef struct { int recid; int size; int time; int id; int nbins; char name[120]; float xmin; float xmax; float data[MAXSIZE]; } TH1F; TH1F tch[2*MAXCH]; #define HISTREC_ID 11 int TH1Finit(int id, char *hname, int nbins, float xmin, float xmax){ tch[id].recid= HISTREC_ID; tch[id].id=id; tch[id].time=time(NULL); if (nbins>MAXSIZE) nbins=MAXSIZE; sprintf(tch[id].name,"%s",hname); tch[id].nbins= nbins; tch[id].xmin = xmin; tch[id].xmax = xmax; tch[id].size = sizeof(TH1F) - (MAXSIZE - nbins)* sizeof(float); return 0; } int TH1Freset(int id){ int i; tch[id].time=time(NULL); for (i=0;i='0')&&(*str<='9')) digit=*str-'0'; else if((*str>='a')&&(*str<='f')) digit=*str-'a'+10; else if((*str>='A')&&(*str<='F')) digit=*str-'A'+10; else break; if(retval>0xFFFFFFF) { // Overflow - you need to decide what to do! } else retval=retval*16+digit; str++; } return(retval); } int daq_on=0; void UIRDimming(int pnl,int flag) { SetInputMode (pnl, P_START, flag); SetInputMode (pnl, P_EXIT, flag); SetInputMode (pnl, P_STOP ,!flag); } int hfill(unsigned long *x, int len){ int recid, reclen, i,j, edge, ch, rg, val; unsigned int data; //printf("len=%d\n",len); i=0; while (i> 17 ) &0x1F; edge = (data >> 16 ) &0x1; tdcdata[edge][ch][val]++; // printf("%d [%d] %d data=%d\n",j,ch,edge,val); break; case 0x340000: case 0x550000: edge=(data>>25)&0x3; if (edge==0) { ch=(data>>17)&0xf; if (recid==0x550000) ch+=16; rg=(data>>16)&0x1; val=data&0xfff; // printf("%d [%d] %d data=%d\n",j,ch,rg,val); adcdata[rg][ch][val]+=1; tch[ch+rg*MAXCH].data[val]++; } break; case 0x330000: if (((data>>27)&0x1F)==0){ edge = (data >> 26 ) & 0x1; ch = (data >> 21 ) & 0x1F; val = data & 0x1FFFFF; tdcdata[edge][ch][val/40]++; //printf("%d [%d] %d data=%d\n",j,ch,edge,val); } break; default: printf("Error in buffer\n"); } } } return 0; } int reset_histo(){ int rg, i, ch; for (rg=0;rg<2;rg++){ for (ch=0;ch>16) & 0xFFFF; printf("-------> %s 0x%x mask=0x%x 0x%x\n", strmask, imask, mask[0], mask[1]); for (i=0;i0){ // zapis v datoteko hdr[1]=nb+4*sizeof(int); hdr[2]=time(NULL); hdr[3]=i; //printf("Event %d %d %d %d nb=%d %d\n",hdr[0],hdr[1],hdr[2],hdr[3],nb,nb/4); if (writerawdata){ fwrite(hdr, sizeof(int),4 , fp); nb1=fwrite(data, 1,nb, fp); if (nb1!=nb) printf("IO error %d != %d err=%d %s\n\n\n\n",nb1,nb, errno, strerror(errno) ); } ntotal += nb1; hfill(data,nb/sizeof(int)); } else { i--; printf("%d daq::event() Tout %s nb=%d\n",i,ctime(&t),nb); } } for (i=0;iadcmax) datadc[i]=0; for (i=0;i< TDCRANGE/tdcrebin;i++) if (dattdc[i]>tdcmax) dattdc[i]=0; for (i=0;i< ADCRANGE;i++) datadc[i/adcrebin]+=adcdata[range][adcch][i]; for (i=0;i< TDCRANGE;i++) dattdc[i/tdcrebin]+=tdcdata[edge][tdcch][i]; adcmax=0; tdcmax=0; for (i=0;i< ADCRANGE/adcrebin;i++) if (datadc[i]>adcmax) adcmax=datadc[i]; for (i=0;i< TDCRANGE/tdcrebin;i++) if (dattdc[i]>tdcmax) tdcmax=dattdc[i]; if (alogy) fadcmax=exp(fadcmax); if (tlogy) ftdcmax=exp(ftdcmax); adcmax *= fadcmax; tdcmax *= ftdcmax; if (adcmax==0) adcmax=1; if (tdcmax==0) tdcmax=1; SetAxisScalingMode (panelHandle, P_ADC, VAL_LEFT_YAXIS, VAL_MANUAL, 0.1, adcmax); SetAxisScalingMode (panelHandle, P_TDC, VAL_LEFT_YAXIS, VAL_MANUAL, 0.1, tdcmax); GetAxisScalingMode (panelHandle, P_ADC, VAL_XAXIS, &mode, &adcmin, & adcmax); GetAxisScalingMode (panelHandle, P_TDC, VAL_XAXIS, &mode, &tdcmin, & tdcmax); // SetAxisScalingMode (panelHandle, P_ADC, VAL_XAXIS, VAL_MANUAL, 0.0, ADCRANGE/adcrebin); // SetAxisScalingMode (panelHandle, P_TDC, VAL_XAXIS, VAL_MANUAL, 0.0, TDCRANGE/tdcrebin); //------------------------------------------------------------------------ DeleteGraphPlot (panelHandle, P_ADC, -1, VAL_DELAYED_DRAW); PlotY (panelHandle, P_ADC, &datadc[0], ADCRANGE/adcrebin, VAL_UNSIGNED_INTEGER, VAL_VERTICAL_BAR, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_RED); DeleteGraphPlot (panelHandle, P_TDC, -1, VAL_DELAYED_DRAW); PlotY (panelHandle, P_TDC, &dattdc[0], TDCRANGE/tdcrebin, VAL_UNSIGNED_INTEGER, VAL_VERTICAL_BAR, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_RED); return (0); } int main (int argc, char *argv[]) { if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ if ((panelHandle = LoadPanel (0, "gui.uir", P)) < 0) return -1; SetStdioWindowOptions (1000, 0, 0); SetStdioWindowSize (300, 600); SetStdioWindowPosition (650, 15); reset_histo(); daqconnect(); #ifdef USE_MIKRO MIKRO_Open (MIKRO_COM); MIKRO_Init (1,0); MIKRO_Init (2,0); #endif SetSleepPolicy(VAL_SLEEP_MORE); CmtNewThreadPool (MAX_THREADS, &poolHandle); DisplayPanel (panelHandle); RunUserInterface (); DiscardPanel (panelHandle); #ifdef USE_MIKRO MIKRO_Close (); #endif daqdisconnect(); return 0; } int CVICALLBACK StopCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: fStop=1; UIRDimming(panel,fStop); break; } return 0; } int CVICALLBACK StartCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int err; switch (event) { case EVENT_COMMIT: fStop=0; UIRDimming(panel,fStop); err = CmtScheduleThreadPoolFunction (poolHandle, daq, (void *)&dummy, &tfID); printf("Err %d!",err); break; } return 0; } int CVICALLBACK ExitCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; } return 0; } int CVICALLBACK UpdateCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int fupdate=0; switch (event) { case EVENT_COMMIT: update_plots(); case EVENT_TIMER_TICK: if (daq_on) { GetCtrlVal(panelHandle, P_UPDATE, &fupdate); if (fupdate) update_plots(); } break; } return 0; } int CVICALLBACK ClearCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: reset_histo(); break; } return 0; } int CVICALLBACK DacCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { float voltage; int dac; switch (event) { case EVENT_COMMIT: GetCtrlVal (panelHandle, P_DAC, &voltage); dac=4096*voltage/10.; // 10V range SetDac(dac); break; } return 0; } int CVICALLBACK PrintCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: PrintPanel (panel, "", 1, VAL_FULL_PANEL, 1); break; } return 0; }