/lab/sipmscan/trunk/libxxusb.h |
---|
File deleted |
/lab/sipmscan/trunk/usb.h |
---|
File deleted |
/lab/sipmscan/trunk/README |
---|
0,0 → 1,105 |
SOFTWARE FOR SIPM CHARACTERIZATION WITH CAMAC, SCOPE, BIAS VOLTAGE AND TABLE POSITION SUPPORT |
============================================================================================= |
By Gasper Kukec Mezek, April 2015. |
________________ |
1. Installation: |
Installation is done through the usual "./configure" and "make" commands to enable the use of this software with 32 bit and 64 bit systems. |
Configure takes two arguments: |
- First argument is the configure option (help, nomake, all, clean, compress). |
- Second argument is the online/offline configure setting (only used when first argument is nomake or all), that enables the software to work with a connected CAMAC and scope (I), only a connected scope (S) or with no connected devices (O). |
Running "./configure" or "./configure help" will give more information on specific uses. |
Example: |
./configure all I |
Makefile: |
Once configuration is done, a Makefile will be generated and further installation is done by running "make". Running "make relib" will only recreate the libraries in case something has been edited in them. |
Example: |
make |
________________________ |
2. Running the software: |
The software requires an installation of ROOT with set environment variable $ROOTSYS and $LD_LIBRARY_PATH. Once installation is performed, use |
./start.sh |
to start the software. Once the software starts it will let you know (in the terminal) if the CAMAC connection was correctly established. |
_______________ |
3. Short guide: |
The main window is divided into 5 subwindows: |
a) Settings window: |
- ON/OFF switches for voltage and surface scans. |
- a voltage limiter -> sets the maximum output voltage for safety reasons |
- clean plots toggle switch -> when ON, no additional stats will be displayed on plots/histograms |
- scope IP -> sets the oscilloscope IP address |
- LASER settings info panel -> this will be written to the output file and is used for supplying additional information |
- chamber temperature -> the chamber temperature to be written to the output file |
b) Main measurement window: |
- settings for table position and bias voltage |
- when scans are enabled, additional settings for scans |
- number of events -> setting for the number of events to gather in a measurement |
- time stamp -> informational time (start time of measurement is written to output file) |
- file selector (for scans, the filenames will be appended sequential numbers to distinguish them) |
- start acquisition button -> starts the measurement based on selected settings |
- waveform analysis settings (channel, measurement type) |
- possibility to send custom one-line commands |
c) Histogram file selection window: |
- open past measurements for analysis |
- if using multiple files, use multiple file select or select all listed files |
- files will be used in order displayed on the list |
- to clear the complete list, use the clear list button |
d) Histogram window: |
- displays the currently selected histogram in the histogram file selection window |
e) Histogram controls window: |
- directly linked to the histogram window, it enables plotting options |
- can set ranges on histogram plots |
- can change between different histogram types (ADC, TDC, ADC vs. TDC, 2D surface plot) |
- for the 2D surface plot, the relevant files need to be selected in the histogram file selection window |
- toggle for logarithmic Y scale |
- the currently selected histogram can be manually exported with the export button |
- fit settings used when running "Fit spectrum" and "Fit all selected" options in the Analysis menu |
On the top, there are 4 menus: |
a) File: |
- New Measurement -> not working |
- Exit -> exit the software (shortkey x) |
b) Analysis: |
- Histogram type -> change between histogram types (same as in histogram controls window) |
- Fit spectrum -> fit the currently open spectrum for peaks |
- Fit all selected -> fit all the selected ADC spectra selected in the histogram file selection window for peaks and display the breakdown voltage plots |
- Integrate spectrum (X, Y) -> integrate the ADC spectrum for multiple files with an X or Y scan (used for edge scans) |
c) Windows: |
- Specific tiling |
- Switch between active windows |
d) Help information |
Important! |
When using any analysis method (surface 2D plot, fitting, integration, ADC spectra display) only events inside the selected TDC window will be used so set the TDC range accordingly. |
______________ |
4. Change log: |
9.4.2015: |
a) Added communications panel for connecting to a Tektronix scope. |
b) Added limited support for waveform analysis with a Tektronix scope. For now it only works when linking it to CAMAC acquisition. |
c) Added a manual chamber temperature entry field. |
16.3.2015: |
a) First version of sipmscan. |
b) Added support for CAMAC, bias voltage settings and table position settings. |
c) Added support for opening measured histograms. |
d) Added support for analysis: |
- making surface plots |
- fitting the ADC spectrum |
- creating breakdown voltage plots |
- integrating the ADC spectrum with changing X or Y direction (edge scans) |
/lab/sipmscan/trunk/configure |
---|
10,14 → 10,15 |
echo "" |
echo "[option] = Option for configure:" |
echo " - help = Display configure instructions." |
echo " - nomake = Only prepare workstation.h file (base directory and online/offline mode)." |
echo " - all = Prepare workstation.h file and set used libraries." |
echo " - clean = Clean the installation directory." |
echo " - nomake = Only prepare system dependent files (base directory and online/offline mode)." |
echo " - all = Prepare system dependent files and make used libraries." |
echo " - clean = Clean the installation directory. Does not clean the results directory." |
echo " - compress = Compress the source code in a tar-ball." |
echo "" |
echo "[type] = Configure for use in online or offline mode (only needed in nomake and all):" |
echo " - I = Online mode." |
echo " - O = Offline mode (no connection to CAMAC, motor, voltage supply and scope)." |
echo " - S = Offline mode with scope connection (no connection to CAMAC, motor and voltage supply)." |
echo "" |
echo "#------------------------------" |
} |
64,7 → 65,7 |
mkdir $startdir/camac_gui_windowed |
mkdir $startdir/camac_gui_windowed/results |
echo "Copying source files to temporary directory $startdir/camac_gui_windowed..." |
cp -r configure daq.h daqscope.h GuiLinkDef.h libxxusb.cpp libxxusb.h libxxusb.o root_include.h start.cxx usb.h windowed_test.C windowed_test.h wusbcc.h wusbxx_dll.c wusbxx_dll.h wusbxx_dll.o mpod/ MIKRO/ vxi11_x86_64/ vxi11_i686/ input/ ./camac_gui_windowed/ |
cp -r configure daq.h daqscope.h GuiLinkDef.h libxxusb.cpp root_include.h start.cxx windowed_test.C windowed_test.h wusbcc.h wusbxx_dll.c wusbxx_dll.h mpod/ MIKRO/ vxi11_x86_64/ vxi11_i686/ input/ ./camac_gui_windowed/ |
cd $startdir/camac_gui_windowed |
echo "Cleaning the base directory in $startdir/camac_gui_windowed..." |
rm -f *.bak |
95,7 → 96,7 |
basedir=$(echo $startdir | sed 's/\//\\\//g') |
if [ "$1" == "nomake" ] || [ "$1" == "all" ]; then |
if [ "$2" == "O" ] || [ "$2" == "I" ]; then |
if [ "$2" == "O" ] || [ "$2" == "I" ] || [ "$2" == "S" ]; then |
grep -q "#define WORKSTAT 'N'" $startdir/input/workstation.h.in |
if [ $? == 0 ]; then |
sed "s/define WORKSTAT 'N'/define WORKSTAT '$2'/" $startdir/input/workstation.h.in > $startdir/workstation.h.mid |
120,17 → 121,20 |
if [ "$2" == "I" ]; then |
sed "s/CAMLIB = \$(LIBFILE)/CAMLIB = \$(LIBFILE) -lusb/g" $startdir/Makefile.mid > $startdir/Makefile |
rm $startdir/Makefile.mid |
elif [ "$2" == "O" ]; then |
elif [ "$2" == "O" ] || [ "$2" == "S" ]; then |
cp $startdir/input/Makefile.in $startdir/Makefile |
fi |
fi |
if [ "$2" == "O" ]; then |
if [ "$2" == "O" ] || [ "$2" == "S" ]; then |
cp $startdir/input/daqusb.C.offline $startdir/daqusb.C |
cp $startdir/input/start.sh.offline $startdir/start.sh |
cp $startdir/input/libxxusb.h.offline $startdir/libxxusb.h |
cp $startdir/input/usb.h.offline $startdir/usb.h |
elif [ "$2" == "I" ]; then |
cp $startdir/input/daqusb.C.online $startdir/daqusb.C |
cp $startdir/input/start.sh.online $startdir/start.sh |
cp $startdir/input/libxxusb.h.online $startdir/libxxusb.h |
fi |
fi |
fi |
151,7 → 155,7 |
make clean |
rm -f Makefile |
else |
if [ "$2" == "O" ] || [ "$2" == "I" ]; then |
if [ "$2" == "O" ] || [ "$2" == "I" ] || [ "$2" == "S" ]; then |
make |
else |
echo "Error! No configuration type selected (second argument)." |
176,7 → 180,7 |
make clean |
rm -f Makefile |
else |
if [ "$2" == "O" ] || [ "$2" == "I" ]; then |
if [ "$2" == "O" ] || [ "$2" == "I" ] || [ "$2" == "S" ]; then |
make |
else |
echo "Error! No installation type selected (second argument)." |
/lab/sipmscan/trunk/daqscope.h |
---|
6,10 → 6,32 |
//class VmUsbStack; |
class daqscope { |
public: |
int scopeUseType; |
int scopeChanNr; |
int scopeChans[8]; |
char scopeChanstring[256]; |
int scopeMeasSel; |
char eventbuf[WAVE_LEN]; |
double measubuf; |
double tektime, tekvolt; |
double choffset; |
int fStop; |
double tekunit(char *prefix); |
int init(); |
int event(); |
int customCommand(char *command, bool query, char *sReturn); |
int connect(char* IPaddr); |
int disconnect(char* IPaddr); |
int lockunlock(bool lockit); |
daqscope(); |
~daqscope(); |
// VmUsbStack * fStack; |
// VmUsbStack * fInit; |
int OSrepetition; |
/* int OSrepetition; |
int OSmeasu; |
int OSmeasuchan; |
int OSgating; |
27,8 → 49,8 |
char multibuf[WAVE_LEN]; |
char eventbuf[WAVE_LEN]; |
double tektime,tekvolt,lctime,lcvolt; |
int fastacqstate; /* GKM - variable that saves the fastacq state */ |
double choffset; /* GKM - position offset for signal */ |
int fastacqstate; // GKM - variable that saves the fastacq state |
double choffset; // GKM - position offset for signal |
int fPoints; |
int fStop; |
47,7 → 69,7 |
void fileopen(const char*); |
void fileclose(); |
void countcontrol(); |
void fastacq(int setting); /* GKM - gets tek out of fastacq*/ |
void fastacq(int setting); // GKM - gets tek out of fastacq |
void header(); |
void measuheader(); |
void lecroyheader(); |
56,7 → 78,7 |
double lcunit(char*); |
daqscope(); |
// daqscope(const char *); |
~daqscope(); |
~daqscope();*/ |
}; |
#endif |
/lab/sipmscan/trunk/input/Makefile.in |
---|
41,7 → 41,7 |
$(TARGET): $(FILES) workstation.h daq.h library $(SHLIB) |
@echo "Generating dictionary Dict.C..." |
rootcint -f GuiDict.C -c $(INC) $(CPPFLAGS) windowed_test.h GuiLinkDef.h |
$(CXX) $(INC) -DG__DICTIONARY -fPIC -g -Wall $(FILES) GuiDict.C $(CPPFLAGS) $(VXI_OBJECT) -o $(TARGET) $(SHLIB) $(LIBS1) -lstdc++ -lSpectrum |
$(CXX) $(INC) -fPIC -g -Wall $(FILES) GuiDict.C $(CPPFLAGS) $(VXI_OBJECT) -o $(TARGET) $(SHLIB) $(LIBS1) -lstdc++ -lSpectrum |
# ----------------------------------------------------------------------------- |
# CAMAC DAQ library rules ----------------------------------------------------- |
73,7 → 73,7 |
libdaqusb.so: $(DAQFILE) $(LIBFILE) |
@echo "Generating dictionary Dict.C..." |
rootcint -f Dict.C -c $(INC) $(CPPFLAGS) $(HEADER) GuiLinkDef.h |
$(CXX) -DG__DICTIONARY $(CPPFLAGS) $(INC) -fPIC -g -Wall $(DAQFILE) Dict.C $(CAMLIB) -shared -o $@ |
$(CXX) $(CPPFLAGS) $(INC) -fPIC -g -Wall $(DAQFILE) Dict.C $(CAMLIB) -shared -o $@ |
# Rule for making the CAMAC DAQ library (libdaqusb.a) |
$(LIBFILE): $(OBJ_FILES) |
85,7 → 85,7 |
libvxi11.so: libvxi11.a |
@echo "Generating dictionary VxiDict.C..." |
rootcint -f VxiDict.C -c $(INC) $(CPPFLAGS) daqscope.h GuiLinkDef.h |
$(CXX) -DG__DICTIONARY $(CPPFLAGS) $(INC) -fPIC -g -Wall daqscope.C VxiDict.C -L. libvxi11.a -shared -o $@ |
$(CXX) $(CPPFLAGS) $(INC) -fPIC -g -Wall daqscope.C VxiDict.C -L. libvxi11.a -shared -o $@ |
libvxi11.a: $(VXI_OBJECT) |
ar r $@ $^ |
95,5 → 95,5 |
# Rule for cleaning the installation |
clean: |
rm -f Dict.C Dict.h GuiDict.C GuiDict.h windowed_test windowed_test_C.d windowed_test_C.so curpos.txt curvolt.txt workstation.h VxiDict.C VxiDict.h daqscope.C daqusb.C start.sh |
rm -f Dict.C Dict.h GuiDict.C GuiDict.h windowed_test windowed_test_C.d windowed_test_C.so curpos.txt curvolt.txt workstation.h VxiDict.C VxiDict.h daqscope.C daqusb.C start.sh usb.h libxxusb.h libdaqusb.a libdaqusb.so libvxi11.a libvxi11.so *.o finish_sig.txt |
# ----------------------------------------------------------------------------- |
/lab/sipmscan/trunk/input/daqscope.C.in |
---|
1,16 → 1,58 |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include "vxi11_user.h" |
#include "daqscope.h" |
#include "workstation.h" |
CLINK *clink; |
char *savedIP; |
const char *allChans[8] = {"CH1","CH2","CH3","CH4","MATH1","MATH2","MATH3","MATH4"}; |
const char *measType[11] = {"AMP","ARE","DEL","FALL","FREQ","MAX","MEAN","MINI","PK2P","PWI","RIS"}; |
char *bbq; |
// Query and command functions to simplify analysis -------------- |
int vxi11_query(CLINK *clink, const char *mycmd) |
{ |
char buf[WAVE_LEN]; |
memset(buf, 0, WAVE_LEN); |
vxi11_send(clink, mycmd); |
int bytes_returned = vxi11_receive(clink, buf, WAVE_LEN); |
if (bytes_returned > 0) |
{ |
printf("%s\n", buf); |
} |
else if (bytes_returned == -15) |
printf("*** [ NOTHING RECEIVED ] ***\n"); |
return 0; |
} |
void vxi11_command(CLINK *clink,char *mycmd) |
{ |
char buf[WAVE_LEN]; |
memset(buf, 0, WAVE_LEN); |
vxi11_send(clink, mycmd); |
} |
// --------------------------------------------------------------- |
// Tektronix unit conversion ------------------------------------- |
double daqscope::tekunit(char *prefix) |
{ |
if (strcmp(prefix,"m")==0) return 0.001; |
else if (strcmp(prefix,"u")==0) return 0.000001; |
else if (strcmp(prefix,"n")==0) return 0.000000001; |
else return 1; |
} |
// --------------------------------------------------------------- |
// Connect to a scope through IP address IPaddr ------------------ |
int daqscope::connect(char *IPaddr) |
{ |
int iTemp; |
char buf[WAVE_LEN]; |
printf("daqscope::connect(%s)\n", IPaddr); |
clink = new CLINK; |
iTemp = vxi11_open_device(IPaddr, clink); |
if(iTemp == 0) |
24,17 → 66,319 |
else |
return iTemp; |
} |
// --------------------------------------------------------------- |
// Disconnect from scope with IP address IPaddr ------------------ |
int daqscope::disconnect(char *IPaddr) |
{ |
int iTemp; |
printf("daqscope::disconnect(%s)\n", IPaddr); |
iTemp = vxi11_close_device(IPaddr, clink); |
if(iTemp == 0) |
{ |
printf("Disconnected from device (%s).\n", IPaddr); |
delete clink; |
delete clink; |
} |
return iTemp; |
} |
// --------------------------------------------------------------- |
// Initialize the scope for waveform or measurement -------------- |
int daqscope::init() |
{ |
int iTemp; |
char cmd[512]; |
char cTemp[256]; |
printf("daqscope::init()\n"); |
printf("Measurement type is: %d\n", scopeUseType); |
// For measurements, only one channel can be used (rise, fall, period,...) |
if(scopeUseType == 2) scopeChanNr = 1; |
printf("Nr. of channels selected: %d\n", scopeChanNr); |
// Only use scope if measurement is different than 0 |
if(scopeUseType == 0) |
return 0; |
else |
{ |
// Combine all selected channels into a comma separated string |
for(int i = 0; i < scopeChanNr; i++) |
{ |
if(i == scopeChanNr-1) |
{ |
if(i == 0) sprintf(scopeChanstring, "%s", allChans[scopeChans[i]]); |
else sprintf(cTemp, "%s", allChans[scopeChans[i]]); |
} |
else |
{ |
if(i == 0) sprintf(scopeChanstring, "%s,", allChans[scopeChans[i]]); |
else sprintf(cTemp, "%s,", allChans[scopeChans[i]]); |
} |
if(i > 0) |
strcat(scopeChanstring, cTemp); |
} |
printf("Selected channels: %s\n", scopeChanstring); |
// Check scope ID and turn the header display on |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_query(clink, "*IDN?"); |
vxi11_command(clink,(char*)"HEADER ON"); |
#else |
printf("Identify Tek (*IDN?, HEADER ON)\n"); |
#endif |
// Set the scope data sources |
sprintf(cmd, "DATA:SOURCE %s", scopeChanstring); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink,cmd); |
#else |
printf("Set data source (DATA:SOURCE): %s\n", cmd); |
#endif |
// Set to fast acquisition and set encoding |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink,(char*)"FASTACQ:STATE 0"); |
vxi11_command(clink,(char*)"DATA:ENCDG SRIBINARY"); |
vxi11_command(clink,(char*)"WFMO:BYT_N 2"); |
// Set gating (currently not used) |
vxi11_command(clink,(char*)"GAT OFF"); |
#else |
printf("Set fastacq, encoding and gating (FASTACQ:STATE 0, DATA:ENCDG SRIBINARY, WFMO:BYT_N 2, MEASU:GAT OFF).\n"); |
#endif |
// Check scale on each of selected channels (is this even needed?) |
bbq = strtok(scopeChanstring,","); |
while(bbq != NULL) |
{ |
sprintf(cmd,"%s:SCALE?",bbq); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_query(clink,cmd); |
#else |
printf("Return the scale of channel: %s\n", cmd); |
#endif |
bbq = strtok(NULL, ","); |
} |
// Check waveform and data options/settings |
char buf[WAVE_LEN]; |
memset(buf, 0, WAVE_LEN); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_send(clink, "WFMO:WFID?"); |
iTemp = vxi11_receive(clink, buf, WAVE_LEN); |
printf("Init out (length = %d): %s\n", iTemp, buf); |
#else |
printf("Get acquisition parameters (WFMOUTPRE:WFID?).\n"); |
sprintf(buf, ":WFMOUTPRE:WFID \"Ch1, DC coupling, 20.0mV/div, 10.0ns/div, 500 points, Sample mode\""); |
iTemp = strlen(buf); |
#endif |
if (iTemp == -15) |
printf("\n*** [ NOTHING RECEIVED ] ***\n"); |
else |
{ |
bbq = strtok(buf,","); // break WFID out into substrings |
for (int k = 0; k < 5; k++) |
{ |
// info on voltage per division setting |
if (k == 2) |
{ |
memcpy(cTemp, &bbq[1], 5); |
cTemp[5] = 0; |
bbq[7] = 0; |
tekvolt = atoi(cTemp)*tekunit(&bbq[6]); |
printf("Voltage per division: %lf\n", tekvolt); |
} |
// info on time per division setting |
if (k == 3) |
{ |
memcpy(cTemp, &bbq[1], 5); |
cTemp[5] = 0; |
bbq[7] = 0; |
tektime = atoi(cTemp)*tekunit(&bbq[6]); |
printf("Time per division: %lf\n", tektime); |
} |
// info on last point to be transfered by CURVE? |
if (k == 4) |
{ |
bbq[strlen(bbq)-7] = 0; |
sprintf(cmd, "DATA:STOP %d", atoi(bbq)); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink, cmd); |
#else |
printf("Stop data collection (DATA:STOP): %s\n", cmd); |
#endif |
} |
// printf("bbq = %s\n",bbq); |
bbq = strtok (NULL, ","); |
} |
} |
// Recheck waveform and data options/settings, turn off header |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_query(clink,"WFMO:WFID?"); |
vxi11_query(clink,"DATA?"); |
vxi11_command(clink,(char*)"HEADER OFF"); |
#else |
printf("Data format query (WFMOUTPRE:WFID?, DATA?, HEADER OFF).\n"); |
#endif |
// Get the channel y-axis offset (only for one CH so far) |
char posoff[WAVE_LEN]; |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
sprintf(cmd, "%s:POS?", allChans[scopeChans[0]]); |
vxi11_command(clink, cmd); |
vxi11_receive(clink, posoff, WAVE_LEN); |
choffset = (double)atof(posoff); |
#else |
printf("Check for channel position offset (CHx:POS?)\n"); |
#endif |
// If measurements are to be performed |
if(scopeUseType == 2) |
{ |
sprintf(cmd, "MEASU:IMM:SOURCE1 %s", scopeChanstring); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink, cmd); |
#else |
printf("Set immediate measurement source (MEASU:IMM:SOURCE1): %s\n", cmd); |
#endif |
sprintf(cmd, "MEASU:IMM:TYP %s", measType[scopeMeasSel]); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink, cmd); |
#else |
printf("Set immediate measurement type (MEASU:IMM:TYP): %s\n", cmd); |
#endif |
} |
return 0; |
} |
} |
// --------------------------------------------------------------- |
// Send a custom command to the scope ---------------------------- |
int daqscope::customCommand(char *command, bool query, char *sReturn) |
{ |
if(query) |
{ |
char buf[WAVE_LEN]; |
memset(buf, 0, WAVE_LEN); |
vxi11_send(clink, command); |
int bytes_returned = vxi11_receive(clink, buf, WAVE_LEN); |
if (bytes_returned > 0) |
{ |
printf("%s\n", buf); |
sprintf(sReturn, "%s", buf); |
// For testing purposes |
/* if( strcmp(command, "CURVE?") == 0 ) |
{ |
FILE *fp; |
char tst[2]; |
fp = fopen("./curve_return.txt","w"); |
for(int i = 6; i < bytes_returned; i++) |
{ |
if(i%2 == 1) |
{ |
tst[0] = buf[i]; |
tst[1] = buf[i-1]; |
fprintf(fp, "bytes returned = %d\tbyte %d = %d\treturn = %s\n", bytes_returned, i, buf[i], tst); |
} |
else |
fprintf(fp, "bytes returned = %d\tbyte %d = %d\n", bytes_returned, i, buf[i]); |
} |
fclose(fp); |
}*/ |
} |
else if (bytes_returned == -15) |
{ |
printf("*** [ NOTHING RECEIVED ] ***\n"); |
sprintf(sReturn, "*** [ NOTHING RECEIVED ] ***"); |
} |
} |
else |
{ |
vxi11_command(clink, command); |
sprintf(sReturn, "*** [ COMMAND NOT QUERY - NO RETURN ] ***"); |
} |
return 0; |
} |
// --------------------------------------------------------------- |
// Get a measuring event (either waveform or measure) ------------ |
int daqscope::lockunlock(bool lockit) |
{ |
// Lock the scope front panel for measurements |
if(lockit) |
{ |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink,(char*)"LOCK ALL"); |
return 0; |
#else |
// printf("Locking the front panel (LOCK ALL).\n"); |
return -1; |
#endif |
} |
// Unlock the scope front panel after measurements |
else |
{ |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
vxi11_command(clink,(char*)"LOCK NONE"); |
return 0; |
#else |
// printf("Unlocking the front panel (LOCK ALL).\n"); |
return -1; |
#endif |
} |
} |
// --------------------------------------------------------------- |
// Get a measuring event (either waveform or measure) ------------ |
int daqscope::event() |
{ |
int bytes_returned; |
if(scopeUseType == 0) |
return -1; |
else if(scopeUseType == 1) |
{ |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
memset(eventbuf, 0, WAVE_LEN); |
vxi11_send(clink, "CURVE?"); |
bytes_returned = vxi11_receive(clink, eventbuf, WAVE_LEN); |
#else |
printf("Ask to return the waveform (CURVE?)\n"); |
bytes_returned = 0; |
#endif |
if(bytes_returned > 0) return 0; |
else return -1; |
} |
else if(scopeUseType == 2) |
{ |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
char buf[WAVE_LEN]; |
memset(buf, 0, WAVE_LEN); |
vxi11_send(clink, "MEASU:IMMED:VALUE?"); |
bytes_returned = vxi11_receive(clink, buf, WAVE_LEN); |
measubuf = (double)atof(buf); |
#else |
// printf("Ask to return the measurement (MEASU:IMMED:VALUE?)\n"); |
bytes_returned = 0; |
measubuf = (double)rand()/(double)RAND_MAX; |
#endif |
if(bytes_returned > 0) return 0; |
else return -1; |
} |
else |
return -1; |
} |
// --------------------------------------------------------------- |
// daqscope class constructor and destructor --------------------- |
daqscope::daqscope() { |
fStop=0; |
} |
42,3 → 386,4 |
daqscope::~daqscope() { |
disconnect(savedIP); |
} |
// --------------------------------------------------------------- |
/lab/sipmscan/trunk/input/daqusb.C.offline |
---|
25,7 → 25,7 |
//#define NADC 2 /* ADC */ |
//#define NADCCH 8 |
int ctrlc=0; |
char *ccserial="CC0126"; |
char *ccserial=(char*)"CC0126"; |
int devDetect; // variable to tell if we detect any devices |
int daq::connect(){ |
50,8 → 50,8 |
int daq::init(){ |
int i; |
long k; |
// int i; |
// long k; |
/* DBGFUNI(xxusb_register_write(udev,1,0x0)); // Stop DAQ mode |
while (xxusb_usbfifo_read(udev, (int*) stackdump,BUFF_L,100)>0); |
119,7 → 119,8 |
} |
int daq::event(unsigned int *data, int maxn){ |
int i,ib,count; |
// int i,ib,count; |
int count; |
/* int events,evsize; |
short ret; |
/lab/sipmscan/trunk/input/daqusb.C.online |
---|
25,7 → 25,7 |
//#define NADC 2 /* ADC */ |
//#define NADCCH 8 |
int ctrlc=0; |
char *ccserial="CC0126"; |
char *ccserial=(char*)"CC0126"; |
int devDetect; // variable to tell if we detect any devices |
int daq::connect(){ |
/lab/sipmscan/trunk/input/libxxusb.h.offline |
---|
0,0 → 1,111 |
#include "usb.h" |
#define XXUSB_WIENER_VENDOR_ID 0x16DC /* Wiener, Plein & Baus */ |
#define XXUSB_VMUSB_PRODUCT_ID 0x000B /* VM-USB */ |
#define XXUSB_CCUSB_PRODUCT_ID 0x0001 /* CC-USB */ |
#define XXUSB_ENDPOINT_OUT 2 /* Endpoint 2 Out*/ |
#define XXUSB_ENDPOINT_IN 0x86 /* Endpoint 6 In */ |
#define XXUSB_FIRMWARE_REGISTER 0 |
#define XXUSB_GLOBAL_REGISTER 1 |
#define XXUSB_ACTION_REGISTER 10 |
#define XXUSB_DELAYS_REGISTER 2 |
#define XXUSB_WATCHDOG_REGISTER 3 |
#define XXUSB_SELLEDA_REGISTER 6 |
#define XXUSB_SELNIM_REGISTER 7 |
#define XXUSB_SELLEDB_REGISTER 4 |
#define XXUSB_SERIAL_REGISTER 15 |
#define XXUSB_LAMMASK_REGISTER 8 |
#define XXUSB_LAM_REGISTER 12 |
#define XXUSB_READOUT_STACK 2 |
#define XXUSB_SCALER_STACK 3 |
#define XXUSB_NAF_DIRECT 12 |
struct XXUSB_STACK |
{ |
long Data; |
short Hit; |
short APatt; |
short Num; |
short HitMask; |
}; |
struct XXUSB_CC_COMMAND_TYPE |
{ |
short Crate; |
short F; |
short A; |
short N; |
long Data; |
short NoS2; |
short LongD; |
short HitPatt; |
short QStop; |
short LAMMode; |
short UseHit; |
short Repeat; |
short AddrScan; |
short FastCam; |
short NumMod; |
short AddrPatt; |
long HitMask[4]; |
long Num; |
}; |
struct xxusb_device_typ |
{ |
struct usb_device *usbdev; |
char SerialString[7]; |
}; |
typedef struct xxusb_device_typ xxusb_device_type; |
typedef unsigned char UCHAR; |
typedef struct usb_bus usb_busx; |
int xxusb_longstack_execute(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_bulk_read(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_bulk_write(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_usbfifo_read(usb_dev_handle *hDev, int *DataBuffer, int lDataLen, int timeout); |
short xxusb_register_read(usb_dev_handle *hDev, short RegAddr, long *RegData); |
short xxusb_stack_read(usb_dev_handle *hDev, short StackAddr, long *StackData); |
short xxusb_stack_write(usb_dev_handle *hDev, short StackAddr, long *StackData); |
short xxusb_stack_execute(usb_dev_handle *hDev, long *StackData); |
short xxusb_register_write(usb_dev_handle *hDev, short RegAddr, long RegData); |
short xxusb_reset_toggle(usb_dev_handle *hDev); |
short xxusb_devices_find(xxusb_device_type *xxusbDev); |
short xxusb_device_close(usb_dev_handle *hDev); |
usb_dev_handle* xxusb_device_open(struct usb_device *dev); |
short xxusb_flash_program(usb_dev_handle *hDev, char *config, short nsect); |
short xxusb_flashblock_program(usb_dev_handle *hDev, UCHAR *config); |
usb_dev_handle* xxusb_serial_open(char *SerialString); |
short VME_register_write(usb_dev_handle *hdev, long VME_Address, long Data); |
short VME_register_read(usb_dev_handle *hdev, long VME_Address, long *Data); |
short VME_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch); |
short VME_DGG(usb_dev_handle *hdev, unsigned short channel, unsigned short trigger,unsigned short output, long delay, unsigned short gate, unsigned short invert, unsigned short latch); |
short VME_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch); |
short VME_read_16(usb_dev_handle *hdev,short Address_Modifier, long VME_Address, long *Data); |
short VME_read_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long *Data); |
short VME_BLT_read_32(usb_dev_handle *hdev, short Address_Modifier, int count, long VME_Address, long Data[]); |
short VME_write_16(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data); |
short VME_write_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data); |
short CAMAC_DGG(usb_dev_handle *hdev, short channel, short trigger, short output, int delay, int gate, short invert, short latch); |
short CAMAC_register_read(usb_dev_handle *hdev, int A, long *Data); |
short CAMAC_register_write(usb_dev_handle *hdev, int A, long Data); |
short CAMAC_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch); |
short CAMAC_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch); |
short CAMAC_read_LAM_mask(usb_dev_handle *hdev, long *Data); |
short CAMAC_write_LAM_mask(usb_dev_handle *hdev, long Data); |
short CAMAC_write(usb_dev_handle *hdev, int N, int A, int F, long Data, int *Q, int *X); |
short CAMAC_read(usb_dev_handle *hdev, int N, int A, int F, long *Data, int *Q, int *X); |
short CAMAC_Z(usb_dev_handle *hdev); |
short CAMAC_C(usb_dev_handle *hdev); |
short CAMAC_I(usb_dev_handle *hdev, int inhibit); |
/lab/sipmscan/trunk/input/libxxusb.h.online |
---|
0,0 → 1,111 |
#include <usb.h> |
#define XXUSB_WIENER_VENDOR_ID 0x16DC /* Wiener, Plein & Baus */ |
#define XXUSB_VMUSB_PRODUCT_ID 0x000B /* VM-USB */ |
#define XXUSB_CCUSB_PRODUCT_ID 0x0001 /* CC-USB */ |
#define XXUSB_ENDPOINT_OUT 2 /* Endpoint 2 Out*/ |
#define XXUSB_ENDPOINT_IN 0x86 /* Endpoint 6 In */ |
#define XXUSB_FIRMWARE_REGISTER 0 |
#define XXUSB_GLOBAL_REGISTER 1 |
#define XXUSB_ACTION_REGISTER 10 |
#define XXUSB_DELAYS_REGISTER 2 |
#define XXUSB_WATCHDOG_REGISTER 3 |
#define XXUSB_SELLEDA_REGISTER 6 |
#define XXUSB_SELNIM_REGISTER 7 |
#define XXUSB_SELLEDB_REGISTER 4 |
#define XXUSB_SERIAL_REGISTER 15 |
#define XXUSB_LAMMASK_REGISTER 8 |
#define XXUSB_LAM_REGISTER 12 |
#define XXUSB_READOUT_STACK 2 |
#define XXUSB_SCALER_STACK 3 |
#define XXUSB_NAF_DIRECT 12 |
struct XXUSB_STACK |
{ |
long Data; |
short Hit; |
short APatt; |
short Num; |
short HitMask; |
}; |
struct XXUSB_CC_COMMAND_TYPE |
{ |
short Crate; |
short F; |
short A; |
short N; |
long Data; |
short NoS2; |
short LongD; |
short HitPatt; |
short QStop; |
short LAMMode; |
short UseHit; |
short Repeat; |
short AddrScan; |
short FastCam; |
short NumMod; |
short AddrPatt; |
long HitMask[4]; |
long Num; |
}; |
struct xxusb_device_typ |
{ |
struct usb_device *usbdev; |
char SerialString[7]; |
}; |
typedef struct xxusb_device_typ xxusb_device_type; |
typedef unsigned char UCHAR; |
typedef struct usb_bus usb_busx; |
int xxusb_longstack_execute(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_bulk_read(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_bulk_write(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout); |
int xxusb_usbfifo_read(usb_dev_handle *hDev, int *DataBuffer, int lDataLen, int timeout); |
short xxusb_register_read(usb_dev_handle *hDev, short RegAddr, long *RegData); |
short xxusb_stack_read(usb_dev_handle *hDev, short StackAddr, long *StackData); |
short xxusb_stack_write(usb_dev_handle *hDev, short StackAddr, long *StackData); |
short xxusb_stack_execute(usb_dev_handle *hDev, long *StackData); |
short xxusb_register_write(usb_dev_handle *hDev, short RegAddr, long RegData); |
short xxusb_reset_toggle(usb_dev_handle *hDev); |
short xxusb_devices_find(xxusb_device_type *xxusbDev); |
short xxusb_device_close(usb_dev_handle *hDev); |
usb_dev_handle* xxusb_device_open(struct usb_device *dev); |
short xxusb_flash_program(usb_dev_handle *hDev, char *config, short nsect); |
short xxusb_flashblock_program(usb_dev_handle *hDev, UCHAR *config); |
usb_dev_handle* xxusb_serial_open(char *SerialString); |
short VME_register_write(usb_dev_handle *hdev, long VME_Address, long Data); |
short VME_register_read(usb_dev_handle *hdev, long VME_Address, long *Data); |
short VME_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch); |
short VME_DGG(usb_dev_handle *hdev, unsigned short channel, unsigned short trigger,unsigned short output, long delay, unsigned short gate, unsigned short invert, unsigned short latch); |
short VME_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch); |
short VME_read_16(usb_dev_handle *hdev,short Address_Modifier, long VME_Address, long *Data); |
short VME_read_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long *Data); |
short VME_BLT_read_32(usb_dev_handle *hdev, short Address_Modifier, int count, long VME_Address, long Data[]); |
short VME_write_16(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data); |
short VME_write_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data); |
short CAMAC_DGG(usb_dev_handle *hdev, short channel, short trigger, short output, int delay, int gate, short invert, short latch); |
short CAMAC_register_read(usb_dev_handle *hdev, int A, long *Data); |
short CAMAC_register_write(usb_dev_handle *hdev, int A, long Data); |
short CAMAC_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch); |
short CAMAC_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch); |
short CAMAC_read_LAM_mask(usb_dev_handle *hdev, long *Data); |
short CAMAC_write_LAM_mask(usb_dev_handle *hdev, long Data); |
short CAMAC_write(usb_dev_handle *hdev, int N, int A, int F, long Data, int *Q, int *X); |
short CAMAC_read(usb_dev_handle *hdev, int N, int A, int F, long *Data, int *Q, int *X); |
short CAMAC_Z(usb_dev_handle *hdev); |
short CAMAC_C(usb_dev_handle *hdev); |
short CAMAC_I(usb_dev_handle *hdev, int inhibit); |
/lab/sipmscan/trunk/input/usb.h.offline |
---|
0,0 → 1,344 |
/* |
* Prototypes, structure definitions and macros. |
* |
* Copyright (c) 2000-2003 Johannes Erdfelt <johannes@erdfelt.com> |
* |
* This library is covered by the LGPL, read LICENSE for details. |
* |
* This file (and only this file) may alternatively be licensed under the |
* BSD license as well, read LICENSE for details. |
*/ |
#ifndef __USB_H__ |
#define __USB_H__ |
#include <unistd.h> |
#include <stdlib.h> |
#include <stdint.h> |
#include <limits.h> |
#include <sys/param.h> |
#include <dirent.h> |
/* |
* USB spec information |
* |
* This is all stuff grabbed from various USB specs and is pretty much |
* not subject to change |
*/ |
/* |
* Device and/or Interface Class codes |
*/ |
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ |
#define USB_CLASS_AUDIO 1 |
#define USB_CLASS_COMM 2 |
#define USB_CLASS_HID 3 |
#define USB_CLASS_PRINTER 7 |
#define USB_CLASS_PTP 6 |
#define USB_CLASS_MASS_STORAGE 8 |
#define USB_CLASS_HUB 9 |
#define USB_CLASS_DATA 10 |
#define USB_CLASS_VENDOR_SPEC 0xff |
/* |
* Descriptor types |
*/ |
#define USB_DT_DEVICE 0x01 |
#define USB_DT_CONFIG 0x02 |
#define USB_DT_STRING 0x03 |
#define USB_DT_INTERFACE 0x04 |
#define USB_DT_ENDPOINT 0x05 |
#define USB_DT_HID 0x21 |
#define USB_DT_REPORT 0x22 |
#define USB_DT_PHYSICAL 0x23 |
#define USB_DT_HUB 0x29 |
/* |
* Descriptor sizes per descriptor type |
*/ |
#define USB_DT_DEVICE_SIZE 18 |
#define USB_DT_CONFIG_SIZE 9 |
#define USB_DT_INTERFACE_SIZE 9 |
#define USB_DT_ENDPOINT_SIZE 7 |
#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ |
#define USB_DT_HUB_NONVAR_SIZE 7 |
/* All standard descriptors have these 2 fields in common */ |
struct usb_descriptor_header { |
uint8_t bLength; |
uint8_t bDescriptorType; |
} __attribute__ ((packed)); |
/* String descriptor */ |
struct usb_string_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint16_t wData[1]; |
} __attribute__ ((packed)); |
/* HID descriptor */ |
struct usb_hid_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint16_t bcdHID; |
uint8_t bCountryCode; |
uint8_t bNumDescriptors; |
/* uint8_t bReportDescriptorType; */ |
/* uint16_t wDescriptorLength; */ |
/* ... */ |
} __attribute__ ((packed)); |
/* Endpoint descriptor */ |
#define USB_MAXENDPOINTS 32 |
struct usb_endpoint_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint8_t bEndpointAddress; |
uint8_t bmAttributes; |
uint16_t wMaxPacketSize; |
uint8_t bInterval; |
uint8_t bRefresh; |
uint8_t bSynchAddress; |
unsigned char *extra; /* Extra descriptors */ |
int extralen; |
}; |
#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ |
#define USB_ENDPOINT_DIR_MASK 0x80 |
#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ |
#define USB_ENDPOINT_TYPE_CONTROL 0 |
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 |
#define USB_ENDPOINT_TYPE_BULK 2 |
#define USB_ENDPOINT_TYPE_INTERRUPT 3 |
/* Interface descriptor */ |
#define USB_MAXINTERFACES 32 |
struct usb_interface_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint8_t bInterfaceNumber; |
uint8_t bAlternateSetting; |
uint8_t bNumEndpoints; |
uint8_t bInterfaceClass; |
uint8_t bInterfaceSubClass; |
uint8_t bInterfaceProtocol; |
uint8_t iInterface; |
struct usb_endpoint_descriptor *endpoint; |
unsigned char *extra; /* Extra descriptors */ |
int extralen; |
}; |
#define USB_MAXALTSETTING 128 /* Hard limit */ |
struct usb_interface { |
struct usb_interface_descriptor *altsetting; |
int num_altsetting; |
}; |
/* Configuration descriptor information.. */ |
#define USB_MAXCONFIG 8 |
struct usb_config_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint16_t wTotalLength; |
uint8_t bNumInterfaces; |
uint8_t bConfigurationValue; |
uint8_t iConfiguration; |
uint8_t bmAttributes; |
uint8_t MaxPower; |
struct usb_interface *interface; |
unsigned char *extra; /* Extra descriptors */ |
int extralen; |
}; |
/* Device descriptor */ |
struct usb_device_descriptor { |
uint8_t bLength; |
uint8_t bDescriptorType; |
uint16_t bcdUSB; |
uint8_t bDeviceClass; |
uint8_t bDeviceSubClass; |
uint8_t bDeviceProtocol; |
uint8_t bMaxPacketSize0; |
uint16_t idVendor; |
uint16_t idProduct; |
uint16_t bcdDevice; |
uint8_t iManufacturer; |
uint8_t iProduct; |
uint8_t iSerialNumber; |
uint8_t bNumConfigurations; |
} __attribute__ ((packed)); |
struct usb_ctrl_setup { |
uint8_t bRequestType; |
uint8_t bRequest; |
uint16_t wValue; |
uint16_t wIndex; |
uint16_t wLength; |
} __attribute__ ((packed)); |
/* |
* Standard requests |
*/ |
#define USB_REQ_GET_STATUS 0x00 |
#define USB_REQ_CLEAR_FEATURE 0x01 |
/* 0x02 is reserved */ |
#define USB_REQ_SET_FEATURE 0x03 |
/* 0x04 is reserved */ |
#define USB_REQ_SET_ADDRESS 0x05 |
#define USB_REQ_GET_DESCRIPTOR 0x06 |
#define USB_REQ_SET_DESCRIPTOR 0x07 |
#define USB_REQ_GET_CONFIGURATION 0x08 |
#define USB_REQ_SET_CONFIGURATION 0x09 |
#define USB_REQ_GET_INTERFACE 0x0A |
#define USB_REQ_SET_INTERFACE 0x0B |
#define USB_REQ_SYNCH_FRAME 0x0C |
#define USB_TYPE_STANDARD (0x00 << 5) |
#define USB_TYPE_CLASS (0x01 << 5) |
#define USB_TYPE_VENDOR (0x02 << 5) |
#define USB_TYPE_RESERVED (0x03 << 5) |
#define USB_RECIP_DEVICE 0x00 |
#define USB_RECIP_INTERFACE 0x01 |
#define USB_RECIP_ENDPOINT 0x02 |
#define USB_RECIP_OTHER 0x03 |
/* |
* Various libusb API related stuff |
*/ |
#define USB_ENDPOINT_IN 0x80 |
#define USB_ENDPOINT_OUT 0x00 |
/* Error codes */ |
#define USB_ERROR_BEGIN 500000 |
/* |
* This is supposed to look weird. This file is generated from autoconf |
* and I didn't want to make this too complicated. |
*/ |
#if 0 |
#define USB_LE16_TO_CPU(x) do { x = ((x & 0xff) << 8) | ((x & 0xff00) >> 8); } while(0) |
#else |
#define USB_LE16_TO_CPU(x) |
#endif |
/* Data types */ |
struct usb_device; |
struct usb_bus; |
/* |
* To maintain compatibility with applications already built with libusb, |
* we must only add entries to the end of this structure. NEVER delete or |
* move members and only change types if you really know what you're doing. |
*/ |
#ifdef PATH_MAX |
#define LIBUSB_PATH_MAX PATH_MAX |
#else |
#define LIBUSB_PATH_MAX 4096 |
#endif |
struct usb_device { |
struct usb_device *next, *prev; |
char filename[LIBUSB_PATH_MAX + 1]; |
struct usb_bus *bus; |
struct usb_device_descriptor descriptor; |
struct usb_config_descriptor *config; |
void *dev; /* Darwin support */ |
uint8_t devnum; |
unsigned char num_children; |
struct usb_device **children; |
}; |
struct usb_bus { |
struct usb_bus *next, *prev; |
char dirname[LIBUSB_PATH_MAX + 1]; |
struct usb_device *devices; |
uint32_t location; |
struct usb_device *root_dev; |
}; |
struct usb_dev_handle; |
typedef struct usb_dev_handle usb_dev_handle; |
/* Variables */ |
extern struct usb_bus *usb_busses; |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Function prototypes */ |
/* usb.c */ |
usb_dev_handle *usb_open(struct usb_device *dev); |
int usb_close(usb_dev_handle *dev); |
int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, |
size_t buflen); |
int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, |
size_t buflen); |
/* descriptors.c */ |
int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, |
unsigned char type, unsigned char index, void *buf, int size); |
int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, |
unsigned char index, void *buf, int size); |
/* <arch>.c */ |
int usb_bulk_write(usb_dev_handle *dev, int ep, const char *bytes, int size, |
int timeout); |
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, |
int timeout); |
int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, |
int timeout); |
int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, |
int timeout); |
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, |
int value, int index, char *bytes, int size, int timeout); |
int usb_set_configuration(usb_dev_handle *dev, int configuration); |
int usb_claim_interface(usb_dev_handle *dev, int interface); |
int usb_release_interface(usb_dev_handle *dev, int interface); |
int usb_set_altinterface(usb_dev_handle *dev, int alternate); |
int usb_resetep(usb_dev_handle *dev, unsigned int ep); |
int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); |
int usb_reset(usb_dev_handle *dev); |
#if 1 |
#define LIBUSB_HAS_GET_DRIVER_NP 1 |
int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, |
unsigned int namelen); |
#define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1 |
int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface); |
#endif |
char *usb_strerror(void); |
void usb_init(void); |
void usb_set_debug(int level); |
int usb_find_busses(void); |
int usb_find_devices(void); |
struct usb_device *usb_device(usb_dev_handle *dev); |
struct usb_bus *usb_get_busses(void); |
#ifdef __cplusplus |
} |
#endif |
#endif /* __USB_H__ */ |
/lab/sipmscan/trunk/libxxusb.cpp |
---|
6,7 → 6,7 |
#include <string.h> |
#include <malloc.h> |
#include "usb.h" |
//#include "usb.h" |
#include "libxxusb.h" |
#include <time.h> |
/lab/sipmscan/trunk/vxi11_i686/Makefile.old |
---|
File deleted |
/lab/sipmscan/trunk/vxi11_x86_64/Makefile.old |
---|
File deleted |
/lab/sipmscan/trunk/windowed_test.C |
---|
66,6 → 66,12 |
void SetPosition(); |
void GetPosition(); |
void HomePosition(); |
void InitializeScope(); |
void StartScopeAcq(); |
void CustomScopeCommand(); |
void SelectedMeasType(int mtype); |
void SaveFile(); |
void StartAcq(); |
101,6 → 107,7 |
double tdctimeconversion = 45.0909; |
double lenconversion = 0.3595; |
int oscOn; |
const char *allMeasNames[11] = {"Amplitude","Area","Delay","Fall","Frequency","Maximum","Mean","Minimum","Peak-to-peak","Peak width","Rise"}; |
// ROOT file variable structure ----------- |
struct EventHeader { |
119,9 → 126,17 |
int tdcdata[8]; |
} evtdata; |
struct EventMeas { |
double measdata; |
} evtmeas; |
TFile *inroot; |
TFile *outroot; |
// Test graphs for scope measurements |
TCanvas *wCanvas; |
TGraph *testgraph; |
//--------------------------------------------------------------- |
// Global variables |
134,6 → 149,7 |
TGNumberEntry *vHardlimit; |
TGNumberEntry *NCH; |
TGTextEntry *laserInfo; |
TGNumberEntry *chtemp; |
TGCheckButton *cleanOn; |
TGTab *setTab; |
197,6 → 213,16 |
TGNumberEntry *accError; |
TGCheckButton *exfitplots; |
//TGButtonGroup *sChangroup; |
TGCheckButton *sCH[8]; |
TGComboBox *sMeasType; |
TGCheckButton *sCamaclink; |
TGTextEntry *scopeCommand; |
TGTextEntry *scopeReturn; |
TGTextButton *sendScopeCustom; |
TGComboBox *sMeasgroup; |
TGTextButton *scopeInit; |
Bool_t firstrun = kTRUE; |
Bool_t started; |
Bool_t cleanPlots = kTRUE; |
287,6 → 313,71 |
printf("Outfile (remove_from_last): %s\n", outname); |
} |
void SeqNumber(int innum, int maxnum, char *outstr) |
{ |
int zeronum = 5; |
// Check how many zeroes we need to add to get sequential numbers |
if( (maxnum > 0) && (maxnum < 1000) ) |
zeronum = 2; |
else if( (maxnum >= 1000) && (maxnum < 10000) ) |
zeronum = 3; |
else if( (maxnum >= 10000) && (maxnum < 100000) ) |
zeronum = 4; |
else if( (maxnum >= 100000) && (maxnum < 1000000) ) |
zeronum = 5; |
// Make the sequence number depending on the number of zeroes |
if(zeronum == 2) |
{ |
if(innum < 10) |
sprintf(outstr, "00%d", innum); |
else if( (innum >= 10) && (innum < 100) ) |
sprintf(outstr, "0%d", innum); |
else if( (innum >= 100) && (innum < 1000) ) |
sprintf(outstr, "%d", innum); |
} |
else if(zeronum == 3) |
{ |
if(innum < 10) |
sprintf(outstr, "000%d", innum); |
else if( (innum >= 10) && (innum < 100) ) |
sprintf(outstr, "00%d", innum); |
else if( (innum >= 100) && (innum < 1000) ) |
sprintf(outstr, "0%d", innum); |
else if( (innum >= 1000) && (innum < 10000) ) |
sprintf(outstr, "%d", innum); |
} |
else if(zeronum == 4) |
{ |
if(innum < 10) |
sprintf(outstr, "0000%d", innum); |
else if( (innum >= 10) && (innum < 100) ) |
sprintf(outstr, "000%d", innum); |
else if( (innum >= 100) && (innum < 1000) ) |
sprintf(outstr, "00%d", innum); |
else if( (innum >= 1000) && (innum < 10000) ) |
sprintf(outstr, "0%d", innum); |
else if( (innum >= 10000) && (innum < 100000) ) |
sprintf(outstr, "%d", innum); |
} |
else if(zeronum == 5) |
{ |
if(innum < 10) |
sprintf(outstr, "00000%d", innum); |
else if( (innum >= 10) && (innum < 100) ) |
sprintf(outstr, "0000%d", innum); |
else if( (innum >= 100) && (innum < 1000) ) |
sprintf(outstr, "000%d", innum); |
else if( (innum >= 1000) && (innum < 10000) ) |
sprintf(outstr, "00%d", innum); |
else if( (innum >= 10000) && (innum < 100000) ) |
sprintf(outstr, "0%d", innum); |
else if( (innum >= 100000) && (innum < 1000000) ) |
sprintf(outstr, "%d", innum); |
} |
} |
// Peak detection function |
int npeaks; |
double FindPeaks(double *x, double *par) |
385,7 → 476,6 |
int scopeState = -1; |
char *IPaddr = (char*)oscIP->GetText(); |
int IPcorr = 0; |
char buf[BSIZE]; |
if(oscOn == 0) |
{ |
396,12 → 486,13 |
if( (IPaddr != NULL) && (IPcorr == 3) ) |
{ |
#if WORKSTAT == 'I' |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
printf("Connecting to oscilloscope.\n"); |
retTemp = gScopeDaq->connect(IPaddr); |
scopeState = 1; // For testing instead of making a real connection |
#else |
scopeState = 1; |
retTemp = 0; |
#endif |
} |
else |
410,39 → 501,70 |
printf("Please enter a valid scope IP address.\n"); |
} |
} |
else if(oscOn == 1) |
else if(oscOn > 0) |
{ |
#if WORKSTAT == 'I' |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
printf("Disconnecting from oscilloscope.\n"); |
retTemp = gScopeDaq->disconnect(IPaddr); |
scopeState = -1; // For testing instead of making a real disconnection |
#else |
scopeState = -1; |
retTemp = 0; |
#endif |
} |
if(scopeState >= 0) |
if(retTemp == 0) |
{ |
setTab->SetEnabled(1, kTRUE); |
setTab->SetEnabled(2, kTRUE); |
oscIP->SetEnabled(kFALSE); |
oscConnect->SetText("Disconnect"); |
oscConnect->SetTextJustify(36); |
oscConnect->SetWrapLength(-1); |
oscConnect->Resize(60,22); |
oscOn = 1; |
if(scopeState >= 0) |
{ |
oscIP->SetEnabled(kFALSE); |
oscConnect->SetText("Disconnect"); |
oscConnect->SetTextJustify(36); |
oscConnect->SetWrapLength(-1); |
oscConnect->Resize(60,22); |
for(int i = 0; i < 8; i++) |
{ |
sCH[i]->SetState(kButtonUp); |
sCH[i]->SetEnabled(kFALSE); |
} |
sMeasType->SetEnabled(kTRUE); |
sCamaclink->SetState(kButtonUp); |
sCamaclink->SetEnabled(kFALSE); |
scopeCommand->SetEnabled(kTRUE); |
sendScopeCustom->SetEnabled(kTRUE); |
sMeasgroup->SetEnabled(kFALSE); |
scopeInit->SetEnabled(kFALSE); |
oscOn = 1; |
} |
else |
{ |
oscIP->SetEnabled(kTRUE); |
oscConnect->SetText("Connect"); |
oscConnect->SetTextJustify(36); |
oscConnect->SetWrapLength(-1); |
oscConnect->Resize(60,22); |
for(int i = 0; i < 8; i++) |
{ |
sCH[i]->SetState(kButtonUp); |
sCH[i]->SetEnabled(kFALSE); |
} |
sMeasType->Select(0); |
sMeasType->SetEnabled(kFALSE); |
sCamaclink->SetState(kButtonUp); |
sCamaclink->SetEnabled(kFALSE); |
scopeCommand->SetEnabled(kFALSE); |
sendScopeCustom->SetEnabled(kFALSE); |
sMeasgroup->SetEnabled(kFALSE); |
scopeInit->SetEnabled(kFALSE); |
oscOn = 0; |
} |
} |
else |
{ |
setTab->SetEnabled(1, kFALSE); |
setTab->SetEnabled(2, kFALSE); |
oscIP->SetEnabled(kTRUE); |
oscConnect->SetText("Connect"); |
oscConnect->SetTextJustify(36); |
oscConnect->SetWrapLength(-1); |
oscConnect->Resize(60,22); |
oscOn = 0; |
} |
printf("Error! Connecting/disconnecting failed.\n"); |
} |
// Set the output voltage |
633,6 → 755,195 |
#endif |
} |
// Initialize the currently connected scope for measurements |
void TGAppMainFrame::InitializeScope() |
{ |
int iTemp; |
int chTemp[8]; |
for(int i = 0; i < 8; i++) chTemp[i] = -1; |
gScopeDaq->scopeUseType = sMeasType->GetSelected(); |
// Check what channels are selected |
iTemp = 0; |
for(int i = 0; i < 8; i++) |
{ |
if(sCH[i]->IsDown()) |
{ |
chTemp[iTemp] = i; |
iTemp++; |
} |
} |
if(iTemp == 0) |
{ |
// If no channel is selected, we select the first one |
chTemp[0] = 0; |
iTemp++; |
sCH[0]->SetState(kButtonDown); |
} |
// If measurement is used, only use the first selected channel |
if(gScopeDaq->scopeUseType == 2) |
{ |
for(int i = 1; i < iTemp; i++) |
sCH[chTemp[i]]->SetState(kButtonUp); |
iTemp = 1; |
} |
gScopeDaq->scopeChanNr = iTemp; |
for(int i = 0; i < 8; i++) gScopeDaq->scopeChans[i] = chTemp[i]; |
// Check which measurement is selected |
gScopeDaq->scopeMeasSel = sMeasgroup->GetSelected(); |
gScopeDaq->init(); |
} |
// Run a scope measurement |
void TGAppMainFrame::StartScopeAcq() |
{ |
// Lock the scope front panel |
gScopeDaq->lockunlock(true); |
retTemp = gScopeDaq->event(); |
if(gScopeDaq->scopeUseType == 1) |
{ |
char len[16]; |
int sval; |
short *spoints; |
if(retTemp == 0) |
{ |
// Read the number of y bytes at beginning of CURVE binary data |
memcpy(len, &gScopeDaq->eventbuf[1],1); |
len[1] = 0; |
sval = atoi(len); |
// printf("Number of y bytes = %d\n", sval); |
// Read the data |
spoints = (short *)(&gScopeDaq->eventbuf[2+sval]); |
// Read the number of data points |
memcpy(len, &gScopeDaq->eventbuf[2],sval); |
len[sval] = 0; |
sval = atoi(len); |
// printf("Number of data points = %d\n", sval/2); |
double *grafx, *grafy; |
grafx = new double[sval/2]; |
grafy = new double[sval/2]; |
// Parse data and graph it |
for(int i = 0; i < sval/2; i++) |
{ |
grafx[i] = i*gScopeDaq->tektime*10./(sval/2.); |
grafy[i] = ((double)spoints[i]*5.*gScopeDaq->tekvolt/32767.) - (gScopeDaq->choffset*gScopeDaq->tekvolt); |
} |
wCanvas->cd(); |
testgraph = new TGraph(sval/2, grafx, grafy); |
testgraph->GetXaxis()->SetTitle("Time [s]"); |
testgraph->GetXaxis()->SetRangeUser(grafx[0], grafx[(sval/2)-1]); |
testgraph->GetYaxis()->SetTitle("Voltage [V]"); |
testgraph->Draw("AL"); |
wCanvas->Modified(); |
wCanvas->Update(); |
delete[] grafx; |
delete[] grafy; |
} |
} |
else if(gScopeDaq->scopeUseType == 2) |
{ |
if(retTemp == 0) |
{ |
if(gScopeDaq->measubuf < 1.e-4) |
printf("Measurement: %le\n", gScopeDaq->measubuf); |
else |
printf("Measurement: %lf\n", gScopeDaq->measubuf); |
} |
} |
// Unlock the scope front panel |
gScopeDaq->lockunlock(false); |
} |
// Send a custom command to the scope |
void TGAppMainFrame::CustomScopeCommand() |
{ |
char *cmd = (char*)scopeCommand->GetText(); |
char ret[100000]; |
if( strchr(cmd, '?') == NULL) |
{ |
printf("Sending command: %s\n", cmd); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
gScopeDaq->customCommand(cmd, false, ret); |
#endif |
} |
else |
{ |
printf("Sending query: %s\n", cmd); |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
gScopeDaq->customCommand(cmd, true, ret); |
#endif |
} |
#if WORKSTAT == 'I' || WORKSTAT == 'S' |
scopeReturn->SetText(ret); |
#endif |
} |
// When we select the measurement type, change other scope settings accordingly |
void TGAppMainFrame::SelectedMeasType(int mtype) |
{ |
// No waveform analysis |
if(mtype == 0) |
{ |
for(int i = 0; i < 8; i++) |
{ |
sCH[i]->SetState(kButtonUp); |
sCH[i]->SetEnabled(kFALSE); |
} |
sMeasType->SetEnabled(kTRUE); |
sCamaclink->SetState(kButtonUp); |
sCamaclink->SetEnabled(kFALSE); |
scopeCommand->SetEnabled(kTRUE); |
sendScopeCustom->SetEnabled(kTRUE); |
sMeasgroup->SetEnabled(kFALSE); |
scopeInit->SetEnabled(kFALSE); |
oscOn = 1; |
} |
// Complete waveform acquisition |
else if(mtype == 1) |
{ |
for(int i = 0; i < 8; i++) |
sCH[i]->SetEnabled(kTRUE); |
sMeasType->SetEnabled(kTRUE); |
sCamaclink->SetState(kButtonDown); |
sCamaclink->SetEnabled(kTRUE); |
scopeCommand->SetEnabled(kTRUE); |
sendScopeCustom->SetEnabled(kTRUE); |
sMeasgroup->SetEnabled(kFALSE); |
scopeInit->SetEnabled(kTRUE); |
oscOn = 2; |
} |
// Waveform measurements |
else if(mtype == 2) |
{ |
for(int i = 0; i < 8; i++) |
sCH[i]->SetEnabled(kTRUE); |
sMeasType->SetEnabled(kTRUE); |
sCamaclink->SetState(kButtonUp); |
sCamaclink->SetEnabled(kTRUE); |
scopeCommand->SetEnabled(kTRUE); |
sendScopeCustom->SetEnabled(kTRUE); |
sMeasgroup->SetEnabled(kTRUE); |
scopeInit->SetEnabled(kTRUE); |
oscOn = 3; |
} |
} |
// Make breakdown voltage plot |
void TGAppMainFrame::MakeBreakdownPlot(int nrp, double *volt, double *volterr, double *psep1, double *pseperr1, double *psep2, double *pseperr2, double *psep3, double *pseperr3, char *plotfile) |
{ |
1350,7 → 1661,9 |
float progVal; |
char ctemp[256]; |
char ctemp2[256]; |
char fname[256]; |
int itemp = 0; |
remove_ext((char*)fileName->GetText(), ctemp); |
// printf("Save name: %s\nNo extension: %s\n", fileName->GetText(), ctemp); |
1366,20 → 1679,55 |
{ |
if(zaxisscan == 0) |
{ |
if(runCase < 10) |
sprintf(fname, "%s_0000%d%s", ctemp, runCase, histExt); |
else if( (runCase >= 10) && (runCase < 100) ) |
sprintf(fname, "%s_000%d%s", ctemp, runCase, histExt); |
else if( (runCase >= 100) && (runCase < 1000) ) |
sprintf(fname, "%s_00%d%s", ctemp, runCase, histExt); |
else if( (runCase >= 1000) && (runCase < 10000) ) |
sprintf(fname, "%s_0%d%s", ctemp, runCase, histExt); |
else if( (runCase >= 10000) && (runCase < 100000) ) |
sprintf(fname, "%s_%d%s", ctemp, runCase, histExt); |
if( (voltscanOn->IsOn()) && (vOutStep->GetNumber() > 0.) ) |
SeqNumber(runCase, (int)((vOutStop->GetNumber())-(vOutStart->GetNumber()))/(vOutStep->GetNumber()), ctemp2); |
else if( surfscanOn->IsOn() ) |
{ |
if( xPosStep->GetNumber() == 0 ) |
itemp = 1; |
else |
itemp = (int)((xPosMax->GetNumber())-(xPosMin->GetNumber()))/(xPosStep->GetNumber()); |
if( yPosStep->GetNumber() == 0 ) |
itemp *= 1; |
else |
itemp *= (int)((yPosMax->GetNumber())-(yPosMin->GetNumber()))/(yPosStep->GetNumber()); |
SeqNumber(runCase, itemp, ctemp2); |
} |
sprintf(fname, "%s_%s%s", ctemp, ctemp2, histExt); |
} |
else if(zaxisscan == 1) |
{ |
if(runCase < 10) |
SeqNumber((int)zPos->GetNumber(), (int)zPosMax->GetNumber(), ctemp2); |
if( (voltscanOn->IsOn()) && (vOutStep->GetNumber() > 0.) ) |
{ |
sprintf(fname, "%s_z%s_", ctemp, ctemp2); |
SeqNumber(runCase, (int)((vOutStop->GetNumber())-(vOutStart->GetNumber()))/(vOutStep->GetNumber())+1, ctemp2); |
strcat(fname, ctemp2); |
strcat(fname, histExt); |
} |
else if( surfscanOn->IsOn() ) |
{ |
sprintf(fname, "%s_z%s_", ctemp, ctemp2); |
if( xPosStep->GetNumber() == 0 ) |
itemp = 1; |
else |
itemp = (int)((xPosMax->GetNumber())-(xPosMin->GetNumber()))/(xPosStep->GetNumber())+1; |
if( yPosStep->GetNumber() == 0 ) |
itemp *= 1; |
else |
itemp *= (int)((yPosMax->GetNumber())-(yPosMin->GetNumber()))/(yPosStep->GetNumber())+1; |
SeqNumber(runCase, itemp, ctemp2); |
strcat(fname, ctemp2); |
strcat(fname, histExt); |
} |
else |
sprintf(fname, "%s_z%s%s", ctemp, ctemp2, histExt); |
/* if(runCase < 10) |
sprintf(fname, "%s_z%d_0000%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt); |
else if( (runCase >= 10) && (runCase < 100) ) |
sprintf(fname, "%s_z%d_000%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt); |
1389,7 → 1737,7 |
sprintf(fname, "%s_z%d_0%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt); |
else if( (runCase >= 10000) && (runCase < 100000) ) |
sprintf(fname, "%s_z%d_0%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt); |
} |
*/ } |
} |
else if( !voltscanOn->IsOn() && !surfscanOn->IsOn() ) |
sprintf(fname, "%s%s", ctemp, histExt); |
1405,7 → 1753,8 |
outroot = new TFile(fname, "RECREATE"); |
TTree *header_data = new TTree("header_data", "Header information for the measurement."); |
TTree *meas_data = new TTree("meas_data", "Saved measurement data."); |
TTree *meas_data = new TTree("meas_data", "Saved ADC and TDC measurement data."); |
TTree *scope_data = new TTree("scope_data", "Saved scope measurement data."); |
// Branches for the header |
header_data->Branch("nrch", &evtheader.nrch, "nrch/I"); |
1423,7 → 1772,7 |
evtheader.xpos = (int)xPos->GetNumber(); |
evtheader.ypos = (int)yPos->GetNumber(); |
evtheader.zpos = (int)zPos->GetNumber(); |
evtheader.temperature = 25.0; // Still to do!!! |
evtheader.temperature = (double)chtemp->GetNumber(); |
sprintf(evtheader.laserinfo, "%s", laserInfo->GetText()); |
char histtime[256]; |
1451,6 → 1800,37 |
meas_data->Branch(ctemp, &evtdata.tdcdata[i], fname); |
} |
// Initialize the scope before measurement |
if( sCamaclink->IsDown() ) |
InitializeScope(); |
// Branch for scope measurement data |
if(gScopeDaq->scopeUseType == 2) // only if we select waveform measurement |
{ |
if(gScopeDaq->scopeMeasSel == 0) |
scope_data->Branch("amp", &evtmeas.measdata, "amp/D"); |
else if(gScopeDaq->scopeMeasSel == 1) |
scope_data->Branch("area", &evtmeas.measdata, "area/D"); |
else if(gScopeDaq->scopeMeasSel == 2) |
scope_data->Branch("delay", &evtmeas.measdata, "delay/D"); |
else if(gScopeDaq->scopeMeasSel == 3) |
scope_data->Branch("fall", &evtmeas.measdata, "fall/D"); |
else if(gScopeDaq->scopeMeasSel == 4) |
scope_data->Branch("freq", &evtmeas.measdata, "freq/D"); |
else if(gScopeDaq->scopeMeasSel == 5) |
scope_data->Branch("max", &evtmeas.measdata, "max/D"); |
else if(gScopeDaq->scopeMeasSel == 6) |
scope_data->Branch("mean", &evtmeas.measdata, "mean/D"); |
else if(gScopeDaq->scopeMeasSel == 7) |
scope_data->Branch("min", &evtmeas.measdata, "min/D"); |
else if(gScopeDaq->scopeMeasSel == 8) |
scope_data->Branch("pk2p", &evtmeas.measdata, "pk2p/D"); |
else if(gScopeDaq->scopeMeasSel == 9) |
scope_data->Branch("pwidth", &evtmeas.measdata, "pwidth/D"); |
else if(gScopeDaq->scopeMeasSel == 10) |
scope_data->Branch("rise", &evtmeas.measdata, "rise/D"); |
} |
int neve = (int) evtNum->GetNumber(); |
int allEvt, zProg; |
zProg = 1; |
1500,8 → 1880,20 |
evtdata.tdcdata[i/2] = (int)adc; |
else if(i % 2 == 1) // ADC |
evtdata.adcdata[i/2] = (int)adc; |
// Start plotting the scope waveform |
if( (gScopeDaq->scopeUseType == 1) && (sCamaclink->IsDown()) ) |
StartScopeAcq(); |
} |
meas_data->Fill(); |
// Start making a scope measurement |
if( (gScopeDaq->scopeUseType == 2) && (sCamaclink->IsDown()) ) |
{ |
StartScopeAcq(); |
evtmeas.measdata = gScopeDaq->measubuf; |
} |
scope_data->Fill(); |
n++; |
nc += evtheader.nrch; |
1532,8 → 1924,10 |
header_data->Write(); |
meas_data->Write(); |
scope_data->Write(); |
delete header_data; |
delete meas_data; |
delete scope_data; |
outroot->Close(); |
} |
1608,7 → 2002,7 |
fflush(stdout); |
printf("Waiting for voltage change...\n"); |
sleep(5); |
sleep(3); |
vOut->SetNumber(currentVoltage); |
printf("Continuing...\n"); |
2792,6 → 3186,15 |
fH1->AddFrame(laserInfo, f2); |
mdiFrame->AddFrame(fH1, f2); |
// Chamber temperature (will only be manually set until we can get it directly from the chamber) |
fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
lab = new TGLabel(fH1, "Chamber temp.:"); |
fH1->AddFrame(lab, f0center2d); |
chtemp = new TGNumberEntry(fH1, 25.0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -70., 150.); |
chtemp->Resize(60,22); |
fH1->AddFrame(chtemp, f0center2d); |
mdiFrame->AddFrame(fH1, f2); |
mdiFrame->SetMdiHints(kMdiMinimize); |
mdiFrame->SetWindowName("Settings pane"); |
mdiFrame->MapSubwindows(); |
3026,23 → 3429,121 |
fT1->AddFrame(fH1, f1); |
// Waveform tab |
fT1 = setTab->AddTab("Waveform"); |
fT1 = setTab->AddTab("Waveform analysis"); |
fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight); |
lab = new TGLabel(fH1, "Waveform controls"); |
fH1->AddFrame(lab, f0center2d); |
fT1->AddFrame(fH1, f0); |
subgroup[0] = 1*subwin[0]/2-12; |
fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1]/3, kFixedWidth); |
// Wave measurements tab |
fT1 = setTab->AddTab("Measurement"); |
fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight); |
lab = new TGLabel(fH1, "Waveform measurement controls"); |
fH1->AddFrame(lab, f0center2d); |
fT1->AddFrame(fH1, f0); |
fG1 = new TGGroupFrame(fV1, "Acquisition channel"); |
// Selection of channels |
fH2 = new TGHorizontalFrame(fG1, subgroup[0], 100); |
sCH[0] = new TGCheckButton(fH2, "CH1"); |
sCH[0]->Resize(50,22); |
sCH[0]->SetState(kButtonUp); |
fH2->AddFrame(sCH[0], f0centerx); |
sCH[1] = new TGCheckButton(fH2, "CH2"); |
sCH[1]->Resize(50,22); |
sCH[1]->SetState(kButtonUp); |
fH2->AddFrame(sCH[1], f0centerx); |
sCH[2] = new TGCheckButton(fH2, "CH3"); |
sCH[2]->Resize(50,22); |
sCH[2]->SetState(kButtonUp); |
fH2->AddFrame(sCH[2], f0centerx); |
sCH[3] = new TGCheckButton(fH2, "CH4"); |
sCH[3]->Resize(50,22); |
sCH[3]->SetState(kButtonUp); |
fH2->AddFrame(sCH[3], f0centerx); |
fG1->AddFrame(fH2, f0centerx); |
// Selection of MATH channels |
fH2 = new TGHorizontalFrame(fG1, subgroup[0], 100); |
sCH[4] = new TGCheckButton(fH2, "MATH1"); |
sCH[4]->Resize(50,22); |
sCH[4]->SetState(kButtonUp); |
fH2->AddFrame(sCH[4], f0centerx); |
sCH[5] = new TGCheckButton(fH2, "MATH2"); |
sCH[5]->Resize(50,22); |
sCH[5]->SetState(kButtonUp); |
fH2->AddFrame(sCH[5], f0centerx); |
sCH[6] = new TGCheckButton(fH2, "MATH3"); |
sCH[6]->Resize(50,22); |
sCH[6]->SetState(kButtonUp); |
fH2->AddFrame(sCH[6], f0centerx); |
sCH[7] = new TGCheckButton(fH2, "MATH4"); |
sCH[7]->Resize(50,22); |
sCH[7]->SetState(kButtonUp); |
fH2->AddFrame(sCH[7], f0centerx); |
fG1->AddFrame(fH2, f0centerx); |
fV1->AddFrame(fG1, f2); |
// Selection of measurement type |
fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30); |
lab = new TGLabel(fH2, "Scope use type:"); |
fH2->AddFrame(lab, f0center2d); |
sMeasType = new TGComboBox(fH2, 200); |
sMeasType->AddEntry("No waveform analysis", 0); |
sMeasType->AddEntry("Waveform acquisition", 1); |
sMeasType->AddEntry("Measurement", 2); |
sMeasType->Resize(150,22); |
sMeasType->Select(0); |
fH2->AddFrame(sMeasType, f0center2d); |
fV1->AddFrame(fH2, f2); |
// Link waveform analysis to CAMAC acquisition |
sCamaclink = new TGCheckButton(fV1, "Link waveform to CAMAC acquisition"); |
sCamaclink->Resize(200,22); |
sCamaclink->SetState(kButtonUp); |
fV1->AddFrame(sCamaclink, f0centerx); |
// Custom command interface for the scope |
lab = new TGLabel(fV1, "Custom scope command:"); |
fV1->AddFrame(lab, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,10,2) ); |
fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30); |
scopeCommand = new TGTextEntry(fH2, ""); |
scopeCommand->Resize(subgroup[0]-45,22); |
fH2->AddFrame(scopeCommand, f2); |
sendScopeCustom = new TGTextButton(fH2, "Send"); |
sendScopeCustom->SetTextJustify(36); |
sendScopeCustom->SetWrapLength(-1); |
sendScopeCustom->Resize(80,22); |
fH2->AddFrame(sendScopeCustom, f0centery); |
fV1->AddFrame(fH2, f0); |
// Return value for custom scope command |
lab = new TGLabel(fV1, "Return:"); |
fV1->AddFrame(lab, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,10,2) ); |
scopeReturn = new TGTextEntry(fV1, ""); |
scopeReturn->Resize(subgroup[0],22); |
fV1->AddFrame(scopeReturn, f2); |
fH1->AddFrame(fV1, f0); |
// Wave measurement type |
fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1]/3, kFixedWidth); |
fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30); |
lab = new TGLabel(fH2, "Meas. type:"); |
fH2->AddFrame(lab, f0center2d); |
sMeasgroup = new TGComboBox(fH2, 200); |
for(int i = 0; i < 11; i++) |
sMeasgroup->AddEntry(allMeasNames[i], i); |
sMeasgroup->Resize(150,22); |
sMeasgroup->Select(4); |
fH2->AddFrame(sMeasgroup, f0center2d); |
fV1->AddFrame(fH2, f2); |
// Initialize current acquisition settings |
scopeInit = new TGTextButton(fV1, "Initialize scope"); |
scopeInit->SetTextJustify(36); |
scopeInit->SetWrapLength(-1); |
scopeInit->Resize(80,22); |
fV1->AddFrame(scopeInit, f0centerx); |
fH1->AddFrame(fV1, f0); |
fT1->AddFrame(fH1, f1); |
mdiFrame->AddFrame(setTab, f0); |
// Disable the two tabs regarding the Scope if not connected to one |
setTab->SetEnabled(1,kFALSE); |
setTab->SetEnabled(2,kFALSE); |
// Bottom pane (File controls) |
subgroup[0] = subwin[0]-20; |
3403,10 → 3904,26 |
logscale->Connect("Clicked()", "TGAppMainFrame", this, "SetHistRange()"); |
exportHist->Connect("Clicked()", "TGAppMainFrame", this, "HistogramExport()"); |
scopeInit->Connect("Clicked()", "TGAppMainFrame", this, "InitializeScope()"); |
sendScopeCustom->Connect("Clicked()", "TGAppMainFrame", this, "CustomScopeCommand()"); |
sMeasType->Connect("Selected(Int_t)", "TGAppMainFrame", this, "SelectedMeasType(Int_t)"); |
started = kFALSE; |
for(int i = 0; i < 8; i++) sCH[i]->SetEnabled(kFALSE); |
sMeasType->SetEnabled(kFALSE); |
sCamaclink->SetEnabled(kFALSE); |
scopeCommand->SetEnabled(kFALSE); |
sendScopeCustom->SetEnabled(kFALSE); |
sMeasgroup->SetEnabled(kFALSE); |
scopeInit->SetEnabled(kFALSE); |
EnableVoltScan(); |
EnableSurfScan(); |
EnableZaxisScan(); |
// Testing canvas for scope waveforms |
wCanvas = new TCanvas("wCanvas", "Waveform canvas", 600, 300); |
} |
//--------------------------------------------------------------- |