diff --git a/FAST ComTec/DMCS6.dll b/FAST ComTec/DMCS6.dll new file mode 100644 index 0000000..260f1dd Binary files /dev/null and b/FAST ComTec/DMCS6.dll differ diff --git a/FAST ComTec/Files from FAST ComTec/mcs6adll/c/DMCS6.dll b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/DMCS6.dll new file mode 100644 index 0000000..260f1dd Binary files /dev/null and b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/DMCS6.dll differ diff --git a/FAST ComTec/Files from FAST ComTec/mcs6adll/c/STRUCT.H b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/STRUCT.H index 046c9c4..41db462 100644 --- a/FAST ComTec/Files from FAST ComTec/mcs6adll/c/STRUCT.H +++ b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/STRUCT.H @@ -51,36 +51,36 @@ typedef struct { #define ST_STARTS 6 typedef struct{ - unsigned long started; // aquisition status - unsigned long maxval; // maxval + unsigned int started; // aquisition status + unsigned int maxval; // maxval double cnt[8]; // status: runtime in msec, ofls, // total sum, roi sum, roi rate, sweeps, starts } ACQSTATUS; typedef struct { - long savedata; // bit 0: auto save after stop + int savedata; // bit 0: auto save after stop // bit 1: write listfile // bit 2: listfile only, no evaluation - long autoinc; // 1 if auto increment filename - long fmt; // format type (seperate spectra): + int autoinc; // 1 if auto increment filename + int fmt; // format type (seperate spectra): // 0 == ASCII, 1 == binary, // 2 == CSV - long mpafmt; // format used in mpa datafiles - long sephead; // seperate Header - long smpts; - long caluse; + int mpafmt; // format used in mpa datafiles + int sephead; // seperate Header + int smpts; + int caluse; char filename[256]; char specfile[256]; char command[256]; } DATSETTING; typedef struct { - long use; // 1 if Replay Mode ON - long modified; // Bit 0: 1 if different settings are used + int use; // 1 if Replay Mode ON + int modified; // Bit 0: 1 if different settings are used // (Bit 1: Write ASCII, reserved) - long limit; // 0: all, + int limit; // 0: all, // 1: limited sweep range - long speed; // replay speed in units of 100 kB / sec + int speed; // replay speed in units of 100 kB / sec double startsfrom; // first start# double startsto; // last start# double startspreset; // last start - first start @@ -88,20 +88,20 @@ typedef struct { } REPLAYSETTING; typedef struct{ - long range; // spectrum length - long cftfak; // LOWORD: 256 * cft factor (t_after_peak / t_to_peak) + int range; // spectrum length + int cftfak; // LOWORD: 256 * cft factor (t_after_peak / t_to_peak) // HIWORD: max pulse width for CFT - long roimin; // lower ROI limit - long roimax; // upper limit: roimin <= channel < roimax - long nregions; // number of regions - long caluse; // bit0: 1 if calibration used, higher bits: formula - long calpoints; // number of calibration points - long param; // (reserved:) for MAP and POS: LOWORD=x, HIWORD=y - long offset; // (reserved:) zoomed MAPS: LOWORD: xoffset, HIWORD, yoffset - long xdim; // (reserved:) x resolution of maps - unsigned long bitshift; // LOWORD: Binwidth = 2 ^ (bitshift) + int roimin; // lower ROI limit + int roimax; // upper limit: roimin <= channel < roimax + int nregions; // number of regions + int caluse; // bit0: 1 if calibration used, higher bits: formula + int calpoints; // number of calibration points + int param; // (reserved:) for MAP and POS: LOWORD=x, HIWORD=y + int offset; // (reserved:) zoomed MAPS: LOWORD: xoffset, HIWORD, yoffset + int xdim; // (reserved:) x resolution of maps + unsigned int bitshift; // LOWORD: Binwidth = 2 ^ (bitshift) // HIWORD: Threshold for Coinc - long active; // Spectrum definition words for CHN1..6: + int active; // Spectrum definition words for CHN1..6: // active & 0xF ==0 not used // ==1 single // bit 8: Enable Tag bits @@ -129,20 +129,20 @@ typedef struct{ } ACQSETTING; typedef struct{ - long range; // spectrum length - long cftfak; // LOWORD: 256 * cft factor (t_after_peak / t_to_peak) + int range; // spectrum length + int cftfak; // LOWORD: 256 * cft factor (t_after_peak / t_to_peak) // HIWORD: max pulse width for CFT - long roimin; // lower ROI limit - long roimax; // upper limit: roimin <= channel < roimax - long nregions; // number of regions - long caluse; // bit0: 1 if calibration used, higher bits: formula - long calpoints; // number of calibration points - long param; // (reserved:) for MAP and POS: LOWORD=x, HIWORD=y - long offset; // (reserved:) zoomed MAPS: LOWORD: xoffset, HIWORD, yoffset - long xdim; // (reserved:) x resolution of maps - unsigned long bitshift; // LOWORD: Binwidth = 2 ^ (bitshift) + int roimin; // lower ROI limit + int roimax; // upper limit: roimin <= channel < roimax + int nregions; // number of regions + int caluse; // bit0: 1 if calibration used, higher bits: formula + int calpoints; // number of calibration points + int param; // (reserved:) for MAP and POS: LOWORD=x, HIWORD=y + int offset; // (reserved:) zoomed MAPS: LOWORD: xoffset, HIWORD, yoffset + int xdim; // (reserved:) x resolution of maps + unsigned int bitshift; // LOWORD: Binwidth = 2 ^ (bitshift) // HIWORD: Threshold for Coinc - long active; // Spectrum definition words for CHN1..6: + int active; // Spectrum definition words for CHN1..6: // active & 0xF ==0 not used // ==1 enabled // bit 8: Enable Tag bits @@ -165,13 +165,13 @@ typedef struct{ double dummy2; // double dummy3; // // MPANT or Server private saved settings: - long type; // 0=single, 1=MAP, 2=ISO... - long ydim; // y resolution of maps - long reserved[16]; + int type; // 0=single, 1=MAP, 2=ISO... + int ydim; // y resolution of maps + int reserved[16]; } EXTACQSETTING; typedef struct { - long sweepmode; // sweepmode & 0xF: 0 = normal, + int sweepmode; // sweepmode & 0xF: 0 = normal, // 1=differential (relative to first stop in sweep) // 4=sequential // 5=seq.+diff (Ch1), bit0 = differential mode @@ -194,7 +194,7 @@ typedef struct { // bit 16..bit 20 ~(input channel enable) // bit 24: require data lost bit in data // bit 25: don't allow 6 byte datalength - long prena; // bit 0: realtime preset enabled + int prena; // bit 0: realtime preset enabled // bit 1: // bit 2: sweep preset enabled // bit 3: ROI preset enabled @@ -204,9 +204,9 @@ typedef struct { // bit 7: ROI4 preset enabled // bit 8: ROI5 preset enabled // bit 9: ROI6 preset enabled - long cycles; // for sequential mode - long sequences; // - long syncout; // LOWORD: sync out; bit 0..5 NIM syncout, bit 8..13 TTL syncout + int cycles; // for sequential mode + int sequences; // + int syncout; // LOWORD: sync out; bit 0..5 NIM syncout, bit 8..13 TTL syncout // bit7: NIM syncout_invert, bit15: TTL syncout_invert // 0="0", 1=10 MHz, 2=78.125 MHz, 3=100 MHz, 4=156.25 MHz, // 5=200 MHz, 6=312.5 MHz, 7=Ch0, 8=Ch1, 9=Ch2, 10=Ch3, @@ -214,7 +214,7 @@ typedef struct { // 16=SYS_ON, 17=WINDOW, 18=HOLD_OFF, 19=EOS_DEADTIME // 20=TIME[0],...,51=TIME[31], 52...63=SWEEP[0]..SWEEP[11] // - long digio; // LOWORD: Use of Dig I/O, GO Line: + int digio; // LOWORD: Use of Dig I/O, GO Line: // bit 0: status dig 0..3 // bit 1: Output digval and increment digval after stop // bit 2: Invert polarity @@ -225,25 +225,25 @@ typedef struct { // bit 10: GO Low at Stop // bit 11: Clear at triggered start // bit 12: Only triggered start - long digval; // digval=0..255 value for samplechanger - long dac0; // DAC0 value (START) + int digval; // digval=0..255 value for samplechanger + int dac0; // DAC0 value (START) // bit 16: Start with rising edge - long dac1; // DAC1 value (STOP 1) - long dac2; // DAC2 value (STOP 2) - long dac3; // DAC3 value (STOP 3) - long dac4; // DAC4 value (STOP 4) - long dac5; // DAC5 value (STOP 5) + int dac1; // DAC1 value (STOP 1) + int dac2; // DAC2 value (STOP 2) + int dac3; // DAC3 value (STOP 3) + int dac4; // DAC4 value (STOP 4) + int dac5; // DAC5 value (STOP 5) // bit (14,15) of each word: 0=falling, 1=rising, 2=both, 3=both+CFT // bit 17 of each: pulse width mode under threshold int fdac; // Feature DAC 0..16383 --> 0..2.5V int tagbits; // number of tagbits int extclk; // use external clock - long maxchan; // number of input channels (=6) - long serno; // serial number - long ddruse; // bit0: DDR_USE, bit1: DDR_2GB + int maxchan; // number of input channels (=6) + int serno; // serial number + int ddruse; // bit0: DDR_USE, bit1: DDR_2GB // bits[2:3]: usb_usage // bits[4:5]: wdlen - long active; // module in system + int active; // module in system double holdafter; // Hold off double swpreset; // sweep preset value double fstchan; // acquisition delay @@ -278,15 +278,15 @@ typedef struct { int sys0[56]; // System definition words for ADCs (1..24): // see active definition in ADCSETTING - int sys1[56]; // ADC in System (=1) - int adcs[8]; // Number of ADCs per module (0) - int tofs[8]; // Number of TOF inputs per module - int res[8]; // reserved + int sys1[40]; // ADC in System (=1) + int adcs[5]; // Number of ADCs per module (0) + int tofs[5]; // Number of TOF inputs per module + int res[6]; // reserved } COINCDEF; typedef struct{ - unsigned long HUGE *s0; // pointer to spectrum - unsigned long *region; // pointer to regions + unsigned int HUGE *s0; // pointer to spectrum + unsigned int *region; // pointer to regions unsigned char *comment0; // pointer to strings double *cnt; // pointer to counters HANDLE hs0; diff --git a/FAST ComTec/Files from FAST ComTec/mcs6adll/c/tstmcs6a.c b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/tstmcs6a.c new file mode 100644 index 0000000..b1e249a --- /dev/null +++ b/FAST ComTec/Files from FAST ComTec/mcs6adll/c/tstmcs6a.c @@ -0,0 +1,240 @@ +// -------------------------------------------------------------------------- +// TSTMCS6A.C : DMCS6.DLL Software driver C example +// -------------------------------------------------------------------------- + +#include +#include +#include +#include + +#undef DLL +#include "dmcs6.h" + + +HANDLE hDLL = 0; + +IMPAGETSETTING lpSet=NULL; +IMPANEWSTATUS lpNewStat=NULL; +IMPAGETSTATUS lpStat=NULL; +IMPARUNCMD lpRun=NULL; +IMPAGETCNT lpCnt=NULL; +IMPAGETROI lpRoi=NULL; +IMPAGETDAT lpDat=NULL; +IMPAGETSTR lpStr=NULL; +IMPASERVEXEC lpServ=NULL; +IMPAGETDATSET lpGetDatSet=NULL; +IMPAGETMCSSET lpGetMCSSet=NULL; +IMPADIGINOUT lpDigInOut=NULL; +IMPADACOUT lpDacOut=NULL; +IMPASTART lpStart=NULL; +IMPAHALT lpHalt=NULL; +IMPACONTINUE lpContinue=NULL; +IMPAERASE lpErase=NULL; + + +ACQSETTING Setting={0}; +ACQDATA Data={0}; +ACQDEF Def={0}; +ACQSTATUS Status={0}; +DATSETTING DatSetting={0}; +BOARDSETTING MCSSetting={0}; + +short nDev=0; + +void help() +{ + printf("Commands:\n"); + printf("Q Quit\n"); + printf("? Help\n"); + printf("S Show Status\n"); + printf("H Halt\n"); + printf("T Show Setting\n"); + printf("CHN=x Switch to CHN #x \n"); + printf("(... more see command language in MPANT help)\n"); + printf("\n"); +} + +void PrintMpaStatus(ACQSTATUS *Stat) +{ + if(Stat->started == 1) printf("ON\n"); + else if(Stat->started == 3) printf("READ OUT\n"); + else printf("OFF\n"); + printf("runtime= %.2lf\n", Stat->cnt[ST_RUNTIME]); + printf("sweeps= %lf\n", Stat->cnt[ST_SWEEPS]); + printf("starts= %lf\n\n", Stat->cnt[ST_STARTS]); +} + +void PrintStatus(ACQSTATUS *Stat) +{ + printf("totalsum= %lf\n", Stat->cnt[ST_TOTALSUM]); + printf("roisum= %lf\n", Stat->cnt[ST_ROISUM]); + printf("rate= %.2lf\n", Stat->cnt[ST_ROIRATE]); + printf("ofls= %.2lf\n\n", Stat->cnt[ST_OFLS]); +} + +void PrintDatSetting(DATSETTING *Set) +{ + printf("savedata= %d\n", Set->savedata); + printf("autoinc= %d\n", Set->autoinc); + printf("fmt= %d\n", Set->fmt); + printf("mpafmt= %d\n", Set->mpafmt); + printf("sephead= %d\n", Set->sephead); + printf("filename= %s\n\n", Set->filename); +} + +void PrintMCSSetting(BOARDSETTING *Set) +{ + printf("sweepmode= 0x%x\n", Set->sweepmode); + printf("prena= 0x%x\n", Set->prena); + printf("cycles= %d\n", Set->cycles); + printf("sequences= %d\n", Set->sequences); + printf("syncout= 0x%x\n", Set->syncout); + printf("digio= 0x%x\n", Set->digio); + printf("digval= %d\n", Set->digval); + printf("dac0= 0x%x\n", Set->dac0); + printf("dac1= 0x%x\n", Set->dac1); + printf("dac2= 0x%x\n", Set->dac2); + printf("dac3= 0x%x\n", Set->dac3); + printf("dac4= 0x%x\n", Set->dac4); + printf("dac5= 0x%x\n", Set->dac5); + printf("fdac= 0x%x\n", Set->fdac); + printf("tagbits= %d\n", Set->tagbits); + printf("extclk= %d\n", Set->extclk); + printf("maxchan= %d\n", Set->maxchan); + printf("serno= %d\n", Set->serno); + printf("ddruse= 0x%x\n", Set->ddruse); + printf("active= %d\n", Set->active); + printf("holdafter= %lg\n", Set->holdafter); + printf("swpreset= %lg\n", Set->swpreset); + printf("fstchan= %lg\n", Set->fstchan); + printf("timepreset= %lg\n\n", Set->timepreset); +} + +void PrintSetting(ACQSETTING *Set) +{ + printf("range= %ld\n", Set->range); + printf("cftfak= 0x%x\n", Set->cftfak); + printf("roimin= %ld\n", Set->roimin); + printf("roimax= %ld\n", Set->roimax); + printf("nregions= %d\n", Set->nregions); + printf("caluse= %d\n", Set->caluse); + printf("calpoints= %d\n", Set->calpoints); + printf("param= 0x%lx\n", Set->param); + printf("offset= 0x%lx\n", Set->offset); + printf("xdim= %d\n", Set->xdim); + printf("bitshift= %d\n", Set->bitshift); + printf("active= 0x%x\n", Set->active); + printf("roipreset= %lg\n\n", Set->eventpreset); +} + +int run(char *command) +{ + int err; + if (!_stricmp(command, "?")) help(); + else if (!_stricmp(command,"Q")) return 1; + else if (!_stricmp(command,"S")) { + err = (*lpStat)(&Status, nDev); + if (nDev) PrintStatus(&Status); + else PrintMpaStatus(&Status); + } + else if (!_stricmp(command,"T")) { + // spectra settings + err = (*lpSet)(&Setting, nDev); + printf("CHN %d:\n", nDev); + PrintSetting(&Setting); + + if (nDev==0) { // MPA settings + err = (*lpGetMCSSet)(&MCSSetting, 0); + PrintMCSSetting(&MCSSetting); + // DATSettings + err = (*lpGetDatSet)(&DatSetting); + PrintDatSetting(&DatSetting); + } + } + else if (!_stricmp(command,"H")) { + (*lpHalt)(0); + } + else if(!_strnicmp(command, "CHN=", 4)) { + sscanf(command+4, "%d", &nDev); + (*lpRun)(0, command); + } + else if (!_stricmp(command,"MPA")) { + nDev=0; + (*lpRun)(0, command); + } + else { + (*lpRun)(0, command); + printf("%s\n", command); + } + return 0; +} + +int readstr(char *buff, int buflen) +{ + int i=0,ic; + + while ((ic=getchar()) != 10) { + if (ic == EOF) { + buff[i]='\0'; + return 1; + } + if (ic == 13) ic=0; + buff[i]=(char)ic; + i++; + if (i==buflen-1) break; + } + buff[i]='\0'; + return 0; +} + +//int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) +void main(int argc, char *argv[]) +{ + int Errset = 0, Erracq = 0, Errread = 0; + char command[80]; + + hDLL = LoadLibrary((LPCWSTR)"DMCS6.DLL"); + if(hDLL){ + lpSet=(IMPAGETSETTING)GetProcAddress(hDLL,"GetSettingData"); + lpNewStat=(IMPANEWSTATUS)GetProcAddress(hDLL,"GetStatus"); + lpStat=(IMPAGETSTATUS)GetProcAddress(hDLL,"GetStatusData"); + lpRun=(IMPARUNCMD)GetProcAddress(hDLL,"RunCmd"); + lpCnt=(IMPAGETCNT)GetProcAddress(hDLL,"LVGetCnt"); + lpRoi=(IMPAGETROI)GetProcAddress(hDLL,"LVGetRoi"); + lpDat=(IMPAGETDAT)GetProcAddress(hDLL,"LVGetDat"); + lpStr=(IMPAGETSTR)GetProcAddress(hDLL,"LVGetStr"); + lpServ=(IMPASERVEXEC)GetProcAddress(hDLL,"ServExec"); + lpGetDatSet=(IMPAGETDATSET)GetProcAddress(hDLL,"GetDatSetting"); + lpGetMCSSet=(IMPAGETMCSSET)GetProcAddress(hDLL,"GetMCSSetting"); + // lpDigInOut=(IMPADIGINOUT)GetProcAddress(hDLL,"DigInOut"); + // lpDacOut=(IMPADACOUT)GetProcAddress(hDLL,"DacOut"); + lpStart=(IMPASTART)GetProcAddress(hDLL,"Start"); + lpHalt=(IMPAHALT)GetProcAddress(hDLL,"Halt"); + lpContinue=(IMPACONTINUE)GetProcAddress(hDLL,"Continue"); + lpErase=(IMPAERASE)GetProcAddress(hDLL,"Erase"); + } + else return; + + // Initialize parameters +// Errset = (*lpServ)(0); + Errset = (*lpNewStat)(0); + Errset = (*lpStat)(&Status, 0); + PrintMpaStatus(&Status); + + /* + (*lpSet)(&Setting, 0); + PrintSetting(&Setting); + */ + + help(); + + while(TRUE) + { + readstr(command, 80); + if (run(command)) break; + } + + FreeLibrary(hDLL); + + return; +} diff --git a/FAST ComTec/mcs6a_wrapper.py b/FAST ComTec/mcs6a_wrapper.py new file mode 100644 index 0000000..0189a7a --- /dev/null +++ b/FAST ComTec/mcs6a_wrapper.py @@ -0,0 +1,11 @@ +from ctypes import * +from sys import platform + +lib_path = "./DMCS6.dll" +try: + lib = CDLL(lib_path) + print("Successfully loaded ", lib) + + print(lib.LEDBlink(0)) +except Exception as e: + print(e) \ No newline at end of file