/lab/sipmscan/trunk/start.cxx |
File deleted |
|
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: sipmscan/trunk/input/Makefile.in |
=================================================================== |
--- sipmscan/trunk/input/Makefile.in (revision 117) |
+++ sipmscan/trunk/input/Makefile.in (nonexistent) |
@@ -1,99 +0,0 @@ |
-# Make variables ---------------------------------------------------- |
- |
-# ROOT include and libraries |
-ROOTINC=$(shell root-config --incdir ) |
-ROOTLIB=$(shell root-config --libs ) |
-LIBS1=$(shell root-config --cflags --glibs ) |
- |
-# Includes, 32 vs. 64 bit type, libraries |
-INC=-I. -I$(ROOTINC) |
-OSTYPE = $(shell uname -p) |
-LIBS=$(ROOTLIB) -L./ -lm |
- |
-# Source and debug prefixes |
-SRC = . |
-DBG = |
- |
-# CAMAC DAQ library variables |
-OBJ_FILES = wusbxx_dll.o libxxusb.o |
-LIBFILE = libdaqusb.a |
- |
-# Specific variables for the main program |
-TARGET = windowed_test |
-DAQFILE = $(SRC)/daqusb.C |
-FILES = $(SRC)/daqusb.C $(SRC)/windowed_test.C $(SRC)/daqscope.C |
-HEADER = daq.h workstation.h root_include.h windowed_test.h |
-CAMLIB = $(LIBFILE) |
-SHLIB = $(LIBFILE) libvxi11.a |
- |
-# VXI scope connection variables, Scope DAQ library variables |
-VXIDIR = ./vxi11_$(OSTYPE) |
-#VXI_FILES = $(VXIDIR)/vxi11_user.o $(VXIDIR)/vxi11.h $(VXIDIR)/vxi11_clnt.c $(VXIDIR)/vxi11_xdr.c |
-VXI_OBJECT = $(VXIDIR)/vxi11_user.o $(VXIDIR)/vxi11_clnt.o $(VXIDIR)/vxi11_xdr.o |
-# ----------------------------------------------------------------------------- |
- |
-# Base rules ------------------------------------------------------------------ |
- |
-# Make the main program and libraries |
-all: $(TARGET) libdaqusb.so libvxi11.so |
- |
-# Rules for making the main program |
-$(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 |
-# ----------------------------------------------------------------------------- |
- |
-# CAMAC DAQ library rules ----------------------------------------------------- |
- |
-# Rules for making CAMAC DAQ library source files (wusbxx_dll and libxxusb) |
-library: $(OBJ_FILES) |
- |
-wusbxx_dll.o:wusbxx_dll.c wusbxx_dll.h |
-libxxusb.o: libxxusb.cpp libxxusb.h |
- |
-.cc.o: |
- $(CXX) -c $< |
- ar r $(LIBFILE) $@ |
- |
-.cpp.o: |
- $(CXX) -c $< |
- ar r $(LIBFILE) $@ |
- |
-.c.o: |
- $(CXX) -c $< |
- ar r $(LIBFILE) $@ |
- |
-# Rules for recreating the CAMAC DAQ libraries even if they exist (libdaqusb.so/.a) |
-relib: |
- rm -f libdaqusb.so libdaqusb.a libvxi11.so libvxi11.a |
- make libdaqusb.so libvxi11.so |
- |
-# Rule for making the CAMAC DAQ library (libdaqusb.so) |
-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 $@ |
- |
-# Rule for making the CAMAC DAQ library (libdaqusb.a) |
-$(LIBFILE): $(OBJ_FILES) |
- ar r $@ $^ |
-# ----------------------------------------------------------------------------- |
- |
-# Scope DAQ library rules ----------------------------------------------------- |
- |
-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 $@ |
- |
-libvxi11.a: $(VXI_OBJECT) |
- ar r $@ $^ |
-# ----------------------------------------------------------------------------- |
- |
-# Clean rule ------------------------------------------------------------------ |
- |
-# 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 |
-# ----------------------------------------------------------------------------- |
Index: sipmscan/trunk/input/daqusb.C.online |
=================================================================== |
--- sipmscan/trunk/input/daqusb.C.online (revision 117) |
+++ sipmscan/trunk/input/daqusb.C.online (nonexistent) |
@@ -1,243 +0,0 @@ |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
-#include <unistd.h> |
-#include <sys/mman.h> |
-#include <errno.h> |
-#include <signal.h> |
-#include <ctype.h> |
-#include <time.h> |
-#include "wusbxx_dll.h" /* the header of the shared library */ |
-#include "daq.h" |
- |
-//#define DEBUG /* vkljuci dodatni izpis */ |
-#ifdef DEBUG |
- #define DBG(X) X |
- #define DBGFUNI(X) printf(">>> %s -> %d\n",#X,(X)) |
-#else |
- #define DBG(X) |
- #define DBGFUNI(X) X |
-#endif |
- |
-/* definiram lokacije enot*/ |
-//#define NTDC 1 /* TDC */ |
-//#define NTDCCH 8 |
-//#define NADC 2 /* ADC */ |
-//#define NADCCH 8 |
-int ctrlc=0; |
-char *ccserial="CC0126"; |
-int devDetect; // variable to tell if we detect any devices |
- |
-int daq::connect(){ |
-// odpri daq |
- xxusb_device_type devices[100]; |
- //struct usb_device *dev; |
- devDetect = xxusb_devices_find(devices); |
-// printf("Detected devices: %d\n", devDetect); |
- //dev = devices[0].usbdev; |
- //udev = xxusb_device_open(dev); |
- |
- if(devDetect > 0) |
- { |
- WUSBXX_load(NULL); |
- WUSBXX_open(ccserial); |
- printf("daq::connect()\n"); |
- } |
- else |
- printf("daq::connect() - No devices were detected!\n"); |
- return 0; |
-} |
- |
-int daq::init(){ |
- |
- 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); |
- |
- CCCZ; |
- CCCC; |
- CREM_I; |
- |
-// create command stack for the TDC and ADC |
- k=1; |
- for(i=0;(i<NTDCCH)&&(i<NADCCH);i++) { stackwrite[k++]=NAF(NTDC,i,0); stackwrite[k++]=NAF(NADC,i,0); } |
-// for(i=0;i<NADCCH;i++) stackwrite[k++]=NAF(NADC,i,0); |
- stackwrite[k++]=NAF(NTDC,0,9); |
- stackwrite[k++]=NAF(NADC,0,9); |
- stackwrite[k++]=NAFS(0,0,16); // insert next word to data |
- stackwrite[k++]=0xfafb; // event termination word |
- stackwrite[0]=k-1; |
-// upload stack #2 |
- xxusb_stack_write(udev,0x2,(long int *)stackwrite); |
- xxusb_stack_read(udev,0x2,(long int *) stackdata); |
- DBG(for(i=0;i<k;i++) printf("0x%04x\n",stackdata[i]);) |
- |
- int ret[10]; |
- |
- CAMAC_LED_settings(udev, 1,1,0,0); |
- ret[0] = CAMAC_register_read(udev,0,&k); |
- printf("Firmware ID (return %d) -> 0x%08lX\n",ret[0],k); // GKM: Firmware ID (i.e. 0x72000001 = 0111 0010 0000 0000 0000 0000 0000 0001) |
- ret[1] = CAMAC_register_read(udev,1,&k); |
- printf("Global Mode (return %d) -> 0x%08lX\n",ret[1],k); |
- k=(k&0xF000)|0x0005; // set buffer length: n=0..6 -> 0x10000 >> n, n=7 -> single event |
- ret[0] = CAMAC_register_write(udev,1,k); // GKM: sets the buffer length (i.e. k=5 -> buf length=128 words) |
- ret[1] = CAMAC_register_write(udev,2,0x80); // wait 0x80 us after trigger // GKM: delay settings in microseconds |
- ret[2] = CAMAC_register_write(udev,3,0x0); // Scaler Readout Control Register // GKM: scaler readout settings - sets the frequency of readout (if 0, it is disabled) |
- ret[3] = CAMAC_register_write(udev,9,0x0); // Lam Mask Register // GKM: When 0, readout is triggered by the signal on NIM input |
- ret[4] = CAMAC_register_write(udev,14,0x0); // USB Bulk Transfer Setup Register |
- |
- // CAMAC_DGG(udev,1,2,3,0,200,0,0); |
- // CAMAC_DGG(udev,0,0,0,0,100,0,0); |
- ret[5] = CAMAC_register_write(udev,5,(0x06<<16)+(0x04<<8)+0x00); // output // GKM: NIM outputs (i.e. 0x060400 = 00 0110 0000 0100 0000 0000 -> NIM O2=DGG_B, NIM O3=DGG_A) |
- ret[6] = CAMAC_register_write(udev,6,(0x01<<24)+(0x01<<16)+(0x0<<8)+0x0); // SCLR & DGG // GKM: device source selector (i.e. 0x01010000 = 00 0000 0001 0000 0001 0000 0000 0000 0000 -> DGG_A=NIM I1, DGG_B=NIM I1, SCLR=disabled) |
- ret[7] = CAMAC_register_write(udev,7,(100<<16)+0); // output // GKM: Delay and Gate Generator A registers (i.e. 0x00640000 = 0000 0000 0110 0100 0000 0000 0000 0000 -> DDG_A [gate=100, delay=0]) |
- ret[8] = CAMAC_register_write(udev,8,(10000<<16)+0); // output // GKM: Delay and Gate Generator B registers (i.e. 0x27100000 = 0010 0111 0001 0000 0000 0000 0000 0000 -> DDG_B [gate=10000, delay=0]) |
- ret[9] = CAMAC_register_write(udev,13,0); // output // GKM: Extended (course) delay (i.e. 0x00000000 = 0 -> DDG_A ext=0, DDG_B ext=0) |
- |
-// for(i = 0; i < 10; i++) printf("Setting %d? -> return = %d\n",i,ret[i]); |
- |
-// ret[0] = CAMAC_register_read(udev,1,&k); |
-// printf("k (return %d) -> 0x%08lX\n",ret[0],k); |
- |
- printf("daq::init()\n"); |
- return 0; |
-} |
- |
-int daq::start(){ |
- xxusb_register_write(udev,1,0x1); // Start DAQ mode |
- printf("daq::start()\n"); |
- return 0; |
-} |
- |
-int daq::stop(){ |
- xxusb_register_write(udev,1,0x0); // Stop DAQ mode |
- while (xxusb_usbfifo_read(udev,(int *)stackdump,BUFF_L,30)>0); |
- printf("daq::stop()\n"); |
- return 0; |
-} |
- |
-int daq::event(unsigned int *data, int maxn){ |
- int i,ib,count; |
- int events,evsize; |
- short ret; |
- |
- ib=0; |
- ret=xxusb_usbfifo_read(udev,(int *) stackdata,BUFF_L,500); |
- events=stackdata[ib++]; |
- DBG(printf("ret=%d,events=0x%08x\n",ret,events);) |
- if ((ret<0)||(ret!=(((NTDCCH+NADCCH)*4+4)*events+4))) return 0; |
- |
- count=0; |
- while (ib<(ret/2-1)){ |
- evsize = stackdata[ib++]&0xffff; |
- DBG(printf("Event:%d EvSize:%d\n", events, evsize);) |
- for (int i=0;i<(NTDCCH+NADCCH);i++,ib++) data[count++] =stackdata[ib++]&0xffff; |
- if (stackdata[ib++]!=0xfafb){ |
- printf("Error!\n"); |
- return 0; |
- } |
- events--; |
- if (fStop) return 0; |
- } |
- if (stackdata[ib++]!=0xffff){ |
- printf("Error!\n"); |
- return 0; |
- } |
- |
-// count = 1; |
- return count; |
-} |
- |
-int daq::disconnect(){ |
-// zapri daq |
- WUSBXX_close(); |
- printf("daq::disconnect()\n"); |
- return 0; |
-} |
- |
-daq::daq(){ |
- fStop=0; |
- connect(); |
- if(devDetect > 0) |
- init(); |
-} |
- |
-daq::~daq(){ |
-disconnect(); |
-} |
- |
-#ifdef MAIN |
-void CatchSig (int signumber) |
-{ |
- ctrlc = 1; |
-} |
- |
- |
-int main (int argc, char **argv){ |
- |
- int neve=1000000; |
- char *fname="test.dat"; |
- if (argc==1) { |
- printf("Uporaba: %s stevilo_dogodkov ime_datoteke\n",argv[0]); |
- printf("Meritev prekini s Ctrl-C, ce je nabranih dogodkov ze dovolj\n"); |
- exit(0); |
- } |
- if (argc>1) neve = atoi(argv[1]); |
- if (argc>2) fname = argv[2]; |
- |
- |
-// intercept routine |
- if (signal (SIGINT, CatchSig) == SIG_ERR) perror ("sigignore"); |
- |
-#define BSIZE 10000 |
- int i,ieve,nc,nb; |
-// int hdr[4]={1,(NTDCCH+4)*sizeof(int)}; // hdr[0]=1, hdr[1]=(NTDCCH+4)*4 |
- int hdr[4]={1,(NTDCCH+NADCCH+4)*sizeof(int)}; |
- unsigned short adc; |
- unsigned int data[BSIZE]; |
- daq *d= new daq(); |
- time_t time_check; |
- |
-// odpremo datoteko za pisanje |
- FILE *fp=fopen(fname,"w"); |
- |
- d->start(); |
- ieve=0; |
- |
- while((ieve<neve)&&(!ctrlc)){ |
- nc=d->event(data,BSIZE); |
- nb=0; |
- while((nc>0)&&(ieve++<neve)&&(!ctrlc)){ |
- // zapis v datoteko |
- hdr[2]=time(NULL); |
- hdr[3]=ieve; |
- fwrite(hdr,sizeof(int),4 ,fp); |
- fwrite(&data[nb],sizeof(int),(NTDCCH+NADCCH),fp); |
-// DBG( |
- for(i=0;i<(NTDCCH+NADCCH);i++){ |
- adc=data[nb+i]&0xFFFF; |
- if(i % 2 == 0) |
-printf(/*"nev=%4d %d. TDC data=%d\n"*/"%d\t"/*,ieve,i*//*/2*/,adc); |
-// printf("nev=%4d %d. TDC data=%d\n",ieve,i/2,adc); |
- else if(i % 2 == 1) |
-printf(/*"nev=%4d %d. TDC data=%d\n"*/"%d\t"/*,ieve,i*//*/2*/,adc); |
-// printf("nev=%4d %d. ADC data=%d\n",ieve,i/2,adc); |
- } |
-printf("\n"); |
-// ) |
- nb+=(NTDCCH+NADCCH); |
- nc-=(NTDCCH+NADCCH); |
- if (!(ieve%1000)) printf("event no. -> %d\n",ieve); |
- }; |
- }; |
- |
- d->stop(); |
- fclose(fp); |
- printf("Podatki so v datoteki %s\n", fname); |
- delete d; |
- |
- return 0; |
-} |
-#endif |
Index: sipmscan/trunk/input/daqscope.C.in |
=================================================================== |
--- sipmscan/trunk/input/daqscope.C.in (revision 117) |
+++ sipmscan/trunk/input/daqscope.C.in (nonexistent) |
@@ -1,44 +0,0 @@ |
-#include <stdio.h> |
-#include <stdlib.h> |
- |
-#include "vxi11_user.h" |
-#include "daqscope.h" |
- |
-CLINK *clink; |
-char *savedIP; |
- |
-int daqscope::connect(char *IPaddr) |
-{ |
- int iTemp; |
- char buf[WAVE_LEN]; |
- clink = new CLINK; |
- iTemp = vxi11_open_device(IPaddr, clink); |
- if(iTemp == 0) |
- { |
- vxi11_send(clink, "*IDN?"); |
- vxi11_receive(clink, buf, WAVE_LEN); |
- printf("Connected to device (%s): %s\n", IPaddr, buf); |
- savedIP = IPaddr; |
- return iTemp; |
- } |
- else |
- return iTemp; |
-} |
- |
-int daqscope::disconnect(char *IPaddr) |
-{ |
- int iTemp; |
- iTemp = vxi11_close_device(IPaddr, clink); |
- if(iTemp == 0) |
- printf("Disconnected from device (%s).\n", IPaddr); |
- delete clink; |
- return iTemp; |
-} |
- |
-daqscope::daqscope() { |
- fStop=0; |
-} |
- |
-daqscope::~daqscope() { |
- disconnect(savedIP); |
-} |
Index: sipmscan/trunk/input/start.sh.offline |
=================================================================== |
--- sipmscan/trunk/input/start.sh.offline (revision 117) |
+++ sipmscan/trunk/input/start.sh.offline (nonexistent) |
@@ -1,12 +0,0 @@ |
-#!/bin/bash |
-dir=`dirname $0` |
- |
-#source /opt/root/bin/thisroot.sh # only for operation with IJS |
- |
-if [ ! -d results ]; then |
- mkdir results |
-fi |
- |
-root -l "$dir/start.cxx(\"$dir\")" |
- |
- |
/sipmscan/trunk/input/start.sh.offline |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: sipmscan/trunk/input/start.sh.online |
=================================================================== |
--- sipmscan/trunk/input/start.sh.online (revision 117) |
+++ sipmscan/trunk/input/start.sh.online (nonexistent) |
@@ -1,12 +0,0 @@ |
-#!/bin/bash |
-dir=`dirname $0` |
- |
-source /opt/root/bin/thisroot.sh # only for operation with IJS |
- |
-if [ ! -d results ]; then |
- mkdir results |
-fi |
- |
-root -l "$dir/start.cxx(\"$dir\")" |
- |
- |
/sipmscan/trunk/input/start.sh.online |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: sipmscan/trunk/input/workstation.h.in |
=================================================================== |
--- sipmscan/trunk/input/workstation.h.in (revision 117) |
+++ sipmscan/trunk/input/workstation.h.in (nonexistent) |
@@ -1,11 +0,0 @@ |
-#ifndef _workstation_h_ |
-#define _workstation_h_ |
- |
-// Define the working computer (O=offline, I=IJS/online) and the base directory |
-#define WORKSTAT 'N' |
- |
-#ifdef WORKSTAT |
- #define rootdir "path-to-installation" |
-#endif |
- |
-#endif |
Index: sipmscan/trunk/input/daqusb.C.offline |
=================================================================== |
--- sipmscan/trunk/input/daqusb.C.offline (revision 117) |
+++ sipmscan/trunk/input/daqusb.C.offline (nonexistent) |
@@ -1,243 +0,0 @@ |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
-#include <unistd.h> |
-#include <sys/mman.h> |
-#include <errno.h> |
-#include <signal.h> |
-#include <ctype.h> |
-#include <time.h> |
-//#include "wusbxx_dll.h" /* the header of the shared library */ |
-#include "daq.h" |
- |
-//#define DEBUG /* vkljuci dodatni izpis */ |
-#ifdef DEBUG |
- #define DBG(X) X |
- #define DBGFUNI(X) printf(">>> %s -> %d\n",#X,(X)) |
-#else |
- #define DBG(X) |
- #define DBGFUNI(X) X |
-#endif |
- |
-/* definiram lokacije enot*/ |
-//#define NTDC 1 /* TDC */ |
-//#define NTDCCH 8 |
-//#define NADC 2 /* ADC */ |
-//#define NADCCH 8 |
-int ctrlc=0; |
-char *ccserial="CC0126"; |
-int devDetect; // variable to tell if we detect any devices |
- |
-int daq::connect(){ |
-// odpri daq |
-/* xxusb_device_type devices[100]; |
- //struct usb_device *dev; |
- devDetect = xxusb_devices_find(devices); |
-// printf("Detected devices: %d\n", devDetect); |
- //dev = devices[0].usbdev; |
- //udev = xxusb_device_open(dev); |
- |
- if(devDetect > 0) |
- { |
- WUSBXX_load(NULL); |
- WUSBXX_open(ccserial); |
- printf("daq::connect()\n"); |
- } |
- else |
-*/ printf("daq::connect() - No devices were detected!\n"); |
- return 0; |
-} |
- |
-int daq::init(){ |
- |
- 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); |
- |
- CCCZ; |
- CCCC; |
- CREM_I; |
- |
-// create command stack for the TDC and ADC |
- k=1; |
- for(i=0;(i<NTDCCH)&&(i<NADCCH);i++) { stackwrite[k++]=NAF(NTDC,i,0); stackwrite[k++]=NAF(NADC,i,0); } |
-// for(i=0;i<NADCCH;i++) stackwrite[k++]=NAF(NADC,i,0); |
- stackwrite[k++]=NAF(NTDC,0,9); |
- stackwrite[k++]=NAF(NADC,0,9); |
- stackwrite[k++]=NAFS(0,0,16); // insert next word to data |
- stackwrite[k++]=0xfafb; // event termination word |
- stackwrite[0]=k-1; |
-// upload stack #2 |
- xxusb_stack_write(udev,0x2,(long int *)stackwrite); |
- xxusb_stack_read(udev,0x2,(long int *) stackdata); |
- DBG(for(i=0;i<k;i++) printf("0x%04x\n",stackdata[i]);) |
- |
- int ret[10]; |
- |
- CAMAC_LED_settings(udev, 1,1,0,0); |
- ret[0] = CAMAC_register_read(udev,0,&k); |
- printf("Firmware ID (return %d) -> 0x%08lX\n",ret[0],k); // GKM: Firmware ID (i.e. 0x72000001 = 0111 0010 0000 0000 0000 0000 0000 0001) |
- ret[1] = CAMAC_register_read(udev,1,&k); |
- printf("Global Mode (return %d) -> 0x%08lX\n",ret[1],k); |
- k=(k&0xF000)|0x0005; // set buffer length: n=0..6 -> 0x10000 >> n, n=7 -> single event |
- ret[0] = CAMAC_register_write(udev,1,k); // GKM: sets the buffer length (i.e. k=5 -> buf length=128 words) |
- ret[1] = CAMAC_register_write(udev,2,0x80); // wait 0x80 us after trigger // GKM: delay settings in microseconds |
- ret[2] = CAMAC_register_write(udev,3,0x0); // Scaler Readout Control Register // GKM: scaler readout settings - sets the frequency of readout (if 0, it is disabled) |
- ret[3] = CAMAC_register_write(udev,9,0x0); // Lam Mask Register // GKM: When 0, readout is triggered by the signal on NIM input |
- ret[4] = CAMAC_register_write(udev,14,0x0); // USB Bulk Transfer Setup Register |
- |
- // CAMAC_DGG(udev,1,2,3,0,200,0,0); |
- // CAMAC_DGG(udev,0,0,0,0,100,0,0); |
- ret[5] = CAMAC_register_write(udev,5,(0x06<<16)+(0x04<<8)+0x00); // output // GKM: NIM outputs (i.e. 0x060400 = 00 0110 0000 0100 0000 0000 -> NIM O2=DGG_B, NIM O3=DGG_A) |
- ret[6] = CAMAC_register_write(udev,6,(0x01<<24)+(0x01<<16)+(0x0<<8)+0x0); // SCLR & DGG // GKM: device source selector (i.e. 0x01010000 = 00 0000 0001 0000 0001 0000 0000 0000 0000 -> DGG_A=NIM I1, DGG_B=NIM I1, SCLR=disabled) |
- ret[7] = CAMAC_register_write(udev,7,(100<<16)+0); // output // GKM: Delay and Gate Generator A registers (i.e. 0x00640000 = 0000 0000 0110 0100 0000 0000 0000 0000 -> DDG_A [gate=100, delay=0]) |
- ret[8] = CAMAC_register_write(udev,8,(10000<<16)+0); // output // GKM: Delay and Gate Generator B registers (i.e. 0x27100000 = 0010 0111 0001 0000 0000 0000 0000 0000 -> DDG_B [gate=10000, delay=0]) |
- ret[9] = CAMAC_register_write(udev,13,0); // output // GKM: Extended (course) delay (i.e. 0x00000000 = 0 -> DDG_A ext=0, DDG_B ext=0) |
- |
-// for(i = 0; i < 10; i++) printf("Setting %d? -> return = %d\n",i,ret[i]); |
- |
-// ret[0] = CAMAC_register_read(udev,1,&k); |
-// printf("k (return %d) -> 0x%08lX\n",ret[0],k); |
- |
-*/ printf("daq::init()\n"); |
- return 0; |
-} |
- |
-int daq::start(){ |
-// xxusb_register_write(udev,1,0x1); // Start DAQ mode |
- printf("daq::start()\n"); |
- return 0; |
-} |
- |
-int daq::stop(){ |
-// xxusb_register_write(udev,1,0x0); // Stop DAQ mode |
-// while (xxusb_usbfifo_read(udev,(int *)stackdump,BUFF_L,30)>0); |
- printf("daq::stop()\n"); |
- return 0; |
-} |
- |
-int daq::event(unsigned int *data, int maxn){ |
- int i,ib,count; |
-/* int events,evsize; |
- short ret; |
- |
- ib=0; |
- ret=xxusb_usbfifo_read(udev,(int *) stackdata,BUFF_L,500); |
- events=stackdata[ib++]; |
- DBG(printf("ret=%d,events=0x%08x\n",ret,events);) |
- if ((ret<0)||(ret!=(((NTDCCH+NADCCH)*4+4)*events+4))) return 0; |
- |
- count=0; |
- while (ib<(ret/2-1)){ |
- evsize = stackdata[ib++]&0xffff; |
- DBG(printf("Event:%d EvSize:%d\n", events, evsize);) |
- for (int i=0;i<(NTDCCH+NADCCH);i++,ib++) data[count++] =stackdata[ib++]&0xffff; |
- if (stackdata[ib++]!=0xfafb){ |
- printf("Error!\n"); |
- return 0; |
- } |
- events--; |
- if (fStop) return 0; |
- } |
- if (stackdata[ib++]!=0xffff){ |
- printf("Error!\n"); |
- return 0; |
- } |
-*/ |
- count = 1; |
- return count; |
-} |
- |
-int daq::disconnect(){ |
-// zapri daq |
-// WUSBXX_close(); |
- printf("daq::disconnect()\n"); |
- return 0; |
-} |
- |
-daq::daq(){ |
- fStop=0; |
- connect(); |
- if(devDetect > 0) |
- init(); |
-} |
- |
-daq::~daq(){ |
-disconnect(); |
-} |
- |
-#ifdef MAIN |
-void CatchSig (int signumber) |
-{ |
- ctrlc = 1; |
-} |
- |
- |
-int main (int argc, char **argv){ |
- |
- int neve=1000000; |
- char *fname="test.dat"; |
- if (argc==1) { |
- printf("Uporaba: %s stevilo_dogodkov ime_datoteke\n",argv[0]); |
- printf("Meritev prekini s Ctrl-C, ce je nabranih dogodkov ze dovolj\n"); |
- exit(0); |
- } |
- if (argc>1) neve = atoi(argv[1]); |
- if (argc>2) fname = argv[2]; |
- |
- |
-// intercept routine |
- if (signal (SIGINT, CatchSig) == SIG_ERR) perror ("sigignore"); |
- |
-#define BSIZE 10000 |
- int i,ieve,nc,nb; |
-// int hdr[4]={1,(NTDCCH+4)*sizeof(int)}; // hdr[0]=1, hdr[1]=(NTDCCH+4)*4 |
- int hdr[4]={1,(NTDCCH+NADCCH+4)*sizeof(int)}; |
- unsigned short adc; |
- unsigned int data[BSIZE]; |
- daq *d= new daq(); |
- time_t time_check; |
- |
-// odpremo datoteko za pisanje |
- FILE *fp=fopen(fname,"w"); |
- |
- d->start(); |
- ieve=0; |
- |
- while((ieve<neve)&&(!ctrlc)){ |
- nc=d->event(data,BSIZE); |
- nb=0; |
- while((nc>0)&&(ieve++<neve)&&(!ctrlc)){ |
- // zapis v datoteko |
- hdr[2]=time(NULL); |
- hdr[3]=ieve; |
- fwrite(hdr,sizeof(int),4 ,fp); |
- fwrite(&data[nb],sizeof(int),(NTDCCH+NADCCH),fp); |
-// DBG( |
- for(i=0;i<(NTDCCH+NADCCH);i++){ |
- adc=data[nb+i]&0xFFFF; |
- if(i % 2 == 0) |
-printf(/*"nev=%4d %d. TDC data=%d\n"*/"%d\t"/*,ieve,i*//*/2*/,adc); |
-// printf("nev=%4d %d. TDC data=%d\n",ieve,i/2,adc); |
- else if(i % 2 == 1) |
-printf(/*"nev=%4d %d. TDC data=%d\n"*/"%d\t"/*,ieve,i*//*/2*/,adc); |
-// printf("nev=%4d %d. ADC data=%d\n",ieve,i/2,adc); |
- } |
-printf("\n"); |
-// ) |
- nb+=(NTDCCH+NADCCH); |
- nc-=(NTDCCH+NADCCH); |
- if (!(ieve%1000)) printf("event no. -> %d\n",ieve); |
- }; |
- }; |
- |
- d->stop(); |
- fclose(fp); |
- printf("Podatki so v datoteki %s\n", fname); |
- delete d; |
- |
- return 0; |
-} |
-#endif |
Index: sipmscan/trunk/mpod/test.sh |
=================================================================== |
--- sipmscan/trunk/mpod/test.sh (revision 117) |
+++ sipmscan/trunk/mpod/test.sh (nonexistent) |
@@ -1,7 +0,0 @@ |
-#!/bin/bash |
- |
-echo "Bash start." |
-sleep $1 |
-echo "Bash end." |
- |
-exit 0 |
Index: sipmscan/trunk/mpod/WIENER-CRATE-MIB.txt |
=================================================================== |
--- sipmscan/trunk/mpod/WIENER-CRATE-MIB.txt (revision 117) |
+++ sipmscan/trunk/mpod/WIENER-CRATE-MIB.txt (nonexistent) |
@@ -1,1578 +0,0 @@ |
----------------------------------------------------------------------------------------------------- |
--- $HeadURL: http://svn.wiener-d.com/src/enet/trunk/mibs/WIENER-CRATE-MIB.txt $ |
--- $LastChangedDate: 2008-11-27 12:00:00 +0100 (Fr, 21. Nov 2008) $ |
--- $LastChangedRevision: 617 / 510 $ |
--- $LastChangedBy: koester (roemer)$ |
--- Copyright © 2005-2007 W-IE-NE-R Plein & Baus GmbH, Burscheid, Germany |
----------------------------------------------------------------------------------------------------- |
-WIENER-CRATE-MIB DEFINITIONS ::= BEGIN |
- |
-IMPORTS |
- OBJECT-TYPE, MODULE-IDENTITY, OBJECT-IDENTITY, |
- Integer32, Opaque, enterprises |
- FROM SNMPv2-SMI |
- |
- TEXTUAL-CONVENTION, DisplayString |
- FROM SNMPv2-TC |
- |
--- Float |
--- FROM NET-SNMP-TC |
--- Float |
--- FROM UCD-SNMP-MIB |
- ; |
- |
- |
- |
- |
-wiener MODULE-IDENTITY |
- LAST-UPDATED "200810090000Z" -- October 9, 2008 |
- ORGANIZATION "WIENER Plein & Baus GmbH" |
- CONTACT-INFO " |
- postal: WIENER Plein & Baus GmbH |
- Mullersbaum 20 |
- D-51399 Burscheid |
- Germany |
- |
- email: info@wiener-d.com |
- |
- " |
- |
- DESCRIPTION |
- "Introduction of the communication.can branch. |
- " |
- |
- |
- REVISION "200805060000Z" -- May 6, 2008 |
- DESCRIPTION |
- "Introduction of the signal branch. |
- " |
- |
- REVISION "200804150000Z" -- April 15, 2008 |
- DESCRIPTION |
- "Enlargement of u0..u11 -> u0..u1999 |
- " |
- |
- REVISION "200804100000Z" -- April 10, 2008 |
- DESCRIPTION |
- "This revision uses again Integer32 instead of Counter32. |
- " |
- |
- REVISION "200804020000Z" -- April 02, 2008 |
- DESCRIPTION |
- "This revision modifies the syntax of this file to be complient with smilint. |
- " |
- |
- REVISION "200709100000Z" |
- DESCRIPTION |
- "This revision introduces new OIDs for debug functionality: |
- sysDebugMemory8, sysDebugMemory16 and sysDebugMemory32. |
- " |
- |
- REVISION "200703160000Z" |
- DESCRIPTION |
- "This revision introduces new OIDs for slew control: |
- outputVoltageRiseRate and outputVoltageFallRate. |
- " |
- |
- REVISION "200502010000Z" |
- DESCRIPTION |
- "This revision introduces new OIDs for group managment: |
- groupTable |
- " |
- |
- REVISION "200406280000Z" |
- DESCRIPTION |
- "WIENER Crate MIB, actual Firmware: UEL6E 4.02. |
- Initial Version. |
- " |
- |
- ::= { enterprises 19947 } |
- |
- |
-------------------------------------------------------------------------------- |
--- Define the Float Textual Convention |
--- This definition was written by David Perkins. |
--- |
-Float ::= TEXTUAL-CONVENTION |
- STATUS current |
- DESCRIPTION |
- "A single precision floating-point number. The semantics |
- and encoding are identical for type 'single' defined in |
- IEEE Standard for Binary Floating-Point, |
- ANSI/IEEE Std 754-1985. |
- The value is restricted to the BER serialization of |
- the following ASN.1 type: |
- FLOATTYPE ::= [120] IMPLICIT FloatType |
- (note: the value 120 is the sum of '30'h and '48'h) |
- The BER serialization of the length for values of |
- this type must use the definite length, short |
- encoding form. |
- |
- For example, the BER serialization of value 123 |
- of type FLOATTYPE is '9f780442f60000'h. (The tag |
- is '9f78'h; the length is '04'h; and the value is |
- '42f60000'h.) The BER serialization of value |
- '9f780442f60000'h of data type Opaque is |
- '44079f780442f60000'h. (The tag is '44'h; the length |
- is '07'h; and the value is '9f780442f60000'h." |
- SYNTAX Opaque (SIZE (7)) |
- |
-------------------------------------------------------------------------------- |
--- crate |
-------------------------------------------------------------------------------- |
- |
-crate OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "SNMP control for electronic crates. A crate is a complete electronic system and |
- consists of the mechanical rack, a power supply, a fan tray and a backplane. |
- All this things are necessary to provide an adequate housing for electronic |
- modules (e.g. VME CPU's)" |
- ::= { wiener 1 } |
- |
---Crate ::= SEQUENCE { |
--- system System, |
--- input Input, |
--- output Output, |
--- sensor Sensor, |
--- communication Communication, |
--- powersupply Powersupply, |
--- fantray Fantray, |
--- rack Rack |
---} |
- |
-system OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "A collection of objects which affect the complete crate" |
- ::= { crate 1 } |
- |
- |
-input OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are associated with the power input of the crate" |
- ::= { crate 2 } |
- |
-output OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are associated with the power output of the crate" |
- ::= { crate 3 } |
- |
-sensor OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are associated with temperature sensors in the crate" |
- ::= { crate 4 } |
- |
-communication OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which affect the remote control of the crate" |
- ::= { crate 5 } |
- |
-powersupply OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are specific for the power supply of the crate" |
- ::= { crate 6 } |
- |
-fantray OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are specific for the fan tray of the crate" |
- ::= { crate 7 } |
- |
-rack OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are specific for the crate (BIN) of the crate" |
- ::= { crate 8 } |
- |
-signal OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "All objects which are associated with analog/digtal input/output in the crate" |
- ::= { crate 9 } |
- |
- |
-------------------------------------------------------------------------------- |
--- system |
-------------------------------------------------------------------------------- |
-System ::= SEQUENCE { |
- sysMainSwitch INTEGER, |
- sysStatus BITS, |
- sysVmeSysReset INTEGER, |
- sysDebugMemory8 Integer32, |
- sysDebugMemory16 Integer32, |
- sysDebugMemory32 Integer32 |
-} |
- |
-sysMainSwitch OBJECT-TYPE |
- SYNTAX INTEGER { off (0), on (1) } |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Read: An enumerated value which shows the current state of |
- the crates main switch. |
- Write: Try to switch the complete crate ON or OFF. |
- Only the values ON or OFF are allowed." |
- ::= { system 1 } |
- |
-sysStatus OBJECT-TYPE |
- SYNTAX BITS { |
- mainOn (0) , |
- mainInhibit (1) , |
- localControlOnly (2) , |
- inputFailure (3) , |
- outputFailure (4) , |
- fantrayFailure (5) , |
- sensorFailure (6), |
- vmeSysfail (7), |
- plugAndPlayIncompatible (8) |
- } |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "A bit string which shows the status (health) of the complete crate. |
- If a bit is set (1), the explanation is satisfied |
- mainOn (0), system is switched on, individual outputs may be controlled by their specific ON/INHIBIT |
- mainInhibit(1), external (hardware-)inhibit of the complete system |
- localControlOnly (2), local control only (CANBUS write access denied) |
- inputFailure (3), any input failure (e.g. power fail) |
- outputFailure (4), any output failure, details in outputTable |
- fantrayFailure (5), fantray failure |
- sensorFailure (6), temperature of the external sensors too high |
- VmeSysfail(7), VME SYSFAIL signal is active |
- plugAndPlayIncompatible (8) wrong power supply and rack connected |
- " |
- ::= { system 2 } |
- |
- |
--- ERROR_BIN_CHECKSUM(?), |
- |
- |
- |
- |
- |
-sysVmeSysReset OBJECT-TYPE |
- SYNTAX INTEGER { trigger (1) } |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Read: Always 0. |
- Write: Trigger the generation of the VME SYSRESET signal. |
- This signal will be active for a time of 200 ms" |
- ::= { system 3 } |
- |
-sysDebugMemory8 OBJECT-TYPE |
- SYNTAX Integer32 (0..255) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Debug 16-bit memory access." |
- ::= { system 1024 } |
- |
-sysDebugMemory16 OBJECT-TYPE |
- SYNTAX Integer32 (0..65535) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Debug 16-bit memory access." |
- ::= { system 1025 } |
- |
-sysDebugMemory32 OBJECT-TYPE |
- SYNTAX Integer32 (-2147483648..2147483647) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Debug 32-bit memory access." |
- ::= { system 1026 } |
- |
-------------------------------------------------------------------------------- |
--- input |
-------------------------------------------------------------------------------- |
--- reserved, possible entries: |
--- inputSetPfcVoltage |
--- inputMesPowerFail |
--- inputMesVoltage |
--- inputMesCurrent |
--- inputMesPower |
--- inputMesTemperature |
-------------------------------------------------------------------------------- |
--- output |
-------------------------------------------------------------------------------- |
---Output ::= SEQUENCE { |
--- outputNumber Integer32, |
--- outputTable OutputTable, |
--- groupsNumber Integer32, |
--- groupsTable GroupsTable |
--- ??TotalPower |
---} |
- |
-outputNumber OBJECT-TYPE |
- SYNTAX Integer32 (0..1999) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The number of output channels of the crate." |
- ::= { output 1 } |
- |
-outputTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF OutputEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A list of output entries." |
- ::= { output 2 } |
- |
-groupsNumber OBJECT-TYPE |
- SYNTAX Integer32 (1..1999) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The number of output groups of the crate." |
- ::= { output 3 } |
- |
-groupsTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF GroupsEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A list of output groups entries." |
- ::= { output 4 } |
- |
-outputEntry OBJECT-TYPE |
- SYNTAX OutputEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A table row" |
- INDEX { outputIndex } |
- ::= { outputTable 1 } |
- |
-OutputEntry ::= SEQUENCE { |
- outputIndex INTEGER, |
- outputName DisplayString, |
- outputGroup INTEGER, |
- outputStatus BITS, |
- outputMeasurementSenseVoltage Float, |
- outputMeasurementTerminalVoltage Float, |
- outputMeasurementCurrent Float, |
- outputMeasurementTemperature INTEGER, |
- |
- outputSwitch INTEGER, |
- outputVoltage Float, |
- outputAdjustVoltage Integer32, |
- outputCurrent Float, |
- |
- outputVoltageRiseRate Float, |
- outputVoltageFallRate Float, |
- |
- outputSupervisionBehavior Integer32, |
- outputSupervisionMinSenseVoltage Float, |
- outputSupervisionMaxSenseVoltage Float, |
- outputSupervisionMaxTerminalVoltage Float, |
- outputSupervisionMaxCurrent Float, |
--- outputSupervisionMaxTemperature Integer32, |
- |
- outputConfigMaxSenseVoltage Float, |
- outputConfigMaxTerminalVoltage Float, |
- outputConfigMaxCurrent Float, |
- outputSupervisionMaxPower Float, |
- |
- outputCurrentRiseRate Float, |
- outputCurrentFallRate Float, |
- outputTripTimeMaxCurrent INTEGER |
- } |
- |
- |
-outputIndex OBJECT-TYPE |
- SYNTAX INTEGER { |
- u0(1),u1(2),u2(3),u3(4),u4(5),u5(6),u6(7),u7(8),u8(9),u9(10), |
- u10(11),u11(12),u12(13),u13(14),u14(15),u15(16),u16(17),u17(18),u18(19),u19(20), |
- u20(21),u21(22),u22(23),u23(24),u24(25),u25(26),u26(27),u27(28),u28(29),u29(30), |
- u30(31),u31(32),u32(33),u33(34),u34(35),u35(36),u36(37),u37(38),u38(39),u39(40), |
- u40(41),u41(42),u42(43),u43(44),u44(45),u45(46),u46(47),u47(48),u48(49),u49(50), |
- u50(51),u51(52),u52(53),u53(54),u54(55),u55(56),u56(57),u57(58),u58(59),u59(60), |
- u60(61),u61(62),u62(63),u63(64),u64(65),u65(66),u66(67),u67(68),u68(69),u69(70), |
- u70(71),u71(72),u72(73),u73(74),u74(75),u75(76),u76(77),u77(78),u78(79),u79(80), |
- u80(81),u81(82),u82(83),u83(84),u84(85),u85(86),u86(87),u87(88),u88(89),u89(90), |
- u90(91),u91(92),u92(93),u93(94),u94(95),u95(96),u96(97),u97(98),u98(99),u99(100), |
- u100(101),u101(102),u102(103),u103(104),u104(105),u105(106),u106(107),u107(108),u108(109),u109(110), |
- u110(111),u111(112),u112(113),u113(114),u114(115),u115(116),u116(117),u117(118),u118(119),u119(120), |
- u120(121),u121(122),u122(123),u123(124),u124(125),u125(126),u126(127),u127(128),u128(129),u129(130), |
- u130(131),u131(132),u132(133),u133(134),u134(135),u135(136),u136(137),u137(138),u138(139),u139(140), |
- u140(141),u141(142),u142(143),u143(144),u144(145),u145(146),u146(147),u147(148),u148(149),u149(150), |
- u150(151),u151(152),u152(153),u153(154),u154(155),u155(156),u156(157),u157(158),u158(159),u159(160), |
- u160(161),u161(162),u162(163),u163(164),u164(165),u165(166),u166(167),u167(168),u168(169),u169(170), |
- u170(171),u171(172),u172(173),u173(174),u174(175),u175(176),u176(177),u177(178),u178(179),u179(180), |
- u180(181),u181(182),u182(183),u183(184),u184(185),u185(186),u186(187),u187(188),u188(189),u189(190), |
- u190(191),u191(192),u192(193),u193(194),u194(195),u195(196),u196(197),u197(198),u198(199),u199(200), |
- u200(201),u201(202),u202(203),u203(204),u204(205),u205(206),u206(207),u207(208),u208(209),u209(210), |
- u210(211),u211(212),u212(213),u213(214),u214(215),u215(216),u216(217),u217(218),u218(219),u219(220), |
- u220(221),u221(222),u222(223),u223(224),u224(225),u225(226),u226(227),u227(228),u228(229),u229(230), |
- u230(231),u231(232),u232(233),u233(234),u234(235),u235(236),u236(237),u237(238),u238(239),u239(240), |
- u240(241),u241(242),u242(243),u243(244),u244(245),u245(246),u246(247),u247(248),u248(249),u249(250), |
- u250(251),u251(252),u252(253),u253(254),u254(255),u255(256),u256(257),u257(258),u258(259),u259(260), |
- u260(261),u261(262),u262(263),u263(264),u264(265),u265(266),u266(267),u267(268),u268(269),u269(270), |
- u270(271),u271(272),u272(273),u273(274),u274(275),u275(276),u276(277),u277(278),u278(279),u279(280), |
- u280(281),u281(282),u282(283),u283(284),u284(285),u285(286),u286(287),u287(288),u288(289),u289(290), |
- u290(291),u291(292),u292(293),u293(294),u294(295),u295(296),u296(297),u297(298),u298(299),u299(300), |
- u300(301),u301(302),u302(303),u303(304),u304(305),u305(306),u306(307),u307(308),u308(309),u309(310), |
- u310(311),u311(312),u312(313),u313(314),u314(315),u315(316),u316(317),u317(318),u318(319),u319(320), |
- u320(321),u321(322),u322(323),u323(324),u324(325),u325(326),u326(327),u327(328),u328(329),u329(330), |
- u330(331),u331(332),u332(333),u333(334),u334(335),u335(336),u336(337),u337(338),u338(339),u339(340), |
- u340(341),u341(342),u342(343),u343(344),u344(345),u345(346),u346(347),u347(348),u348(349),u349(350), |
- u350(351),u351(352),u352(353),u353(354),u354(355),u355(356),u356(357),u357(358),u358(359),u359(360), |
- u360(361),u361(362),u362(363),u363(364),u364(365),u365(366),u366(367),u367(368),u368(369),u369(370), |
- u370(371),u371(372),u372(373),u373(374),u374(375),u375(376),u376(377),u377(378),u378(379),u379(380), |
- u380(381),u381(382),u382(383),u383(384),u384(385),u385(386),u386(387),u387(388),u388(389),u389(390), |
- u390(391),u391(392),u392(393),u393(394),u394(395),u395(396),u396(397),u397(398),u398(399),u399(400), |
- u400(401),u401(402),u402(403),u403(404),u404(405),u405(406),u406(407),u407(408),u408(409),u409(410), |
- u410(411),u411(412),u412(413),u413(414),u414(415),u415(416),u416(417),u417(418),u418(419),u419(420), |
- u420(421),u421(422),u422(423),u423(424),u424(425),u425(426),u426(427),u427(428),u428(429),u429(430), |
- u430(431),u431(432),u432(433),u433(434),u434(435),u435(436),u436(437),u437(438),u438(439),u439(440), |
- u440(441),u441(442),u442(443),u443(444),u444(445),u445(446),u446(447),u447(448),u448(449),u449(450), |
- u450(451),u451(452),u452(453),u453(454),u454(455),u455(456),u456(457),u457(458),u458(459),u459(460), |
- u460(461),u461(462),u462(463),u463(464),u464(465),u465(466),u466(467),u467(468),u468(469),u469(470), |
- u470(471),u471(472),u472(473),u473(474),u474(475),u475(476),u476(477),u477(478),u478(479),u479(480), |
- u480(481),u481(482),u482(483),u483(484),u484(485),u485(486),u486(487),u487(488),u488(489),u489(490), |
- u490(491),u491(492),u492(493),u493(494),u494(495),u495(496),u496(497),u497(498),u498(499),u499(500), |
- u500(501),u501(502),u502(503),u503(504),u504(505),u505(506),u506(507),u507(508),u508(509),u509(510), |
- u510(511),u511(512),u512(513),u513(514),u514(515),u515(516),u516(517),u517(518),u518(519),u519(520), |
- u520(521),u521(522),u522(523),u523(524),u524(525),u525(526),u526(527),u527(528),u528(529),u529(530), |
- u530(531),u531(532),u532(533),u533(534),u534(535),u535(536),u536(537),u537(538),u538(539),u539(540), |
- u540(541),u541(542),u542(543),u543(544),u544(545),u545(546),u546(547),u547(548),u548(549),u549(550), |
- u550(551),u551(552),u552(553),u553(554),u554(555),u555(556),u556(557),u557(558),u558(559),u559(560), |
- u560(561),u561(562),u562(563),u563(564),u564(565),u565(566),u566(567),u567(568),u568(569),u569(570), |
- u570(571),u571(572),u572(573),u573(574),u574(575),u575(576),u576(577),u577(578),u578(579),u579(580), |
- u580(581),u581(582),u582(583),u583(584),u584(585),u585(586),u586(587),u587(588),u588(589),u589(590), |
- u590(591),u591(592),u592(593),u593(594),u594(595),u595(596),u596(597),u597(598),u598(599),u599(600), |
- u600(601),u601(602),u602(603),u603(604),u604(605),u605(606),u606(607),u607(608),u608(609),u609(610), |
- u610(611),u611(612),u612(613),u613(614),u614(615),u615(616),u616(617),u617(618),u618(619),u619(620), |
- u620(621),u621(622),u622(623),u623(624),u624(625),u625(626),u626(627),u627(628),u628(629),u629(630), |
- u630(631),u631(632),u632(633),u633(634),u634(635),u635(636),u636(637),u637(638),u638(639),u639(640), |
- u640(641),u641(642),u642(643),u643(644),u644(645),u645(646),u646(647),u647(648),u648(649),u649(650), |
- u650(651),u651(652),u652(653),u653(654),u654(655),u655(656),u656(657),u657(658),u658(659),u659(660), |
- u660(661),u661(662),u662(663),u663(664),u664(665),u665(666),u666(667),u667(668),u668(669),u669(670), |
- u670(671),u671(672),u672(673),u673(674),u674(675),u675(676),u676(677),u677(678),u678(679),u679(680), |
- u680(681),u681(682),u682(683),u683(684),u684(685),u685(686),u686(687),u687(688),u688(689),u689(690), |
- u690(691),u691(692),u692(693),u693(694),u694(695),u695(696),u696(697),u697(698),u698(699),u699(700), |
- u700(701),u701(702),u702(703),u703(704),u704(705),u705(706),u706(707),u707(708),u708(709),u709(710), |
- u710(711),u711(712),u712(713),u713(714),u714(715),u715(716),u716(717),u717(718),u718(719),u719(720), |
- u720(721),u721(722),u722(723),u723(724),u724(725),u725(726),u726(727),u727(728),u728(729),u729(730), |
- u730(731),u731(732),u732(733),u733(734),u734(735),u735(736),u736(737),u737(738),u738(739),u739(740), |
- u740(741),u741(742),u742(743),u743(744),u744(745),u745(746),u746(747),u747(748),u748(749),u749(750), |
- u750(751),u751(752),u752(753),u753(754),u754(755),u755(756),u756(757),u757(758),u758(759),u759(760), |
- u760(761),u761(762),u762(763),u763(764),u764(765),u765(766),u766(767),u767(768),u768(769),u769(770), |
- u770(771),u771(772),u772(773),u773(774),u774(775),u775(776),u776(777),u777(778),u778(779),u779(780), |
- u780(781),u781(782),u782(783),u783(784),u784(785),u785(786),u786(787),u787(788),u788(789),u789(790), |
- u790(791),u791(792),u792(793),u793(794),u794(795),u795(796),u796(797),u797(798),u798(799),u799(800), |
- u800(801),u801(802),u802(803),u803(804),u804(805),u805(806),u806(807),u807(808),u808(809),u809(810), |
- u810(811),u811(812),u812(813),u813(814),u814(815),u815(816),u816(817),u817(818),u818(819),u819(820), |
- u820(821),u821(822),u822(823),u823(824),u824(825),u825(826),u826(827),u827(828),u828(829),u829(830), |
- u830(831),u831(832),u832(833),u833(834),u834(835),u835(836),u836(837),u837(838),u838(839),u839(840), |
- u840(841),u841(842),u842(843),u843(844),u844(845),u845(846),u846(847),u847(848),u848(849),u849(850), |
- u850(851),u851(852),u852(853),u853(854),u854(855),u855(856),u856(857),u857(858),u858(859),u859(860), |
- u860(861),u861(862),u862(863),u863(864),u864(865),u865(866),u866(867),u867(868),u868(869),u869(870), |
- u870(871),u871(872),u872(873),u873(874),u874(875),u875(876),u876(877),u877(878),u878(879),u879(880), |
- u880(881),u881(882),u882(883),u883(884),u884(885),u885(886),u886(887),u887(888),u888(889),u889(890), |
- u890(891),u891(892),u892(893),u893(894),u894(895),u895(896),u896(897),u897(898),u898(899),u899(900), |
- u900(901),u901(902),u902(903),u903(904),u904(905),u905(906),u906(907),u907(908),u908(909),u909(910), |
- u910(911),u911(912),u912(913),u913(914),u914(915),u915(916),u916(917),u917(918),u918(919),u919(920), |
- u920(921),u921(922),u922(923),u923(924),u924(925),u925(926),u926(927),u927(928),u928(929),u929(930), |
- u930(931),u931(932),u932(933),u933(934),u934(935),u935(936),u936(937),u937(938),u938(939),u939(940), |
- u940(941),u941(942),u942(943),u943(944),u944(945),u945(946),u946(947),u947(948),u948(949),u949(950), |
- u950(951),u951(952),u952(953),u953(954),u954(955),u955(956),u956(957),u957(958),u958(959),u959(960), |
- u960(961),u961(962),u962(963),u963(964),u964(965),u965(966),u966(967),u967(968),u968(969),u969(970), |
- u970(971),u971(972),u972(973),u973(974),u974(975),u975(976),u976(977),u977(978),u978(979),u979(980), |
- u980(981),u981(982),u982(983),u983(984),u984(985),u985(986),u986(987),u987(988),u988(989),u989(990), |
- u990(991),u991(992),u992(993),u993(994),u994(995),u995(996),u996(997),u997(998),u998(999),u999(1000), |
- u1000(1001),u1001(1002),u1002(1003),u1003(1004),u1004(1005),u1005(1006),u1006(1007),u1007(1008),u1008(1009),u1009(1010), |
- u1010(1011),u1011(1012),u1012(1013),u1013(1014),u1014(1015),u1015(1016),u1016(1017),u1017(1018),u1018(1019),u1019(1020), |
- u1020(1021),u1021(1022),u1022(1023),u1023(1024),u1024(1025),u1025(1026),u1026(1027),u1027(1028),u1028(1029),u1029(1030), |
- u1030(1031),u1031(1032),u1032(1033),u1033(1034),u1034(1035),u1035(1036),u1036(1037),u1037(1038),u1038(1039),u1039(1040), |
- u1040(1041),u1041(1042),u1042(1043),u1043(1044),u1044(1045),u1045(1046),u1046(1047),u1047(1048),u1048(1049),u1049(1050), |
- u1050(1051),u1051(1052),u1052(1053),u1053(1054),u1054(1055),u1055(1056),u1056(1057),u1057(1058),u1058(1059),u1059(1060), |
- u1060(1061),u1061(1062),u1062(1063),u1063(1064),u1064(1065),u1065(1066),u1066(1067),u1067(1068),u1068(1069),u1069(1070), |
- u1070(1071),u1071(1072),u1072(1073),u1073(1074),u1074(1075),u1075(1076),u1076(1077),u1077(1078),u1078(1079),u1079(1080), |
- u1080(1081),u1081(1082),u1082(1083),u1083(1084),u1084(1085),u1085(1086),u1086(1087),u1087(1088),u1088(1089),u1089(1090), |
- u1090(1091),u1091(1092),u1092(1093),u1093(1094),u1094(1095),u1095(1096),u1096(1097),u1097(1098),u1098(1099),u1099(1100), |
- u1100(1101),u1101(1102),u1102(1103),u1103(1104),u1104(1105),u1105(1106),u1106(1107),u1107(1108),u1108(1109),u1109(1110), |
- u1110(1111),u1111(1112),u1112(1113),u1113(1114),u1114(1115),u1115(1116),u1116(1117),u1117(1118),u1118(1119),u1119(1120), |
- u1120(1121),u1121(1122),u1122(1123),u1123(1124),u1124(1125),u1125(1126),u1126(1127),u1127(1128),u1128(1129),u1129(1130), |
- u1130(1131),u1131(1132),u1132(1133),u1133(1134),u1134(1135),u1135(1136),u1136(1137),u1137(1138),u1138(1139),u1139(1140), |
- u1140(1141),u1141(1142),u1142(1143),u1143(1144),u1144(1145),u1145(1146),u1146(1147),u1147(1148),u1148(1149),u1149(1150), |
- u1150(1151),u1151(1152),u1152(1153),u1153(1154),u1154(1155),u1155(1156),u1156(1157),u1157(1158),u1158(1159),u1159(1160), |
- u1160(1161),u1161(1162),u1162(1163),u1163(1164),u1164(1165),u1165(1166),u1166(1167),u1167(1168),u1168(1169),u1169(1170), |
- u1170(1171),u1171(1172),u1172(1173),u1173(1174),u1174(1175),u1175(1176),u1176(1177),u1177(1178),u1178(1179),u1179(1180), |
- u1180(1181),u1181(1182),u1182(1183),u1183(1184),u1184(1185),u1185(1186),u1186(1187),u1187(1188),u1188(1189),u1189(1190), |
- u1190(1191),u1191(1192),u1192(1193),u1193(1194),u1194(1195),u1195(1196),u1196(1197),u1197(1198),u1198(1199),u1199(1200), |
- u1200(1201),u1201(1202),u1202(1203),u1203(1204),u1204(1205),u1205(1206),u1206(1207),u1207(1208),u1208(1209),u1209(1210), |
- u1210(1211),u1211(1212),u1212(1213),u1213(1214),u1214(1215),u1215(1216),u1216(1217),u1217(1218),u1218(1219),u1219(1220), |
- u1220(1221),u1221(1222),u1222(1223),u1223(1224),u1224(1225),u1225(1226),u1226(1227),u1227(1228),u1228(1229),u1229(1230), |
- u1230(1231),u1231(1232),u1232(1233),u1233(1234),u1234(1235),u1235(1236),u1236(1237),u1237(1238),u1238(1239),u1239(1240), |
- u1240(1241),u1241(1242),u1242(1243),u1243(1244),u1244(1245),u1245(1246),u1246(1247),u1247(1248),u1248(1249),u1249(1250), |
- u1250(1251),u1251(1252),u1252(1253),u1253(1254),u1254(1255),u1255(1256),u1256(1257),u1257(1258),u1258(1259),u1259(1260), |
- u1260(1261),u1261(1262),u1262(1263),u1263(1264),u1264(1265),u1265(1266),u1266(1267),u1267(1268),u1268(1269),u1269(1270), |
- u1270(1271),u1271(1272),u1272(1273),u1273(1274),u1274(1275),u1275(1276),u1276(1277),u1277(1278),u1278(1279),u1279(1280), |
- u1280(1281),u1281(1282),u1282(1283),u1283(1284),u1284(1285),u1285(1286),u1286(1287),u1287(1288),u1288(1289),u1289(1290), |
- u1290(1291),u1291(1292),u1292(1293),u1293(1294),u1294(1295),u1295(1296),u1296(1297),u1297(1298),u1298(1299),u1299(1300), |
- u1300(1301),u1301(1302),u1302(1303),u1303(1304),u1304(1305),u1305(1306),u1306(1307),u1307(1308),u1308(1309),u1309(1310), |
- u1310(1311),u1311(1312),u1312(1313),u1313(1314),u1314(1315),u1315(1316),u1316(1317),u1317(1318),u1318(1319),u1319(1320), |
- u1320(1321),u1321(1322),u1322(1323),u1323(1324),u1324(1325),u1325(1326),u1326(1327),u1327(1328),u1328(1329),u1329(1330), |
- u1330(1331),u1331(1332),u1332(1333),u1333(1334),u1334(1335),u1335(1336),u1336(1337),u1337(1338),u1338(1339),u1339(1340), |
- u1340(1341),u1341(1342),u1342(1343),u1343(1344),u1344(1345),u1345(1346),u1346(1347),u1347(1348),u1348(1349),u1349(1350), |
- u1350(1351),u1351(1352),u1352(1353),u1353(1354),u1354(1355),u1355(1356),u1356(1357),u1357(1358),u1358(1359),u1359(1360), |
- u1360(1361),u1361(1362),u1362(1363),u1363(1364),u1364(1365),u1365(1366),u1366(1367),u1367(1368),u1368(1369),u1369(1370), |
- u1370(1371),u1371(1372),u1372(1373),u1373(1374),u1374(1375),u1375(1376),u1376(1377),u1377(1378),u1378(1379),u1379(1380), |
- u1380(1381),u1381(1382),u1382(1383),u1383(1384),u1384(1385),u1385(1386),u1386(1387),u1387(1388),u1388(1389),u1389(1390), |
- u1390(1391),u1391(1392),u1392(1393),u1393(1394),u1394(1395),u1395(1396),u1396(1397),u1397(1398),u1398(1399),u1399(1400), |
- u1400(1401),u1401(1402),u1402(1403),u1403(1404),u1404(1405),u1405(1406),u1406(1407),u1407(1408),u1408(1409),u1409(1410), |
- u1410(1411),u1411(1412),u1412(1413),u1413(1414),u1414(1415),u1415(1416),u1416(1417),u1417(1418),u1418(1419),u1419(1420), |
- u1420(1421),u1421(1422),u1422(1423),u1423(1424),u1424(1425),u1425(1426),u1426(1427),u1427(1428),u1428(1429),u1429(1430), |
- u1430(1431),u1431(1432),u1432(1433),u1433(1434),u1434(1435),u1435(1436),u1436(1437),u1437(1438),u1438(1439),u1439(1440), |
- u1440(1441),u1441(1442),u1442(1443),u1443(1444),u1444(1445),u1445(1446),u1446(1447),u1447(1448),u1448(1449),u1449(1450), |
- u1450(1451),u1451(1452),u1452(1453),u1453(1454),u1454(1455),u1455(1456),u1456(1457),u1457(1458),u1458(1459),u1459(1460), |
- u1460(1461),u1461(1462),u1462(1463),u1463(1464),u1464(1465),u1465(1466),u1466(1467),u1467(1468),u1468(1469),u1469(1470), |
- u1470(1471),u1471(1472),u1472(1473),u1473(1474),u1474(1475),u1475(1476),u1476(1477),u1477(1478),u1478(1479),u1479(1480), |
- u1480(1481),u1481(1482),u1482(1483),u1483(1484),u1484(1485),u1485(1486),u1486(1487),u1487(1488),u1488(1489),u1489(1490), |
- u1490(1491),u1491(1492),u1492(1493),u1493(1494),u1494(1495),u1495(1496),u1496(1497),u1497(1498),u1498(1499),u1499(1500), |
- u1500(1501),u1501(1502),u1502(1503),u1503(1504),u1504(1505),u1505(1506),u1506(1507),u1507(1508),u1508(1509),u1509(1510), |
- u1510(1511),u1511(1512),u1512(1513),u1513(1514),u1514(1515),u1515(1516),u1516(1517),u1517(1518),u1518(1519),u1519(1520), |
- u1520(1521),u1521(1522),u1522(1523),u1523(1524),u1524(1525),u1525(1526),u1526(1527),u1527(1528),u1528(1529),u1529(1530), |
- u1530(1531),u1531(1532),u1532(1533),u1533(1534),u1534(1535),u1535(1536),u1536(1537),u1537(1538),u1538(1539),u1539(1540), |
- u1540(1541),u1541(1542),u1542(1543),u1543(1544),u1544(1545),u1545(1546),u1546(1547),u1547(1548),u1548(1549),u1549(1550), |
- u1550(1551),u1551(1552),u1552(1553),u1553(1554),u1554(1555),u1555(1556),u1556(1557),u1557(1558),u1558(1559),u1559(1560), |
- u1560(1561),u1561(1562),u1562(1563),u1563(1564),u1564(1565),u1565(1566),u1566(1567),u1567(1568),u1568(1569),u1569(1570), |
- u1570(1571),u1571(1572),u1572(1573),u1573(1574),u1574(1575),u1575(1576),u1576(1577),u1577(1578),u1578(1579),u1579(1580), |
- u1580(1581),u1581(1582),u1582(1583),u1583(1584),u1584(1585),u1585(1586),u1586(1587),u1587(1588),u1588(1589),u1589(1590), |
- u1590(1591),u1591(1592),u1592(1593),u1593(1594),u1594(1595),u1595(1596),u1596(1597),u1597(1598),u1598(1599),u1599(1600), |
- u1600(1601),u1601(1602),u1602(1603),u1603(1604),u1604(1605),u1605(1606),u1606(1607),u1607(1608),u1608(1609),u1609(1610), |
- u1610(1611),u1611(1612),u1612(1613),u1613(1614),u1614(1615),u1615(1616),u1616(1617),u1617(1618),u1618(1619),u1619(1620), |
- u1620(1621),u1621(1622),u1622(1623),u1623(1624),u1624(1625),u1625(1626),u1626(1627),u1627(1628),u1628(1629),u1629(1630), |
- u1630(1631),u1631(1632),u1632(1633),u1633(1634),u1634(1635),u1635(1636),u1636(1637),u1637(1638),u1638(1639),u1639(1640), |
- u1640(1641),u1641(1642),u1642(1643),u1643(1644),u1644(1645),u1645(1646),u1646(1647),u1647(1648),u1648(1649),u1649(1650), |
- u1650(1651),u1651(1652),u1652(1653),u1653(1654),u1654(1655),u1655(1656),u1656(1657),u1657(1658),u1658(1659),u1659(1660), |
- u1660(1661),u1661(1662),u1662(1663),u1663(1664),u1664(1665),u1665(1666),u1666(1667),u1667(1668),u1668(1669),u1669(1670), |
- u1670(1671),u1671(1672),u1672(1673),u1673(1674),u1674(1675),u1675(1676),u1676(1677),u1677(1678),u1678(1679),u1679(1680), |
- u1680(1681),u1681(1682),u1682(1683),u1683(1684),u1684(1685),u1685(1686),u1686(1687),u1687(1688),u1688(1689),u1689(1690), |
- u1690(1691),u1691(1692),u1692(1693),u1693(1694),u1694(1695),u1695(1696),u1696(1697),u1697(1698),u1698(1699),u1699(1700), |
- u1700(1701),u1701(1702),u1702(1703),u1703(1704),u1704(1705),u1705(1706),u1706(1707),u1707(1708),u1708(1709),u1709(1710), |
- u1710(1711),u1711(1712),u1712(1713),u1713(1714),u1714(1715),u1715(1716),u1716(1717),u1717(1718),u1718(1719),u1719(1720), |
- u1720(1721),u1721(1722),u1722(1723),u1723(1724),u1724(1725),u1725(1726),u1726(1727),u1727(1728),u1728(1729),u1729(1730), |
- u1730(1731),u1731(1732),u1732(1733),u1733(1734),u1734(1735),u1735(1736),u1736(1737),u1737(1738),u1738(1739),u1739(1740), |
- u1740(1741),u1741(1742),u1742(1743),u1743(1744),u1744(1745),u1745(1746),u1746(1747),u1747(1748),u1748(1749),u1749(1750), |
- u1750(1751),u1751(1752),u1752(1753),u1753(1754),u1754(1755),u1755(1756),u1756(1757),u1757(1758),u1758(1759),u1759(1760), |
- u1760(1761),u1761(1762),u1762(1763),u1763(1764),u1764(1765),u1765(1766),u1766(1767),u1767(1768),u1768(1769),u1769(1770), |
- u1770(1771),u1771(1772),u1772(1773),u1773(1774),u1774(1775),u1775(1776),u1776(1777),u1777(1778),u1778(1779),u1779(1780), |
- u1780(1781),u1781(1782),u1782(1783),u1783(1784),u1784(1785),u1785(1786),u1786(1787),u1787(1788),u1788(1789),u1789(1790), |
- u1790(1791),u1791(1792),u1792(1793),u1793(1794),u1794(1795),u1795(1796),u1796(1797),u1797(1798),u1798(1799),u1799(1800), |
- u1800(1801),u1801(1802),u1802(1803),u1803(1804),u1804(1805),u1805(1806),u1806(1807),u1807(1808),u1808(1809),u1809(1810), |
- u1810(1811),u1811(1812),u1812(1813),u1813(1814),u1814(1815),u1815(1816),u1816(1817),u1817(1818),u1818(1819),u1819(1820), |
- u1820(1821),u1821(1822),u1822(1823),u1823(1824),u1824(1825),u1825(1826),u1826(1827),u1827(1828),u1828(1829),u1829(1830), |
- u1830(1831),u1831(1832),u1832(1833),u1833(1834),u1834(1835),u1835(1836),u1836(1837),u1837(1838),u1838(1839),u1839(1840), |
- u1840(1841),u1841(1842),u1842(1843),u1843(1844),u1844(1845),u1845(1846),u1846(1847),u1847(1848),u1848(1849),u1849(1850), |
- u1850(1851),u1851(1852),u1852(1853),u1853(1854),u1854(1855),u1855(1856),u1856(1857),u1857(1858),u1858(1859),u1859(1860), |
- u1860(1861),u1861(1862),u1862(1863),u1863(1864),u1864(1865),u1865(1866),u1866(1867),u1867(1868),u1868(1869),u1869(1870), |
- u1870(1871),u1871(1872),u1872(1873),u1873(1874),u1874(1875),u1875(1876),u1876(1877),u1877(1878),u1878(1879),u1879(1880), |
- u1880(1881),u1881(1882),u1882(1883),u1883(1884),u1884(1885),u1885(1886),u1886(1887),u1887(1888),u1888(1889),u1889(1890), |
- u1890(1891),u1891(1892),u1892(1893),u1893(1894),u1894(1895),u1895(1896),u1896(1897),u1897(1898),u1898(1899),u1899(1900), |
- u1900(1901),u1901(1902),u1902(1903),u1903(1904),u1904(1905),u1905(1906),u1906(1907),u1907(1908),u1908(1909),u1909(1910), |
- u1910(1911),u1911(1912),u1912(1913),u1913(1914),u1914(1915),u1915(1916),u1916(1917),u1917(1918),u1918(1919),u1919(1920), |
- u1920(1921),u1921(1922),u1922(1923),u1923(1924),u1924(1925),u1925(1926),u1926(1927),u1927(1928),u1928(1929),u1929(1930), |
- u1930(1931),u1931(1932),u1932(1933),u1933(1934),u1934(1935),u1935(1936),u1936(1937),u1937(1938),u1938(1939),u1939(1940), |
- u1940(1941),u1941(1942),u1942(1943),u1943(1944),u1944(1945),u1945(1946),u1946(1947),u1947(1948),u1948(1949),u1949(1950), |
- u1950(1951),u1951(1952),u1952(1953),u1953(1954),u1954(1955),u1955(1956),u1956(1957),u1957(1958),u1958(1959),u1959(1960), |
- u1960(1961),u1961(1962),u1962(1963),u1963(1964),u1964(1965),u1965(1966),u1966(1967),u1967(1968),u1968(1969),u1969(1970), |
- u1970(1971),u1971(1972),u1972(1973),u1973(1974),u1974(1975),u1975(1976),u1976(1977),u1977(1978),u1978(1979),u1979(1980), |
- u1980(1981),u1981(1982),u1982(1983),u1983(1984),u1984(1985),u1985(1986),u1986(1987),u1987(1988),u1988(1989),u1989(1990), |
- u1990(1991),u1991(1992),u1992(1993),u1993(1994),u1994(1995),u1995(1996),u1996(1997),u1997(1998),u1998(1999),u1999(2000)} |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each power output channel. Its value |
- ranges between 1 and total number of output channels. |
- This value is equivalent to the output channel number at |
- the type label of the crate or power supply, but because the SMI |
- index starts at 1, index 1 corresponds to U0." |
- ::= { outputEntry 1 } |
- |
-outputName OBJECT-TYPE |
- SYNTAX DisplayString (SIZE (1..4)) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "A textual string containing a short name of the |
- output. If the crate is equipped with an alphanumeric |
- display, this string is shown to identify a output channel." |
- ::= { outputEntry 2 } |
- |
-outputGroup OBJECT-TYPE |
- SYNTAX Integer32 (0..1999) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The group number associated with this channel" |
- ::= { outputEntry 3 } |
- |
- |
-outputStatus OBJECT-TYPE |
- SYNTAX BITS { |
- outputOn (0) , |
- outputInhibit (1) , |
- outputFailureMinSenseVoltage (2), |
- outputFailureMaxSenseVoltage (3), |
- outputFailureMaxTerminalVoltage (4), |
- outputFailureMaxCurrent (5), |
- outputFailureMaxTemperature (6), |
- outputFailureMaxPower (7), |
- -- reserved |
- outputFailureTimeout (9), |
- outputCurrentLimited (10), |
- outputRampUp (11), |
- outputRampDown (12), |
- outputEnableKill(13), |
- outputEmergencyOff (14) |
- } |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "A bit string which shows the status (health and operating conditions) of one output channel. |
- If a bit is set (1), the explanation is satisfied: |
- outputOn (0), output channel is on |
- outputInhibit(1), external (hardware-)inhibit of the output channel |
- outputFailureMinSenseVoltage (2) Supervision limit hurt: Sense voltage is too low |
- outputFailureMaxSenseVoltage (3), Supervision limit hurt: Sense voltage is too high |
- outputFailureMaxTerminalVoltage (4), Supervision limit hurt: Terminal voltage is too high |
- outputFailureMaxCurrent (5), Supervision limit hurt: Current is too high |
- outputFailureMaxTemperature (6), Supervision limit hurt: Heat sink temperature is too high |
- outputFailureMaxPower (7), Supervision limit hurt: Output power is too high |
- outputFailureTimeout (9), Communication timeout between output channel and main control |
- outputCurrentLimited (10), Current limiting is active (constant current mode) |
- outputRampUp (11), Output voltage is increasing (e.g. after switch on) |
- outputRampDown (12), Output voltage is decreasing (e.g. after switch off) |
- outputEnableKill (13), EnableKill is aktive |
- outputEmergencyOff (14), EmergencyOff event is aktive |
- |
- " |
- |
- ::= { outputEntry 4 } |
- |
- |
- |
- |
-outputMeasurementSenseVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured voltage at the sense input lines." |
- ::= { outputEntry 5 } |
- |
-outputMeasurementTerminalVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured voltage at the output terminals." |
- ::= { outputEntry 6 } |
- |
-outputMeasurementCurrent OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured output current." |
- ::= { outputEntry 7 } |
- |
-outputMeasurementTemperature OBJECT-TYPE |
- SYNTAX INTEGER { ok (-128), failure(127) } |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured temperature of the power module." |
- ::= { outputEntry 8 } |
- |
- |
-outputSwitch OBJECT-TYPE |
- SYNTAX INTEGER { Off (0), On (1), resetEmergencyOff (2), setEmergencyOff (3), clearEvents (10) } |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Read: An enumerated value which shows the current state of |
- the output channel. |
- |
- Write: Change the state of the channel. |
- If the channel is On, and the write value is Off, then the channel |
- will switch Off. |
- If the channel is Off, and the write value is On, and if no other |
- signals (mainInhibit, outputInhibit, outputEmergencyOff or outputFailureMaxCurrent) |
- are active, then the channel will switch on. |
- |
- If the write value is resetEmergencyOff, then the channel will |
- leave the state EmergencyOff. A write of clearEvents is necessary |
- before the voltage can ramp up again. |
- If the write value is setEmergencyOff, then the channel will have |
- the state EmergencyOff, which means that the High Voltage will |
- switch off without a ramp and reset of the outputVoltage to null volt. |
- |
- If the write value is clearEvents, then all failure messages |
- of the outputStatus will be reset (all channel events, all module events |
- and the state emergencyOff)." |
- ::= { outputEntry 9 } |
- |
-outputVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The nominal output voltage of the channel." |
- ::= { outputEntry 10 } |
- |
-outputAdjustVoltage OBJECT-TYPE |
- SYNTAX Integer32 (-128..127) |
- MAX-ACCESS read-write |
- STATUS obsolete |
- DESCRIPTION |
- "A posibillity to make small changes of the output voltage." |
- ::= { outputEntry 11 } |
- |
-outputCurrent OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The current limit of the channel." |
- ::= { outputEntry 12 } |
- |
-outputVoltageRiseRate OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V/s" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Voltage Fall Slew Rate [V/s]. |
- The slew rate of the output voltage if it increases (after switch on or if the Voltage has been |
- changed). |
- " |
- ::= { outputEntry 13 } |
- |
-outputVoltageFallRate OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V/s" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Voltage Rise Slew Rate [V/s]. |
- The slew rate of the output voltage if it decreases (after switch off or if the Voltage has been |
- changed). |
- " |
- ::= { outputEntry 14 } |
- |
-outputSupervisionBehavior OBJECT-TYPE |
- SYNTAX Integer32 (0..65535) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "A bit field packed into an integer which define the behavior of the output channel / power supply |
- after failures. |
- For each supervision value, a two-bit field exists. |
- The enumeration of this value (..L+..H*2) is: |
- WIENER LV devices |
- 0 ignore the failure |
- 1 switch off this channel |
- 2 switch off all channels with the same group number |
- 3 switch off the complete crate. |
- iseg HV devices |
- 0 ignore the failure |
- 1 switch off this channel by ramp down the voltage |
- 2 switch off this channel by a emergencyOff |
- 3 switch off the whole board of the HV module by emergencyOff. |
- The position of the bit fields in the integer value are: |
- Bit 0, 1: outputFailureMinSenseVoltage |
- Bit 2, 3: outputFailureMaxSenseVoltage |
- Bit 4, 5: outputFailureMaxTerminalVoltage |
- Bit 6, 7: outputFailureMaxCurrent |
- Bit 8, 9: outputFailureMaxTemperature |
- Bit 10, 11: outputFailureMaxPower |
- Bit 12, 13: outputFailureInhibit |
- Bit 14, 15: outputFailureTimeout |
- " |
- |
- ::= { outputEntry 15 } |
- |
-outputSupervisionMinSenseVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured sense voltage is below this value, the power supply |
- performs the function defined by SupervisionAction." |
- ::= { outputEntry 16 } |
- |
-outputSupervisionMaxSenseVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured sense voltage is above this value, the power supply |
- performs the function defined by SupervisionAction." |
- ::= { outputEntry 17 } |
- |
-outputSupervisionMaxTerminalVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured voltage at the power supply output |
- terminals is above this value, the power supply |
- performs the function defined by SupervisionAction." |
- ::= { outputEntry 18 } |
- |
-outputSupervisionMaxCurrent OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured current is above this value, the power supply |
- performs the function defined by SupervisionAction." |
- ::= { outputEntry 19 } |
- |
---outputSupervisionMaxTemperature OBJECT-TYPE wohl besser config !! |
--- SYNTAX INTEGER |
--- MAX-ACCESS read-write |
--- STATUS current |
--- DESCRIPTION |
--- "If the measured module temperature is above this value, the power supply |
--- performs the function defined by SupervisionAction." |
--- ::= { outputEntry 20 } |
- |
- |
- |
-outputConfigMaxSenseVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The maximum possible value of the sense voltage" |
- ::= { outputEntry 21 } |
- |
-outputConfigMaxTerminalVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The maximum possible value of the terminal voltage" |
- ::= { outputEntry 22 } |
- |
-outputConfigMaxCurrent OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The maximum possible value of the output current" |
- ::= { outputEntry 23 } |
- |
-outputSupervisionMaxPower OBJECT-TYPE |
- SYNTAX Float |
- UNITS "W" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured power (measured current * measured terminal voltage) |
- is above this value, the power supply performs the function defined |
- by SupervisionAction." |
- ::= { outputEntry 24 } |
- |
-outputCurrentRiseRate OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A/s" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Current Fall Slew Rate [A/s]. |
- The slew rate of the output current if it increases (after |
- switch on or if the Current has been changed). |
- " |
- ::= { outputEntry 25 } |
- |
-outputCurrentFallRate OBJECT-TYPE |
- SYNTAX Float |
- UNITS "A/s" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Current Rise Slew Rate [A/s]. |
- The slew rate of the output current if it decreases (after |
- switch off or if the Current has been changed). |
- " |
- ::= { outputEntry 26 } |
- |
-outputTripTimeMaxCurrent OBJECT-TYPE |
- SYNTAX INTEGER (0..4000) |
- UNITS "ms" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Current trip time out [ms]. |
- The outputTripTimeMaxCurrent defines a span for the time out function. |
- The activity is depending from the bit field outputFailureMaxCurrent |
- of the outputSupervisionBehavior." |
- ::= { outputEntry 27 } |
- |
-------------------------------------------------------------------------------- |
--- output->groups |
-------------------------------------------------------------------------------- |
- |
-groupsEntry OBJECT-TYPE |
- SYNTAX GroupsEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A table row" |
- INDEX { groupsIndex } |
- ::= { groupsTable 1 } |
- |
-GroupsEntry ::= |
- SEQUENCE { |
- groupsIndex |
- INTEGER, |
--- outputGroupsName |
--- DisplayString, |
--- outputGroupsGroup |
--- INTEGER, |
- |
--- outputGroupsStatus |
--- BITS, |
--- outputGroupsMeasurementSenseVoltage |
--- Float, |
--- outputMeasurementTerminalVoltage |
--- Float, |
--- outputMeasurementCurrent |
--- Float, |
--- outputMeasurementTemperature |
--- INTEGER, |
- |
- |
- groupsSwitch |
- INTEGER |
--- outputVoltage |
--- Float, |
--- outputAdjustVoltage |
--- INTEGER, |
--- outputCurrent |
--- Float, |
- |
--- outputRampUp |
--- Float, |
--- outputRampDown |
--- Float, |
- |
--- outputSupervisionBehavior |
--- INTEGER, |
--- outputSupervisionMinSenseVoltage |
--- Float, |
--- outputSupervisionMaxSenseVoltage |
--- Float, |
--- outputSupervisionMaxTerminalVoltage |
--- Float, |
--- outputSupervisionMaxCurrent |
--- Float, |
--- outputSupervisionMaxTemperature |
--- INTEGER, |
- |
--- outputConfigMaxSenseVoltage |
--- Float, |
--- outputConfigMaxTerminalVoltage |
--- Float, |
--- outputConfigMaxCurrent |
--- Float, |
--- outputSupervisionMaxPower |
--- Float, |
- } |
- |
-groupsIndex OBJECT-TYPE |
- SYNTAX Integer32 (0..1999) |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each power output group. Its value |
- ranges between 1 and 1999. |
- The special group 0 is predefined and gives access to all channels. |
- " |
- ::= { groupsEntry 1 } |
- |
-groupsSwitch OBJECT-TYPE |
- SYNTAX INTEGER { undefined (-1), Off (0), On (1), resetEmergencyOff (2), setEmergencyOff(3), disableKill (4), enableKill (5), clearEvents(10) } |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Read: This function is not defined with groups of output channels. |
- |
- Write: Switch the state of all channels of a group. |
- If any channel is On, and the write value is Off, then all channels |
- will switch off. |
- If any channel is Off, and the write value is On, and if no other |
- signals (mainInhibit, outputInhibit, outputEmergencyOff or outputFailureMaxCurrent) |
- are active, then all channels will switch on. |
- |
- If the write value is resetEmergencyOff, then all channels will |
- leave the state EmergencyOff. A write of clearEvents is necessary |
- before the voltage can ramp up again. |
- If the write value is setEmergencyOff, then all channels will have |
- the state EmergencyOff, which means that the High Voltage will |
- switch off without a ramp and reset of the outputVoltage to null volt. |
- |
- If the write value is disableKILL, then all channels will switch |
- to disableKill (outputStatus outputDisableKill). |
- If the write value is enableKILL, then all channels will switch |
- to enableKill (outputStatus outputEnableKill). |
- |
- If the write value is clearEvents, then all failure messages |
- of the outputStatus will be cleared (all channel events, |
- all module events and the state outputEmergencyOff will be reset)." |
- ::= { groupsEntry 9 } |
- |
---groupsName OBJECT-TYPE |
--- SYNTAX DisplayString (SIZE (1..4)) |
--- MAX-ACCESS read-only |
--- STATUS current |
--- DESCRIPTION |
--- "A textual string containing a short name of the |
--- output. If the crate is equipped with an alphanumeric |
--- display, this string is shown to identify a output channel." |
--- ::= { groupsEntry 2 } |
- |
- |
- |
- |
-------------------------------------------------------------------------------- |
--- sensor |
-------------------------------------------------------------------------------- |
---Sensor ::= SEQUENCE { |
--- sensorNumber Integer32, |
--- sensorTable SensorTable |
---} |
- |
-sensorNumber OBJECT-TYPE |
- SYNTAX Integer32 (0..8) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The number of temperature sensors of the crate." |
- ::= { sensor 1 } |
- |
-sensorTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF SensorEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A (conceptual table) of temperature sensor data." |
- ::= { sensor 2 } |
- |
-sensorEntry OBJECT-TYPE |
- SYNTAX SensorEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "An entry (conceptual row) of the sensorTable." |
- INDEX { sensorIndex } |
- ::= { sensorTable 1 } |
- |
-SensorEntry ::= SEQUENCE { |
- sensorIndex INTEGER, |
- sensorTemperature INTEGER, |
- sensorWarningThreshold INTEGER, |
- sensorFailureThreshold INTEGER |
- } |
- |
-sensorIndex OBJECT-TYPE |
- SYNTAX INTEGER { temp1 (1), temp2(2), temp3(3), temp4(4), temp5(5), |
- temp6(6), temp7(7), temp8(8) } |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each temperature sensor in the crate" |
- ::= { sensorEntry 1 } |
- |
-sensorTemperature OBJECT-TYPE |
--- CHECK SYNTAX INTEGER { UNUSED(-128), (-127..127) } |
- SYNTAX Integer32 (-128..127) |
- UNITS "deg C" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured temperature of the sensor. |
- Unused temperature probes have the special value -128" |
- ::= { sensorEntry 2 } |
- |
-sensorWarningThreshold OBJECT-TYPE |
--- CHECK SYNTAX INTEGER { (0..126), DISABLED(127) } |
- SYNTAX Integer32 (0..127) |
- UNITS "deg C" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured temperature of the sensor is higher than this |
- value, the fan speed of the connected fan tray is increased. |
- The value 127 has the special meaning: channel disabled." |
- ::= { sensorEntry 3} |
- |
-sensorFailureThreshold OBJECT-TYPE |
--- CHECK SYNTAX INTEGER { (0..126), DISABLED(127) } |
- SYNTAX Integer32 (0..127) |
- UNITS "deg C" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "If the measured temperature of the sensor is higher than this |
- value, the power supply switches off. |
- The value 127 has the special meaning: channel disabled." |
- ::= { sensorEntry 4} |
- |
---################ |
- |
-------------------------------------------------------------------------------- |
--- signal |
-------------------------------------------------------------------------------- |
---Signal ::= SEQUENCE { |
--- numberOfAnalogInputs Integer32, |
--- analogInputTable AnalogInputTable |
--- numberOfAnalogOutputs Integer32, |
--- analogOutputTable AnalogOutputTable |
--- digitalInput BITS, |
--- digitalOutput BITS |
---} |
- |
-numberOfAnalogInputs OBJECT-TYPE |
- SYNTAX Integer32 (0..8) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The number of additional analog inputs of the crate." |
- ::= { signal 1 } |
- |
-analogInputTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF AnalogInputEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A (conceptual table) of analog input data." |
- ::= { signal 2 } |
- |
-analogInputEntry OBJECT-TYPE |
- SYNTAX AnalogInputEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "An entry (conceptual row) of the analogInputTable." |
- INDEX { analogInputIndex } |
- ::= { analogInputTable 1 } |
- |
-AnalogInputEntry ::= SEQUENCE { |
- analogInputIndex INTEGER, |
- analogMeasurementVoltage Float |
- } |
- |
-analogInputIndex OBJECT-TYPE |
- SYNTAX Integer32 (1..8) |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each analog input of the crate" |
- ::= { analogInputEntry 1 } |
- |
-analogMeasurementVoltage OBJECT-TYPE |
- SYNTAX Float |
- UNITS "V" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured voltage of the analog input." |
- ::= { analogInputEntry 2 } |
- |
- |
-digitalInput OBJECT-TYPE |
- SYNTAX BITS { |
- d0 (0) , |
- d1 (1) , |
- d2 (2) , |
- d3 (3) |
- } |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The value of the digital inputs." |
- ::= { signal 5 } |
- |
- |
- |
- |
--- ################### |
-------------------------------------------------------------------------------- |
--- communication |
-------------------------------------------------------------------------------- |
---Communication ::= SEQUENCE { |
--- snmp Snmp, |
--- tcpip Tcpip, |
--- http Http, |
--- telnet Telnet, |
--- canbus Canbus, |
--- rs232 RS232 |
---} |
- |
-------------------------------------------------------------------------------- |
--- communication.snmp |
-------------------------------------------------------------------------------- |
-snmp OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "SNMP configuration." |
- ::= { communication 1 } |
- |
---Snmp ::= SEQUENCE { |
--- snmpCommunityTable SnmpCommunityTable, |
--- snmpPort INTEGER |
---} |
- |
-snmpCommunityTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF SnmpCommunityEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "The SNMP community string table for different views." |
- ::= { snmp 1 } |
- |
-snmpCommunityEntry OBJECT-TYPE |
- SYNTAX SnmpCommunityEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "One table row." |
- INDEX { snmpAccessRight } |
- ::= { snmpCommunityTable 1 } |
- |
- |
-SnmpCommunityEntry ::= SEQUENCE { |
- snmpAccessRight INTEGER, |
- snmpCommunityName OCTET STRING |
-} |
- |
-snmpAccessRight OBJECT-TYPE |
- SYNTAX INTEGER { public (1), private (2), admin (3), guru (4) } |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each access right" |
- ::= { snmpCommunityEntry 1 } |
- |
-snmpCommunityName OBJECT-TYPE |
- SYNTAX OCTET STRING (SIZE (0..14)) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The SNMP community names for different views. The rights of the different communities are: |
- public no write access |
- private can switch power on/off, generate system reset |
- admin can change supervision levels |
- guru can change output voltage & current (this may destroy hardware if done wrong!) |
- Setting a community name to a zero-length string completly |
- disables the access to this view. If there is no higher- |
- privileged community, the community name can only changed |
- by direct access to the crate (not via network)! |
- " |
- ::= { snmpCommunityEntry 2} |
- |
-snmpPort OBJECT-TYPE |
- SYNTAX Integer32 |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The UDP port number of the SNMP protocol" |
- ::= { snmp 2} |
- |
-------------------------------------------------------------------------------- |
--- communication.canTunnel |
-------------------------------------------------------------------------------- |
-can OBJECT-IDENTITY |
- STATUS current |
- DESCRIPTION |
- "CAN-Bus tunnel via SNMP." |
- ::= { communication 2 } |
- |
-canBitRate OBJECT-TYPE |
- SYNTAX Integer32 |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Control of the CAN-Bus. |
- The value defines the bit rate of the CAN-bus interface. |
- A write disconnects the CAN interface from the ISEG modules and connects |
- it to the SNMP communication. Both the receive and transmit fifos are |
- cleared and the CAN interface is initialized with the selected bit rate. |
- The special bit rate 0 disables the tunnel and switches back to normal operation. |
- " |
- ::= { can 1 } |
- |
-canReceive OBJECT-TYPE |
- SYNTAX OCTET STRING (SIZE (14)) |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "Control of the CAN-Bus Receive FIFO. |
- A read access returns the total number of CAN messages stored in the receive |
- fifo and the oldest message. |
- This message is removed from the fifo. |
- The OCTET STRING data is formatted according to the CANviaSNMP structure. |
- " |
- ::= { can 2 } |
- |
-canTransmit OBJECT-TYPE |
- SYNTAX OCTET STRING (SIZE (14)) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Control of the CAN-Bus Transmit FIFO. |
- A read access returns the total number of CAN messages stored in the transmit |
- fifo and a NULL message. |
- A write inserts the CAN message into the transmit fifo. This message will be |
- transmitted via the CAN interface later. The total number of CAN messages |
- stored in the transmit fifo and the recent message are returned. |
- The OCTET STRING data is formatted according to the CANviaSNMP structure. |
- " |
- ::= { can 3 } |
- |
-------------------------------------------------------------------------------- |
--- communication.... |
-------------------------------------------------------------------------------- |
- |
--- other future entries: |
--- +-tcpip |
--- | | |
--- | +- tcpipIpAddress |
--- | +- tcpipGateway |
--- | +- tcpipSubnetMask |
--- | +- tcpipNegotiation |
--- | +- tcpipMAC |
--- | |
--- +-http |
--- | | |
--- | +- httpPort |
--- | +- httpWriteEnable |
--- | |
--- +-telnet |
--- | | |
--- | +- telnetPort |
--- | |
--- +-canbus |
--- | | |
--- | +- address |
--- | +- address2 |
--- | +- speed |
--- | |
--- +-rs232 |
--- | | |
--- | +- ? |
- |
- |
- |
-------------------------------------------------------------------------------- |
--- powersupply |
-------------------------------------------------------------------------------- |
-Powersupply ::= SEQUENCE { |
- --psFirmwareVersion DisplayString, |
- psSerialNumber DisplayString, |
- psOperatingTime Integer32, |
- psDirectAccess OCTET STRING |
-} |
- |
---integrated in system.sysDesc |
---psFirmwareVersion OBJECT-TYPE |
--- SYNTAX DisplayString |
--- MAX-ACCESS read-only |
--- STATUS current |
--- DESCRIPTION |
--- "The firmware version of the power supply main CPU." |
--- ::= { powersupply 1 } |
- |
-psSerialNumber OBJECT-TYPE |
- SYNTAX DisplayString |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The serial number of the power supply." |
- ::= { powersupply 2 } |
- |
-psOperatingTime OBJECT-TYPE |
- SYNTAX Integer32 |
- UNITS "s" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The time in seconds for how long the power supply was switched on." |
- ::= { powersupply 3 } |
- |
-psDirectAccess OBJECT-TYPE |
- SYNTAX OCTET STRING (SIZE (1..14)) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "Direct data transfer to the UEP6000 power supply. |
- A read access returns nothing, a write access returns the |
- response of the power supply. |
- " |
- ::= { powersupply 1024 } |
- |
-------------------------------------------------------------------------------- |
--- fantray |
-------------------------------------------------------------------------------- |
---Fantray ::= SEQUENCE { |
--- fanFirmwareVersion DisplayString, |
--- fanSerialNumber OCTET STRING, |
--- fanOperatingTime Integer32, |
--- fanAirTemperature INTEGER, |
--- fanSwitchOffDelay INTEGER, |
--- fanNominalSpeed INTEGER, |
--- fanNumberOfFans INTEGER, |
--- fanSpeedTable FanSpeedTable |
---} |
- |
---integrated in system.sysDesc |
---fanFirmwareVersion OBJECT-TYPE |
--- SYNTAX DisplayString |
--- MAX-ACCESS read-only |
--- STATUS current |
--- DESCRIPTION |
--- "The firmware version of the fan tray CPU." |
--- ::= { fantray 1 } |
- |
-fanSerialNumber OBJECT-TYPE |
- SYNTAX DisplayString (SIZE (0..14)) |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The serial number of the fan tray." |
- ::= { fantray 2 } |
- |
-fanOperatingTime OBJECT-TYPE |
- SYNTAX Integer32 |
- UNITS "s" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The time in seconds for how long the fan tray was switched on." |
- ::= { fantray 3 } |
- |
-fanAirTemperature OBJECT-TYPE |
- SYNTAX Integer32 |
- UNITS "deg C" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The temperature of the fan tray inlet air." |
- ::= { fantray 4 } |
- |
-fanSwitchOffDelay OBJECT-TYPE |
- SYNTAX Integer32 (0 .. 900) |
- UNITS "s" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The maximum time in seconds for which the fans will continue running |
- after the power supply has been switched off. This feature is used |
- to cool down the electronics after switching off. |
- " |
- ::= { fantray 5 } |
- |
-fanNominalSpeed OBJECT-TYPE |
--- CHECK SYNTAX INTEGER { (0) , (1200..3600) } |
- SYNTAX Integer32 (0..3600) |
- UNITS "RPM" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The nominal fan rotation speed (RPM, Revolutions Per Minute) |
- Value 0 does switch off the fans (only allowed if at least |
- one rack temperature sensor is present). |
- Values 1..1199 are not allowed" |
- ::= { fantray 6 } |
- |
-fanNumberOfFans OBJECT-TYPE |
- SYNTAX Integer32 ( 0..12 ) |
- UNITS "Fans" |
- MAX-ACCESS read-write |
- STATUS current |
- DESCRIPTION |
- "The number of installed fans" |
- ::= { fantray 7 } |
- |
- |
-fanSpeedTable OBJECT-TYPE |
- SYNTAX SEQUENCE OF FanSpeedEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A list of fanSpeedEntries." |
- ::= { fantray 8 } |
- |
-fanSpeedEntry OBJECT-TYPE |
- SYNTAX FanSpeedEntry |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A table row" |
- INDEX { fanNumber } |
- ::= { fanSpeedTable 1 } |
- |
-FanSpeedEntry ::= SEQUENCE { |
- fanNumber |
- INTEGER, |
- fanSpeed |
- INTEGER |
-} |
- |
-fanNumber OBJECT-TYPE |
- SYNTAX Integer32 ( 1..12 ) |
- MAX-ACCESS not-accessible |
- STATUS current |
- DESCRIPTION |
- "A unique number for each fan." |
- ::= { fanSpeedEntry 1 } |
- |
-fanSpeed OBJECT-TYPE |
- SYNTAX Integer32 |
- UNITS "RPM" |
- MAX-ACCESS read-only |
- STATUS current |
- DESCRIPTION |
- "The measured fan rotation speed (RPM, Revolutions Per Minute)" |
- ::= { fanSpeedEntry 2 } |
- |
- |
- |
- |
- |
-------------------------------------------------------------------------------- |
--- rack |
-------------------------------------------------------------------------------- |
--- this is reserved for futer items (BIN serial number, plug&play, ...) |
- |
- |
- |
-------------------------------------------------------------------------------- |
-END |
Index: sipmscan/trunk/mpod/mpod_voltage.sh |
=================================================================== |
--- sipmscan/trunk/mpod/mpod_voltage.sh (revision 117) |
+++ sipmscan/trunk/mpod/mpod_voltage.sh (nonexistent) |
@@ -1,114 +0,0 @@ |
-#!/bin/bash |
- |
-# Commands: |
-# snmpset - sets the selected attribute of a single channel |
-# snmpget - prints the selected atribute of a single channel |
-# snmpwalk - prints the selected attribute of all channels |
-# |
-# Attributes: |
-# outputVoltage - float(F), R/W |
-# outputCurrent - float(F), R/W |
-# outputMeasurementSenseVoltage - float(F), R |
-# outputMeasurementCurrent - float(F), R |
-# outputSwitch - integer(i), R/W |
-# outputVoltageRiseRate - float(F), R/W |
-# outputStatus - bits, R |
- |
-#ip=194.249.156.124 |
-#ip=f9mpod.ijs.si |
- |
-#if [$1 -lt 99]; then |
-# if [$2 -lt 74]; then |
-# echo "Setting bias to " $2 |
-# snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputVoltage.$1 F $2 |
-# else |
-# echo "Bias voltage needs to be smaller than 74V." |
-# fi |
-#else if [$1 -gt 99]; then |
-# if [$2 -lt 35]; then |
-# echo "Setting bias to " $2 |
-# snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputVoltage.$1 F $2 |
-# else |
-# echo "Bias voltage needs to be smaller than 35V." |
-# fi |
-#fi |
- |
-function reset_all |
-{ |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.1 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.2 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.3 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.4 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.5 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.6 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.7 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.8 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.101 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.102 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.103 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.104 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.105 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.106 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.107 i 10 |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.108 i 10 |
- |
- exit 0 |
-} |
- |
-ip=f9mpod.ijs.si |
- |
-# save all arguments to array args |
-args=("$@") |
- |
-argcnt=0 |
-outSel=-1 |
-outVolt=-1 |
-outSw=-1 |
-resetOut=-1 |
-getOut=-1 |
- |
-# search the arguments for valid options |
-for ARG in "${args[@]}"; do |
- if [ "$ARG" == "--resetall" ]; then |
- reset_all |
- elif [ "$ARG" == "-g" ]; then |
- getOut=1 |
- elif [ "$ARG" == "-r" ]; then |
- resetOut=${args[$argcnt+1]} |
- elif [ "$ARG" == "-o" ]; then |
- outSel=${args[$argcnt+1]} |
- elif [ "$ARG" == "-v" ]; then |
- outVolt=${args[$argcnt+1]} |
- elif [ "$ARG" == "-s" ]; then |
- outSw=${args[$argcnt+1]} |
- fi |
- (( argcnt++ )) |
-done |
- |
-if [ $resetOut != -1 ]; then |
- if [ $resetOut -ge 1 -a $resetOut -le 8 ] || [ $resetOut -ge 101 -a $resetOut -le 108 ]; then |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.$resetOut i 10 |
- else |
- echo "Please select output between 1 and 8 (channel 1) or 101 and 108 (output 2)." |
- fi |
-else |
- if [ $outSel != -1 ]; then |
- # limit the channels to the correct value |
- if [ $outSel -ge 1 -a $outSel -le 8 ] || [ $outSel -ge 101 -a $outSel -le 108 ]; then |
- if [ $outVolt != -1 ]; then |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputVoltage.$outSel F $outVolt |
- fi |
- if [ $outSw != -1 ]; then |
- snmpset -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.$outSel i $outSw |
- fi |
- if [ $getOut != -1 ]; then |
- snmpget -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputVoltage.$outSel |
- snmpget -v 2c -M +. -m +WIENER-CRATE-MIB -c guru $ip outputSwitch.$outSel |
- fi |
- else |
- echo "Please select output between 1 and 8 (channel 1) or 101 and 108 (output 2)." |
- fi |
- fi |
-fi |
- |
-exit 0 |
/sipmscan/trunk/mpod/mpod_voltage.sh |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: sipmscan/trunk/mpod/instructions_mpod.txt |
=================================================================== |
--- sipmscan/trunk/mpod/instructions_mpod.txt (revision 117) |
+++ sipmscan/trunk/mpod/instructions_mpod.txt (nonexistent) |
@@ -1,6 +0,0 @@ |
-mpod_voltage.sh has the following options: |
- --resetall Resets all outputs |
- -r [integer] Resets output selected with [integer] |
- -o [integer] Selects output [integer] |
- -v [float] Sets the voltage to [float]. Must be used in combination with -o |
- -s [0/1] Turns output on (1) or off (0). Must be used in combination with -o |
Index: sipmscan/trunk/mpod/test.sh.bak |
=================================================================== |
--- sipmscan/trunk/mpod/test.sh.bak (revision 117) |
+++ sipmscan/trunk/mpod/test.sh.bak (nonexistent) |
@@ -1,7 +0,0 @@ |
-#!/bin/bash |
- |
-echo "Bash start." |
-sleep 5 |
-echo "Bash end." |
- |
-exit 0 |
Index: sipmscan/trunk/windowed_test.C |
=================================================================== |
--- sipmscan/trunk/windowed_test.C (revision 117) |
+++ sipmscan/trunk/windowed_test.C (nonexistent) |
@@ -1,3483 +0,0 @@ |
-#include "workstation.h" |
-#include "daq.h" |
-#include "root_include.h" |
-#include "windowed_test.h" |
- |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <time.h> |
-#include <unistd.h> |
- |
-#include "daqscope.h" |
- |
-//--------------------------------------------------------------- |
-// Subwindow layout class |
- |
-class TGMdiSubwindow |
-{ |
-RQ_OBJECT("TGMdiSubwindow") |
- |
-protected: |
- TGMdiFrame *fMdiFrame; |
- |
-public: |
- TGMdiSubwindow(TGMdiMainFrame *main, int w, int h); |
- |
- TGMdiFrame *GetMdiFrame() const { return fMdiFrame; } |
- virtual Bool_t CloseWindow(); |
-}; |
- |
-//--------------------------------------------------------------- |
-// Main window class |
- |
-class TGAppMainFrame |
-{ |
-RQ_OBJECT("TGAppMainFrame") |
- |
-protected: |
- TGMainFrame *fMain; |
- TGMdiMainFrame *fMainFrame; |
- TGMdiMenuBar *fMenuBar; |
- TGLayoutHints *fMenuBarItemLayout; |
- TGPopupMenu *fMenuFile, *fMenuAnalysis, *fMenuWindow, *fMenuHelp; |
- TGPopupMenu *fMenuHisttype; |
- TGMdiSubwindow *settingsPane, *mainSubwindow, *histogramPane, *histogramPaneFile, *histogramPaneCtr; |
- |
- void InitMenu(); |
- void MeasurementLayout(); |
- void CloseWindow(); |
- Bool_t About(); |
-public: |
- TGAppMainFrame(const TGWindow *p, int w, int h); |
- |
- void HandleMenu(Int_t id); |
- |
- void EnableVoltScan(); |
- void EnableSurfScan(); |
- void EnableZaxisScan(); |
- void VoltageLimit(); |
- void ChannelLimit(); |
- void CleanPlotToggle(); |
- void ConnectToScope(); |
- |
- void SetVoltOut(); |
- void GetVoltOut(); |
- void ResetVoltOut(); |
- void SetPosition(); |
- void GetPosition(); |
- void HomePosition(); |
- void SaveFile(); |
- void StartAcq(); |
- |
- void SelectDirectory(); |
- void ListMultiSelect(); |
- void ListSelectAll(); |
- void FileListNavigation(int pn); |
- |
- void DisplayHistogram(char *histfile, int histtype); |
- void SetHistRange(); |
- void ChangeHisttype(int type); |
- void ChangeChannel(); |
- void HistogramExport(); |
- void MakeSurfPlot(TList *files); |
- void MakeBreakdownPlot(int nrp, double *volt, double *volterr, double *psep1, double *pseperr1, double *psep2, double *pseperr2, double *psep3, double *pseperr3, char *plotfile); |
- |
- void FitSpectrum(TList *files, int q); |
- void EdgeDetection(TGraph *pdf, TGraph *cdf, char *outname, TCanvas *g1dCanvas, double pdfmax, int direction); |
- void IntegSpectrum(TList *files, int direction); |
- |
- void RunMeas(void *ptr, int runCase, int zaxisscan); |
-}; |
- |
-const char *histExt = ".root"; |
-const char *histExtAll = "*.root"; |
-daq *gDaq; |
-daqscope *gScopeDaq; |
-int debugSig = 0; |
-int retTemp; |
-int gStop=0; |
-unsigned int gBuf[BSIZE]; |
-int logchange = 0; |
-double tdctimeconversion = 45.0909; |
-double lenconversion = 0.3595; |
-int oscOn; |
- |
-// ROOT file variable structure ----------- |
-struct EventHeader { |
- int nrch; |
- int timestamp; |
- double biasvolt; |
- int xpos; |
- int ypos; |
- int zpos; |
- double temperature; |
- char laserinfo[256]; |
-} evtheader; |
- |
-struct EventData { |
- int adcdata[8]; |
- int tdcdata[8]; |
-} evtdata; |
- |
-TFile *inroot; |
-TFile *outroot; |
- |
-//--------------------------------------------------------------- |
-// Global variables |
- |
-TGCheckButton *voltscanOn; |
-TGCheckButton *surfscanOn; |
-TGCheckButton *zscanOn; |
-TGTextEntry *oscIP; |
-TGTextButton *oscConnect; |
-TGCheckButton *histogramOn; |
-TGNumberEntry *vHardlimit; |
-TGNumberEntry *NCH; |
-TGTextEntry *laserInfo; |
-TGCheckButton *cleanOn; |
- |
-TGTab *setTab; |
-TGComboBox *vOutCh; |
-TGNumberEntry *vOut; |
-TGCheckButton *vOutOnOff; |
-TGTextButton *vOutSet; |
-TGTextButton *vOutGet; |
-TGTextButton *vOutReset; |
-TGNumberEntry *vOutStart; |
-TGNumberEntry *vOutStop; |
-TGNumberEntry *vOutStep; |
-TGNumberEntry *xPos; |
-TGNumberEntry *yPos; |
-TGNumberEntry *zPos; |
-TGTextButton *positionSet; |
-TGTextButton *positionGet; |
-TGTextButton *positionHome; |
-TGNumberEntry *xPosMin; |
-TGNumberEntry *xPosMax; |
-TGNumberEntry *xPosStep; |
-TGNumberEntry *yPosMin; |
-TGNumberEntry *yPosMax; |
-TGNumberEntry *yPosStep; |
-TGNumberEntry *zPosMin; |
-TGNumberEntry *zPosMax; |
-TGNumberEntry *zPosStep; |
-TGNumberEntry *evtNum; |
-TGTextEntry *timeStamp; |
-TGTextEntry *fileName; |
-TGTextButton *saveFile; |
-TGTextButton *measStart; |
-TGLabel *busyLabel; |
-TGHProgressBar *curProgress; |
- |
-TRootEmbeddedCanvas *histCanvas; |
- |
-TGTextButton *selectDir; |
-TGListBox *fileList; |
-TGCheckButton *multiSelect; |
-TGCheckButton *multiSelectAll; |
-TGTextButton *prevFile; |
-TGTextButton *nextFile; |
- |
-TGNumberEntry *adcMinRange; |
-TGNumberEntry *adcMaxRange; |
-TGNumberEntry *tdcMinwindow; |
-TGNumberEntry *tdcMaxwindow; |
-TGNumberEntry *yMinRange; |
-TGNumberEntry *yMaxRange; |
-TGNumberEntry *selectCh; |
-TGTextButton *changeADC; |
-TGTextButton *changeTDC; |
-TGTextButton *changeADCTDC; |
-TGTextButton *change2Dsurf; |
-TGCheckButton *logscale; |
-TGTextButton *exportHist; |
-TGNumberEntry *fitSigma; |
-TGNumberEntry *fitTresh; |
-TGNumberEntry *fitInter; |
-TGNumberEntry *accError; |
-TGCheckButton *exfitplots; |
- |
-Bool_t firstrun = kTRUE; |
-Bool_t started; |
-Bool_t cleanPlots = kTRUE; |
- |
-// Layout hints definitions |
-TGLayoutHints *f0 = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2); |
-TGLayoutHints *f0centerx = new TGLayoutHints(kLHintsCenterX,2,2,2,2); |
-TGLayoutHints *f0centery = new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,2,2); |
-TGLayoutHints *f0center2d = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,2,2,2,2); |
-TGLayoutHints *f0right = new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2); |
-TGLayoutHints *f1 = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2); |
-TGLayoutHints *f2 = new TGLayoutHints(kLHintsExpandX,2,2,2,2); |
-TGLayoutHints *f3 = new TGLayoutHints(kLHintsCenterY,2,2,20,2); |
-TGLayoutHints *f3notop = new TGLayoutHints(kLHintsCenterY,4,4,2,30); |
- |
-// Separate functions ----------------------------------------- |
-void GetTime(int intime, char *outtime) |
-{ |
- time_t rawtime; |
- struct tm * timeinfo; |
- if(intime < 0) |
- time(&rawtime); |
- else |
- rawtime = (time_t)intime; |
- timeinfo = localtime(&rawtime); |
- sprintf(outtime, "%s", asctime(timeinfo)); |
- int len = strlen(outtime); |
- if(len) outtime[len-1] = 0; |
-} |
- |
-int MyTimer() |
-{ |
- char cmd[100]; |
- GetTime(-1, cmd); |
- if (timeStamp) timeStamp->SetText(cmd); |
- return 0; |
-} |
- |
-int GetChannel() |
-{ |
- int selectedOutput; |
- if(vOutCh->GetSelected() < 8) selectedOutput = (vOutCh->GetSelected())+1; |
- else if( (vOutCh->GetSelected() >= 8) && (vOutCh->GetSelected() < 16) ) selectedOutput = (vOutCh->GetSelected())+93; |
- else selectedOutput = 1; |
- |
- return selectedOutput; |
-} |
- |
-void remove_ext(char *inname, char *outname) |
-{ |
- char ctemp[256]; |
- for(int i = 0; i < (int)strlen(inname); i++) |
- { |
- if( (inname[i] == '.') && (i > (int)(strlen(inname)-6)) ) |
- { |
- ctemp[i] = '\0'; |
- sprintf(outname, "%s", ctemp); |
- break; |
- } |
- else |
- ctemp[i] = inname[i]; |
- } |
- |
- if(debugSig) |
- printf("Outfile (remove_ext): %s\n", outname); |
-} |
- |
-void remove_from_last(char *inname, char search, char *outname) |
-{ |
- char ctemp[256]; |
- int searchpos = -1; |
- for(int i = (int)strlen(inname); i >= 0; i--) |
- { |
- if(inname[i] == search) |
- { |
- searchpos = i; |
- break; |
- } |
- } |
- |
- for(int i = 0; i < searchpos; i++) |
- ctemp[i] = inname[i]; |
- |
- ctemp[searchpos] = '\0'; |
- sprintf(outname, "%s", ctemp); |
- |
- if(debugSig) |
- printf("Outfile (remove_from_last): %s\n", outname); |
-} |
- |
-// Peak detection function |
-int npeaks; |
-double FindPeaks(double *x, double *par) |
-{ |
- double result = 0; |
- for(int i = 0; i < npeaks; i++) |
- { |
- double norm = par[3*i]; |
- double mean = par[3*i+1]; |
- double sigma = par[3*i+2]; |
- result += norm*TMath::Gaus(x[0], mean, sigma); |
- } |
- return result; |
-} |
- |
-// Class related functions -------------------------------------- |
- |
-// Apply the upper voltage limit from settings pane to main window |
-void TGAppMainFrame::VoltageLimit() |
-{ |
- vOut->SetLimitValues(0, vHardlimit->GetNumber() ); |
-} |
- |
-// Apply the upper channel limit from settings pane to histogram settings |
-void TGAppMainFrame::ChannelLimit() |
-{ |
- selectCh->SetLimitValues(0, (NCH->GetNumber()-1) ); |
-} |
- |
-// Enable or disable voltage scan controls |
-void TGAppMainFrame::EnableVoltScan() |
-{ |
- if(voltscanOn->IsOn()) |
- { |
- vOutStart->SetState(kTRUE); |
- vOutStop->SetState(kTRUE); |
- vOutStep->SetState(kTRUE); |
- } |
- else |
- { |
- vOutStart->SetState(kFALSE); |
- vOutStop->SetState(kFALSE); |
- vOutStep->SetState(kFALSE); |
- } |
-} |
- |
-// Enable or disable surface scan controls |
-void TGAppMainFrame::EnableSurfScan() |
-{ |
- if(surfscanOn->IsOn()) |
- { |
- xPosMin->SetState(kTRUE); |
- xPosMax->SetState(kTRUE); |
- xPosStep->SetState(kTRUE); |
- yPosMin->SetState(kTRUE); |
- yPosMax->SetState(kTRUE); |
- yPosStep->SetState(kTRUE); |
- } |
- else |
- { |
- xPosMin->SetState(kFALSE); |
- xPosMax->SetState(kFALSE); |
- xPosStep->SetState(kFALSE); |
- yPosMin->SetState(kFALSE); |
- yPosMax->SetState(kFALSE); |
- yPosStep->SetState(kFALSE); |
- } |
-} |
- |
-// Enable or disable Z axis scan controls |
-void TGAppMainFrame::EnableZaxisScan() |
-{ |
- if(zscanOn->IsOn()) |
- { |
- zPosMin->SetState(kTRUE); |
- zPosMax->SetState(kTRUE); |
- zPosStep->SetState(kTRUE); |
- } |
- else |
- { |
- zPosMin->SetState(kFALSE); |
- zPosMax->SetState(kFALSE); |
- zPosStep->SetState(kFALSE); |
- } |
-} |
- |
-// Toggle clean plots on/off |
-void TGAppMainFrame::CleanPlotToggle() |
-{ |
- cleanPlots = cleanOn->IsDown(); |
-} |
- |
-// Connect to oscilloscope |
-void TGAppMainFrame::ConnectToScope() |
-{ |
- int scopeState = -1; |
- char *IPaddr = (char*)oscIP->GetText(); |
- int IPcorr = 0; |
- char buf[BSIZE]; |
- |
- if(oscOn == 0) |
- { |
- // Check if the IP address has the required three . |
- for(int i = 0; i < (int)strlen(IPaddr); i++) |
- if(IPaddr[i] == '.') |
- IPcorr++; |
- |
- if( (IPaddr != NULL) && (IPcorr == 3) ) |
- { |
-#if WORKSTAT == 'I' |
- printf("Connecting to oscilloscope.\n"); |
- retTemp = gScopeDaq->connect(IPaddr); |
- scopeState = 1; // For testing instead of making a real connection |
-#else |
- scopeState = 1; |
-#endif |
- } |
- else |
- { |
- scopeState = -1; |
- printf("Please enter a valid scope IP address.\n"); |
- } |
- } |
- else if(oscOn == 1) |
- { |
-#if WORKSTAT == 'I' |
- printf("Disconnecting from oscilloscope.\n"); |
- retTemp = gScopeDaq->disconnect(IPaddr); |
- scopeState = -1; // For testing instead of making a real disconnection |
-#else |
- scopeState = -1; |
-#endif |
- } |
- |
- if(scopeState >= 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; |
- } |
- 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; |
- } |
-} |
- |
-// Set the output voltage |
-void TGAppMainFrame::SetVoltOut() |
-{ |
- char cmd[256]; |
- int outOn; |
- float outputVoltage; |
- |
- outputVoltage = vOut->GetNumber(); |
- |
- if(vOutOnOff->IsOn()) outOn = 1; |
- else outOn = 0; |
- |
- fflush(stdout); |
- sprintf(cmd, "%s/mpod/mpod_voltage.sh -o %d -v %f -s %d", rootdir, GetChannel(), outputVoltage, outOn); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
-} |
- |
-// Get the output voltage |
-void TGAppMainFrame::GetVoltOut() |
-{ |
- char cmd[256]; |
- |
- fflush(stdout); |
- sprintf(cmd, "%s/mpod/mpod_voltage.sh -o %d -g > %s/curvolt.txt", rootdir, GetChannel(), rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
-#if WORKSTAT == 'I' |
- FILE* fvolt; |
- double dtemp; |
- char ctemp[24]; |
- sprintf(cmd, "%s/curvolt.txt", rootdir); |
- fvolt = fopen(cmd, "r"); |
- |
- if(fvolt != NULL) |
- { |
- sprintf(cmd, "WIENER-CRATE-MIB::outputVoltage.u%d = Opaque: Float: %s V\n", GetChannel()-1, "%lf" ); |
- retTemp = fscanf(fvolt, cmd, &dtemp); |
- vOut->SetNumber(dtemp); |
- sprintf(cmd, "WIENER-CRATE-MIB::outputSwitch.u%d = INTEGER: %s\n", GetChannel()-1, "%s" ); |
- retTemp = fscanf(fvolt, cmd, ctemp); |
- if( strcmp(ctemp, "On(1)") == 0 ) |
- vOutOnOff->SetState(kButtonDown); |
- else if( strcmp(ctemp, "Off(0)") == 0 ) |
- vOutOnOff->SetState(kButtonUp); |
- } |
- |
- fclose(fvolt); |
-#endif |
-} |
- |
-// Reset the output voltage |
-void TGAppMainFrame::ResetVoltOut() |
-{ |
- char cmd[256]; |
- |
- vOut->SetNumber(0.000); |
- vOutOnOff->SetState(kButtonUp); |
- |
- fflush(stdout); |
- sprintf(cmd, "%s/mpod/mpod_voltage.sh -r %d", rootdir, GetChannel()); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
-} |
- |
-// Get the current table position |
-void TGAppMainFrame::GetPosition() |
-{ |
- char cmd[256]; |
- |
- fflush(stdout); |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 1 -p > %s/curpos.txt", rootdir, rootdir); // X-axis |
- fflush(stdout); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 2 -p >> %s/curpos.txt", rootdir, rootdir); // Y-axis |
- fflush(stdout); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 3 -p >> %s/curpos.txt", rootdir, rootdir); // Z-axis |
- fflush(stdout); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
-#if WORKSTAT == 'I' |
- FILE* fpos; |
- int itemp; |
- sprintf(cmd, "%s/curpos.txt", rootdir); |
- fpos = fopen(cmd, "r"); |
- |
- if(fpos != NULL) |
- { |
- retTemp = fscanf(fpos, "%d\n", &itemp); |
- xPos->SetNumber(itemp); |
- retTemp = fscanf(fpos, "%d\n", &itemp); |
- yPos->SetNumber(itemp); |
- retTemp = fscanf(fpos, "%d\n", &itemp); |
- zPos->SetNumber(itemp); |
- } |
- |
- fclose(fpos); |
-#endif |
-} |
- |
-// Set the current table position |
-void TGAppMainFrame::SetPosition() |
-{ |
- char cmd[256]; |
- int positX, positY, positZ; |
- |
- positX = xPos->GetNumber(); |
- positY = yPos->GetNumber(); |
- positZ = zPos->GetNumber(); |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir, positX, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir, positY, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir, positZ, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
-} |
- |
-// Set the current table position to a predetermined HOME position |
-void TGAppMainFrame::HomePosition() |
-{ |
- char cmd[256]; |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 1 -h", rootdir); // X-axis |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 2 -h", rootdir); // Y-axis |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 3 -h", rootdir); // Z-axis |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
-} |
- |
-// 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) |
-{ |
- double fparam[2], fparamerr[2], meanval; |
- TLatex *latex; |
- char ctemp[256]; |
- int sortindex[nrp]; |
- |
- TCanvas *canvas = new TCanvas("canv","canv",900,1200); |
- canvas->Divide(1,3); |
- |
- TGraphErrors *gr1 = new TGraphErrors(nrp, volt, psep1, volterr, pseperr1); |
- TGraphErrors *gr2 = new TGraphErrors(nrp, volt, psep2, volterr, pseperr2); |
- TGraphErrors *gr3 = new TGraphErrors(nrp, volt, psep3, volterr, pseperr3); |
- |
- if(!cleanPlots) |
- gr1->SetTitle("1st - 2nd peak separation"); |
- else |
- gr1->SetTitle(); |
- gr1->SetLineColor(kBlue); |
- gr1->SetMarkerColor(kBlue); |
- gr1->SetMarkerStyle(20); |
- gr1->SetMarkerSize(0.6); |
- |
- |
- if(!cleanPlots) |
- gr2->SetTitle("2nd - 3rd peak separation"); |
- else |
- gr2->SetTitle(); |
- gr2->SetLineColor(kMagenta); |
- gr2->SetMarkerColor(kMagenta); |
- gr2->SetMarkerStyle(21); |
- gr2->SetMarkerSize(0.4); |
- |
- if(!cleanPlots) |
- gr3->SetTitle("3rd - 4th peak separation"); |
- else |
- gr3->SetTitle(); |
- gr3->SetLineColor(kGreen); |
- gr3->SetMarkerColor(kGreen); |
- gr3->SetMarkerStyle(22); |
- gr3->SetMarkerSize(0.6); |
- |
- // Plotting the first breakdown voltage plot |
- canvas->cd(1); |
- gPad->SetGridx(1); |
- gPad->SetGridy(1); |
- |
- gr1->Draw("AP"); |
- gr1->GetXaxis()->SetTitle("Bias voltage (V)"); |
- gr1->GetYaxis()->SetTitle("Peak separation"); |
- gr1->GetYaxis()->CenterTitle(); |
- gr1->Fit("pol1","Q"); |
- |
- TF1 *fit1 = gr1->GetFunction("pol1"); |
- fparam[0] = fit1->GetParameter(0); |
- fparamerr[0] = fit1->GetParError(0); |
- fparam[1] = fit1->GetParameter(1); |
- fparamerr[1] = fit1->GetParError(1); |
- |
- TMath::Sort(nrp, psep1, sortindex, kFALSE); |
- |
- meanval = -fparam[0]/fparam[1]; |
- if(!cleanPlots) |
- { |
- sprintf(ctemp, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- latex = new TLatex(); |
- latex->SetTextSize(0.039); |
- latex->DrawLatex(volt[0]-(volt[1]-volt[0]), 0.97*psep1[sortindex[nrp-1]], ctemp); |
- } |
- else |
- printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- |
- // Plotting the second breakdown voltage plot |
- canvas->cd(2); |
- gPad->SetGridx(1); |
- gPad->SetGridy(1); |
- |
- gr2->Draw("AP"); |
- gr2->GetXaxis()->SetTitle("Bias voltage (V)"); |
- gr2->GetYaxis()->SetTitle("Peak separation"); |
- gr2->GetYaxis()->CenterTitle(); |
- gr2->Fit("pol1","Q"); |
- |
- TF1 *fit2 = gr2->GetFunction("pol1"); |
- fparam[0] = fit2->GetParameter(0); |
- fparamerr[0] = fit2->GetParError(0); |
- fparam[1] = fit2->GetParameter(1); |
- fparamerr[1] = fit2->GetParError(1); |
- |
- meanval = -fparam[0]/fparam[1]; |
- if(!cleanPlots) |
- { |
- sprintf(ctemp, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- latex = new TLatex(); |
- latex->SetTextSize(0.039); |
- latex->DrawLatex(volt[0]-(volt[1]-volt[0]), 0.97*psep2[sortindex[nrp-1]], ctemp); |
- } |
- else |
- printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- |
- // Plotting the third breakdown voltage plot |
- canvas->cd(3); |
- gPad->SetGridx(1); |
- gPad->SetGridy(1); |
- |
- gr3->Draw("AP"); |
- gr3->GetXaxis()->SetTitle("Bias voltage (V)"); |
- gr3->GetYaxis()->SetTitle("Peak separation"); |
- gr3->GetYaxis()->CenterTitle(); |
- gr3->Fit("pol1","Q"); |
- |
- TF1 *fit3 = gr3->GetFunction("pol1"); |
- fparam[0] = fit3->GetParameter(0); |
- fparamerr[0] = fit3->GetParError(0); |
- fparam[1] = fit3->GetParameter(1); |
- fparamerr[1] = fit3->GetParError(1); |
- |
- meanval = -fparam[0]/fparam[1]; |
- if(!cleanPlots) |
- { |
- sprintf(ctemp, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- latex = new TLatex(); |
- latex->SetTextSize(0.039); |
- latex->DrawLatex(volt[0]-(volt[1]-volt[0]), 0.97*psep3[sortindex[nrp-1]], ctemp); |
- } |
- else |
- printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam[0], fparamerr[0], fparam[1], fparamerr[1], meanval, meanval*(TMath::Abs(fparamerr[0]/fparam[0]) + TMath::Abs(fparamerr[1]/fparam[1])) ); |
- |
- canvas->SaveAs(plotfile); |
-} |
- |
-// Fit the ADC spectrum peaks and make a breakdown voltage plot |
-void TGAppMainFrame::FitSpectrum(TList *files, int q) |
-{ |
- TCanvas *gCanvas = histCanvas->GetCanvas(); |
- gCanvas->cd(); |
- TH1F *histtemp; |
- TSpectrum *spec; |
- TH1 *histback; |
- TH1F *h2; |
- float *xpeaks; |
- TF1 *fit; |
- TF1 *fittingfunc; |
- double *fparam; |
- double *fparamerr; |
- double meanparam[20], meanparamerr[20]; |
- int sortindex[20]; |
- char exportname[256]; |
- char paramname[256]; |
- char ctemp[256]; |
- |
- FILE *fp; |
- remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp); |
- sprintf(paramname, "%s_fitresult.txt", ctemp); |
- fp = fopen(paramname, "w"); |
- fclose(fp); |
- |
- int peaklimit = 5; |
- int p = 0; |
- double dtemp; |
- double volt[files->GetSize()], volterr[files->GetSize()], sep[3][files->GetSize()], seperr[3][files->GetSize()]; |
- for(int m = 0; m < files->GetSize(); m++) |
- { |
- volt[m] = 0; volterr[m] = 0; |
- for(int i = 0; i < 3; i++) |
- { sep[i][m] = 0; seperr[i][m] = 0; } |
- } |
- |
- for(int m = 0; m < files->GetSize(); m++) |
- { |
- for(int i = 0; i < 20; i++) { meanparam[20] = 0; meanparamerr[20] = 0; } |
- |
- DisplayHistogram( (char*)(files->At(m)->GetTitle()), 0); |
- dtemp = evtheader.biasvolt; |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- histtemp = (TH1F*)gCanvas->GetPrimitive(histname); |
- npeaks = 20; |
- double par[3000]; |
- spec = new TSpectrum(npeaks); |
- // Find spectrum background |
- histback = spec->Background(histtemp, (int)fitInter->GetNumber(), "same"); |
- // Clone histogram and subtract background from it |
- h2 = (TH1F*)histtemp->Clone("h2"); |
- h2->Add(histback, -1); |
- // Search for the peaks |
- int found = spec->Search(h2, fitSigma->GetNumber(), "goff", fitTresh->GetNumber() ); |
- printf("Found %d candidates to fit.\n",found); |
- npeaks = found; |
- |
- xpeaks = spec->GetPositionX(); |
- for(int i = 0; i < found; i++) |
- { |
- float xp = xpeaks[i]; |
- int bin = h2->GetXaxis()->FindBin(xp); |
- float yp = h2->GetBinContent(bin); |
- par[3*i] = yp; |
- par[3*i+1] = xp; |
- // par[3*i+2] = 3; |
- par[3*i+2] = (double)fitSigma->GetNumber(); |
- // printf("Peak %d: %f\n", i+1, xp); |
- } |
- |
- // Fit the histogram |
- fit = new TF1("fit", FindPeaks, 0, 400, 3*npeaks); |
- TVirtualFitter::Fitter(histtemp, 3*npeaks); |
- fit->SetParameters(par); |
- fit->SetNpx(300); |
- h2->Fit("fit","Q"); // for quiet mode, add Q |
- fittingfunc = h2->GetFunction("fit"); |
- fparam = fittingfunc->GetParameters(); |
- fparamerr = fittingfunc->GetParErrors(); |
- |
- // Gather the parameters (mean peak value for now) |
- int j = 1; |
- int nrfit = 0; |
- while(1) |
- { |
- if( (fparam[j] < 1.E-30) || (fparamerr[j] < 1.E-10) ) |
- break; |
- else |
- { |
- if(fparam[j] > 0) |
- { |
- meanparam[nrfit] = fparam[j]; |
- meanparamerr[nrfit] = fparamerr[j]; |
- nrfit++; |
- } |
- } |
- |
- j+=3; |
- } |
- |
- // Write out parameters to a file |
- fp = fopen(paramname, "a"); |
- |
- fprintf(fp, "%d\t", nrfit); |
- TMath::Sort(nrfit, meanparam, sortindex, kFALSE); |
- for(int i = 0; i < nrfit; i++) |
- { |
- if(debugSig) |
- printf("Peak %d: %lf\t%lf\n", i+1, meanparam[sortindex[i]], meanparamerr[sortindex[i]]); |
- fprintf(fp, "%le\t%le\t", meanparam[sortindex[i]], meanparamerr[sortindex[i]]); |
- } |
- printf("\n"); |
- fprintf(fp, "\n"); |
- |
- fclose(fp); |
- |
- h2->SetStats(0); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- // Save each fitting plot |
- if(exfitplots->IsDown()) |
- { |
- remove_ext((char*)files->At(m)->GetTitle(), ctemp); |
- sprintf(exportname, "%s_fit.pdf", ctemp); |
- gCanvas->SaveAs(exportname); |
- } |
- |
- // Get points for mean peak values and create a breakdown voltage plot |
- if(nrfit >= peaklimit) |
- { |
- sep[0][p] = meanparam[sortindex[2]] - meanparam[sortindex[1]]; |
- sep[1][p] = meanparam[sortindex[3]] - meanparam[sortindex[2]]; |
- sep[2][p] = meanparam[sortindex[4]] - meanparam[sortindex[3]]; |
- |
- seperr[0][p] = TMath::Abs(meanparamerr[sortindex[2]]) + TMath::Abs(meanparamerr[sortindex[1]]); |
- seperr[1][p] = TMath::Abs(meanparamerr[sortindex[3]]) + TMath::Abs(meanparamerr[sortindex[2]]); |
- seperr[2][p] = TMath::Abs(meanparamerr[sortindex[4]]) + TMath::Abs(meanparamerr[sortindex[3]]); |
- |
- volt[p] = dtemp; |
- volterr[p] = 1.e-4; |
- |
- if(debugSig) |
- printf("p=%d:\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", p, volt[p], sep[0][p], seperr[0][p], sep[1][p], seperr[1][p], sep[2][p], seperr[2][p]); |
- |
- // Accept only the points with a small enough error |
- if( (seperr[0][p]/sep[0][p] < accError->GetNumber()) && (seperr[1][p]/sep[1][p] < accError->GetNumber()) && (seperr[2][p]/sep[2][p] < accError->GetNumber()) ) |
- p++; |
- else |
- printf("Point (at %.2lfV) rejected due to errors: %lf, %lf, %lf\n", volt[p], seperr[0][p]/sep[0][p], seperr[1][p]/sep[1][p], seperr[2][p]/sep[2][p]); |
- } |
- |
- if(q == 1) break; |
- } |
- |
- // Plot & fit breakdown voltage plots |
- if(q > 1) |
- { |
- remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp); |
- sprintf(paramname, "%s_breakdown.pdf", ctemp); |
- MakeBreakdownPlot(p, volt, volterr, sep[0], seperr[0], sep[1], seperr[1], sep[2], seperr[2], paramname); |
- } |
-} |
- |
-// Plotting of PDF and CDF functions for the edge (with the added fit) |
-void TGAppMainFrame::EdgeDetection(TGraph *pdf, TGraph *cdf, char *outname, TCanvas *g1dCanvas, double pdfmax, int direction) |
-{ |
-// double x, y; |
- |
- pdf->Fit("gaus","Q"); |
- pdf->GetFunction("gaus")->SetNpx(400); |
-/* |
- for(int i = 0; i < nrpoints; i++) |
- { |
- pdf->GetPoint(i, x, y); |
- pdf->SetPoint(i, x, (y/pdfmax) ); |
- } |
-*/ |
- gStyle->SetOptFit(1); |
- |
- cdf->Draw("AL"); |
- gPad->Update(); |
- pdf->Draw("LP"); |
- |
- g1dCanvas->Modified(); |
- g1dCanvas->Update(); |
- |
- TPaveStats *stats = (TPaveStats*)pdf->FindObject("stats"); |
- if(!cleanPlots) |
- { |
-// stats->SetX1NDC(0.14); stats->SetX2NDC(0.28); |
-// stats->SetY1NDC(0.83); stats->SetY2NDC(0.96); |
- stats->SetX1NDC(0.86); stats->SetX2NDC(1.0); |
- stats->SetY1NDC(0.87); stats->SetY2NDC(1.0); |
- } |
- else |
- { |
- stats->SetX1NDC(1.1); stats->SetX2NDC(1.3); |
- stats->SetY1NDC(1.1); stats->SetY2NDC(1.3); |
- } |
- |
- g1dCanvas->SetGridx(1); |
- g1dCanvas->SetGridy(1); |
- if(direction == 1) |
- cdf->GetXaxis()->SetTitle("X [#mum]"); |
- else if(direction == 2) |
- cdf->GetXaxis()->SetTitle("Y [#mum]"); |
- cdf->GetXaxis()->CenterTitle(kTRUE); |
- cdf->GetXaxis()->SetLabelSize(0.022); |
- cdf->GetYaxis()->SetTitle("Normalized ADC integral"); |
-// cdf->GetYaxis()->SetTitle("Normalized ADC integral (CDF)"); |
-// cdf->GetYaxis()->SetTitleColor(kBlue); |
- cdf->GetYaxis()->CenterTitle(kTRUE); |
- cdf->GetYaxis()->SetLabelSize(0.022); |
- cdf->GetYaxis()->SetRangeUser(0,1); |
- cdf->GetYaxis()->SetTitleSize(0.030); |
-// cdf->GetYaxis()->SetLabelColor(kBlue); |
- if(!cleanPlots) |
- cdf->SetTitle("SiPM edge detection"); |
- else |
- cdf->SetTitle(); |
- cdf->SetLineColor(kBlue); |
- pdf->SetLineWidth(2); |
- cdf->SetLineWidth(2); |
- |
-/* TGaxis *axis = new TGaxis(gPad->GetUxmax(), 0, gPad->GetUxmax(), 1, 0, pdfmax, 510, "+L"); |
- axis->Draw(); |
- axis->SetTitle("Normalized ADC integral (PDF)"); |
- axis->SetTitleSize(0.035); |
- axis->CenterTitle(); |
- axis->SetTitleColor(kBlack); |
- axis->SetTitleFont(42); |
- axis->SetLabelSize(0.022); |
- axis->SetLabelColor(kBlack);*/ |
- |
- g1dCanvas->Modified(); |
- g1dCanvas->Update(); |
- |
- g1dCanvas->SaveAs(outname); |
-} |
- |
-// Integrate the spectrum |
-void TGAppMainFrame::IntegSpectrum(TList *files, int direction) |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- char ctemp[256]; |
- int j, k = 0, m = 0, n = 0; |
- |
- TCanvas *gCanvas = new TCanvas("canv","canv",900,900); |
- TCanvas *g1dCanvas = new TCanvas("canv1d","canv1d",1200,900); |
- TTree *header_data, *meas_data; |
- double *integralCount, *integralAcc; |
- integralCount = new double[nrfiles]; |
- integralAcc = new double[nrfiles]; |
-// double xsurfmin, ysurfmin, zsurfmin; |
- double *surfx, *surfy, *surfz; |
- surfx = new double[nrfiles]; |
- surfy = new double[nrfiles]; |
- surfz = new double[nrfiles]; |
- for(int i = 0; i < (int)nrfiles; i++) {integralCount[i] = 0; integralAcc[i] = 0; } |
- |
- TGraph *gScan[2]; // graphs for PDF and CDF functions |
- double pdfmax = -1; |
- TGraph2D *gScan2D; |
- gScan2D = new TGraph2D(); |
- int nrentries; |
- double minInteg, maxInteg; |
- |
- char exportname[256]; |
- |
- if(files->GetSize() > 0) |
- { |
- for(int i = 0; i < (int)files->GetSize(); i++) |
- { |
- n++; |
- if(files->At(i)) |
- { |
- sprintf(ctemp, "%s", files->At(i)->GetTitle()); |
- inroot = new TFile(ctemp, "READ"); |
- |
- inroot->GetObject("header_data", header_data); |
- inroot->GetObject("meas_data", meas_data); |
- |
- // Reading the header |
- header_data->SetBranchAddress("xpos", &evtheader.xpos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("ypos", &evtheader.ypos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("zpos", &evtheader.zpos); |
- header_data->GetEntry(0); |
- |
- char rdc[256]; |
- j = selectCh->GetNumber(); |
- double rangetdc[2]; |
- rangetdc[0] = tdcMinwindow->GetNumber(); |
- rangetdc[1] = tdcMaxwindow->GetNumber(); |
- |
- k = 0; |
- m = 0; |
- |
- // Reading the data |
- for(int e = 0; e < meas_data->GetEntries(); e++) |
- { |
- sprintf(rdc, "ADC%d", j); |
- meas_data->SetBranchAddress(rdc, &evtdata.adcdata[j]); |
- meas_data->GetEntry(e); |
- |
- sprintf(rdc, "TDC%d", j); |
- meas_data->SetBranchAddress(rdc, &evtdata.tdcdata[j]); |
- meas_data->GetEntry(e); |
- |
- // If our data point is inside the TDC window |
- if( ((double)evtdata.tdcdata[j]/tdctimeconversion >= rangetdc[0]) && ((double)evtdata.tdcdata[j]/tdctimeconversion <= rangetdc[1]) ) |
- { |
- k++; |
- m += evtdata.adcdata[j]; |
- } |
- } |
- |
-/* if(n == 1) // these values can be used to set 0 value at first X, Y and Z positions |
- { |
- xsurfmin = evtheader.xpos; |
- ysurfmin = evtheader.ypos; |
- zsurfmin = evtheader.zpos; |
- } |
- surfx[i] = (double)(evtheader.xpos-xsurfmin)*lenconversion; |
- surfy[i] = (double)(evtheader.ypos-ysurfmin)*lenconversion; |
- surfz[i] = (double)(evtheader.zpos-zsurfmin)*lenconversion;*/ |
- surfx[i] = (double)(evtheader.xpos*lenconversion); |
- surfy[i] = (double)(evtheader.ypos*lenconversion); |
- surfz[i] = (double)(evtheader.zpos*lenconversion); |
- |
-/* surfx[i] = evtheader.xpos; |
- surfy[i] = evtheader.ypos; |
- surfz[i] = evtheader.zpos; |
-*/ |
- integralCount[i] += ((double)m)/((double)k); |
- |
- delete inroot; |
- } |
- } |
- |
- nrentries = n; |
- printf("%d files were selected.\n", nrentries); |
- |
- double curzval = surfz[0]; |
- j = 0; |
- int acc = 0; |
- int zb; |
- for(int i = 0; i <= nrentries; i++) |
- { |
- if(acc == nrentries) |
- { |
- minInteg = TMath::MinElement(j, integralAcc); |
- |
- for(int za = 0; za < j; za++) |
- integralAcc[za] = integralAcc[za] - minInteg; |
- |
- maxInteg = TMath::MaxElement(j, integralAcc); |
- |
- for(int za = 0; za < j; za++) |
- { |
- zb = i-j+za; |
- integralCount[zb] = integralAcc[za]/maxInteg; |
- if(debugSig) |
- printf("Integral check 2 (i=%d,j=%d,za=%d,z=%.2lf,zb=%d): %lf\t%lf\n", i, j, za, surfz[i-j], zb, integralCount[zb], integralAcc[za]/maxInteg); |
- } |
- |
- // Plotting of PDF and CDF functions for the edge (with the added fit) |
- gScan[1] = new TGraph(); |
- for(int za = 0; za < j; za++) |
- { |
- zb = i-j+za; |
- if(direction == 1) |
- gScan[1]->SetPoint(za, (double)surfx[zb], (double)integralAcc[za]/maxInteg); |
- else if(direction == 2) |
- gScan[1]->SetPoint(za, (double)surfy[zb], (double)integralAcc[za]/maxInteg); |
- |
- if( ((integralAcc[za+1]-integralAcc[za])/maxInteg > pdfmax) && (za < j-1) ) |
- pdfmax = (integralAcc[za+1]-integralAcc[za])/maxInteg; |
- } |
- |
- pdfmax = (TMath::Ceil(pdfmax*10))/10.; |
- |
- gScan[0] = new TGraph(); |
- for(int za = j-1; za >= 0; za--) |
- { |
- zb = (i-1)-(j-1)+za; |
- if((integralAcc[za]-integralAcc[za-1])/(maxInteg) < 0) |
- { |
- if(direction == 1) |
- gScan[0]->SetPoint(za, (double)surfx[zb], 0); |
- else if(direction == 2) |
- gScan[0]->SetPoint(za, (double)surfy[zb], 0); |
- } |
- else |
- { |
- if(direction == 1) |
- gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg)); |
- else if(direction == 2) |
- gScan[0]->SetPoint(za, (double)surfy[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg)); |
-// gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(pdfmax*maxInteg)); |
- } |
- } |
- |
- remove_from_last((char*)files->At(i-1)->GetTitle(), '_', ctemp); |
- sprintf(exportname, "%s_edge.pdf", ctemp); |
- EdgeDetection(gScan[0], gScan[1], exportname, g1dCanvas, pdfmax, direction); |
- |
-// delete gScan[0]; |
-// delete gScan[1]; |
- |
- i--; |
- pdfmax = 0; |
- break; |
- } |
- else |
- { |
- if(surfz[i] == curzval) |
- { |
- integralAcc[j] = integralCount[i]; |
- if(debugSig) |
- printf("Integral check 1 (i=%d,j=%d,z=%.2lf): %lf\t%lf\n", i, j, surfz[i], integralCount[i], integralAcc[j]); |
- j++; |
- acc++; |
- } |
- else |
- { |
- minInteg = TMath::MinElement(j, integralAcc); |
- |
- for(int za = 0; za < j; za++) |
- integralAcc[za] = integralAcc[za] - minInteg; |
- |
- maxInteg = TMath::MaxElement(j, integralAcc); |
- |
- for(int za = 0; za < j; za++) |
- { |
- zb = i-j+za; |
- integralCount[zb] = integralAcc[za]/maxInteg; |
- if(debugSig) |
- printf("Integral check 2 (i=%d,j=%d,za=%d,z=%.2lf,zb=%d): %lf\t%lf\n", i, j, za, surfz[i-j], zb, integralCount[zb], integralAcc[za]/maxInteg); |
- } |
- |
- curzval = surfz[i]; |
- i--; |
- |
- // Plotting of PDF and CDF functions for the edge (with the added fit) |
- gScan[1] = new TGraph(); |
- for(int za = 0; za < j; za++) |
- { |
- zb = i-(j-1)+za; |
- if(direction == 1) |
- gScan[1]->SetPoint(za, (double)surfx[zb], (double)integralAcc[za]/maxInteg); |
- else if(direction == 2) |
- gScan[1]->SetPoint(za, (double)surfy[zb], (double)integralAcc[za]/maxInteg); |
- |
- if( ((integralAcc[za+1]-integralAcc[za])/maxInteg > pdfmax) && (za < j-1) ) |
- pdfmax = (integralAcc[za+1]-integralAcc[za])/maxInteg; |
- } |
- |
- pdfmax = (TMath::Ceil(pdfmax*10))/10.; |
- |
- gScan[0] = new TGraph(); |
- for(int za = j-1; za >= 0; za--) |
- { |
- zb = i-(j-1)+za; |
- if((integralAcc[za]-integralAcc[za-1])/(maxInteg) < 0) |
- { |
- if(direction == 1) |
- gScan[0]->SetPoint(za, (double)surfx[zb], 0); |
- else if(direction == 2) |
- gScan[0]->SetPoint(za, (double)surfy[zb], 0); |
- } |
- else |
- { |
- if(direction == 1) |
- gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg)); |
- else if(direction == 2) |
- gScan[0]->SetPoint(za, (double)surfy[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg)); |
-// gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(pdfmax*maxInteg)); |
- } |
- } |
- |
- remove_from_last((char*)files->At(i)->GetTitle(), '_', ctemp); |
- sprintf(exportname, "%s_edge.pdf", ctemp); |
- EdgeDetection(gScan[0], gScan[1], exportname, g1dCanvas, pdfmax, direction); |
- |
- delete gScan[0]; |
- delete gScan[1]; |
- |
- j = 0; |
- pdfmax = 0; |
- } |
- } |
- } |
- |
-// delete g1dCanvas; |
- |
- double range[4]; |
- if(direction == 1) |
- { |
- range[0] = TMath::MinElement(nrentries, surfx); |
- range[1] = TMath::MaxElement(nrentries, surfx); |
- } |
- else if(direction == 2) |
- { |
- range[0] = TMath::MinElement(nrentries, surfy); |
- range[1] = TMath::MaxElement(nrentries, surfy); |
- } |
- else |
- { |
- range[0] = TMath::MinElement(nrentries, surfx); |
- range[1] = TMath::MaxElement(nrentries, surfx); |
- } |
- range[2] = TMath::MinElement(nrentries, surfz); |
- range[3] = TMath::MaxElement(nrentries, surfz); |
- |
- // Plotting of 2D edge plot |
- for(int i = 0; i < nrentries; i++) |
- { |
- if(direction == 1) |
- { |
- if(debugSig) |
- printf("%.2lf\t%.2lf\t%lf\n", surfx[i], surfz[i], integralCount[i]); |
- gScan2D->SetPoint(i, surfx[i], surfz[i], integralCount[i]); |
- } |
- else if(direction == 2) |
- { |
- if(debugSig) |
- printf("%.2lf\t%.2lf\t%lf\n", surfy[i], surfz[i], integralCount[i]); |
- gScan2D->SetPoint(i, surfy[i], surfz[i], integralCount[i]); |
- } |
- } |
- |
- gCanvas->cd(); |
- gStyle->SetPalette(1); |
- gScan2D->Draw("COLZ"); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- if(direction == 1) |
- gScan2D->GetXaxis()->SetTitle("X [#mum]"); |
- else if(direction == 2) |
- gScan2D->GetXaxis()->SetTitle("Y [#mum]"); |
- gScan2D->GetXaxis()->CenterTitle(kTRUE); |
- gScan2D->GetXaxis()->SetLabelSize(0.022); |
- gScan2D->GetXaxis()->SetRangeUser(range[0], range[1]); |
- gScan2D->GetXaxis()->SetNoExponent(); |
- gScan2D->GetYaxis()->SetTitle("Z [#mum]"); |
- gScan2D->GetYaxis()->SetTitleOffset(1.3); |
- gScan2D->GetYaxis()->CenterTitle(kTRUE); |
- gScan2D->GetYaxis()->SetLabelSize(0.022); |
- gScan2D->GetYaxis()->SetRangeUser(range[2], range[3]); |
- TGaxis *yax = (TGaxis*)gScan2D->GetYaxis(); |
- yax->SetMaxDigits(4); |
- if(!cleanPlots) |
- gScan2D->SetTitle("Laser focal point"); |
- else |
- gScan2D->SetTitle(); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp); |
- sprintf(exportname, "%s", ctemp); |
- remove_from_last(exportname, '_', ctemp); |
- if(direction == 1) |
- sprintf(exportname, "%s_xdir_focalpoint.pdf", ctemp); |
- else if(direction == 2) |
- sprintf(exportname, "%s_ydir_focalpoint.pdf", ctemp); |
- gCanvas->SaveAs(exportname); |
- } |
-} |
- |
-void TGAppMainFrame::RunMeas(void *ptr, int runCase, int zaxisscan) |
-{ |
- printf("Start of Run, run case %d\n", runCase); |
- float progVal; |
- |
- char ctemp[256]; |
- char fname[256]; |
- |
- remove_ext((char*)fileName->GetText(), ctemp); |
-// printf("Save name: %s\nNo extension: %s\n", fileName->GetText(), ctemp); |
- |
- // Open file for writing |
-/* if(runCase == 0) |
- { |
- sprintf(fname, "rm %s_%s", ctemp, histExtAll); |
- retTemp = system(fname); |
- }*/ // deleting might not be necesary due to RECREATE in root file open |
- |
- if( voltscanOn->IsOn() || surfscanOn->IsOn() ) |
- { |
- 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); |
- } |
- else if(zaxisscan == 1) |
- { |
- 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); |
- else if( (runCase >= 100) && (runCase < 1000) ) |
- sprintf(fname, "%s_z%d_00%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt); |
- else if( (runCase >= 1000) && (runCase < 10000) ) |
- 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); |
-// printf("Rootfile: %s\n", fname); |
- |
- // Check if set voltage is below the hard limit |
- if( vOut->GetNumber() > vHardlimit->GetNumber() ) |
- { |
- printf("Voltage hard limit triggered (%lf > %lf)!\n", vOut->GetNumber(), vHardlimit->GetNumber() ); |
- vOut->SetNumber( vHardlimit->GetNumber() ); |
- } |
- |
- 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."); |
- |
- // Branches for the header |
- header_data->Branch("nrch", &evtheader.nrch, "nrch/I"); |
- header_data->Branch("timestamp", &evtheader.timestamp, "timestamp/I"); |
- header_data->Branch("biasvolt", &evtheader.biasvolt, "biasvolt/D"); |
- header_data->Branch("xpos", &evtheader.xpos, "xpos/I"); |
- header_data->Branch("ypos", &evtheader.ypos, "ypos/I"); |
- header_data->Branch("zpos", &evtheader.zpos, "zpos/I"); |
- header_data->Branch("temperature", &evtheader.temperature, "temperature/D"); |
- header_data->Branch("laserinfo", &evtheader.laserinfo, "laserinfo/C"); |
- |
- evtheader.nrch = (int)NCH->GetNumber()*2; |
- evtheader.timestamp = (int)time(NULL); |
- evtheader.biasvolt = (double)vOut->GetNumber(); |
- evtheader.xpos = (int)xPos->GetNumber(); |
- evtheader.ypos = (int)yPos->GetNumber(); |
- evtheader.zpos = (int)zPos->GetNumber(); |
- evtheader.temperature = 25.0; // Still to do!!! |
- sprintf(evtheader.laserinfo, "%s", laserInfo->GetText()); |
- |
- char histtime[256]; |
- GetTime(evtheader.timestamp, histtime); |
- |
- printf("Save file header information:\n"); |
- printf("- Number of channels: %d\n", evtheader.nrch); |
- printf("- Timestamp: %d (%s)\n", evtheader.timestamp, histtime); |
- printf("- Bias voltage: %lf\n", evtheader.biasvolt); |
- printf("- Table position (X,Y,Z): %d, %d, %d\n", evtheader.xpos, evtheader.ypos, evtheader.zpos); |
- printf("- Temperature: %lf\n", evtheader.temperature); |
- printf("- Laser and filter settings: %s\n", evtheader.laserinfo); |
- |
- header_data->Fill(); |
- |
- // Branches for ADC and TDC data |
- for(int i = 0; i < evtheader.nrch/2; i++) |
- { |
- sprintf(ctemp, "ADC%d", i); |
- sprintf(fname, "ADC%d/I", i); |
- meas_data->Branch(ctemp, &evtdata.adcdata[i], fname); |
- |
- sprintf(ctemp, "TDC%d", i); |
- sprintf(fname, "TDC%d/I", i); |
- meas_data->Branch(ctemp, &evtdata.tdcdata[i], fname); |
- } |
- |
- int neve = (int) evtNum->GetNumber(); |
- int allEvt, zProg; |
- zProg = 1; |
- |
-#if WORKSTAT == 'I' |
-#else |
-// ONLY FOR TESTING! |
- TRandom *randNum = new TRandom(); |
- randNum->SetSeed(0); |
-// ONLY FOR TESTING! |
-#endif |
- |
- if (gDaq) |
- { |
- gDaq->fStop=0; |
- // Start gathering |
- gDaq->start(); |
- |
- busyLabel->Enable(); |
- |
- for (int n=0;n<neve && !gDaq->fStop ;/*n++*/) |
- { |
- int nb = gDaq->event(gBuf,BSIZE); |
- |
-#if WORKSTAT == 'I' |
-#else |
-// ONLY FOR TESTING! |
- for(int i=0; i < evtheader.nrch; i++) |
- { |
- if(i == 1) |
- gBuf[i] = randNum->Gaus(1500,300); |
- else if(i == 0) |
- gBuf[i] = randNum->Poisson(2500); |
- } |
-// ONLY FOR TESTING! |
-#endif |
- if (nb<=0) n--; |
- |
- int nc=0; |
- |
- while ( (nb>0) && (n<neve) ) |
- { |
- for(int i = 0; i < evtheader.nrch; i++) |
- { |
- unsigned short adc = gBuf[i+nc]&0xFFFF; |
- if(i % 2 == 0) // TDC |
- evtdata.tdcdata[i/2] = (int)adc; |
- else if(i % 2 == 1) // ADC |
- evtdata.adcdata[i/2] = (int)adc; |
- } |
- meas_data->Fill(); |
- |
- n++; |
- nc += evtheader.nrch; |
- nb -= evtheader.nrch; |
- } |
- |
- MyTimer(); |
- allEvt = n; |
- if (gSystem->ProcessEvents()) printf("Run Interrupted\n"); |
- |
- if( (started) && (n == (neve*zProg)/10) ) |
- { |
- progVal = (float)zProg*10; |
- curProgress->SetPosition(progVal); |
- zProg++; |
- } |
- } |
- |
- printf("Number of gathered events: %d\n", allEvt); |
- measStart->SetText("Start acquisition"); |
- started = kFALSE; |
- |
- gDaq->stop(); |
- } |
- |
- busyLabel->Disable(); |
- printf("End of Run neve=%d\n",neve); |
- |
- header_data->Write(); |
- meas_data->Write(); |
- delete header_data; |
- delete meas_data; |
- |
- outroot->Close(); |
-} |
- |
-// Start the acquisition |
-void TGAppMainFrame::StartAcq() |
-{ |
- // Determine the type of measurement to perform |
- int vscan = 0, pscan = 0, zscan = 0; |
- if(voltscanOn->IsOn()) vscan = 1; |
- if(surfscanOn->IsOn()) pscan = 1; |
- if(zscanOn->IsOn()) zscan = 1; |
- |
- char cmd[256]; |
- int i, j, k; |
- float progVal; |
- FILE *pfin; |
- |
- // Variables for voltage scan |
- float currentVoltage, minVoltage, maxVoltage, stepVoltage; |
- int repetition; |
- |
- // Variables for surface scan |
- int minXpos, maxXpos, stepXpos; |
- int minYpos, maxYpos, stepYpos; |
- int minZpos, maxZpos, stepZpos; |
- int repetX, repetY, repetZ; |
- |
- // Voltage scan |
- if( (vscan == 1) && (pscan == 0) ) |
- { |
- if(started) |
- { |
- printf("Stopping current voltage scan...\n"); |
- gROOT->SetInterrupt(); |
- measStart->SetText("Start acquisition"); |
- started = kFALSE; |
- |
- pfin = fopen("finish_sig.txt","w"); |
- fprintf(pfin, "%s: Voltage scan stopped.", timeStamp->GetText()); |
- fclose(pfin); |
- } |
- else if(!started) |
- { |
- measStart->SetText("Stop acquisition"); |
- started = kTRUE; |
- |
- printf("Running a voltage scan...\n"); |
- |
- minVoltage = vOutStart->GetNumber(); |
- maxVoltage = vOutStop->GetNumber(); |
- stepVoltage = vOutStep->GetNumber(); |
- |
- if(stepVoltage == 0.) |
- repetition = 1; |
- else |
- repetition = ((maxVoltage - minVoltage)/stepVoltage)+1; |
- |
- for(i=0; i < repetition; i++) |
- { |
- progVal = (float)(100.00/repetition)*i; |
- curProgress->SetPosition(progVal); |
- |
- fflush(stdout); |
- currentVoltage = minVoltage + stepVoltage*i; |
- sprintf(cmd, "%s/mpod/mpod_voltage.sh -o %d -v %f -s 1", rootdir, GetChannel(), currentVoltage); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- printf("Waiting for voltage change...\n"); |
- sleep(5); |
- vOut->SetNumber(currentVoltage); |
- printf("Continuing...\n"); |
- |
- // Here comes function to start histogramming <<<<<<<<<<<<<<<<<<<<<<<< |
- RunMeas((void*)0, i, 0); |
- fflush(stdout); |
- } |
- |
- // Set output back to off |
- fflush(stdout); |
- printf("Measurement finished, returning to starting voltage...\n"); |
- sprintf(cmd, "%s/mpod/mpod_voltage.sh -o %d -v %f -s 1", rootdir, GetChannel(), minVoltage); |
- vOut->SetNumber(minVoltage); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- progVal = 100.00; |
- curProgress->SetPosition(progVal); |
- printf("\n"); |
- |
- pfin = fopen("finish_sig.txt","w"); |
- fprintf(pfin, "%s: Voltage scan finished.", timeStamp->GetText()); |
- fclose(pfin); |
- } |
- } |
- // Surface scan |
- else if( (pscan == 1) && (vscan == 0) ) |
- { |
- minXpos = xPosMin->GetNumber(); |
- maxXpos = xPosMax->GetNumber(); |
- stepXpos = xPosStep->GetNumber(); |
- minYpos = yPosMin->GetNumber(); |
- maxYpos = yPosMax->GetNumber(); |
- stepYpos = yPosStep->GetNumber(); |
- minZpos = zPosMin->GetNumber(); |
- maxZpos = zPosMax->GetNumber(); |
- stepZpos = zPosStep->GetNumber(); |
- |
- if(zscan == 1) |
- { |
- if(stepZpos == 0.) repetZ = 1; |
- else repetZ = ((maxZpos - minZpos)/stepZpos)+1; |
- } |
- else |
- { |
- minZpos = zPos->GetNumber(); |
- repetZ = 1; |
- } |
- |
- if(stepXpos == 0.) repetX = 1; |
- else repetX = ((maxXpos - minXpos)/stepXpos)+1; |
- if(stepYpos == 0.) repetY = 1; |
- else repetY = ((maxYpos - minYpos)/stepYpos)+1; |
- |
- for(k=0; k < repetZ; k++) |
- { |
- fflush(stdout); |
- // Y-axis change |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir, minZpos + stepZpos*k, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- printf("Next Z position...\n"); |
- zPos->SetNumber(minZpos + stepZpos*k); |
- fflush(stdout); |
- |
- for(j=0; j < repetY; j++) |
- { |
- fflush(stdout); |
- // Y-axis change |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir, minYpos + stepYpos*j, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- sleep(4); |
- printf("Next Y position...\n"); |
- yPos->SetNumber(minYpos + stepYpos*j); |
- fflush(stdout); |
- |
- for(i=0; i < repetX; i++) |
- { |
- progVal = (float)(100.00/(repetX*repetY))*(j*repetX+i); |
- curProgress->SetPosition(progVal); |
- |
- // X-axis change |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir, minXpos + stepXpos*i, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- printf("Next X position...\n"); |
- fflush(stdout); |
- |
- printf("Waiting for position change...\n"); |
- sleep(2); |
- xPos->SetNumber(minXpos + stepXpos*i); |
- printf("Continuing...\n"); |
- |
-// for (k=0;k<(NTDCCH+NADCCH);k++) gHisto1D[k]->Reset(); |
-// for (k=0;k<(NTDCCH+NADCCH)/2;k++) gHisto2D[k]->Reset(); |
- |
- // Here comes function to start histogramming <<<<<<<<<<<<<<<<<<<<<<<< |
- RunMeas((void*)0, (j*repetX + i), zscan ); |
- |
- fflush(stdout); |
- } |
- |
- printf("\n"); |
- } |
- } |
- |
- fflush(stdout); |
- printf("Measurement finished, returning to starting position...\n"); |
- // X-axis return |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir, minXpos, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- fflush(stdout); |
- |
- // Y-axis return |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir, minYpos, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- |
- // Z-axis return |
- sprintf(cmd, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir, minZpos, rootdir); |
-#if WORKSTAT == 'I' |
- retTemp = system(cmd); |
-#else |
- printf("Cmd: %s\n",cmd); |
-#endif |
- xPos->SetNumber(minXpos); |
- yPos->SetNumber(minYpos); |
- zPos->SetNumber(minZpos); |
- |
- progVal = 100.00; |
- curProgress->SetPosition(progVal); |
- printf("\n"); |
- |
- pfin = fopen("finish_sig.txt","w"); |
- fprintf(pfin, "%s: Surface scan finished.", timeStamp->GetText()); |
- fclose(pfin); |
- } |
- // Normal single measurement |
- else if( (vscan == 0) && (pscan == 0) ) |
- { |
- // Set the start button to stop and enable stopping of measurement |
- if(started) |
- { |
- printf("Stopping current single scan...\n"); |
- gROOT->SetInterrupt(); |
-// gDaq->fStop=1; |
- measStart->SetText("Start acquisition"); |
- started = kFALSE; |
- } |
- else if(!started) |
- { |
- measStart->SetText("Stop acquisition"); |
- started = kTRUE; |
- |
- printf("Running a single scan...\n"); |
- RunMeas((void*)0, 0, 0); |
- printf("Measurement finished...\n"); |
- printf("\n"); |
- } |
- } |
-} |
- |
-// File browser for opening histograms |
-void TGAppMainFrame::SelectDirectory() |
-{ |
- int i = fileList->GetNumberOfEntries(); |
- |
- TGFileInfo file_info; |
- const char *filetypes[] = {"Histograms",histExtAll,0,0}; |
- file_info.fFileTypes = filetypes; |
- file_info.fIniDir = StrDup("./results"); |
- file_info.fMultipleSelection = kTRUE; |
- new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDOpen, &file_info); |
- |
- TList *files = file_info.fFileNamesList; |
- if(files) |
- { |
- TSystemFile *file; |
- TString fname; |
- TIter next(files); |
- while(file=(TSystemFile*)next()) |
- { |
- fname = file->GetName(); |
- fileList->AddEntry(fname.Data(), i); |
- i++; |
- } |
- } |
- fileList->Layout(); |
-} |
- |
-// File browser for selecting the save file |
-void TGAppMainFrame::SaveFile() |
-{ |
- TGFileInfo file_info; |
- const char *filetypes[] = {"Histograms",histExtAll,0,0}; |
- file_info.fFileTypes = filetypes; |
- file_info.fIniDir = StrDup("./results"); |
- new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDSave, &file_info); |
- |
- fileName->SetText(file_info.fFilename); |
-} |
- |
-// Toggle multiple selection in filelist |
-void TGAppMainFrame::ListMultiSelect() |
-{ |
- fileList->SetMultipleSelections((multiSelect->IsOn())); |
- |
- if(multiSelectAll->IsDown()) |
- multiSelectAll->SetState(kButtonUp); |
-} |
- |
-// Select all entries in filelist |
-void TGAppMainFrame::ListSelectAll() |
-{ |
- if(multiSelectAll->IsDown()) |
- { |
- multiSelect->SetState(kButtonDown); |
- fileList->SetMultipleSelections((multiSelect->IsOn())); |
- for(int i = 0; i < fileList->GetNumberOfEntries(); i++) |
- fileList->Select(i,kTRUE); |
- } |
- else if(!multiSelectAll->IsDown()) |
- { |
- multiSelect->SetState(kButtonUp); |
- fileList->SetMultipleSelections((multiSelect->IsOn())); |
- for(int i = 0; i < fileList->GetNumberOfEntries(); i++) |
- fileList->Select(i,kFALSE); |
- } |
-} |
- |
-// Navigation buttons for the filelist (<<, >>) and double click |
-void TGAppMainFrame::FileListNavigation(int pn) |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- int curSel; |
- TList *files; |
- if( nrfiles > 0 ) |
- { |
- if(pn < -1) |
- { |
- if(multiSelect->IsOn()) |
- { |
- // turn off multiple selection and select first file on list |
- fileList->SetMultipleSelections(kFALSE); |
- multiSelect->SetState(kButtonUp); |
- multiSelectAll->SetState(kButtonUp); |
- |
- fileList->Select(0,kTRUE); |
- } |
- else |
- { |
- // if nothing is selected, curSel will be -1 |
- curSel = fileList->GetSelected(); |
- // go to next file on list |
- if(pn == -3) |
- { |
- if( (curSel == (int)(nrfiles-1)) || (curSel == -1) ) |
- fileList->Select(0); |
- else |
- fileList->Select(curSel+1); |
- } |
- // go to previous file on list |
- else if(pn == -2) |
- { |
- if( (curSel == 0) || (curSel == -1) ) |
- fileList->Select(nrfiles-1); |
- else |
- fileList->Select(curSel-1); |
- } |
- } |
- } |
- |
- // check the newly selected file/files and return its name/their names |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- if(files) |
- { |
- for(int i = 0; i < (int)nrfiles; i++) |
- { |
- if(files->At(i)) |
- { |
- if(debugSig) |
- printf("Filename: %s\n", files->At(i)->GetTitle()); |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2); |
- } |
- } |
- } |
- |
- // Still need to include drawing of histograms we move to!!! |
- } |
-} |
- |
-// Display the currently selected histogram in file list |
-void TGAppMainFrame::DisplayHistogram(char* histfile, int histtype) |
-{ |
- if(debugSig) |
- printf("Selected file: %s\n", histfile); |
- |
- TCanvas *gCanvas = histCanvas->GetCanvas(); |
- |
- inroot = new TFile(histfile, "READ"); |
- |
- TTree *header_data, *meas_data; |
- inroot->GetObject("header_data", header_data); |
- inroot->GetObject("meas_data", meas_data); |
- |
- // Reading the header |
- header_data->SetBranchAddress("nrch", &evtheader.nrch); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("timestamp", &evtheader.timestamp); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("xpos", &evtheader.xpos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("ypos", &evtheader.ypos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("zpos", &evtheader.zpos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("temperature", &evtheader.temperature); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo); |
- header_data->GetEntry(0); |
- |
- char histtime[256]; |
- GetTime(evtheader.timestamp, histtime); |
- |
- if(debugSig) |
- { |
- printf("Opened file header information:\n"); |
- printf("- Number of channels: %d\n", evtheader.nrch); |
- printf("- Timestamp: %d (%s)\n", evtheader.timestamp, histtime); |
- printf("- Bias voltage: %lf\n", evtheader.biasvolt); |
- printf("- Table position (X,Y,Z): %d, %d, %d\n", evtheader.xpos, evtheader.ypos, evtheader.zpos); |
- printf("- Temperature: %lf\n", evtheader.temperature); |
- printf("- Laser and filter settings: %s\n", evtheader.laserinfo); |
- } |
- |
- int j; |
- char rdc[256]; |
- char rdcsel[256]; |
- |
- j = selectCh->GetNumber(); |
- |
- printf("Found %d data points.\n", (int)meas_data->GetEntries()); |
- |
- gCanvas->cd(); |
- double range[4]; |
- range[0] = adcMinRange->GetNumber(); |
- range[1] = adcMaxRange->GetNumber(); |
- range[2] = tdcMinwindow->GetNumber(); |
- range[3] = tdcMaxwindow->GetNumber(); |
- |
- if(histtype == 0) |
- { |
- if( range[0] == range[1] ) |
- sprintf(rdc, "ADC%d>>%s", j, histname); |
- else |
- sprintf(rdc, "ADC%d>>%s(%d,%lf,%lf)", j, histname, (int)(range[1]-range[0]), range[0]-0.5, range[1]-0.5); |
- |
- sprintf(rdcsel, "(TDC%d>%lf)&&(TDC%d<%lf)", j, range[2]*tdctimeconversion, j, range[3]*tdctimeconversion); |
- meas_data->Draw(rdc, rdcsel); |
- |
- sprintf(rdc, "ADC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);ADC;", j, evtheader.biasvolt, range[2], range[3]); |
- TH1F *histtemp = (TH1F*)gCanvas->GetPrimitive(histname); |
- if(!cleanPlots) |
- histtemp->SetTitle(rdc); |
- else |
- histtemp->SetTitle(";ADC;"); |
- histtemp->GetXaxis()->SetLabelSize(0.025); |
- histtemp->GetXaxis()->CenterTitle(kTRUE); |
- histtemp->GetYaxis()->SetLabelSize(0.025); |
- if(cleanPlots) |
- { |
- TGaxis *yax = (TGaxis*)histtemp->GetYaxis(); |
- yax->SetMaxDigits(4); |
- } |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- if( yMinRange->GetNumber() != yMaxRange->GetNumber() ) |
- { |
- if( (logscale->IsDown()) && (yMinRange->GetNumber() <= 0) ) |
- { |
- histtemp->GetYaxis()->SetRangeUser(0.5, yMaxRange->GetNumber()); |
- yMinRange->SetNumber(0.5); |
- logchange = 1; |
- } |
- else |
- { |
- gCanvas->SetLogy(kFALSE); |
- if(logchange == 1) |
- { |
- yMinRange->SetNumber(0.0); |
- logchange = 0; |
- } |
- histtemp->GetYaxis()->SetRangeUser(yMinRange->GetNumber(), yMaxRange->GetNumber()); |
- } |
- } |
- |
- TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats"); |
- if(!cleanPlots) |
- { |
- stats->SetX1NDC(0.84); stats->SetX2NDC(0.97); |
- stats->SetY1NDC(0.87); stats->SetY2NDC(0.97); |
- } |
- else |
- { |
- stats->SetX1NDC(1.1); stats->SetX2NDC(1.3); |
- stats->SetY1NDC(1.1); stats->SetY2NDC(1.3); |
- } |
- } |
- else if(histtype == 1) |
- { |
- if( range[0] == range[1] ) |
- sprintf(rdc, "(TDC%d/%lf)>>%s", j, tdctimeconversion, histname); |
- else |
- sprintf(rdc, "(TDC%d/%lf)>>%s(%d,%lf,%lf)", j, tdctimeconversion, histname, (int)((range[3]-range[2])*tdctimeconversion), range[2], range[3]); |
- sprintf(rdcsel, "(TDC%d>%lf)&&(TDC%d<%lf)", j, range[2]*tdctimeconversion, j, range[3]*tdctimeconversion); |
- meas_data->Draw(rdc, rdcsel); |
- |
- sprintf(rdc, "TDC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);Time (TDC channel) [ns];", j, evtheader.biasvolt, range[2], range[3]); |
- TH1F *histtemp = (TH1F*)gCanvas->GetPrimitive(histname); |
- if(!cleanPlots) |
- histtemp->SetTitle(rdc); |
- else |
- histtemp->SetTitle(";Time (TDC channel) [ns];"); |
- histtemp->GetXaxis()->SetLabelSize(0.025); |
- histtemp->GetXaxis()->CenterTitle(kTRUE); |
- histtemp->GetYaxis()->SetLabelSize(0.025); |
- if(cleanPlots) |
- { |
- TGaxis *yax = (TGaxis*)histtemp->GetYaxis(); |
- yax->SetMaxDigits(4); |
- } |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- if( yMinRange->GetNumber() != yMaxRange->GetNumber() ) |
- { |
- if( (logscale->IsDown()) && (yMinRange->GetNumber() <= 0) ) |
- { |
- histtemp->GetYaxis()->SetRangeUser(0.5, yMaxRange->GetNumber()); |
- yMinRange->SetNumber(0.5); |
- logchange = 1; |
- } |
- else |
- { |
- gCanvas->SetLogy(kFALSE); |
- if(logchange == 1) |
- { |
- yMinRange->SetNumber(0.0); |
- logchange = 0; |
- } |
- histtemp->GetYaxis()->SetRangeUser(yMinRange->GetNumber(), yMaxRange->GetNumber()); |
- } |
- } |
- |
- TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats"); |
- if(!cleanPlots) |
- { |
- stats->SetX1NDC(0.84); stats->SetX2NDC(0.97); |
- stats->SetY1NDC(0.87); stats->SetY2NDC(0.97); |
- } |
- else |
- { |
- stats->SetX1NDC(1.1); stats->SetX2NDC(1.3); |
- stats->SetY1NDC(1.1); stats->SetY2NDC(1.3); |
- } |
- } |
- else if(histtype == 2) |
- { |
- if( ((range[0] == range[1]) && (range[2] == range[3])) || (range[2] == range[3]) || (range[0] == range[1]) ) |
- sprintf(rdc, "(TDC%d/%lf):ADC%d>>%s", j, tdctimeconversion, j, histname); |
- else |
- sprintf(rdc, "(TDC%d/%lf):ADC%d>>%s(%d,%lf,%lf,%d,%lf,%lf)", j, tdctimeconversion, j, histname, (int)(range[1]-range[0])/2, range[0]-0.5, range[1]-0.5, (int)((range[3]-range[2])*tdctimeconversion)/2, range[2], range[3]); |
- meas_data->Draw(rdc,"","COLZ"); |
- |
- sprintf(rdc, "ADC/TDC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);ADC;TDC", j, evtheader.biasvolt, range[2], range[3]); |
- TH2F *histtemp = (TH2F*)gCanvas->GetPrimitive(histname); |
- if(!cleanPlots) |
- histtemp->SetTitle(rdc); |
- else |
- histtemp->SetTitle(";ADC;Time (TDC channel) [ns]"); |
- histtemp->GetXaxis()->SetLabelSize(0.025); |
- histtemp->GetXaxis()->CenterTitle(kTRUE); |
- histtemp->GetYaxis()->SetLabelSize(0.025); |
- histtemp->GetYaxis()->CenterTitle(kTRUE); |
- histtemp->GetYaxis()->SetTitleOffset(1.35); |
- if(cleanPlots) |
- { |
- TGaxis *yax = (TGaxis*)histtemp->GetYaxis(); |
- yax->SetMaxDigits(4); |
- } |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats"); |
-// stats->SetOptStat(0); |
- stats->SetX1NDC(1.1); stats->SetX2NDC(1.3); |
- stats->SetY1NDC(1.1); stats->SetY2NDC(1.3); |
- |
- TPaletteAxis *gpalette = (TPaletteAxis*)histtemp->GetListOfFunctions()->FindObject("palette"); |
- gpalette->SetLabelSize(0.022); |
- } |
- |
- if(histtype < 2) |
- { |
- if( logscale->IsDown() ) |
- gCanvas->SetLogy(kTRUE); |
- else if( !logscale->IsDown() ) |
- gCanvas->SetLogy(kFALSE); |
- } |
- else |
- gCanvas->SetLogy(kFALSE); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- // If you close the opened file, the data can't be accessed by other functions |
-} |
- |
-// Create a 2D surface plot and plot it |
-void TGAppMainFrame::MakeSurfPlot(TList *files) |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- int j, k = 0, m = 0, n = 0; |
- char ctemp[256]; |
- TCanvas *gCanvas = histCanvas->GetCanvas(); |
- TTree *header_data, *meas_data; |
- double *integralCount; |
- double *surfx, *surfy; |
- double xsurfmin = 0, ysurfmin = 0; |
- integralCount = new double[nrfiles]; |
- for(int i = 0; i < (int)nrfiles; i++) integralCount[i] = 0; |
- surfx = new double[nrfiles]; |
- surfy = new double[nrfiles]; |
- int nrentries; |
- TGraph2D *gScan2D; |
- gScan2D = new TGraph2D(); |
- |
-/* int zProg = 0; |
- float progVal; |
- curProgress->SetPosition(zProg);*/ |
- |
- char exportname[256]; |
- |
- if(multiSelect->IsOn()) |
- { |
- printf("Creating a surface plot. Please wait...\n"); |
- fileList->GetSelectedEntries(files); |
- if(files) |
- { |
- busyLabel->Enable(); |
- |
- for(int i = 0; i < (int)nrfiles; i++) |
- { |
- if(files->At(i)) |
- { |
- n++; |
-// printf("Filename: %s\n", files->At(i)->GetTitle()); |
- |
- sprintf(ctemp, "%s", files->At(i)->GetTitle()); |
- inroot = new TFile(ctemp, "READ"); |
- |
- inroot->GetObject("header_data", header_data); |
- inroot->GetObject("meas_data", meas_data); |
- |
- // Reading the header |
- header_data->SetBranchAddress("xpos", &evtheader.xpos); |
- header_data->GetEntry(0); |
- header_data->SetBranchAddress("ypos", &evtheader.ypos); |
- header_data->GetEntry(0); |
- |
- char rdc[256]; |
- j = selectCh->GetNumber(); |
- double rangetdc[2]; |
- rangetdc[0] = tdcMinwindow->GetNumber(); |
- rangetdc[1] = tdcMaxwindow->GetNumber(); |
- |
- k = 0; |
- m = 0; |
- |
- // Reading the data |
- for(int i = 0; i < meas_data->GetEntries(); i++) |
- { |
- sprintf(rdc, "ADC%d", j); |
- meas_data->SetBranchAddress(rdc, &evtdata.adcdata[j]); |
- meas_data->GetEntry(i); |
- |
- sprintf(rdc, "TDC%d", j); |
- meas_data->SetBranchAddress(rdc, &evtdata.tdcdata[j]); |
- meas_data->GetEntry(i); |
- |
- // If our data point is inside the TDC window |
- if( ((double)evtdata.tdcdata[j]/tdctimeconversion >= rangetdc[0]) && ((double)evtdata.tdcdata[j]/tdctimeconversion <= rangetdc[1]) ) |
- { |
- k++; |
- m += evtdata.adcdata[j]; |
- } |
- } |
- |
- integralCount[n-1] += ((double)m)/((double)k); |
- if(n == 1) |
- { |
- xsurfmin = evtheader.xpos; |
- ysurfmin = evtheader.ypos; |
- } |
- surfx[n-1] = (double)(evtheader.xpos-xsurfmin)*lenconversion; |
- surfy[n-1] = (double)(evtheader.ypos-ysurfmin)*lenconversion; |
- |
-/* if( n == (((files->GetSize())*zProg)/20)+1 ) // divide by 20 because files->GetSize() gives a double value of the files selected |
- { |
- progVal = (float)n; |
- curProgress->SetPosition(progVal); |
- zProg++; |
- printf("Progress = %lf\n", progVal); |
- }*/ |
- |
- delete inroot; |
- } |
- } |
- |
- busyLabel->Disable(); |
- |
- nrentries = n; |
- printf("%d files were selected.\n", nrentries); |
- |
- for(int i = 0; i < nrentries; i++) |
- { |
-// printf("At position (%d,%d), the ADC integral is: %lf.\n", surfx[i], surfy[i], integralCount[i]); |
- gScan2D->SetPoint(i, surfx[i], surfy[i], integralCount[i]); |
- } |
- gCanvas->cd(); |
- gScan2D->Draw("COLZ"); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- gScan2D->GetXaxis()->SetTitle("X [#mum]"); |
- gScan2D->GetXaxis()->CenterTitle(kTRUE); |
- gScan2D->GetXaxis()->SetLabelSize(0.022); |
- gScan2D->GetXaxis()->SetRangeUser(surfx[0], surfx[nrentries-1]); |
-// j = 500+(int)((surfx[nrentries-1]-surfx[0])/(surfx[1]-surfx[0])); |
-// if(j > 510) j = 510; |
- gScan2D->GetXaxis()->SetNdivisions(510, kTRUE); |
- gScan2D->GetYaxis()->SetTitle("Y [#mum]"); |
- gScan2D->GetYaxis()->SetTitleOffset(1.3); |
- gScan2D->GetYaxis()->CenterTitle(kTRUE); |
- gScan2D->GetYaxis()->SetLabelSize(0.022); |
- gScan2D->GetYaxis()->SetRangeUser(surfy[0], surfy[nrentries-1]); |
-// j = 500+(int)((surfy[nrentries-1]-surfy[0])/(surfy[(int)((surfx[nrentries-1]-surfx[0])/(surfx[1]-surfx[0])+1)]-surfy[0])); |
-// if(j > 510) j = 510; |
- gScan2D->GetYaxis()->SetNdivisions(510, kTRUE); |
- |
- TGaxis *yax = (TGaxis*)gScan2D->GetYaxis(); |
- yax->SetMaxDigits(4); |
- |
- if(!cleanPlots) |
- gScan2D->SetTitle("Surface scan"); |
- else |
- gScan2D->SetTitle(); |
- |
-// TPaletteAxis *gpalette = (TPaletteAxis*)gScan2D->GetListOfFunctions()->FindObject("palette"); |
-// gpalette->SetLabelSize(0.022); |
- |
- gCanvas->Modified(); |
- gCanvas->Update(); |
- |
- remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp); |
- sprintf(exportname, "%s_surfscan.pdf", ctemp); |
- gCanvas->SaveAs(exportname); |
- } |
- } |
- else |
- { |
- printf("To make a 2D surface scan plot, select multiple root files.\n"); |
- change2Dsurf->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF); |
- } |
- |
- delete[] surfx; |
- delete[] surfy; |
- delete[] integralCount; |
-} |
- |
-// Change histogram when changing the channel |
-void TGAppMainFrame::ChangeChannel() |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- TList *files; |
- |
- if( nrfiles > 0 ) |
- { |
- // check the newly selected file/files and return its name/their names |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- if(files) |
- { |
- for(int i = 0; i < (int)nrfiles; i++) |
- { |
- if(files->At(i)) |
- { |
- if(debugSig) |
- printf("Filename: %s\n", files->At(i)->GetTitle()); |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2); |
- } |
- } |
- } |
- } |
-} |
- |
-// Setting a predetermined X range |
-void TGAppMainFrame::SetHistRange() |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- |
- if(nrfiles > 0) |
- { |
- TList *files; |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- if(files) |
- { |
- for(int i = 0; i < (int)nrfiles; i++) |
- { |
- if(files->At(i)) |
- { |
- if(debugSig) |
- printf("Filename: %s\n", files->At(i)->GetTitle()); |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1); |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) ) |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2); |
- } |
- } |
- } |
- } |
-} |
- |
-// Changing the histogram type to display |
-void TGAppMainFrame::ChangeHisttype(int type) |
-{ |
- TGTextButton *pressedB = new TGTextButton(); |
- int menuID = 0; |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- |
- // ADC histogram |
- if(type == 0) |
- { |
- pressedB = changeADC; |
- menuID = M_ANALYSIS_HISTTYPE_1DADC; |
- |
- changeTDC->SetDown(kFALSE); |
- changeADCTDC->SetDown(kFALSE); |
- change2Dsurf->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF); |
- } |
- // TDC histogram |
- else if(type == 1) |
- { |
- pressedB = changeTDC; |
- menuID = M_ANALYSIS_HISTTYPE_1DTDC; |
- |
- changeADC->SetDown(kFALSE); |
- changeADCTDC->SetDown(kFALSE); |
- change2Dsurf->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF); |
- } |
- // ADC vs. TDC histogram |
- else if(type == 2) |
- { |
- pressedB = changeADCTDC; |
- menuID = M_ANALYSIS_HISTTYPE_2D; |
- |
- changeADC->SetDown(kFALSE); |
- changeTDC->SetDown(kFALSE); |
- change2Dsurf->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF); |
- } |
- // Surface scan plot |
- else if(type == 3) |
- { |
- pressedB = change2Dsurf; |
- menuID = M_ANALYSIS_HISTTYPE_SURF; |
- |
- changeADC->SetDown(kFALSE); |
- changeTDC->SetDown(kFALSE); |
- changeADCTDC->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC); |
- fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D); |
- } |
- |
- if( fMenuHisttype->IsEntryChecked(menuID) ) |
- { |
- pressedB->SetDown(kFALSE); |
- fMenuHisttype->UnCheckEntry(menuID); |
- } |
- else if( !fMenuHisttype->IsEntryChecked(menuID) ) |
- { |
- pressedB->SetDown(kTRUE); |
- fMenuHisttype->CheckEntry(menuID); |
- } |
- |
- if(nrfiles > 0) |
- { |
- // Still need to add the switch!!! |
- TList *files; |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- |
- if(type < 3) |
- DisplayHistogram( (char*)(files->At(0)->GetTitle()), type); |
- else if(type == 3) |
- MakeSurfPlot( files ); |
- } |
-} |
- |
-// Changing the histogram type to display |
-void TGAppMainFrame::HistogramExport() |
-{ |
- unsigned int nrfiles = fileList->GetNumberOfEntries(); |
- TList *files; |
- TCanvas *gCanvas = histCanvas->GetCanvas(); |
- |
- char exportname[256]; |
- char ctemp[256]; |
- |
- if(nrfiles > 0) |
- { |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- if(files) |
- { |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_SURF) ) // for the surface scan, the plot from all selected files is already created |
- { |
- remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp); |
- sprintf(exportname, "%s_surfscan.pdf", ctemp); |
- gCanvas->SaveAs(exportname); |
- } |
- else |
- { |
- for(int i = 0; i < (int)nrfiles; i++) |
- { |
- if(files->At(i)) |
- { |
- remove_ext((char*)files->At(i)->GetTitle(), ctemp); |
- |
- if(debugSig) |
- printf("Filename: %s\n", files->At(i)->GetTitle()); |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) ) |
- { |
- sprintf(exportname, "%s_adc%d.pdf", ctemp, (int)selectCh->GetNumber()); |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0); |
- } |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) ) |
- { |
- sprintf(exportname, "%s_tdc%d.pdf", ctemp, (int)selectCh->GetNumber()); |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1); |
- } |
- else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) ) |
- { |
- sprintf(exportname, "%s_adctdc%d.pdf", ctemp, (int)selectCh->GetNumber()); |
- DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2); |
- } |
- |
- gCanvas->SaveAs(exportname); |
- } |
- } |
- } |
- } |
- } |
-} |
- |
-//--------------------------------------------------------------- |
-// Main window constructor definition (& layout) |
- |
-TGAppMainFrame::TGAppMainFrame(const TGWindow *p, int w, int h) |
-{ |
- gDaq = new daq(); |
- gScopeDaq = new daqscope(); |
- |
- // Define the main window and menubar |
- fMain = new TGMainFrame(p, w, h, kVerticalFrame); // vertical frame split into menubar and main frame |
- fMenuBar = new TGMdiMenuBar(fMain, 10, 10); // just prepare menubar, draw it with InitMenu() |
- fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX)); |
- |
- // Define the main frame where opened subwindows will appear |
- fMainFrame = new TGMdiMainFrame(fMain, fMenuBar, 300, 300); |
- fMain->AddFrame(fMainFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); |
- |
- // Initialize the menubar the initial measurement layout subwindows and display the main window |
- InitMenu(); |
- MeasurementLayout(); |
- fMain->SetWindowName(WINDOW_NAME); |
- fMain->MapSubwindows(); |
- fMain->MapWindow(); |
- fMain->Layout(); |
- GetPosition(); |
- GetVoltOut(); |
-} |
- |
-//--------------------------------------------------------------- |
-// Event handler for menubar actions |
- |
-void TGAppMainFrame::HandleMenu(Int_t id) |
-{ |
- TList *files; |
- |
- switch (id) { |
- case M_FILE_NEW: |
- // Clear any values and histogram |
- break; |
- |
- case M_FILE_EXIT: |
- CloseWindow(); |
- break; |
- |
- case M_ANALYSIS_HISTTYPE_1DADC: |
- // Toggles the ADC button |
- ChangeHisttype(0); |
- break; |
- |
- case M_ANALYSIS_HISTTYPE_1DTDC: |
- ChangeHisttype(1); |
- break; |
- |
- case M_ANALYSIS_HISTTYPE_2D: |
- ChangeHisttype(2); |
- break; |
- |
- case M_ANALYSIS_HISTTYPE_SURF: |
- ChangeHisttype(3); |
- break; |
- |
- case M_ANALYSIS_FIT: |
- // Fit spectrum |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- |
- if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) && (files->GetSize() > 0) ) |
- FitSpectrum(files, 1); |
- break; |
- |
- case M_ANALYSIS_FITSEL: |
- // Fit all spectra |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- |
- if( (fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC)) && (files->GetSize() > 1) ) |
- FitSpectrum(files, files->GetSize()); |
- break; |
- |
- case M_ANALYSIS_INTEGX: |
- // Integrate the current spectra |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- |
- IntegSpectrum(files, 1); |
- break; |
- |
- case M_ANALYSIS_INTEGY: |
- // Integrate the current spectra |
- files = new TList(); |
- fileList->GetSelectedEntries(files); |
- |
- IntegSpectrum(files, 2); |
- break; |
- |
- case M_WINDOW_HOR: |
- fMainFrame->TileHorizontal(); |
- break; |
- |
- case M_WINDOW_VERT: |
- fMainFrame->TileVertical(); |
- break; |
- |
- case M_HELP_ABOUT: |
- About(); |
- break; |
- |
- default: |
- fMainFrame->SetCurrent(id); |
- break; |
- } |
-} |
- |
-//--------------------------------------------------------------- |
-// Initialize the main window menu |
- |
-void TGAppMainFrame::InitMenu() |
-{ |
- fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0); |
- |
- // Popup menu in menubar for File controls |
- fMenuFile = new TGPopupMenu(gClient->GetRoot()); // adds a new popup menu to the menubar |
- fMenuFile->AddEntry(new TGHotString("&New Measurement"), M_FILE_NEW); |
- fMenuFile->AddSeparator(); |
- fMenuFile->AddEntry(new TGHotString("E&xit"), M_FILE_EXIT); |
- |
- // Popup menu in menubar for Analysis controls |
- fMenuHisttype = new TGPopupMenu(gClient->GetRoot()); // adds a cascade menu that will be incorporated into analysis controls |
- fMenuHisttype->AddEntry(new TGHotString("1D &ADC histogram"), M_ANALYSIS_HISTTYPE_1DADC); |
- fMenuHisttype->AddEntry(new TGHotString("1D &TDC histogram"), M_ANALYSIS_HISTTYPE_1DTDC); |
- fMenuHisttype->AddEntry(new TGHotString("&2D ADC vs. TDC histogram"), M_ANALYSIS_HISTTYPE_2D); |
- fMenuHisttype->AddEntry(new TGHotString("2D &surface scan plot"), M_ANALYSIS_HISTTYPE_SURF); |
- |
- fMenuAnalysis = new TGPopupMenu(gClient->GetRoot()); // adds a new popup menu to the menubar |
- fMenuAnalysis->AddPopup(new TGHotString("&Histogram type"), fMenuHisttype); |
- |
- fMenuAnalysis->AddEntry(new TGHotString("&Fit spectrum"), M_ANALYSIS_FIT); |
- fMenuAnalysis->AddEntry(new TGHotString("Fit &all selected"), M_ANALYSIS_FITSEL); |
- fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&X direction)"), M_ANALYSIS_INTEGX); |
- fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&Y direction)"), M_ANALYSIS_INTEGY); |
- |
- // Popup menu in menubar for Window controls |
- fMenuWindow = new TGPopupMenu(gClient->GetRoot()); // adds a new popup menu to the menubar |
- fMenuWindow->AddEntry(new TGHotString("Tile &Horizontally"), M_WINDOW_HOR); |
- fMenuWindow->AddEntry(new TGHotString("Tile &Vertically"), M_WINDOW_VERT); |
- fMenuWindow->AddPopup(new TGHotString("&Windows"), fMainFrame->GetWinListMenu()); |
- |
- // Popup menu in menubar for Help controls |
- fMenuHelp = new TGPopupMenu(gClient->GetRoot()); |
- fMenuHelp->AddEntry(new TGHotString("&About"), M_HELP_ABOUT); |
- |
- // Connect all menu items with actions - handled by HandleMenu() |
- fMenuFile->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)"); |
- fMenuAnalysis->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)"); |
- fMenuWindow->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)"); |
- fMenuHelp->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)"); |
- |
- // Draw the created popup menus on the menubar |
- fMenuBar->AddPopup(new TGHotString("&File"), fMenuFile, fMenuBarItemLayout); |
- fMenuBar->AddPopup(new TGHotString("&Analysis"),fMenuAnalysis,fMenuBarItemLayout); |
- fMenuBar->AddPopup(new TGHotString("&Windows"),fMenuWindow,fMenuBarItemLayout); |
- fMenuBar->AddPopup(new TGHotString("&Help"), fMenuHelp, fMenuBarItemLayout); |
-} |
- |
-//--------------------------------------------------------------- |
-// Set the measurement subwindow layout |
- |
-void TGAppMainFrame::MeasurementLayout() |
-{ |
- TGMdiFrame *mdiFrame; |
- |
- // Generic horizontal and vertical frames |
- TGHorizontalFrame *fH1, *fH2, *fH3; |
- TGVerticalFrame *fV1; |
- TGGroupFrame *fG1; |
- TGLabel *lab; |
- TGCompositeFrame *fT1; |
- |
- // Sizes of internal group and subwindow structures |
- int subwin[2]; |
- int subgroup[2]; |
- |
-// Settings pane --------------------------------------------------------------------------- |
- subwin[0] = (winWidth/6)-5; subwin[1] = 3*((winHeight/5)-5)-10; |
- settingsPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]); |
- mdiFrame = settingsPane->GetMdiFrame(); |
- |
- // Check button to toggle voltage scan |
- voltscanOn = new TGCheckButton(mdiFrame, "Voltage scan ON/OFF"); |
- voltscanOn->Resize(50,22); |
- voltscanOn->SetState(kButtonUp); |
- mdiFrame->AddFrame(voltscanOn, f0centerx); |
- |
- // Check button to toggle surface scan |
- surfscanOn = new TGCheckButton(mdiFrame, "Surface scan ON/OFF"); |
- surfscanOn->Resize(50,22); |
- surfscanOn->SetState(kButtonUp); |
- mdiFrame->AddFrame(surfscanOn, f0centerx); |
- |
- // Check button to toggle Z direction scan |
- zscanOn = new TGCheckButton(mdiFrame, "Z-axis scan ON/OFF"); |
- zscanOn->Resize(50,22); |
- zscanOn->SetState(kButtonUp); |
- mdiFrame->AddFrame(zscanOn, f0centerx); |
- |
- // Check button to toggle (open) the histogram window |
-// histogramOn = new TGCheckButton(mdiFrame, "Histogram display ON/OFF"); |
-// histogramOn->Resize(50,22); |
-// histogramOn->SetState(kButtonUp); |
-// mdiFrame->AddFrame(histogramOn, f0centerx); |
- |
- subgroup[0] = subwin[0]-10; |
- // Hard limit for maximum voltage we can set |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Voltage limit:"); |
- fH1->AddFrame(lab, f0center2d); |
- vHardlimit = new TGNumberEntry(fH1, 70.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber); |
- vHardlimit->Resize(80,22); |
- fH1->AddFrame(vHardlimit, f0center2d); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- // Number of used channels |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Nr. of channels:"); |
- fH1->AddFrame(lab, f0center2d); |
- NCH = new TGNumberEntry(fH1, 1, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 8); |
- NCH->Resize(40,22); |
- fH1->AddFrame(NCH, f0center2d); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- // Check button to toggle plots with additional information or clean plots |
- cleanOn = new TGCheckButton(mdiFrame, "Clean plots ON/OFF"); |
- cleanOn->Resize(50,22); |
- cleanOn->SetState(kButtonDown); |
- cleanPlots = 1; |
- mdiFrame->AddFrame(cleanOn, f0centerx); |
- |
- // Button and textbox to enter the oscilloscope IP address |
- lab = new TGLabel(mdiFrame, "Scope IP:"); |
- mdiFrame->AddFrame(lab, f0); |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- oscIP = new TGTextEntry(fH1, "178.172.43.157"); |
- oscIP->Resize(110,22); |
- fH1->AddFrame(oscIP, f0); |
- oscConnect = new TGTextButton(fH1, "Connect"); |
- oscConnect->SetTextJustify(36); |
- oscConnect->SetWrapLength(-1); |
- oscConnect->Resize(60,22); |
- fH1->AddFrame(oscConnect, f0); |
- oscOn = 0; |
- mdiFrame->AddFrame(fH1, f2); |
- |
- // Laser settings (freq., tune, ND filter) |
- lab = new TGLabel(mdiFrame, "Laser settings:"); |
- mdiFrame->AddFrame(lab, f0); |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- laserInfo = new TGTextEntry(fH1, "kHz, tune, ND"); |
- fH1->AddFrame(laserInfo, f2); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- mdiFrame->SetMdiHints(kMdiMinimize); |
- mdiFrame->SetWindowName("Settings pane"); |
- mdiFrame->MapSubwindows(); |
- mdiFrame->Layout(); |
- mdiFrame->Move(0,0); |
-// Settings pane --------------------------------------------------------------------------- |
- |
-// Main window ----------------------------------------------------------------------------- |
- subwin[0] = 3*((winWidth/6)-5); subwin[1] = 3*((winHeight/5)-5)-10; |
- mainSubwindow = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]); |
- mdiFrame = mainSubwindow->GetMdiFrame(); |
- |
- // Voltage and position tab |
- subgroup[0] = 2*subwin[0]/5-12; |
- subgroup[1] = (subwin[1]+15)/2+5; |
- setTab = new TGTab(mdiFrame, subgroup[0], subgroup[1]); |
- |
- fT1 = setTab->AddTab("Voltage + Position"); |
- |
- fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight); |
- // Left pane (Bias voltage controls) |
- fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight); |
- fG1 = new TGGroupFrame(fV1, "Bias voltage controls"); |
- |
- // Output voltage supply channel |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "Output channel:"); |
- fH2->AddFrame(lab, f0center2d); |
- vOutCh = new TGComboBox(fH2, 200); |
- vOutCh->AddEntry("1", 0); |
- vOutCh->AddEntry("2", 1); |
- vOutCh->AddEntry("3", 2); |
- vOutCh->AddEntry("4", 3); |
- vOutCh->AddEntry("5", 4); |
- vOutCh->AddEntry("6", 5); |
- vOutCh->AddEntry("7", 6); |
- vOutCh->AddEntry("8", 7); |
- vOutCh->AddEntry("101", 8); |
- vOutCh->AddEntry("102", 9); |
- vOutCh->AddEntry("103", 10); |
- vOutCh->AddEntry("104", 11); |
- vOutCh->AddEntry("105", 12); |
- vOutCh->AddEntry("106", 13); |
- vOutCh->AddEntry("107", 14); |
- vOutCh->AddEntry("108", 15); |
- vOutCh->Resize(50,22); |
- vOutCh->Select(0); |
- fH2->AddFrame(vOutCh, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- // Output voltage setting |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "Output voltage:"); |
- fH2->AddFrame(lab, f0center2d); |
- vOut = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, 0, vHardlimit->GetNumber()); |
- vOut->Resize(80,22); |
- fH2->AddFrame(vOut, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- vOutOnOff = new TGCheckButton(fH2, "Output ON/OFF"); |
- vOutOnOff->Resize(subgroup[0]-10,22); |
- vOutOnOff->SetState(kButtonUp); |
- fH2->AddFrame(vOutOnOff, f0centerx); |
- fG1->AddFrame(fH2, f2); |
- |
- // Set, get and reset voltage buttons |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- fH3 = new TGHorizontalFrame(fH2, subgroup[0], 30); |
- vOutSet = new TGTextButton(fH3, "Set"); |
- vOutSet->SetTextJustify(36); |
- vOutSet->SetWrapLength(-1); |
- vOutSet->Resize(60,22); |
- fH3->AddFrame(vOutSet, f0); |
- vOutGet = new TGTextButton(fH3, "Get"); |
- vOutGet->SetTextJustify(36); |
- vOutGet->SetWrapLength(-1); |
- vOutGet->Resize(60,22); |
- fH3->AddFrame(vOutGet, f0); |
- vOutReset = new TGTextButton(fH3, "Reset"); |
- vOutReset->SetTextJustify(36); |
- vOutReset->SetWrapLength(-1); |
- vOutReset->Resize(60,22); |
- fH3->AddFrame(vOutReset, f0); |
- fH2->AddFrame(fH3, f0centerx); |
- fG1->AddFrame(fH2, f2); |
- |
- // Voltage scan controls |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "V (min):"); |
- fH2->AddFrame(lab, f0center2d); |
- vOutStart = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber); |
- vOutStart->Resize(80,22); |
- fH2->AddFrame(vOutStart, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "V (max):"); |
- fH2->AddFrame(lab, f0center2d); |
- vOutStop = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber); |
- vOutStop->Resize(80,22); |
- fH2->AddFrame(vOutStop, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "V (step):"); |
- fH2->AddFrame(lab, f0center2d); |
- vOutStep = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber); |
- vOutStep->Resize(80,22); |
- fH2->AddFrame(vOutStep, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fV1->AddFrame(fG1, f1); |
- // Left pane (Bias voltage controls) |
- fH1->AddFrame(fV1, f0); |
- |
- // Right pane (Table position controls) |
- subgroup[0] = 3*subwin[0]/5-12; |
- fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight); |
- fG1 = new TGGroupFrame(fV1, "Table position controls"); |
- |
- // X, Y and Z positions |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "X:"); |
- fH2->AddFrame(lab, f0center2d); |
- xPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- xPos->Resize(80,22); |
- fH2->AddFrame(xPos, f0center2d); |
- |
- lab = new TGLabel(fH2, "Z (min):"); |
- fH2->AddFrame(lab, f0center2d); |
- zPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000); |
- zPosMin->Resize(80,22); |
- fH2->AddFrame(zPosMin, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "Y:"); |
- fH2->AddFrame(lab, f0center2d); |
- yPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- yPos->Resize(80,22); |
- fH2->AddFrame(yPos, f0center2d); |
- |
- lab = new TGLabel(fH2, "Z (max):"); |
- fH2->AddFrame(lab, f0center2d); |
- zPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000); |
- zPosMax->Resize(80,22); |
- fH2->AddFrame(zPosMax, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0] ,30); |
- lab = new TGLabel(fH2, "Z:"); |
- fH2->AddFrame(lab, f0center2d); |
- zPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000); |
- zPos->Resize(80,22); |
- fH2->AddFrame(zPos, f0center2d); |
- |
- lab = new TGLabel(fH2, "Z (step):"); |
- fH2->AddFrame(lab, f0center2d); |
- zPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); |
- zPosStep->Resize(80,22); |
- fH2->AddFrame(zPosStep, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- // Set, Get and Home the table position |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- fH3 = new TGHorizontalFrame(fH2, subgroup[0], 30); |
- positionSet = new TGTextButton(fH3, "Set"); |
- positionSet->SetTextJustify(36); |
- positionSet->SetWrapLength(-1); |
- positionSet->Resize(60,22); |
- fH3->AddFrame(positionSet, f0); |
- positionGet = new TGTextButton(fH3, "Get"); |
- positionGet->SetTextJustify(36); |
- positionGet->SetWrapLength(-1); |
- positionGet->Resize(60,22); |
- fH3->AddFrame(positionGet, f0); |
- positionHome = new TGTextButton(fH3, "Home"); |
- positionHome->SetTextJustify(36); |
- positionHome->SetWrapLength(-1); |
- positionHome->Resize(60,22); |
- fH3->AddFrame(positionHome, f0); |
- fH2->AddFrame(fH3, f0centerx); |
- fG1->AddFrame(fH2, f2); |
- |
- // Position scan controls |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "X (min):"); |
- fH2->AddFrame(lab, f0center2d); |
- xPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- xPosMin->Resize(80,22); |
- fH2->AddFrame(xPosMin, f0center2d); |
- |
- lab = new TGLabel(fH2, "Y (min):"); |
- fH2->AddFrame(lab, f0center2d); |
- yPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- yPosMin->Resize(80,22); |
- fH2->AddFrame(yPosMin, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "X (max):"); |
- fH2->AddFrame(lab, f0center2d); |
- xPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- xPosMax->Resize(80,22); |
- fH2->AddFrame(xPosMax, f0center2d); |
- |
- lab = new TGLabel(fH2, "Y (max):"); |
- fH2->AddFrame(lab, f0center2d); |
- yPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000); |
- yPosMax->Resize(80,22); |
- fH2->AddFrame(yPosMax, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "X (step):"); |
- fH2->AddFrame(lab, f0center2d); |
- xPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); |
- xPosStep->Resize(80,22); |
- fH2->AddFrame(xPosStep, f0center2d); |
- |
- lab = new TGLabel(fH2, "Y (step):"); |
- fH2->AddFrame(lab, f0center2d); |
- yPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); |
- yPosStep->Resize(80,22); |
- fH2->AddFrame(yPosStep, f0center2d); |
- fG1->AddFrame(fH2, f2); |
- |
- fV1->AddFrame(fG1, f1); |
- // Right pane (Table position controls) |
- fH1->AddFrame(fV1, f0); |
- fT1->AddFrame(fH1, f1); |
- |
- // Waveform tab |
- fT1 = setTab->AddTab("Waveform"); |
- fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight); |
- lab = new TGLabel(fH1, "Waveform controls"); |
- fH1->AddFrame(lab, f0center2d); |
- fT1->AddFrame(fH1, f0); |
- |
- // 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); |
- |
- 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; |
- subgroup[1] = subwin[1]/3-30; //2*(3*((winWidth/6)-5))/5+10; |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], subgroup[1] /*1*(3*((winWidth/6)-5))/5+15*/ , kFixedWidth | kFixedHeight); |
- fG1 = new TGGroupFrame(fH1, "Event/Data file controls"); |
- |
- // Number of events |
- fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH2, "Number of events:"); |
- fH2->AddFrame(lab, f0centery); |
- evtNum = new TGNumberEntry(fH2, 10000, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); |
- evtNum->Resize(80,22); |
- fH2->AddFrame(evtNum, f0centery); |
- fG1->AddFrame(fH2, f2); |
- |
- // Time stamp display |
- fH2 = new TGHorizontalFrame(fG1,600,200); |
- lab = new TGLabel(fH2, "Time stamp:"); |
- fH2->AddFrame(lab, f0centery); |
- timeStamp = new TGTextEntry(fH2, ""); |
- timeStamp->Resize(440,22); |
- timeStamp->SetState(kFALSE); // time stamp is read-only |
- fH2->AddFrame(timeStamp, f0centery); |
- fG1->AddFrame(fH2, f2); |
- |
- // Save to file |
- fH2 = new TGHorizontalFrame(fG1,600,200); |
- lab = new TGLabel(fH2, "Save to file:"); |
- fH2->AddFrame(lab, f0centery); |
- char *cTemp; |
- cTemp = new char[256]; |
- sprintf(cTemp, "./results/test%s", histExt); |
- fileName = new TGTextEntry(fH2, cTemp); |
- delete[] cTemp; |
- fileName->Resize(400,22); |
- fileName->SetState(kFALSE); |
- fH2->AddFrame(fileName, f0centery); |
- saveFile = new TGTextButton(fH2, "..."); |
- saveFile->SetTextJustify(36); |
- saveFile->SetWrapLength(-1); |
- saveFile->Resize(80,22); |
- fH2->AddFrame(saveFile, f0centery); |
-// mdiFrame->AddFrame(fH2, f0); |
- fG1->AddFrame(fH2, f2); |
- fH1->AddFrame(fG1, f1); |
- // Bottom pane (File controls) |
- mdiFrame->AddFrame(fH1, f0); |
- |
- subgroup[0] = subwin[0]-70; |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- fH2 = new TGHorizontalFrame(fH1, 3*subgroup[0]/4, 30, kFixedWidth); |
- measStart = new TGTextButton(fH2, "Start acquisition"); |
- measStart->SetTextJustify(36); |
- measStart->SetWrapLength(-1); |
- measStart->Resize(80,22); |
- fH2->AddFrame(measStart, f0center2d); |
- |
- ULong_t fcolor; |
- gClient->GetColorByName("red", fcolor); |
- |
- busyLabel = new TGLabel(fH2, "Busy"); //, fTextGC->GetGC(), labelfont, kChildFrame); |
- busyLabel->SetTextJustify(36); |
- busyLabel->Resize(80,22); |
- busyLabel->Disable(); |
- busyLabel->SetTextColor(fcolor); |
- fH2->AddFrame(busyLabel, f0center2d); |
- |
- curProgress = new TGHProgressBar(fH2, TGProgressBar::kStandard, 150); |
- curProgress->ShowPosition(); |
- curProgress->SetRange(0,100); |
- curProgress->SetBarColor("green"); |
- fH2->AddFrame(curProgress, f0center2d); |
- fH1->AddFrame(fH2, f0centerx); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize); |
- mdiFrame->SetWindowName("Main measurement window"); |
- mdiFrame->MapSubwindows(); |
- mdiFrame->Layout(); |
- mdiFrame->Move((winWidth/6),0); |
-// Main window ----------------------------------------------------------------------------- |
- |
-// Histogram pane -------------------------------------------------------------------------- |
- subwin[0] = 2*((winWidth/6)-5); subwin[1] = (int)(2.5*((winHeight/5)-5))-5; |
- histogramPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]); |
- mdiFrame = histogramPane->GetMdiFrame(); |
- |
- histCanvas = new TRootEmbeddedCanvas("histCanvas",mdiFrame,900,900); |
- mdiFrame->AddFrame(histCanvas, f1); |
- TCanvas *gCanvas = histCanvas->GetCanvas(); |
- gCanvas->SetGridx(); |
- gCanvas->SetGridy(); |
- |
- mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize); |
- mdiFrame->SetWindowName("Histogram"); |
- mdiFrame->MapSubwindows(); |
- mdiFrame->Layout(); |
- mdiFrame->Move(4*((winWidth/6)-5)+10,0); |
-// Histogram pane -------------------------------------------------------------------------- |
- |
-// Histogram file selection pane ----------------------------------------------------------- |
- subwin[0] = 4*((winWidth/6)-5); subwin[1] = 2*((winHeight/5)-5)+15; |
- histogramPaneFile = new TGMdiSubwindow(fMainFrame, subwin[0]+5, subwin[1]); |
- mdiFrame = histogramPaneFile->GetMdiFrame(); |
- |
- // Open browser for file selection |
- subgroup[0] = subwin[0]-10; |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- lab = new TGLabel(fH1, "File selection:"); |
- fH1->AddFrame(lab, f0centery); |
- |
- selectDir = new TGTextButton(fH1, "..."); |
- selectDir->SetTextJustify(36); |
- selectDir->SetWrapLength(-1); |
- selectDir->Resize(80,22); |
- fH1->AddFrame(selectDir, f0centery); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- // List view of the opened files |
- fileList = new TGListBox(mdiFrame,1); |
- fileList->GetVScrollbar(); |
- fileList->Resize(300, (subwin[1]/2)-10 ); |
- mdiFrame->AddFrame(fileList, f2); |
- |
- // Multiple file selection toggle, previous/next controls and clear list |
- fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30); |
- multiSelect = new TGCheckButton(fH1, "Multiple file select"); |
- multiSelect->Resize(50,22); |
- multiSelect->SetState(kButtonUp); |
- fH1->AddFrame(multiSelect, f0); |
- |
- multiSelectAll = new TGCheckButton(fH1, "Select all listed files"); |
- multiSelectAll->Resize(50,22); |
- multiSelectAll->SetState(kButtonUp); |
- fH1->AddFrame(multiSelectAll, f0); |
- |
- TGTextButton *clearList = new TGTextButton(fH1, "Clear list"); |
- clearList->SetTextJustify(36); |
- clearList->SetWrapLength(-1); |
- clearList->Resize(80,22); |
- fH1->AddFrame(clearList, f0right); |
- |
- nextFile = new TGTextButton(fH1, ">>"); |
- nextFile->SetTextJustify(36); |
- nextFile->SetWrapLength(-1); |
- nextFile->Resize(80,22); |
- fH1->AddFrame(nextFile, f0right); |
- |
- prevFile = new TGTextButton(fH1, "<<"); |
- prevFile->SetTextJustify(36); |
- prevFile->SetWrapLength(-1); |
- prevFile->Resize(80,22); |
- fH1->AddFrame(prevFile, f0right); |
- mdiFrame->AddFrame(fH1, f2); |
- |
- mdiFrame->SetMdiHints(kMdiMinimize); |
- mdiFrame->SetWindowName("Histogram file selection"); |
- mdiFrame->MapSubwindows(); |
- mdiFrame->Layout(); |
- mdiFrame->Move(0,3*((winHeight/5)-5)-5); |
-// Histogram file selection pane ----------------------------------------------------------- |
- |
-// Histogram controls pane ----------------------------------------------------------------- |
- subwin[0] = 2*((winWidth/6)-5); subwin[1] = (int)(2.5*((winHeight/5)-5))+10; |
- histogramPaneCtr = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]); |
- mdiFrame = histogramPaneCtr->GetMdiFrame(); |
- |
- // Control for histogram X range |
- subgroup[0] = subwin[0]-10; |
- fG1 = new TGGroupFrame(mdiFrame, "Histogram display"); |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "ADC range (min, max):"); |
- fH1->AddFrame(lab, f0centery); |
- adcMinRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber); |
- adcMinRange->Resize(80,22); |
- fH1->AddFrame(adcMinRange, f0centery); |
- adcMaxRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber); |
- adcMaxRange->Resize(80,22); |
- fH1->AddFrame(adcMaxRange, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- // TDC window for getting data |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "TDC range (min, max):"); |
- fH1->AddFrame(lab, f0centery); |
- tdcMinwindow = new TGNumberEntry(fH1, 0.0, 6, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEAAnyNumber); |
- tdcMinwindow->Resize(80,22); |
- fH1->AddFrame(tdcMinwindow, f0centery); |
- tdcMaxwindow = new TGNumberEntry(fH1, 221.8, 6, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEAAnyNumber); |
- tdcMaxwindow->Resize(80,22); |
- fH1->AddFrame(tdcMaxwindow, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- // Y axis range settings |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Y range (min, max):"); |
- fH1->AddFrame(lab, f0centery); |
- yMinRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber); |
- yMinRange->Resize(80,22); |
- fH1->AddFrame(yMinRange, f0centery); |
- yMaxRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber); |
- yMaxRange->Resize(80,22); |
- fH1->AddFrame(yMaxRange, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- // Select the channel to display |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Display channel:"); |
- fH1->AddFrame(lab, f0centery); |
- selectCh = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, (NCH->GetNumber())-1); |
- selectCh->Resize(40,22); |
- fH1->AddFrame(selectCh, f0centery); |
- |
- changeADC = new TGTextButton(fH1, "ADC"); |
- changeADC->AllowStayDown(kTRUE); |
- changeADC->SetDown(kTRUE); |
- fMenuHisttype->CheckEntry(M_ANALYSIS_HISTTYPE_1DADC); |
- changeADC->SetTextJustify(36); |
- changeADC->SetWrapLength(-1); |
- changeADC->Resize(60,22); |
- fH1->AddFrame(changeADC, f0centery); |
- |
- changeTDC = new TGTextButton(fH1, "TDC"); |
- changeTDC->AllowStayDown(kTRUE); |
- changeTDC->SetTextJustify(36); |
- changeTDC->SetWrapLength(-1); |
- changeTDC->Resize(60,22); |
- fH1->AddFrame(changeTDC, f0centery); |
- |
- changeADCTDC = new TGTextButton(fH1, "ADC/TDC"); |
- changeADCTDC->AllowStayDown(kTRUE); |
- changeADCTDC->SetTextJustify(36); |
- changeADCTDC->SetWrapLength(-1); |
- changeADCTDC->Resize(60,22); |
- fH1->AddFrame(changeADCTDC, f0centery); |
- |
- change2Dsurf = new TGTextButton(fH1, "Surf 2D"); |
- change2Dsurf->AllowStayDown(kTRUE); |
- change2Dsurf->SetTextJustify(36); |
- change2Dsurf->SetWrapLength(-1); |
- change2Dsurf->Resize(60,22); |
- fH1->AddFrame(change2Dsurf, f0); |
- fG1->AddFrame(fH1, f2); |
- |
- logscale = new TGCheckButton(fG1, "Logarithmic scale ON/OFF"); |
- logscale->Resize(50,22); |
- logscale->SetState(kButtonUp); |
- fG1->AddFrame(logscale, f0centerx); |
- |
- // Export the selected files |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 100); |
- fH2 = new TGHorizontalFrame(fH1, subgroup[0], 100); |
- lab = new TGLabel(fH2, "Export selected histograms:"); |
- fH2->AddFrame(lab, f0centery); |
- |
- exportHist = new TGTextButton(fH2, "Export"); |
- exportHist->SetTextJustify(36); |
- exportHist->SetWrapLength(-1); |
- exportHist->Resize(80,22); |
- fH2->AddFrame(exportHist, f0centery); |
- fH1->AddFrame(fH2, f0centerx); |
- fG1->AddFrame(fH1, f2); |
- mdiFrame->AddFrame(fG1, f2); |
- |
- // Fitting controls for ADC spectrum |
- fG1 = new TGGroupFrame(mdiFrame, "Fit Settings"); |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Peak sigma:"); |
- fH1->AddFrame(lab, f0centery); |
- fitSigma = new TGNumberEntry(fH1, 1.5, 3, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative); |
- fitSigma->Resize(60,22); |
- fH1->AddFrame(fitSigma, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Signal/Noise treshold:"); |
- fH1->AddFrame(lab, f0centery); |
- fitTresh = new TGNumberEntry(fH1, 5.0E-3, 3, 999, TGNumberFormat::kNESReal, TGNumberFormat::kNEANonNegative); |
- fitTresh->Resize(60,22); |
- fH1->AddFrame(fitTresh, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Background interpolation:"); |
- fH1->AddFrame(lab, f0centery); |
- fitInter = new TGNumberEntry(fH1, 8, 3, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); |
- fitInter->Resize(60,22); |
- fH1->AddFrame(fitInter, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30); |
- lab = new TGLabel(fH1, "Peak fit max. acceptable error:"); |
- fH1->AddFrame(lab, f0centery); |
- accError = new TGNumberEntry(fH1, 0.15, 3, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEANonNegative); |
- accError->Resize(60,22); |
- fH1->AddFrame(accError, f0centery); |
- fG1->AddFrame(fH1, f2); |
- |
- exfitplots = new TGCheckButton(fG1, "Export fitting plots ON/OFF"); |
- exfitplots->Resize(50,22); |
- exfitplots->SetState(kButtonDown); |
- fG1->AddFrame(exfitplots, f0centerx); |
- mdiFrame->AddFrame(fG1, f2); |
- |
- mdiFrame->SetMdiHints(kMdiMinimize); |
- mdiFrame->SetWindowName("Histogram controls"); |
- mdiFrame->MapSubwindows(); |
- mdiFrame->Layout(); |
- mdiFrame->Move(4*((winWidth/6)-5)+10,(int)(2.5*((winHeight/5)-5))); |
-// Histogram controls pane ----------------------------------------------------------------- |
- |
- // Action connections |
- voltscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableVoltScan()"); |
- surfscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableSurfScan()"); |
- zscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableZaxisScan()"); |
-// histogramOn->Connect("Clicked()", "TGAppMainFrame", this, "HistogramToggle()"); |
- vHardlimit->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "VoltageLimit()"); |
- (vHardlimit->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "VoltageLimit()"); |
- NCH->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ChannelLimit()"); |
- (NCH->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "ChannelLimit()"); |
- cleanOn->Connect("Clicked()", "TGAppMainFrame", this, "CleanPlotToggle()"); |
- oscConnect->Connect("Clicked()", "TGAppMainFrame", this, "ConnectToScope()"); |
- vOutSet->Connect("Clicked()", "TGAppMainFrame", this, "SetVoltOut()"); |
- vOutGet->Connect("Clicked()", "TGAppMainFrame", this, "GetVoltOut()"); |
- vOutReset->Connect("Clicked()", "TGAppMainFrame", this, "ResetVoltOut()"); |
- positionSet->Connect("Clicked()", "TGAppMainFrame", this, "SetPosition()"); |
- positionGet->Connect("Clicked()", "TGAppMainFrame", this, "GetPosition()"); |
- positionHome->Connect("Clicked()", "TGAppMainFrame", this, "HomePosition()"); |
- saveFile->Connect("Clicked()", "TGAppMainFrame", this, "SaveFile()"); |
- measStart->Connect("Clicked()", "TGAppMainFrame", this, "StartAcq()"); |
- selectDir->Connect("Clicked()", "TGAppMainFrame", this, "SelectDirectory()"); |
- multiSelect->Connect("Clicked()", "TGAppMainFrame", this, "ListMultiSelect()"); |
- multiSelectAll->Connect("Clicked()", "TGAppMainFrame", this, "ListSelectAll()"); |
- prevFile->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-2)"); |
- nextFile->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-3)"); |
- fileList->Connect("DoubleClicked(Int_t)", "TGAppMainFrame", this, "FileListNavigation(Int_t)"); |
- clearList->Connect("Clicked()", "TGListBox", fileList, "RemoveAll()"); |
- |
- adcMinRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (adcMinRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- adcMaxRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (adcMaxRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- yMinRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (yMinRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- yMaxRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (yMaxRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- tdcMinwindow->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (tdcMinwindow->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- tdcMaxwindow->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()"); |
- (tdcMaxwindow->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()"); |
- changeADC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=0)"); |
- changeTDC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=1)"); |
- changeADCTDC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=2)"); |
- change2Dsurf->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=3)"); |
- selectCh->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ChangeChannel()"); |
- (selectCh->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "ChangeChannel()"); |
- logscale->Connect("Clicked()", "TGAppMainFrame", this, "SetHistRange()"); |
- exportHist->Connect("Clicked()", "TGAppMainFrame", this, "HistogramExport()"); |
- |
- started = kFALSE; |
- EnableVoltScan(); |
- EnableSurfScan(); |
- EnableZaxisScan(); |
-} |
- |
-//--------------------------------------------------------------- |
-// Closing the main application window and checking the about information |
- |
-void TGAppMainFrame::CloseWindow() |
-{ |
- gApplication->Terminate(0); |
-} |
- |
-Bool_t TGAppMainFrame::About() |
-{ |
- int ret = 0; |
- |
- new TGMsgBox(gClient->GetRoot(), fMain, |
- fMain->GetWindowName(), "This is an application.", |
- kMBIconQuestion, kMBClose, &ret); |
- |
- if(debug == 1) |
- if(ret == kMBClose) |
- printf("Closing the About window (%d).\n", ret); |
- |
- return kFALSE; |
-} |
- |
-//--------------------------------------------------------------- |
-// Subwindow constructor definition (& layout) and close subwindow action |
- |
-TGMdiSubwindow::TGMdiSubwindow(TGMdiMainFrame *main, int w, int h) |
-{ |
- // Create a new subwindow |
- fMdiFrame = new TGMdiFrame(main, w, h); |
- fMdiFrame->Connect("CloseWindow()", "TGMdiSubwindow", this, "CloseWindow()"); // setting here to =0 -> will always ask before closing window |
- fMdiFrame->DontCallClose(); // only let this window close if Yes is pressed when closing window |
- |
-} |
- |
-Bool_t TGMdiSubwindow::CloseWindow() |
-{ |
- int ret = 0; |
- |
-// if(noq == 0) |
-// { |
- new TGMsgBox(gClient->GetRoot(), fMdiFrame, |
- fMdiFrame->GetWindowName(), "Really want to close the window?", |
- kMBIconExclamation, kMBYes | kMBNo, &ret); |
- if (ret == kMBYes) return fMdiFrame->CloseWindow(); |
- |
- return kFALSE; |
-// } |
-// else |
-// return fMdiFrame->CloseWindow(); |
-} |
- |
-//--------------------------------------------------------------- |
-// Main function |
- |
-void windowed_test() |
-{ |
- new TGAppMainFrame(gClient->GetRoot(), winWidth, winHeight); |
-} |
- |
-//#ifdef STANDALONE |
-int main(int argc, char **argv) |
-{ |
- TApplication theApp("MdiTest", &argc, argv); |
- |
- windowed_test(); |
- |
- theApp.Run(); |
- |
- return 0; |
-} |
-//#endif |
Index: sipmscan/trunk/windowed_test.h |
=================================================================== |
--- sipmscan/trunk/windowed_test.h (revision 117) |
+++ sipmscan/trunk/windowed_test.h (nonexistent) |
@@ -1,32 +0,0 @@ |
-#ifndef _windowedtest_h_ |
-#define _windowedtest_h_ |
- |
-#define debug 1 |
-#define winWidth 1200 |
-#define winHeight 800 |
-#define WINDOW_NAME "CAMAC/MPOD/4MM DAQ software" |
-#define BSIZE 10000 |
-#define histname "hdata" |
- |
-enum EMenuIds { |
- M_FILE_NEW, |
-// M_FILE_CLOSE, |
- M_FILE_EXIT, |
- |
- M_ANALYSIS_HISTTYPE, |
- M_ANALYSIS_HISTTYPE_1DADC, |
- M_ANALYSIS_HISTTYPE_1DTDC, |
- M_ANALYSIS_HISTTYPE_2D, |
- M_ANALYSIS_HISTTYPE_SURF, |
- M_ANALYSIS_FIT, |
- M_ANALYSIS_FITSEL, |
- M_ANALYSIS_INTEGX, |
- M_ANALYSIS_INTEGY, |
- |
- M_WINDOW_HOR, |
- M_WINDOW_VERT, |
- |
- M_HELP_ABOUT |
-}; |
- |
-#endif |
Index: sipmscan/trunk/GuiLinkDef.h |
=================================================================== |
--- sipmscan/trunk/GuiLinkDef.h (revision 117) |
+++ sipmscan/trunk/GuiLinkDef.h (nonexistent) |
@@ -1,17 +0,0 @@ |
-#ifdef __CINT__ |
- |
-#pragma link off all globals; |
-#pragma link off all classes; |
-#pragma link off all functions; |
-//#pragma link C++ class TGMdiSubwindow+; |
-//#pragma link C++ class TGAppMainFrame+; |
- |
-//#pragma link C++ function MyEventHandler; |
-//#pragma link C++ function GetDebug; |
-//#pragma link C++ function MyRedraw; |
-//#pragma link C++ function MyTimer; |
- |
-//#pragma link C++ class daq; |
- |
-#endif |
- |
Index: sipmscan/trunk/root_include.h |
=================================================================== |
--- sipmscan/trunk/root_include.h (revision 117) |
+++ sipmscan/trunk/root_include.h (nonexistent) |
@@ -1,214 +0,0 @@ |
-#ifndef _root_include_h_ |
-#define _root_include_h_ |
- |
-// ROOT base includes |
-#ifndef ROOT_TRootBrowser |
-#include "TRootBrowser.h" |
-#endif |
-#ifndef ROOT_IOstream |
-#include "Riostream.h" |
-#endif |
-#ifndef ROOT_TSystem |
-#include "TSystem.h" |
-#endif |
-#ifndef ROOT_TApplication |
-#include "TApplication.h" |
-#endif |
-#ifndef ROOT_TROOT |
-#include "TROOT.h" |
-#endif |
-#ifndef ROOT_RQ_Object |
-#include "RQ_OBJECT.h" |
-#endif |
-#ifndef ROOT_TGClient |
-#include "TGClient.h" |
-#endif |
-#ifndef ROOT_TGResourcePool |
-#include "TGResourcePool.h" |
-#endif |
- |
-// ROOT GUI frame includes |
-#ifndef ROOT_TGFrame |
-#include "TGFrame.h" |
-#endif |
-#ifndef ROOT_TGDockableFrame |
-#include "TGDockableFrame.h" |
-#endif |
-#ifndef ROOT_TGMenu |
-#include "TGMenu.h" |
-#endif |
-#ifndef ROOT_TGMdiDecorFrame |
-#include "TGMdiDecorFrame.h" |
-#endif |
-#ifndef ROOT_TGMdiFrame |
-#include "TGMdiFrame.h" |
-#endif |
-#ifndef ROOT_TGMdiMainFrame |
-#include "TGMdiMainFrame.h" |
-#endif |
-#ifndef ROOT_TGMdiMenu |
-#include "TGMdiMenu.h" |
-#endif |
-#ifndef ROOT_TGMdi |
-#include "TGMdi.h" |
-#endif |
-#ifndef ROOT_TG3DLine |
-#include "TG3DLine.h" |
-#endif |
-#ifndef ROOT_TGStatusBar |
-#include "TGStatusBar.h" |
-#endif |
- |
-// ROOT GUI builder incudes (not needed) |
-#ifndef ROOT_TRootGuiBuilder |
-#include "TRootGuiBuilder.h" |
-#endif |
-#ifndef ROOT_TGuiBldHintsButton |
-#include "TGuiBldHintsButton.h" |
-#endif |
-#ifndef ROOT_TGuiBldHintsEditor |
-#include "TGuiBldHintsEditor.h" |
-#endif |
-#ifndef ROOT_TGuiBldEditor |
-#include "TGuiBldEditor.h" |
-#endif |
-#ifndef ROOT_TGuiBldDragManager |
-#include "TGuiBldDragManager.h" |
-#endif |
- |
-// ROOT GUI object includes |
-#ifndef ROOT_TGListBox |
-#include "TGListBox.h" |
-#endif |
-#ifndef ROOT_TGNumberEntry |
-#include "TGNumberEntry.h" |
-#endif |
-#ifndef ROOT_TGScrollBar |
-#include "TGScrollBar.h" |
-#endif |
-#ifndef ROOT_TGFileDialog |
-#include "TGFileDialog.h" |
-#endif |
-#ifndef ROOT_TGShutter |
-#include "TGShutter.h" |
-#endif |
-#ifndef ROOT_TGButtonGroup |
-#include "TGButtonGroup.h" |
-#endif |
-#ifndef ROOT_TGCanvas |
-#include "TGCanvas.h" |
-#endif |
-#ifndef ROOT_TGButton |
-#include "TGButton.h" |
-#endif |
-#ifndef ROOT_TGTextEdit |
-#include "TGTextEdit.h" |
-#endif |
-#ifndef ROOT_TGLabel |
-#include "TGLabel.h" |
-#endif |
-#ifndef ROOT_TGView |
-#include "TGView.h" |
-#endif |
-#ifndef ROOT_TGTab |
-#include "TGTab.h" |
-#endif |
-#ifndef ROOT_TGListView |
-#include "TGListView.h" |
-#endif |
-#ifndef ROOT_TGSplitter |
-#include "TGSplitter.h" |
-#endif |
-#ifndef ROOT_TGListTree |
-#include "TGListTree.h" |
-#endif |
-#ifndef ROOT_TGToolTip |
-#include "TGToolTip.h" |
-#endif |
-#ifndef ROOT_TGToolBar |
-#include "TGToolBar.h" |
-#endif |
-#ifndef ROOT_TRootEmbeddedCanvas |
-#include "TRootEmbeddedCanvas.h" |
-#endif |
-#ifndef ROOT_TCanvas |
-#include "TCanvas.h" |
-#endif |
-#ifndef ROOT_TGComboBox |
-#include "TGComboBox.h" |
-#endif |
-#ifndef ROOT_TGProgressBar |
-#include "TGProgressBar.h" |
-#endif |
-#ifndef ROOT_TGTextEntry |
-#include "TGTextEntry.h" |
-#endif |
-#ifndef ROOT_TGMsgBox |
-#include "TGMsgBox.h" |
-#endif |
-#ifndef ROOT_TGSlider |
-#include "TGSlider.h" |
-#endif |
-#ifndef ROOT_TGFSContainer |
-#include "TGFSContainer.h" |
-#endif |
-#ifndef ROOT_TGFSComboBox |
-#include "TGFSComboBox.h" |
-#endif |
- |
-// ROOT File browser includes |
-#ifndef ROOT_TSystemDir |
-#include "TSystemDirectory.h" |
-#endif |
-#ifndef ROOT_TTree |
-#include "TTree.h" |
-#endif |
-#ifndef ROOT_TFile |
-#include "TFile.h" |
-#endif |
- |
-// ROOT plotting includes |
-#ifndef ROOT_TPaveStats |
-#include "TPaveStats.h" |
-#endif |
-#ifndef ROOT_TGraph2D |
-#include "TGraph2D.h" |
-#endif |
-#ifndef ROOT_TLatex |
-#include "TLatex.h" |
-#endif |
-#ifndef ROOT_TGraphErrors |
-#include "TGraphErrors.h" |
-#endif |
-#ifndef ROOT_TStyle |
-#include "TStyle.h" |
-#endif |
-#ifndef ROOT_TPaletteAxis |
-#include "TPaletteAxis.h" |
-#endif |
-#ifndef ROOT_TGraph |
-#include "TGraph.h" |
-#endif |
-#ifndef ROOT_TH1F |
-#include "TH1F.h" |
-#endif |
-#ifndef ROOT_TH2F |
-#include "TH2F.h" |
-#endif |
-#ifndef ROOT_TF1 |
-#include "TF1.h" |
-#endif |
-#ifndef ROOT_TSpectrum |
-#include "TSpectrum.h" |
-#endif |
-#ifndef ROOT_TVirtualFitter |
-#include "TVirtualFitter.h" |
-#endif |
-#ifndef ROOT_TMath |
-#include "TMath.h" |
-#endif |
-#ifndef ROOT_TRandom |
-#include "TRandom.h" |
-#endif |
- |
-#endif |
Index: sipmscan/trunk/wusbcc.h |
=================================================================== |
--- sipmscan/trunk/wusbcc.h (revision 117) |
+++ sipmscan/trunk/wusbcc.h (nonexistent) |
@@ -1,15 +0,0 @@ |
-#ifndef _WUSBCC_H |
-#define _WUSBCC_H |
- |
-#define NAF(N,A,F) 0x4000+(N)*0x200+(A)*0x20+(F) |
-#define NAFS(N,A,F) (N)*0x200+(A)*0x20+(F) |
- |
-#define CSSA_RQX(N,A,F,DATA,Q,X) CAMAC_read(udev,(N),(A),(F),(DATA),(Q),(X)) |
-#define CSSA_WQX(N,A,F,DATA,Q,X) CAMAC_write(udev,(N),(A),(F),(DATA),(Q),(X)) |
- |
-#define CCCZ CAMAC_Z(udev) |
-#define CCCC CAMAC_C(udev) |
-#define CSET_I CAMAC_I(udev,1) |
-#define CREM_I CAMAC_I(udev,0) |
- |
-#endif |
Index: sipmscan/trunk/wusbxx_dll.c |
=================================================================== |
--- sipmscan/trunk/wusbxx_dll.c (revision 117) |
+++ sipmscan/trunk/wusbxx_dll.c (nonexistent) |
@@ -1,104 +0,0 @@ |
-#include "wusbxx_dll.h" |
- |
-usb_dev_handle *udev; |
- |
- |
- |
-void _VI_FUNC WUSBXX_load (char* module_path) |
-{ |
- |
- /* |
- if (module_path == NULL) |
- DLLHandle = LoadLibrary("libxxusb.dll"); |
- else |
- DLLHandle = LoadLibrary(module_path); |
- |
- if (!(xxusb_register_read_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_register_read"))) exit(1); |
- if (!(xxusb_stack_read_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_stack_read"))) exit(1); |
- if (!(xxusb_stack_write_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_stack_write"))) exit(1); |
- if (!(xxusb_stack_execute_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_stack_execute"))) exit(1); |
- if (!(xxusb_register_write_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_register_write"))) exit(1); |
- if (!(xxusb_usbfifo_read_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_usbfifo_read"))) exit(1); |
- if (!(xxusb_bulk_read_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_bulk_read"))) exit(1); |
- if (!(xxusb_bulk_write_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_bulk_write"))) exit(1); |
- if (!(xxusb_reset_toggle_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_reset_toggle"))) exit(1); |
- |
- if (!(xxusb_devices_find_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_devices_find"))) exit(1); |
- if (!(xxusb_device_close_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_device_close"))) exit(1); |
- if (!(xxusb_device_open_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_device_open"))) exit(1); |
- if (!(xxusb_flash_program_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_flash_program"))) exit(1); |
- if (!(xxusb_flashblock_program_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_flashblock_program"))) exit(1); |
- if (!(xxusb_serial_open_Ptr = (void*) GetProcAddress(DLLHandle,"xxusb_serial_open"))) exit(1); |
- |
- if (!(VME_register_write_Ptr = (void*) GetProcAddress(DLLHandle,"VME_register_write"))) exit(1); |
- if (!(VME_register_read_Ptr = (void*) GetProcAddress(DLLHandle,"VME_register_read"))) exit(1); |
- if (!(VME_LED_settings_Ptr = (void*) GetProcAddress(DLLHandle,"VME_LED_settings"))) exit(1); |
- if (!(VME_DGG_Ptr = (void*) GetProcAddress(DLLHandle,"VME_DGG"))) exit(1); |
- if (!(VME_Output_settings_Ptr = (void*) GetProcAddress(DLLHandle,"VME_Output_settings"))) exit(1); |
- if (!(VME_read_16_Ptr = (void*) GetProcAddress(DLLHandle,"VME_read_16"))) exit(1); |
- if (!(VME_read_32_Ptr = (void*) GetProcAddress(DLLHandle,"VME_read_32"))) exit(1); |
- if (!(VME_BLT_read_32_Ptr = (void*) GetProcAddress(DLLHandle,"VME_BLT_read_32"))) exit(1); |
- if (!(VME_write_16_Ptr = (void*) GetProcAddress(DLLHandle,"VME_write_16"))) exit(1); |
- if (!(VME_write_32_Ptr = (void*) GetProcAddress(DLLHandle,"VME_write_32"))) exit(1); |
- |
- if (!(CAMAC_DGG_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_DGG"))) exit(1); |
- if (!(CAMAC_register_read_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_register_read"))) exit(1); |
- if (!(CAMAC_register_write_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_register_write"))) exit(1); |
- if (!(CAMAC_LED_settings_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_LED_settings"))) exit(1); |
- if (!(CAMAC_Output_settings_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_Output_settings"))) exit(1); |
- if (!(CAMAC_read_LAM_mask_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_read_LAM_mask"))) exit(1); |
- if (!(CAMAC_write_LAM_mask_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_write_LAM_mask"))) exit(1); |
- if (!(CAMAC_write_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_write"))) exit(1); |
- if (!(CAMAC_read_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_read"))) exit(1); |
- if (!(CAMAC_Z_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_Z"))) exit(1); |
- if (!(CAMAC_C_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_C"))) exit(1); |
- if (!(CAMAC_I_Ptr = (void*) GetProcAddress(DLLHandle,"CAMAC_I"))) exit(1); |
-*/ |
-} |
- |
-void _VI_FUNC WUSBXX_open (char *serial) |
-{ |
- if (serial != NULL) |
- udev = xxusb_serial_open(serial); |
-} |
- |
-void _VI_FUNC WUSBXX_close (void) |
-{ |
- if (udev) xxusb_device_close(udev); |
-} |
- |
-int _VI_FUNC WUSBXX_CCread (int n, int a, int f, unsigned long *data) |
-{ |
- long intbuf[4]; |
- int ret; |
- // CAMAC direct read function |
- intbuf[0]=1; |
- intbuf[1]=(long)(f+a*32+n*512 + 0x4000); |
- ret = xxusb_stack_execute(udev, intbuf); |
- if (f < 16) |
- { |
- *data=intbuf[0] + intbuf[1] * 0x10000; //24-bit word |
-// *Q = ((intbuf[1] >> 8) & 1); |
-// *X = ((intbuf[1] >> 9) & 1); |
- } |
- return ret; |
-} |
- |
-int _VI_FUNC WUSBXX_CCwrite (int n, int a, int f, unsigned long data) |
-{ |
- long intbuf[4]; |
- int ret; |
-// CAMAC direct write function |
- intbuf[0]=1; |
- intbuf[1]=(long)(f+a*32+n*512 + 0x4000); |
- if ((f > 15) && (f < 24)) |
- { |
- intbuf[0]=3; |
- intbuf[2]=(data & 0xffff); |
- intbuf[3]=((data >>16) & 255); |
- ret = xxusb_stack_execute(udev, intbuf); |
-// *Q = (intbuf[0] & 1); |
-// *X = ((intbuf[0] >> 1) & 1); |
- } |
- return ret; |
-} |
Index: sipmscan/trunk/usb.h |
=================================================================== |
--- sipmscan/trunk/usb.h (revision 117) |
+++ sipmscan/trunk/usb.h (nonexistent) |
@@ -1,344 +0,0 @@ |
-/* |
- * 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__ */ |
- |
Index: sipmscan/trunk/libxxusb.cpp |
=================================================================== |
--- sipmscan/trunk/libxxusb.cpp (revision 117) |
+++ sipmscan/trunk/libxxusb.cpp (nonexistent) |
@@ -1,1651 +0,0 @@ |
- |
-// libxxusb.cpp : Defines the entry point for the DLL application. |
-// |
- |
- |
- |
-#include <string.h> |
-#include <malloc.h> |
-#include "usb.h" |
-#include "libxxusb.h" |
-#include <time.h> |
- |
- |
- |
- |
-// 03/09/06 Release 3.00 changes |
-// 07/28/06 correction CAMAC write for F to be in range 16...23 |
-// 10/09/06 correction CAMAC read for F to be in range <16 OR >23 |
-// 10/16/06 CAMAC DGG corrected |
-// 12/28/07 Open corrected for bug when calling register after opening |
-/* |
-******** xxusb_longstack_execute ************************ |
- |
- Executes stack array passed to the function and returns the data read from the VME bus |
- |
- Paramters: |
- hdev: USB device handle returned from an open function |
- DataBuffer: pointer to the dual use buffer |
- when calling , DataBuffer contains (unsigned short) stack data, with first word serving |
- as a placeholder |
- upon successful return, DataBuffer contains (unsigned short) VME data |
- lDataLen: The number of bytes to be fetched from VME bus - not less than the actual number |
- expected, or the function will return -5 code. For stack consisting only of write operations, |
- lDataLen may be set to 1. |
- timeout: The time in ms that should be spent tryimg to write data. |
- |
- Returns: |
- When Successful, the number of bytes read from xxusb. |
- Upon failure, a negative number |
- |
- Note: |
- The function must pass a pointer to an array of unsigned integer stack data, in which the first word |
- is left empty to serve as a placeholder. |
- The function is intended for executing long stacks, up to 4 MBytes long, both "write" and "read" |
- oriented, such as using multi-block transfer operations. |
- Structure upon call: |
- DataBuffer(0) = 0(don't care place holder) |
- DataBuffer(1) = (unsigned short)StackLength bits 0-15 |
- DataBuffer(2) = (unsigned short)StackLength bits 16-20 |
- DataBuffer(3 - StackLength +2) (unsigned short) stack data |
- StackLength represents the number of words following DataBuffer(1) word, thus the total number |
- of words is StackLength+2 |
- Structure upon return: |
- DataBuffer(0 - (ReturnValue/2-1)) - (unsigned short)array of returned data when ReturnValue>0 |
-*/ |
- |
-int xxusb_longstack_execute(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout) |
-{ |
- int ret; |
- char *cbuf; |
- unsigned short *usbuf; |
- int bufsize; |
- |
- cbuf = (char *)DataBuffer; |
- usbuf = (unsigned short *)DataBuffer; |
- cbuf[0]=12; |
- cbuf[1]=0; |
- bufsize = 2*(usbuf[1]+0x10000*usbuf[2])+4; |
- ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, cbuf, bufsize, timeout); |
- if (ret>0) |
- ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout); |
- |
- return ret; |
-} |
- |
-/* |
-******** xxusb_bulk_read ************************ |
- |
- Reads the content of the usbfifo whenever "FIFO full" flag is set, |
- otherwise times out. |
- |
- Paramters: |
- hdev: USB device handle returned from an open function |
- DataBuffer: pointer to an array to store data that is read from the VME bus; |
- the array may be declared as byte, unsigned short, or unsigned long |
- lDatalen: The number of bytes to read from xxusb |
- timeout: The time in ms that should be spent waiting for data. |
- |
- Returns: |
- When Successful, the number of bytes read from xxusb. |
- Upon failure, a negative number |
- |
- Note: |
- Depending upon the actual need, the function may be used to return the data in a form |
- of an array of bytes, unsigned short integers (16 bits), or unsigned long integers (32 bits). |
- The latter option of passing a pointer to an array of unsigned long integers is meaningful when |
- xxusb data buffering option is used (bit 7=128 of the global register) that requires data |
- 32-bit data alignment. |
- |
-*/ |
-int xxusb_bulk_read(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout) |
-{ |
-int ret; |
-char *cbuf; |
-cbuf = (char *)DataBuffer; |
- ret = usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout); |
- return ret; |
-} |
- |
-/* |
-******** xxusb_bulk_write ************************ |
- |
- Writes the content of an array of bytes, unsigned short integers, or unsigned long integers |
- to the USB port fifo; times out when the USB fifo is full (e.g., when xxusb is busy). |
- |
- Paramters: |
- hdev: USB device handle returned from an open function |
- DataBuffer: pointer to an array storing the data to be sent; |
- the array may be declared as byte, unsigned short, or unsigned long |
- lDatalen: The number of bytes to to send to xxusb |
- timeout: The time in ms that should be spent waiting for data. |
- |
- Returns: |
- When Successful, the number of bytes passed to xxusb. |
- Upon failure, a negative number |
- |
- Note: |
- Depending upon the actual need, the function may be used to pass to xxusb the data in a form |
- of an array of bytes, unsigned short integers (16 bits), or unsigned long integers (32 bits). |
-*/ |
-int xxusb_bulk_write(usb_dev_handle *hDev, void *DataBuffer, int lDataLen, int timeout) |
-{ |
-int ret; |
-char *cbuf; |
-cbuf = (char *)DataBuffer; |
- ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, cbuf, lDataLen, timeout); |
- return ret; |
-} |
- |
-/* |
-******** xxusb_usbfifo_read ************************ |
- |
- Reads data stored in the xxusb fifo and packs them in an array of long integers. |
- |
- Paramters: |
- hdev: USB device handle returned from an open function |
- DataBuffer: pointer to an array of long to store data that is read |
- the data occupy only the least significant 16 bits of the 32-bit data words |
- lDatalen: The number of bytes to read from the xxusb |
- timeout: The time in ms that should be spent waiting for data. |
- |
- Returns: |
- When Successful, the number of bytes read from xxusb. |
- Upon failure, a negative number |
- |
- Note: |
- The function is not economical as it wastes half of the space required for storing |
- the data received. Also, it is relatively slow, as it performs extensive data repacking. |
- It is recommended to use xxusb_bulk_read with a pointer to an array of unsigned short |
- integers. |
-*/ |
-int xxusb_usbfifo_read(usb_dev_handle *hDev, int *DataBuffer, int lDataLen, int timeout) |
-{ |
-int ret; |
-char *cbuf; |
-unsigned short *usbuf; |
-int i; |
- |
-cbuf = (char *)DataBuffer; |
-usbuf = (unsigned short *)DataBuffer; |
- |
- ret = usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, cbuf, lDataLen, timeout); |
- if (ret > 0) |
- for (i=ret/2-1; i >= 0; i=i-1) |
- { |
- usbuf[i*2]=usbuf[i]; |
- usbuf[i*2+1]=0; |
- } |
- return ret; |
-} |
- |
- |
-//******************************************************// |
-//******************* GENERAL XX_USB *******************// |
-//******************************************************// |
-// The following are functions used for both VM_USB & CC_USB |
- |
- |
-/* |
-******** xxusb_register_write ************************ |
- |
- Writes Data to the xxusb register selected by RedAddr. For |
- acceptable values for RegData and RegAddr see the manual |
- the module you are using. |
- |
- Parameters: |
- hdev: usb device handle returned from open device |
- RegAddr: The internal address if the xxusb |
- RegData: The Data to be written to the register |
- |
- Returns: |
- Number of bytes sent to xxusb if successful |
- 0 if the register is write only |
- Negative numbers if the call fails |
-*/ |
-short xxusb_register_write(usb_dev_handle *hDev, short RegAddr, long RegData) |
-{ |
- long RegD; |
- char buf[8]={5,0,0,0,0,0,0,0}; |
- int ret; |
- int lDataLen; |
- int timeout; |
- if ((RegAddr==0) || (RegAddr==12) || (RegAddr==15)) |
- return 0; |
- buf[2]=(char)(RegAddr & 15); |
- buf[4]=(char)(RegData & 255); |
- |
- RegD = RegData >> 8; |
- buf[5]=(char)(RegD & 255); |
- RegD = RegD >>8; |
- if (RegAddr==8) |
- { |
- buf[6]=(char)(RegD & 255); |
- lDataLen=8; |
- } |
- else |
- lDataLen=6; |
- timeout=10; |
- ret=xxusb_bulk_write(hDev, buf, lDataLen, timeout); |
- return ret; |
-} |
- |
-/* |
-******** xxusb_stack_write ************************ |
- |
- Writes a stack of VME/CAMAC calls to the VM_USB/CC_USB |
- to be executed upon trigger. |
- |
- Parameters: |
- hdev: usb device handle returned from an open function |
- StackAddr: internal register to which the stack should be written |
- lpStackData: Pointer to an array holding the stack |
- |
- Returns: |
- The number of Bytes written to the xxusb when successful |
- A negative number upon failure |
-*/ |
-short xxusb_stack_write(usb_dev_handle *hDev, short StackAddr, long *intbuf) |
-{ |
- int timeout; |
- short ret; |
- short lDataLen; |
- char buf[2000]; |
- short i; |
- int bufsize; |
- |
- buf[0]=(char)((StackAddr & 51) + 4); |
- buf[1]=0; |
- lDataLen=(short)(intbuf[0] & 0xFFF); |
- buf[2]=(char)(lDataLen & 255); |
- lDataLen = lDataLen >> 8; |
- buf[3] = (char)(lDataLen & 255); |
- bufsize=intbuf[0]*2+4; |
- if (intbuf[0]==0) |
- return 0; |
- for (i=1; i <= intbuf[0]; i++) |
- { |
- buf[2+2*i] = (char)(intbuf[i] & 255); |
- buf[3+2*i] = (char)((intbuf[i] >>8) & 255); |
- } |
- timeout=50; |
- ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, bufsize, timeout); |
- return ret; |
-} |
- |
-/* |
-******** xxusb_stack_execute ********************** |
- |
- Writes, executes and returns the value of a DAQ stack. |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- intbuf: Pointer to an array holding the values stack. Upon return |
- Pointer value is the Data returned from the stack. |
- |
- Returns: |
- When successful, the number of Bytes read from xxusb |
- Upon Failure, a negative number. |
-*/ |
-short xxusb_stack_execute(usb_dev_handle *hDev, long *intbuf) |
-{ |
- int timeout; |
- short ret; |
- short lDataLen; |
- char buf[26700]; |
- short i; |
- int bufsize; |
- int ii = 0; |
- |
- buf[0]=12; |
- buf[1]=0; |
- lDataLen=(short)(intbuf[0] & 0xFFF); |
- buf[2]=(char)(lDataLen & 255); |
- lDataLen = lDataLen >> 8; |
- buf[3] = (char)(lDataLen & 15); |
- bufsize=intbuf[0]*2+4; |
- if (intbuf[0]==0) |
- return 0; |
- for (i=1; i <= intbuf[0]; i++) |
- { |
- buf[2+2*i] = (char)(intbuf[i] & 255); |
- buf[3+2*i] = (char)((intbuf[i] >>8) & 255); |
- } |
- timeout=2000; |
- ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, bufsize, timeout); |
- if (ret>0) |
- { |
- lDataLen=26700; |
- timeout=6000; |
- ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, buf, lDataLen, timeout); |
- if (ret>0) |
- for (i=0; i < ret; i=i+2) |
- intbuf[ii++]=(UCHAR)(buf[i]) +(UCHAR)( buf[i+1])*256; |
- } |
- return ret; |
-} |
- |
-/* |
-******** xxusb_stack_read ************************ |
- |
- Reads the current DAQ stack stored by xxusb |
- |
- Parameters: |
- hdev: USB device handle returned by an open function |
- StackAddr: Indicates which stack to read, primary or secondary |
- intbuf: Pointer to a array where the stack can be stored |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short xxusb_stack_read(usb_dev_handle *hDev, short StackAddr, long *intbuf) |
-{ |
- int timeout; |
- short ret; |
- short lDataLen; |
- short bufsize; |
- char buf[1600]; |
- int i; |
- |
- buf[0]=(char)(StackAddr & 51); |
- buf[1]=0; |
- lDataLen = 2; |
- timeout=100; |
- ret=usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, lDataLen, timeout); |
- if (ret < 0) |
- return ret; |
- else |
- bufsize=1600; |
- int ii=0; |
- { |
- ret=usb_bulk_read(hDev, XXUSB_ENDPOINT_IN, buf, bufsize, timeout); |
- if (ret>0) |
- for (i=0; i < ret; i=i+2) |
- intbuf[ii++]=(UCHAR)(buf[i]) + (UCHAR)(buf[i+1])*256; |
- return ret; |
- |
- } |
-} |
- |
-/* |
-******** xxusb_register_read ************************ |
- |
- Reads the current contents of an internal xxusb register |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- RegAddr: The internal address of the register from which to read |
- RegData: Pointer to a long to hold the data. |
- |
- Returns: |
- When Successful, the number of bytes read from xxusb. |
- Upon failure, a negative number |
-*/ |
-short xxusb_register_read(usb_dev_handle *hDev, short RegAddr, long *RegData) |
-{ |
-//long RegD; |
-int timeout; |
- char buf[4]={1,0,0,0}; |
- int ret; |
- int lDataLen; |
- |
- buf[2]=(char)(RegAddr & 15); |
- timeout=10; |
- lDataLen=4; |
- ret=xxusb_bulk_write(hDev, buf, lDataLen, timeout); |
- if (ret < 0) |
- return (short)ret; |
- else |
- { |
- lDataLen=8; |
- timeout=100; |
- ret=xxusb_bulk_read(hDev, buf, lDataLen, timeout); |
- if (ret<0) |
- return (short)ret; |
- else |
- { |
- *RegData=(UCHAR)(buf[0])+256*(UCHAR)(buf[1]); |
- if (ret==4) |
- *RegData=*RegData+0x10000*(UCHAR)(buf[2]); |
- return (short)ret; |
- } |
- } |
-} |
- |
-/* |
-******** xxusb_reset_toggle ************************ |
- |
- Toggles the reset state of the FPGA while the xxusb in programming mode |
- |
- Parameters |
- hdev: US B device handle returned from an open function |
- |
- Returns: |
- Upon failure, a negative number |
-*/ |
-short xxusb_reset_toggle(usb_dev_handle *hDev) |
-{ |
- short ret; |
- char buf[2] = {(char)255,(char)255}; |
- int lDataLen=2; |
- int timeout=1000; |
- ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf,lDataLen, timeout); |
- return (short)ret; |
-} |
- |
-/* |
-******** xxusb_devices_find ************************ |
- |
- Determines the number and parameters of all xxusb devices attched to |
- the computer. |
- |
- Parameters: |
- xxdev: pointer to an array on which the device parameters are stored |
- |
- Returns: |
- Upon success, returns the number of devices found |
- Upon Failure returns a negative number |
-*/ |
-short xxusb_devices_find(xxusb_device_type *xxdev) |
-{ |
- short DevFound = 0; |
- usb_dev_handle *udev; |
- struct usb_bus *bus; |
- struct usb_device *dev; |
-struct usb_bus *usb_busses; |
- char string[256]; |
- short ret; |
- usb_init(); |
- usb_find_busses(); |
- usb_busses=usb_get_busses(); |
- usb_find_devices(); |
- for (bus=usb_busses; bus; bus = bus->next) |
- { |
- for (dev = bus->devices; dev; dev= dev->next) |
- { |
- if (dev->descriptor.idVendor==XXUSB_WIENER_VENDOR_ID) |
- { |
- udev = usb_open(dev); |
- if (udev) |
- { |
- ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); |
- if (ret >0 ) |
- { |
- xxdev[DevFound].usbdev=dev; |
- strcpy(xxdev[DevFound].SerialString, string); |
- DevFound++; |
- } |
- usb_close(udev); |
- } |
- else return -1; |
- } |
- } |
- } |
- return DevFound; |
-} |
- |
-/* |
-******** xxusb_device_close ************************ |
- |
- Closes an xxusb device |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- |
- Returns: 1 |
-*/ |
-short xxusb_device_close(usb_dev_handle *hDev) |
-{ |
- short ret; |
- ret=usb_release_interface(hDev,0); |
- usb_close(hDev); |
- return 1; |
-} |
- |
-/* |
-******** xxusb_device_open ************************ |
- |
- Opens an xxusb device found by xxusb_device_find |
- |
- Parameters: |
- dev: a usb device |
- |
- Returns: |
- A USB device handle |
-*/ |
-usb_dev_handle* xxusb_device_open(struct usb_device *dev) |
-{ |
- short ret; |
- long val; |
- int count =0; |
- usb_dev_handle *udev; |
- udev = usb_open(dev); |
- ret = usb_set_configuration(udev,1); |
- ret = usb_claim_interface(udev,0); |
-// RESET USB (added 10/16/06 Andreas Ruben) |
- ret=xxusb_register_write(udev, 10, 0x04); |
-// Loop to find known state (added 12/28/07 TH / AR) |
- ret =-1; |
- while ((ret <0) && (count <10)) |
- { |
- xxusb_register_read(udev, 0, &val); |
- count++; |
- } |
- |
- return udev; |
-} |
- |
-/* |
-******** xxusb_flash_program ************************ |
- |
- --Untested and therefore uncommented-- |
-*/ |
-short xxusb_flash_program(usb_dev_handle *hDev, char *config, short nsect) |
-{ |
- int i=0; |
- int k=0; |
- short ret=0; |
- time_t t1,t2; |
- |
- char *pconfig; |
- char *pbuf; |
- pconfig=config; |
- char buf[518] ={(char)0xAA,(char)0xAA,(char)0x55,(char)0x55,(char)0xA0,(char)0xA0}; |
- while (*pconfig++ != -1); |
- for (i=0; i<nsect; i++) |
- { |
- pbuf=buf+6; |
- for (k=0; k<256; k++) |
- { |
- *(pbuf++)=*(pconfig); |
- *(pbuf++)=*(pconfig++); |
- } |
- ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, 518, 2000); |
- if (ret<0) |
- return ret; |
- t1=clock()+(time_t)(0.03*CLOCKS_PER_SEC); |
- while (t1>clock()); |
- t2=clock(); |
- } |
- return ret; |
-} |
- |
-/* |
-******** xxusb_flashblock_program ************************ |
- |
- --Untested and therefore uncommented-- |
-*/ |
-short xxusb_flashblock_program(usb_dev_handle *hDev, UCHAR *config) |
-{ |
- int k=0; |
- short ret=0; |
- |
- UCHAR *pconfig; |
- char *pbuf; |
- pconfig=config; |
- char buf[518] ={(char)0xAA,(char)0xAA,(char)0x55,(char)0x55,(char)0xA0,(char)0xA0}; |
- pbuf=buf+6; |
- for (k=0; k<256; k++) |
- { |
- *(pbuf++)=(UCHAR)(*(pconfig)); |
- *(pbuf++)=(UCHAR)(*(pconfig++)); |
- } |
- ret = usb_bulk_write(hDev, XXUSB_ENDPOINT_OUT, buf, 518, 2000); |
- return ret; |
-} |
- |
-/* |
-******** xxusb_serial_open ************************ |
- |
- Opens a xxusb device whose serial number is given |
- |
- Parameters: |
- SerialString: a char string that gives the serial number of |
- the device you wish to open. It takes the form: |
- VM0009 - for a vm_usb with serial number 9 or |
- CC0009 - for a cc_usb with serial number 9 |
- |
- Returns: |
- A USB device handle |
-*/ |
-usb_dev_handle* xxusb_serial_open(char *SerialString) |
-{ |
- short DevFound = 0; |
- usb_dev_handle *udev = NULL; |
- struct usb_bus *bus; |
- struct usb_device *dev; |
-struct usb_bus *usb_busses; |
-char string[7]; |
- short ret; |
-// usb_set_debug(4); |
- usb_init(); |
- usb_find_busses(); |
- usb_busses=usb_get_busses(); |
- usb_find_devices(); |
- for (bus=usb_busses; bus; bus = bus->next) |
- { |
- for (dev = bus->devices; dev; dev= dev->next) |
- { |
- if (dev->descriptor.idVendor==XXUSB_WIENER_VENDOR_ID) |
- { |
- udev = xxusb_device_open(dev); |
- if (udev) |
- { |
- ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); |
- if (ret >0 ) |
- { |
- if (strcmp(string,SerialString)==0) |
- return udev; |
- } |
- usb_close(udev); |
- } |
- } |
- } |
- } |
- udev = NULL; |
- return udev; |
-} |
- |
- |
-//******************************************************// |
-//****************** EZ_VME Functions ******************// |
-//******************************************************// |
-// The following are functions used to perform simple |
-// VME Functions with the VM_USB |
- |
-/* |
-******** VME_write_32 ************************ |
- |
- Writes a 32 bit data word to the VME bus |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Address_Modifier: VME address modifier for the VME call |
- VME_Address: Address to write the data to |
- Data: 32 bit data word to be written to VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_write_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- intbuf[0]=7; |
- intbuf[1]=0; |
- intbuf[2]=Address_Modifier; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff); |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- intbuf[6]=(Data & 0xffff); |
- intbuf[7]=((Data >> 16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
-/* |
-******** VME_read_32 ************************ |
- |
- |
- Reads a 32 bit data word from a VME address |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Address_Modifier: VME address modifier for the VME call |
- VME_Address: Address to read the data from |
- Data: 32 bit data word read from VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_read_32(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long *Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- intbuf[0]=5; |
- intbuf[1]=0; |
- intbuf[2]=Address_Modifier +0x100; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff); |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Data=intbuf[0] + (intbuf[1] * 0x10000); |
- return ret; |
-} |
- |
-/* |
-******** VME_write_16 ************************ |
- |
- Writes a 16 bit data word to the VME bus |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Address_Modifier: VME address modifier for the VME call |
- VME_Address: Address to write the data to |
- Data: word to be written to VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_write_16(usb_dev_handle *hdev, short Address_Modifier, long VME_Address, long Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- intbuf[0]=7; |
- intbuf[1]=0; |
- intbuf[2]=Address_Modifier; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff)+ 0x01; |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- intbuf[6]=(Data & 0xffff); |
- intbuf[7]=0; |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
-/* |
-******** VME_read_16 ************************ |
- |
- Reads a 16 bit data word from a VME address |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Address_Modifier: VME address modifier for the VME call |
- VME_Address: Address to read the data from |
- Data: word read from VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_read_16(usb_dev_handle *hdev,short Address_Modifier, long VME_Address, long *Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- intbuf[0]=5; |
- intbuf[1]=0; |
- intbuf[2]=Address_Modifier +0x100; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff)+ 0x01; |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Data=intbuf[0]; |
- return ret; |
-} |
- |
-/* |
-******** VME_BLT_read_32 ************************ |
- |
- Performs block transfer of 32 bit words from a VME address |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Address_Modifier: VME address modifier for the VME call |
- count: number of data words to read |
- VME_Address: Address to read the data from |
- Data: pointer to an array to hold the data words |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_BLT_read_32(usb_dev_handle *hdev, short Adress_Modifier, int count, long VME_Address, long Data[]) |
-{ |
- long intbuf[1000]; |
- short ret; |
- int i=0; |
- if (count > 255) return -1; |
- intbuf[0]=5; |
- intbuf[1]=0; |
- intbuf[2]=Adress_Modifier +0x100; |
- intbuf[3]=(count << 8); |
- intbuf[4]=(VME_Address & 0xffff); |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- int j=0; |
- for (i=0;i<(2*count);i=i+2) |
- { |
- Data[j]=intbuf[i] + (intbuf[i+1] * 0x10000); |
- j++; |
- } |
- return ret; |
-} |
- |
-//******************************************************// |
-//****************** VM_USB Registers ******************// |
-//******************************************************// |
-// The following are functions used to set the registers |
-// in the VM_USB |
- |
-/* |
-******** VME_register_write ************************ |
- |
- Writes to the vmusb registers that are accessible through |
- VME style calls |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- VME_Address: The VME Address of the internal register |
- Data: Data to be written to VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_register_write(usb_dev_handle *hdev, long VME_Address, long Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- |
- intbuf[0]=7; |
- intbuf[1]=0; |
- intbuf[2]=0x1000; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff); |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- intbuf[6]=(Data & 0xffff); |
- intbuf[7]=((Data >> 16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
-/* |
-******** VME_register_read ************************ |
- |
- Reads from the vmusb registers that are accessible trough VME style calls |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- VME_Address: The VME Address of the internal register |
- Data: Data read from VME_Address |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_register_read(usb_dev_handle *hdev, long VME_Address, long *Data) |
-{ |
- long intbuf[1000]; |
- short ret; |
- |
- intbuf[0]=5; |
- intbuf[1]=0; |
- intbuf[2]=0x1100; |
- intbuf[3]=0; |
- intbuf[4]=(VME_Address & 0xffff); |
- intbuf[5]=((VME_Address >>16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Data=intbuf[0] + (intbuf[1] * 0x10000); |
- return ret; |
-} |
- |
-/* |
-******** VME_LED_settings ************************ |
- |
- Sets the vmusb LED's |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- LED: The number which corresponds to an LED values are: |
- 0 - for Top YELLOW LED |
- 1 - for RED LED |
- 2 - for GREEN LED |
- 3 - for Bottom YELLOW LED |
- code: The LED aource selector code, valid values for each LED |
- are listed in the manual |
- invert: to invert the LED lighting |
- latch: sets LED latch bit |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch) |
-{ |
- short ret; |
-// long internal; |
- long Data; |
- |
- if( (LED <0) ||(LED > 3) || (code < 0) || (code > 7)) return -1; |
- |
- VME_register_read(hdev,0xc,&Data); |
- if(LED == 0) |
- { |
- Data = Data & 0xFFFFFF00; |
- Data = Data | code; |
- if (invert == 1 && latch == 1) Data = Data | 0x18; |
- if (invert == 1 && latch == 0) Data = Data | 0x08; |
- if (invert == 0 && latch == 1) Data = Data | 0x10; |
- } |
- if(LED == 1) |
- { |
- Data = Data & 0xFFFF00FF; |
- Data = Data | (code * 0x0100); |
- if (invert == 1 && latch == 1) Data = Data | 0x1800; |
- if (invert == 1 && latch == 0) Data = Data | 0x0800; |
- if (invert == 0 && latch == 1) Data = Data | 0x1000; |
- } |
- if(LED == 2) |
- { |
- Data = Data & 0xFF00FFFF; |
- Data = Data | (code * 0x10000); |
- if (invert == 1 && latch == 1) Data = Data | 0x180000; |
- if (invert == 1 && latch == 0) Data = Data | 0x080000; |
- if (invert == 0 && latch == 1) Data = Data | 0x100000; |
- } |
- if(LED == 3) |
- { |
- Data = Data & 0x00FFFFFF; |
- Data = Data | (code * 0x10000); |
- if (invert == 1 && latch == 1) Data = Data | 0x18000000; |
- if (invert == 1 && latch == 0) Data = Data | 0x08000000; |
- if (invert == 0 && latch == 1) Data = Data | 0x10000000; |
- } |
- ret = VME_register_write(hdev, 0xc, Data); |
- return ret; |
-} |
- |
-/* |
-******** VME_DGG ************************ |
- |
- Sets the parameters for Gate & Delay channel A of vmusb |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- channel: Which DGG channel to use Valid Values are: |
- 0 - For DGG A |
- 1 - For DGG B |
- trigger: Determines what triggers the start of the DGG Valid values are: |
- 0 - Channel disabled |
- 1 - NIM input 1 |
- 2 - NIM input 2 |
- 3 - Event Trigger |
- 4 - End of Event |
- 5 - USB Trigger |
- 6 - Pulser |
- output: Determines which NIM output to use for the channel, Vaild values are: |
- 0 - for NIM O1 |
- 1 - for NIM O2 |
- delay: 32 bit word consisting of |
- lower 16 bits: Delay_fine in steps of 12.5ns between trigger and start of gate |
- upper 16 bits: Delay_coarse in steps of 81.7us between trigger and start of gate |
- gate: the time the gate should stay open in steps of 12.5ns |
- invert: is 1 if you wish to invert the DGG channel output |
- latch: is 1 if you wish to run the DGG channel latched |
- |
- Returns: |
- Returns 1 when successful |
- Upon failure, a negative number |
-*/ |
-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) |
-{ |
- long Data, DGData, Delay_ext; |
- long internal; |
- short ret; |
- |
- |
- ret = VME_register_read(hdev, 0x10, &Data); |
- // check and correct values |
- if(ret<=0) return -1; |
- |
- if(channel >1) channel =1; |
- if(invert >1) invert =1; |
- if(latch >1) latch =1; |
- if(output >1) output =1; |
- if(trigger >6) trigger =0; |
- |
- // define Delay and Gate data |
- DGData = gate * 0x10000; |
- DGData += (unsigned short) delay; |
- |
- // Set channel, output, invert, latch |
- if (output == 0) |
- { |
- Data = Data & 0xFFFFFF00; |
- Data += 0x04 + channel +0x08*invert + 0x10*latch; |
- } |
- if (output == 1) |
- { |
- Data = Data & 0xFFFF00FF; |
- Data += (0x04 + channel +0x08*invert + 0x10*latch)*0x100; |
- } |
- |
- // Set trigger, delay, gate |
- |
- if(channel ==0) // CHANNEL DGG_A |
- { |
- internal = (trigger * 0x1000000) ; |
- Data= Data & 0xF0FFFFFF; |
- Data += internal; |
- ret = VME_register_write(hdev,0x10,Data); |
- if(ret<=0) return -1; |
- ret=VME_register_write(hdev,0x14,DGData); |
- if(ret<=0) return -1; |
- // Set coarse delay in DGG_Extended register |
- ret = VME_register_read(hdev,0x38,&Data); |
- Delay_ext= (Data & 0xffff0000); |
- Delay_ext+= ((delay/0x10000) & 0xffff); |
- ret = VME_register_write(hdev,0x38,Delay_ext); |
- } |
- if( channel ==1) // CHANNEL DGG_B |
- { |
- internal = (trigger * 0x10000000) ; |
- Data= Data & 0x0FFFFFFF; |
- Data += internal; |
- ret = VME_register_write(hdev,0x10,Data); |
- if(ret<=0) return -1; |
- ret=VME_register_write(hdev,0x18,DGData); |
- if(ret<=0) return -1; |
- // Set coarse delay in DGG_Extended register |
- ret = VME_register_read(hdev,0x38,&Data); |
- Delay_ext= (Data & 0x0000ffff); |
- Delay_ext+= (delay & 0xffff0000); |
- ret = VME_register_write(hdev,0x38,Delay_ext); |
- } |
- return 1; |
- |
-} |
- |
-/* |
-******** VME_Output_settings ************************ |
- |
- Sets the vmusb NIM output register |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Channel: The number which corresponds to an output: |
- 1 - for Output 1 |
- 2 - for Output 2 |
- code: The Output selector code, valid values |
- are listed in the manual |
- invert: to invert the output |
- latch: sets latch bit |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short VME_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch) |
-{ |
- |
- short ret; |
-// long internal; |
- long Data; |
- |
- if( (Channel <1) ||(Channel > 2) || (code < 0) || (code > 7)) return -1; |
- VME_register_read(hdev,0x10,&Data); |
- if(Channel == 1) |
- { |
- Data = Data & 0xFFFF00; |
- Data = Data | code; |
- if (invert == 1 && latch == 1) Data = Data | 0x18; |
- if (invert == 1 && latch == 0) Data = Data | 0x08; |
- if (invert == 0 && latch == 1) Data = Data | 0x10; |
- } |
- if(Channel == 2) |
- { |
- Data = Data & 0xFF00FF; |
- Data = Data | (code * 0x0100); |
- if (invert == 1 && latch == 1) Data = Data | 0x1800; |
- if (invert == 1 && latch == 0) Data = Data | 0x0800; |
- if (invert == 0 && latch == 1) Data = Data | 0x1000; |
- } |
- ret = VME_register_write(hdev, 0x10, Data); |
- return ret; |
-} |
- |
- |
-//******************************************************// |
-//****************** CC_USB Registers ******************// |
-//******************************************************// |
-// The following are functions used to set the registers |
-// in the CAMAC_USB |
- |
-/* |
-******** CAMAC_register_write ***************** |
- |
- Performs a CAMAC write to CC_USB register |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- A: CAMAC Subaddress |
- F: CAMAC Function |
- Data: data to be written |
- |
- Returns: |
- Number of bytes written to xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_register_write(usb_dev_handle *hdev, int A, long Data) |
-{ |
- int F = 16; |
- int N = 25; |
- long intbuf[4]; |
- int ret; |
- |
- intbuf[0]=1; |
- intbuf[1]=(long)(F+A*32+N*512 + 0x4000); |
- intbuf[0]=3; |
- intbuf[2]=(Data & 0xffff); |
- intbuf[3]=((Data >>16) & 0xffff); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_register_read ************************ |
- |
- Performs a CAMAC read from CC_USB register |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- N: CAMAC Station Number |
- A: CAMAC Subaddress |
- F: CAMAC Function |
- Q: The Q response from the CAMAC dataway |
- X: The comment accepted response from CAMAC dataway |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_register_read(usb_dev_handle *hdev, int A, long *Data) |
-{ |
- int F = 0; |
- int N = 25; |
- long intbuf[4]; |
- int ret; |
- |
- intbuf[0]=1; |
- intbuf[1]=(long)(F+A*32+N*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Data=intbuf[0] + (intbuf[1] * 0x10000); |
- |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_DGG ************************ |
- |
- Sets the parameters for Gate & Delay channel A of CC_USB |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- channel: Which DGG channel to use Valid Values are: |
- 0 - For DGG A |
- 1 - For DGG B |
- trigger: Determines what triggers the start of the DGG Valid values are: |
- 0 - Channel disabled |
- 1 - NIM input 1 |
- 2 - NIM input 2 |
- 3 - NIM input 2 |
- 4 - Event Trigger |
- 5 - End of Event |
- 6 - USB Trigger |
- 7 - Pulser |
- output: Determines which NIM output to use for the channel, Vaild values are: |
- 1 - for NIM O1 |
- 2 - for NIM O2 |
- 3 - for NIM O3 |
- delay: Delay in steps of 12.5ns between trigger and start of gate |
- gate: the time the gate should stay open in steps of 12.5ns |
- invert: is 1 if you wish to invert the DGG channel output |
- latch: is 1 if you wish to run the DGG channel latched |
- |
- Returns: |
- Returns 1 when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_DGG(usb_dev_handle *hdev, short channel, short trigger, short output, |
- int delay, int gate, short invert, short latch) |
- |
- |
- |
-{ |
-// short channel_ID; |
- long Data; |
- long internal; |
- short ret; |
- long Delay_ext; |
- |
- ret = CAMAC_register_read(hdev,5,&Data); |
- //Set trigger |
- if((output < 1 ) || (output >3) || (channel < 0 ) || (channel > 1)) |
- return -1; |
- if(output ==1) |
- { |
- if(channel ==0) |
- { |
- internal = 0x03; |
- } else { |
- internal = 0x04; |
- } |
- } |
- if(output ==2) |
- { |
- if(channel ==0) |
- { |
- internal = 0x04; |
- } else { |
- internal = 0x05; |
- } |
- } |
- if(output ==3) |
- { |
- if(channel ==0) |
- { |
- internal = 0x05; |
- } else { |
- internal = 0x06; |
- } |
- } |
- |
- |
-// Set invert bit |
- if(invert ==1) |
- internal = internal | 0x10; |
- else |
- internal = internal & 0x0F; |
- // Set Latch Bit |
- if(latch==1) |
- internal = internal | 0x20; |
- else |
- internal = internal & 0x1F; |
-// Add new data to old |
- if(output == 1) |
- { |
- Data = Data & 0xFFFF00; |
- Data = Data | internal; |
- } |
- if(output == 2) |
- { |
- Data = Data & 0xFF00FF; |
- Data = Data |(internal * 0x100); |
- } |
- if(output == 3) |
- { |
- Data = Data & 0x00FFFF; |
- Data = Data | (internal * 0x10000) ; |
- } |
- CAMAC_register_write(hdev, 5, Data); |
- ret = CAMAC_register_read(hdev,6,&Data); |
-//Set Trigger |
- if(trigger <0 || trigger > 7) |
- return -1; |
- if(channel ==0) |
- { |
- Data = Data & 0xFF00FFFF; |
- internal = trigger * 0x10000; |
- Data = Data | internal; |
- } else { |
- Data = Data & 0x00FFFFFF; |
- internal = trigger * 0x1000000; |
- Data = Data | internal; |
- } |
- ret = CAMAC_register_write(hdev, 6, Data); |
- if(channel == 0) |
- { |
-// Write Delay and Gate info |
- ret = CAMAC_register_read(hdev,13,&Data); |
- Delay_ext= (Data & 0xffff0000); |
- Delay_ext+= ((delay/0x10000) & 0xffff); |
- internal = gate * 0x10000; |
- Data = internal + (delay & 0xffff); |
- ret=CAMAC_register_write(hdev,7,Data); |
-// Set coarse delay in DGG_Extended register |
- ret=CAMAC_register_write(hdev,13,Delay_ext); |
- } |
- else |
- { |
- ret=CAMAC_register_write(hdev,8,Data); |
- ret = CAMAC_register_read(hdev,13,&Data); |
- Delay_ext= (Data & 0x0000ffff); |
- Delay_ext+= (delay & 0xffff0000); |
- internal = gate * 0x10000; |
- Data = internal + (delay & 0xffff); |
-// Set coarse delay in DGG_Extended register |
- ret=CAMAC_register_write(hdev,13,Delay_ext); |
- } |
- return 1; |
-} |
- |
-/* |
-******** CAMAC_LED_settings ************************ |
- |
- Writes a data word to the vmusb LED register |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- LED: The number which corresponds to an LED values are: |
- 1 - for RED LED |
- 2 - for GREEN LED |
- 3 - for Yellow LED |
- code: The LED aource selector code, valid values for each LED |
- are listed in the manual |
- invert: to invert the LED lighting |
- latch: sets LED latch bit |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_LED_settings(usb_dev_handle *hdev, int LED, int code, int invert, int latch) |
-{ |
- |
- short ret; |
-// long internal; |
- long Data; |
- |
- if( (LED <1) ||(LED > 3) || (code < 0) || (code > 7)) |
- return -1; |
- |
- CAMAC_register_read(hdev,4,&Data); |
- |
- if(LED == 1) |
- { |
- Data = Data & 0xFFFF00; |
- Data = Data | code; |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x30; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x10; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x20; |
- } |
- if(LED == 2) |
- { |
- Data = Data & 0xFF00FF; |
- Data = Data | (code * 0x0100); |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x3000; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x1000; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x2000; |
- } |
- if(LED == 3) |
- { |
- Data = Data & 0x00FFFF; |
- Data = Data | (code * 0x10000); |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x300000; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x100000; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x200000; |
- } |
- ret = CAMAC_register_write(hdev, 4, Data); |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_Output_settings ************************ |
- |
- Writes a data word to the vmusb LED register |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Channel: The number which corresponds to an output: |
- 1 - for Output 1 |
- 2 - for Output 2 |
- 3 - for Output 3 |
- code: The Output selector code, valid values |
- are listed in the manual |
- invert: to invert the output |
- latch: sets latch bit |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_Output_settings(usb_dev_handle *hdev, int Channel, int code, int invert, int latch) |
-{ |
- short ret; |
-// long internal; |
- long Data; |
- |
- if( (Channel <1) ||(Channel > 3) || (code < 0) || (code > 7)) |
- return -1; |
- |
- CAMAC_register_read(hdev,5,&Data); |
- |
- if(Channel == 1) |
- { |
- Data = Data & 0xFFFF00; |
- Data = Data | code; |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x30; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x10; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x20; |
- } |
- if(Channel == 2) |
- { |
- Data = Data & 0xFF00FF; |
- Data = Data | (code * 0x0100); |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x3000; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x1000; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x2000; |
- } |
- if(Channel == 3) |
- { |
- Data = Data & 0x00FFFF; |
- Data = Data | (code * 0x10000); |
- if (invert == 1 && latch == 1) |
- Data = Data | 0x300000; |
- if (invert == 1 && latch == 0) |
- Data = Data | 0x100000; |
- if (invert == 0 && latch == 1) |
- Data = Data | 0x200000; |
- } |
- ret = CAMAC_register_write(hdev, 5, Data); |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_write_LAM_mask ************************ |
- |
- Writes the data word to the LAM mask register |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Data: LAM mask to write |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_write_LAM_mask(usb_dev_handle *hdev, long Data) |
-{ |
- short ret; |
- ret = CAMAC_register_write(hdev, 9, Data); |
- |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_read_LAM_mask ************************ |
- |
- Writes the data word to the LAM mask register |
- |
- Parameters: |
- hdev: USB devcie handle returned from an open function |
- Data: LAM mask to write |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_read_LAM_mask(usb_dev_handle *hdev, long *Data) |
-{ |
- long intbuf[4]; |
- int ret; |
- int N = 25; |
- int F = 0; |
- int A = 9; |
- |
- // CAMAC direct read function |
- intbuf[0]=1; |
- intbuf[1]=(long)(F+A*32+N*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000; |
- return ret; |
-} |
- |
- |
-//******************************************************// |
-//**************** EZ_CAMAC Functions ******************// |
-//******************************************************// |
-// The following are functions used to perform simple |
-// CAMAC Functions with the CC_USB |
- |
- |
-/* |
-******** CAMAC_write ************************ |
- |
- Performs a CAMAC write using NAF comments |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- N: CAMAC Station Number |
- A: CAMAC Subaddress |
- F: CAMAC Function (16...23) |
- Q: The Q response from the CAMAC dataway |
- X: The comment accepted response from CAMAC dataway |
- |
- Returns: |
- Number of bytes written to xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_write(usb_dev_handle *hdev, int N, int A, int F, long Data, int *Q, int *X) |
-{ |
- long intbuf[4]; |
- int ret; |
-// CAMAC direct write function |
- intbuf[0]=1; |
- intbuf[1]=(long)(F+A*32+N*512 + 0x4000); |
- if ((F > 15) && (F < 24)) |
- { |
- intbuf[0]=3; |
- intbuf[2]=(Data & 0xffff); |
- intbuf[3]=((Data >>16) & 255); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- *Q = (intbuf[0] & 1); |
- *X = ((intbuf[0] >> 1) & 1); |
- } |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_read ************************ |
- |
- Performs a CAMAC read using NAF comments |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- N: CAMAC Station Number |
- A: CAMAC Subaddress |
- F: CAMAC Function (F<16 or F>23) |
- Q: The Q response from the CAMAC dataway |
- X: The comment accepted response from CAMAC dataway |
- |
- Returns: |
- Number of bytes read from xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_read(usb_dev_handle *hdev, int N, int A, int F, long *Data, int *Q, int *X) |
-{ |
- long intbuf[4]; |
- int ret; |
- // CAMAC direct read function |
- intbuf[0]=1; |
- intbuf[1]=(long)(F+A*32+N*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- if ((F < 16) || (F >23)) |
- { |
- *Data=intbuf[0] + (intbuf[1] & 255) * 0x10000; //24-bit word |
- *Q = ((intbuf[1] >> 8) & 1); |
- *X = ((intbuf[1] >> 9) & 1); |
- } |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_Z ************************ |
- |
- Performs a CAMAC init |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- |
- Returns: |
- Number of bytes written to xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_Z(usb_dev_handle *hdev) |
-{ |
- long intbuf[4]; |
- int ret; |
-// CAMAC Z = N(28) A(8) F(29) |
- intbuf[0]=1; |
- intbuf[1]=(long)(29+8*32+28*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_C ************************ |
- |
- Performs a CAMAC clear |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- |
- Returns: |
- Number of bytes written to xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_C(usb_dev_handle *hdev) |
-{ |
- long intbuf[4]; |
- int ret; |
- intbuf[0]=1; |
- intbuf[1]=(long)(29+9*32+28*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
-/* |
-******** CAMAC_I ************************ |
- |
- Set CAMAC inhibit |
- |
- Parameters: |
- hdev: USB device handle returned from an open function |
- |
- Returns: |
- Number of bytes written to xxusb when successful |
- Upon failure, a negative number |
-*/ |
-short CAMAC_I(usb_dev_handle *hdev, int inhibit) |
-{ |
- long intbuf[4]; |
- int ret; |
- intbuf[0]=1; |
- if (inhibit) intbuf[1]=(long)(24+9*32+29*512 + 0x4000); |
- else intbuf[1]=(long)(26+9*32+29*512 + 0x4000); |
- ret = xxusb_stack_execute(hdev, intbuf); |
- return ret; |
-} |
- |
- |
Index: sipmscan/trunk/configure |
=================================================================== |
--- sipmscan/trunk/configure (revision 117) |
+++ sipmscan/trunk/configure (nonexistent) |
@@ -1,199 +0,0 @@ |
-#!/bin/bash |
- |
-function helptext() |
-{ |
- echo "#------------------------------" |
- echo "# Configure instructions: -----" |
- echo "#------------------------------" |
- echo "" |
- echo "./configure [option] [type]" |
- 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 " - 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 "" |
- echo "#------------------------------" |
-} |
- |
-# Check for arguments |
-if [ "$1" == "" ]; then |
- echo "Error! No arguments supplied." |
- echo "" |
- helptext |
- exit 1 |
-else |
- # When using help, only display help and then exit |
- if [ "$1" == "help" ]; then |
- helptext |
- exit 0 |
- fi |
- |
- # Print help and exit if we give a wrong first argument |
- if [ "$1" != "nomake" ] && [ "$1" != "all" ] && [ "$1" != "clean" ] && [ "$1" != "compress" ]; then |
- echo "Error! Wrong configuration option selected (first argument)." |
- echo "" |
- helptext |
- exit 1 |
- fi |
- |
- startdir=$PWD |
- |
- ostype=`uname -p` |
- |
- # Compiles the table microcontroller program |
- if [ "$1" == "all" ]; then |
- if [ -d $startdir/MIKRO ]; then |
- cd $startdir/MIKRO |
- rm -f $startdir/MIKRO/mikro_ctrl |
- make |
- cd $startdir |
- fi |
- fi |
- |
- # When using compress, only create a tar-ball and then exit |
- if [ "$1" == "compress" ]; then |
- cd $startdir |
- if [ ! -d $startdir/camac_gui_windowed ]; then |
- 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/ |
- cd $startdir/camac_gui_windowed |
- echo "Cleaning the base directory in $startdir/camac_gui_windowed..." |
- rm -f *.bak |
- cd $startdir/camac_gui_windowed/input |
- echo "Cleaning the input directory in $startdir/camac_gui_windowed/input..." |
- rm -f *.bak |
- cd $startdir/camac_gui_windowed/vxi11_x86_64 |
- echo "Cleaning the 64 bit VXI11 directory in $startdir/camac_gui_windowed/vxi11_x86_64..." |
- rm -f *.bak |
- make clean |
- cd $startdir/camac_gui_windowed/vxi11_i686 |
- echo "Cleaning the 32 bit VXI11 directory in $startdir/camac_gui_windowed/vxi11_i686..." |
- rm -f *.bak |
- make clean |
- cd $startdir |
- echo "Creating a tar-ball camac_gui_windowed.tar.gz..." |
- tar czf $startdir/camac_gui_windowed.tar.gz ./camac_gui_windowed |
- echo "Removing the temporary directory $startdir/camac_gui_windowed..." |
- rm -r $startdir/camac_gui_windowed |
- exit 0 |
- else |
- echo "Error! Directory ./camac_gui_windowed already exists." |
- exit 1 |
- fi |
- fi |
- |
- # Configure the workstation information and directory of program (0 if we find something and 1 otherwise) |
- basedir=$(echo $startdir | sed 's/\//\\\//g') |
- |
- if [ "$1" == "nomake" ] || [ "$1" == "all" ]; then |
- if [ "$2" == "O" ] || [ "$2" == "I" ]; 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 |
- fi |
- grep -q "#define rootdir \"path-to-installation\"" $startdir/input/workstation.h.in |
- if [ $? == 0 ]; then |
- sed "s/path-to-installation/$basedir/g" $startdir/workstation.h.mid > $startdir/workstation.h |
- rm $startdir/workstation.h.mid |
- fi |
- grep -q "#include \"vxi11_user.h\"" $startdir/input/daqscope.C.in |
- if [ $? == 0 ]; then |
- sed "s/vxi11_user.h/.\/vxi11_$ostype\/vxi11_user.h/g" $startdir/input/daqscope.C.in > $startdir/daqscope.C |
- fi |
- grep -q "SHLIB = \$(LIBFILE) libvxi11.a" $startdir/input/Makefile.in |
- if [ $? == 0 ]; then |
- if [ "$2" == "I" ]; then |
- sed "s/SHLIB = \$(LIBFILE) libvxi11.a/SHLIB = \$(LIBFILE) libvxi11.a -lusb/g" $startdir/input/Makefile.in > $startdir/Makefile.mid |
- fi |
- fi |
- grep -q "CAMLIB = \$(LIBFILE)" $startdir/input/Makefile.in |
- if [ $? == 0 ]; then |
- 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 |
- cp $startdir/input/Makefile.in $startdir/Makefile |
- fi |
- fi |
- |
- if [ "$2" == "O" ]; then |
- cp $startdir/input/daqusb.C.offline $startdir/daqusb.C |
- cp $startdir/input/start.sh.offline $startdir/start.sh |
- elif [ "$2" == "I" ]; then |
- cp $startdir/input/daqusb.C.online $startdir/daqusb.C |
- cp $startdir/input/start.sh.online $startdir/start.sh |
- fi |
- fi |
- fi |
- |
- # In case we just want to set the workstation information, exit here |
- if [ "$1" == "nomake" ]; then |
- exit 0 |
- fi |
- |
- # 64 bit configuration rules |
- if [ $ostype == "x86_64" ]; then |
- vxidir=$startdir/vxi11_$ostype |
- if [ -d $vxidir ]; then |
- cd $vxidir |
- if [ "$1" == "clean" ]; then |
- make clean |
- cd $startdir |
- make clean |
- rm -f Makefile |
- else |
- if [ "$2" == "O" ] || [ "$2" == "I" ]; then |
- make |
- else |
- echo "Error! No configuration type selected (second argument)." |
- echo "" |
- helptext |
- exit 1 |
- fi |
- fi |
- cd $startdir |
- else |
- echo "No 64 bit VXI11 source folder." |
- exit 1 |
- fi |
- # 32 bit configuration rules |
- elif [ $ostype == "i686" ]; then |
- vxidir=$startdir/vxi11_$ostype |
- if [ -d $vxidir ]; then |
- cd $vxidir |
- if [ "$1" == "clean" ]; then |
- make clean |
- cd $startdir |
- make clean |
- rm -f Makefile |
- else |
- if [ "$2" == "O" ] || [ "$2" == "I" ]; then |
- make |
- else |
- echo "Error! No installation type selected (second argument)." |
- echo "" |
- helptext |
- exit 1 |
- fi |
- fi |
- cd $startdir |
- else |
- echo "No 32 bit VXI11 source folder." |
- exit 1 |
- fi |
- else |
- echo "No OS type information found." |
- exit 1 |
- fi |
-fi |
- |
-exit 0 |
/sipmscan/trunk/configure |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: sipmscan/trunk/MIKRO/rs232.h |
=================================================================== |
--- sipmscan/trunk/MIKRO/rs232.h (revision 117) |
+++ sipmscan/trunk/MIKRO/rs232.h (nonexistent) |
@@ -1,20 +0,0 @@ |
-#ifndef _RS232_H_ |
-#define _RS232_H_ |
-#include <stdlib.h> |
-#include <stdio.h> |
- |
-#define LWRS_HWHANDSHAKE_OFF 0 |
-#define LWRS_HWHANDSHAKE_CTS_RTS_DTR 1 |
-#define LWRS_HWHANDSHAKE_CTS_RTS 2 |
- |
-int Delay(double seconds); |
-int FlushInQ(int fd); |
-int FlushOutQ(int fd); |
-int ComWrt (int fd, char* cmd, int Count ) ; |
-int ComRdTerm (int fd, char* result, int count, int termchar ); |
-int OpenComConfig(char *dev, char * device_name, long Baud_Rate, int Parity, int Data_Bits, |
- int Stop_Bits, int Input_Queue_Size, int Output_Queue_Size ); |
-int CloseCom (int fd); |
-int SetComTime(int fd, double timeout_seconds); |
-#endif |
- |
Index: sipmscan/trunk/MIKRO/MIKRO.c |
=================================================================== |
--- sipmscan/trunk/MIKRO/MIKRO.c (revision 117) |
+++ sipmscan/trunk/MIKRO/MIKRO.c (nonexistent) |
@@ -1,296 +0,0 @@ |
-#include "rs232.h" |
-#include "MIKRO.h" |
- |
-//#define DEBUG |
- |
-#define COMWAIT 0.5 |
-#define COMDELAY 0.1 |
- |
-static char MIKRO_Send[100], MIKRO_Receive[100]; |
-static char MIKRO_Device, MIKRO_Axes, MIKRO_Response; |
-static int MIKRO_Port; |
-static int nin, nout, rstat; |
-static int MIKRO_type[100]; |
- |
-int MIKRO_Cmd (int node, char *cmd) |
-{ |
- printf("Command: %1d %s\n",node,cmd); |
- Delay(COMDELAY); |
- FlushInQ (MIKRO_Port); |
- nout = sprintf (MIKRO_Send, "%1d %s\r", node, cmd); |
- ComWrt (MIKRO_Port, MIKRO_Send, nout); |
- if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) { |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
- if (nin==2) return (0); |
- } |
- return (-1); |
-} |
- |
-int MIKRO_Set (int node, char cmd[], int val) |
-{ |
- printf("Command: %1d %s %d\n",node,cmd, val); |
- Delay(COMDELAY); |
- FlushInQ (MIKRO_Port); |
- nout = sprintf (MIKRO_Send, "%1d %s %d\r", node, cmd, val); |
- ComWrt (MIKRO_Port, MIKRO_Send, nout); |
- if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) { |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
- if (nin==2) return (0); |
- } |
- return (-1); |
-} |
- |
-int MIKRO_Get (int node, char cmd[], int *val) |
-{ |
- short int stmp; |
- |
- Delay(COMDELAY); |
- FlushInQ (MIKRO_Port); |
- nout = sprintf (MIKRO_Send, "%1d %s\r", node, cmd); |
- ComWrt (MIKRO_Port, MIKRO_Send, nout); |
- if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) { |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
- if (nin>0){ |
-// MIKRO_Receive[--nin]=0; |
- switch (nin) { |
- case 9: |
- sscanf (MIKRO_Receive, "%*x %hx",&stmp); |
- *val=stmp; |
- return (0); |
- case 13: |
- sscanf (MIKRO_Receive, "%*x %x",val); |
- return (0); |
- default: |
- printf("Node %d Com error => bytes rcved=0x%02x buf=%s\n",node,nin,MIKRO_Receive); |
- break; |
- } |
- } |
- } |
- return (-1); |
-} |
- |
-int MIKRO_GetStat (int node) |
-{ |
- int tmp; |
- |
- Delay(COMDELAY); |
- FlushInQ (MIKRO_Port); |
- nout = sprintf (MIKRO_Send, "%1d st\r", node); |
- ComWrt (MIKRO_Port, MIKRO_Send, nout); |
- if ((nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa))==0) { |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
-// if (nin>0) nin--; |
- MIKRO_Receive[nin]=0; |
- if (nin==9) { |
- tmp=0; |
- sscanf (MIKRO_Receive, "%*x %hx",(short int *)&tmp); |
- return (tmp); |
- } |
- } |
- return (-1); |
-} |
- |
-int _VI_FUNC MIKRO_Open (char * dev) |
-{ |
- |
- |
- MIKRO_Port=OpenComConfig (dev, "", 38400, 0, 8, 1, 512, 512); |
-// SetXMode (MIKRO_Port, 0); |
-// SetCTSMode (MIKRO_Port, LWRS_HWHANDSHAKE_OFF); |
-// SetComTime (MIKRO_Port, COMWAIT); |
- |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_Init (int node, int type) |
-{ |
- MIKRO_type[node]=type; |
- Delay(0.1); |
- MIKRO_Cmd(node,"ok 1"); |
- MIKRO_Cmd(node,"ab"); |
- switch (type){ |
- case 1: // 3M Linear |
- MIKRO_Cmd(node,"k 1"); |
- MIKRO_Cmd(node,"ad 200"); |
- MIKRO_Cmd(node,"aa 2"); |
- MIKRO_Cmd(node,"fa 1"); |
- MIKRO_Cmd(node,"fd 3000"); // Set Max Dynamic Following Error (1000) |
- MIKRO_Cmd(node,"sr 1000"); |
- MIKRO_Cmd(node,"sp 750"); |
- MIKRO_Cmd(node,"ac 100"); |
- MIKRO_Cmd(node,"dc 200"); |
- MIKRO_Cmd(node,"por 28000"); |
- MIKRO_Cmd(node,"i 600"); |
- MIKRO_Cmd(node,"ano 2350"); |
- MIKRO_Cmd(node,"ls 1"); |
- MIKRO_Cmd(node,"hp 1"); |
- MIKRO_Cmd(node,"hf 1"); |
- break; |
- case 2: // 3M Rotary |
- MIKRO_Cmd(node,"k 1"); |
- MIKRO_Cmd(node,"ad 200"); |
- MIKRO_Cmd(node,"aa 1"); |
- MIKRO_Cmd(node,"fa 1"); |
- MIKRO_Cmd(node,"fd 3000"); // Set Max Dynamic Following Error (1000) |
- MIKRO_Cmd(node,"sr 1000"); |
- MIKRO_Cmd(node,"sp 550"); |
- MIKRO_Cmd(node,"ac 100"); |
- MIKRO_Cmd(node,"dc 200"); |
- MIKRO_Cmd(node,"por 28000"); |
- MIKRO_Cmd(node,"i 600"); |
- MIKRO_Cmd(node,"ano 2350"); |
- MIKRO_Cmd(node,"ls 99"); |
- MIKRO_Cmd(node,"hp 1"); |
- MIKRO_Cmd(node,"hf 1"); |
- break; |
- case 3: // 4M Linear |
- MIKRO_Cmd(node,"k 1"); |
- MIKRO_Cmd(node,"ad 1000"); |
- MIKRO_Cmd(node,"aa 2"); |
- MIKRO_Cmd(node,"fa 1"); |
- MIKRO_Cmd(node,"fd 3000"); // Set Max Dynamic Following Error (1000) |
- MIKRO_Cmd(node,"sr 1000"); |
- MIKRO_Cmd(node,"sp 1000"); |
- MIKRO_Cmd(node,"ac 100"); |
- MIKRO_Cmd(node,"dc 200"); |
- MIKRO_Cmd(node,"por 28000"); |
- MIKRO_Cmd(node,"i 600"); |
- MIKRO_Cmd(node,"ano 2600"); |
- MIKRO_Cmd(node,"ls 1"); |
- MIKRO_Cmd(node,"hp 1"); |
- MIKRO_Cmd(node,"hf 1"); |
- break; |
- case 4: // 4M Rotary |
- MIKRO_Cmd(node,"k 1"); |
- MIKRO_Cmd(node,"ad 100"); |
- MIKRO_Cmd(node,"aa 1"); |
- MIKRO_Cmd(node,"fa 1"); |
- MIKRO_Cmd(node,"fd 3000"); // Set Max Dynamic Following Error (1000) |
- MIKRO_Cmd(node,"sp 800"); |
- MIKRO_Cmd(node,"sr 1000"); |
- MIKRO_Cmd(node,"ac 100"); |
- MIKRO_Cmd(node,"dc 200"); |
- MIKRO_Cmd(node,"por 28000"); |
- MIKRO_Cmd(node,"i 600"); |
- MIKRO_Cmd(node,"ano 2600"); |
- MIKRO_Cmd(node,"ls 99"); |
- break; |
- default: |
- break; |
- } |
- MIKRO_Cmd(node,"rd 0"); |
- MIKRO_Cmd(node,"n 2"); |
- MIKRO_Cmd(node,"en"); |
- if (type != 0){ |
- MIKRO_Cmd(node,"eeboot 1"); |
- MIKRO_Cmd(node,"eepsav 1"); |
- Delay(0.1); |
- } |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_Reset (int node) |
-{ |
- |
- MIKRO_Cmd(node,"di"); // disables the node |
- |
- Delay(COMDELAY); |
- nout = sprintf (MIKRO_Send, "%1d rn\r", node); // resets the node |
- ComWrt (MIKRO_Port, MIKRO_Send, nout); |
- |
- SetComTime (MIKRO_Port, 20); |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
- SetComTime (MIKRO_Port, COMWAIT); |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
-// if (nin!=0) nin--; |
-// MIKRO_Receive[nin]=0; |
- printf("%s\n",MIKRO_Receive); |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
- nin = ComRdTerm (MIKRO_Port, MIKRO_Receive, 30, 0xa); |
-// if (nin!=0) nin--; |
-// MIKRO_Receive[nin]=0; |
- printf("%s\n",MIKRO_Receive); |
- MIKRO_Init(node,0); |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_ReferenceMove (int node) |
-{ |
- int fac=10; |
- int n2,as; |
- |
- MIKRO_Cmd(node,"ab"); |
- MIKRO_Cmd(node,"en"); |
- MIKRO_Set(node,"ll",-1000000); |
- MIKRO_Set(node,"ll",1000000); |
- |
- if (!(MIKRO_GetStat(node)&0x8000)){ |
- MIKRO_Set(node,"v", -100*fac); |
- do { |
- MIKRO_GetPosition(node,&n2); |
- MIKRO_Get(node,"as",&as); |
- printf("Approaching N-limit node=%d pos=%d speed=%d\n",node,n2,as); |
- } while (MIKRO_GetStat(node)&0x1 ); |
- if (!(MIKRO_GetStat(node)&0x8000)){ |
- printf("N-limit not reached! Trying with half speed.\n"); |
- MIKRO_Set(node,"v", -50*fac); |
- do { |
- MIKRO_GetPosition(node,&n2); |
- MIKRO_Get(node,"as",&as); |
- printf("Approaching N-limit node=%d pos=%d speed=%d\n",node,n2,as); |
- } while (MIKRO_GetStat(node)&0x1 ); |
- if (!(MIKRO_GetStat(node)&0x8000)){ |
- printf("N-limit not reached! Aborting ...\n"); |
- MIKRO_Cmd(node,"ab"); |
- return -1; |
- } |
- } |
- } |
- MIKRO_MoveFor(node,1000); |
- MIKRO_Set(node,"v", -10*fac); |
- do { |
- MIKRO_GetPosition(node,&n2); |
- MIKRO_Get(node,"as",&as); |
- printf("Fine tuning 0: node=%d pos=%d speed=%d\n",node,n2, as); |
- } while (MIKRO_GetStat(node)&0x1); |
- if (!(MIKRO_GetStat(node)&0x8000)){ |
- printf("N-limit not reached! Aborting ...\n"); |
- MIKRO_Cmd(node,"ab"); |
- return -1; |
- } |
- |
- MIKRO_MoveFor(node,1000); |
- MIKRO_Set(node,"ho",0); |
- MIKRO_Set(node,"ll",-100); |
- MIKRO_Set(node,"ll",500100); |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_MoveFor (int node, int dist) |
-{ |
- MIKRO_Set(node,"lr", dist); |
- MIKRO_Cmd(node,"mv"); |
- while (MIKRO_GetStat(node)&1) Delay(0.1); |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_MoveTo (int node, int dest) |
-{ |
-// printf("-> MIKRO_MoveTo \n"); |
- MIKRO_Set(node,"la", dest); |
- MIKRO_Cmd(node,"mv"); |
- while (MIKRO_GetStat(node)&1) Delay(0.1); |
- return 0; |
-} |
- |
-int _VI_FUNC MIKRO_GetPosition (int node, int pos[]) |
-{ |
- MIKRO_Get(node,"pos",pos); |
- return 0; |
-} |
- |
-void _VI_FUNC MIKRO_Close (void) |
-{ |
-CloseCom (MIKRO_Port); |
-} |
- |
Index: sipmscan/trunk/MIKRO/mikro_ctrl |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/sipmscan/trunk/MIKRO/mikro_ctrl |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Deleted: svn:mime-type |
## -1 +0,0 ## |
-application/octet-stream |
\ No newline at end of property |
Index: sipmscan/trunk/MIKRO/mikro_ctrl.c |
=================================================================== |
--- sipmscan/trunk/MIKRO/mikro_ctrl.c (revision 117) |
+++ sipmscan/trunk/MIKRO/mikro_ctrl.c (nonexistent) |
@@ -1,148 +0,0 @@ |
-#include <stdlib.h> |
-#include <stdio.h> |
-#include "MIKRO.h" |
- |
- |
-#include <getopt.h> |
- |
-#define MIKRO_COM "/dev/ttyUSB0" |
- |
-int help(){ |
- fprintf(stderr,"Usage: mikro [-i node][-n node] [-u up] [-d down] [-r node] [-h node] [-a] [-g] [-m pos]\n"); |
- fprintf(stderr," Options:\n"); |
- fprintf(stderr,"[-n node] -i type .. initialize node + save to EEPROM\n"); |
- fprintf(stderr," (1=3MLin,2=3MRot,3=4MLin,4=4MRot,0=skip\n"); |
- fprintf(stderr," -n node -h .. homing procedure for node\n"); |
- fprintf(stderr," -n node -r .. reset node\n"); |
- fprintf(stderr," -n node -u .. move node for +1000\n"); |
- fprintf(stderr," -n node -d .. move node for -1000\n"); |
- fprintf(stderr,"[-n node] -a .. current status of the nodes\n"); |
- fprintf(stderr," -n node -v value -s cmd .. set value of the cmd on the node\n"); |
- fprintf(stderr," -n node -g cmd .. get value of the cmd on the node\n"); |
- fprintf(stderr," -n node -m position .. move node to position\n"); |
- fprintf(stderr," -l delaysec .. loop test with the delay delaysec\n"); |
- return 0; |
-} |
- |
-int main (int argc, char ** argv){ |
- int i,j,k; |
- int node=0,opt,value=0,itype=0; |
- int nr_nodes=3; |
- int ierr; |
- int pos,xpos,ypos,zpos; |
- char custcmd[20]; |
- char statbits[16][10]={"Moving","In-Pos","Mode","AMN Mode","%Done","DNet","DNErr","FD-Error", |
- "Disable","R-Lim","Local","Estop","Event1","P-Lim","Event2","N-Lim"}; |
- |
- MIKRO_Open (MIKRO_COM); |
- |
- // ":" just indicates that this option needs an argument |
- while ((opt = getopt(argc, argv, "i:av:s:l:udn:c:pm:g:hre")) != -1) { |
- switch (opt) { |
- case 'i': |
- itype = atoi(optarg); |
- if(node != 0) |
- MIKRO_Init (node,itype); |
- else |
- for(i=1; i<nr_nodes+1; i++) MIKRO_Init (i,itype); |
- break; |
- case 'a': |
- if(node != 0) { |
- pos=0; |
- ierr=MIKRO_GetStat(node); |
- MIKRO_GetPosition (node, &pos); |
- printf("node %d position %d status =%04x\n",node,pos,ierr); |
- for(i=0; i<16; i++){ |
- printf("%d: %s\n", (ierr&1),statbits[i]); |
- ierr>>=1; |
- } |
- }else{ |
- pos=0; |
- for (j=1;j<nr_nodes+1;j++){ |
- ierr=MIKRO_GetStat(j); |
- MIKRO_GetPosition (j, &pos); |
- printf("node %d position %d status =%04x\n",j,pos,ierr); |
- for(i=0; i<16; i++){ |
- printf("%d: %s\n", (ierr&1),statbits[i]); |
- ierr>>=1; |
- } |
- } |
- } |
- break; |
- case 'l': |
- printf("MIKRO_MoveTo Loop\n"); |
- for (i=0;i<5;i++){ |
- xpos=i*1000+10000; |
- MIKRO_MoveTo (1, xpos); |
- for (j=0;j<5;j++){ |
- ypos=j*1000+10000; |
- MIKRO_MoveTo (2, ypos); |
- for (k=0;k<50;k++){ |
- zpos=k*1000+10000; |
- MIKRO_MoveTo (3, zpos); |
- printf("x=%d y=%d z=%d\n",xpos,ypos,zpos); |
- Delay(atof(optarg)); |
- } |
- } |
- } |
- break; |
- case 'n': |
- node = atoi(optarg); |
- break; |
- case 'm': |
- MIKRO_MoveTo (node, atoi(optarg)); |
- printf("MIKRO_MoveTo node=%d pos=%d \n",node,atoi(optarg)); |
- MIKRO_GetPosition (node, &i); |
- printf("node %d position %d \n",node,i); |
- break; |
- case 'v': |
- value=atoi(optarg); |
- break; |
- case 's': |
- MIKRO_Set (node,optarg,value); |
- printf("MIKRO_Set node %d cmd=%s val=%d\n",node,optarg, value); |
- break; |
- case 'g': |
- MIKRO_Get (node,optarg,&i); |
- printf("MIKRO_Get node %d cmd=%s val=%d\n",node,optarg, i); |
- break; |
- case 'h': |
- printf("MIKRO_ReferenceMove node=%d\n",node); |
- MIKRO_ReferenceMove (node); |
- break; |
- case 'r': |
- printf("MIKRO_Reset node=%d\n",node); |
- MIKRO_Reset (node); |
- break; |
- case 'u': |
- MIKRO_Set(node,"lr", 1000); |
- MIKRO_Cmd(node,"mv"); |
- break; |
- case 'd': |
- MIKRO_Set(node,"lr", -1000); |
- MIKRO_Cmd(node,"mv"); |
- break; |
- case 'e': |
- MIKRO_Cmd(node,"ab"); |
- MIKRO_Cmd(node,"n 2"); |
- MIKRO_Cmd(node,"en"); |
- break; |
- case 'c': // cust. com. |
- sprintf(custcmd,"%s",optarg); |
- MIKRO_Cmd(node,custcmd); |
- break; |
- case 'p': // get pos. |
- if(node != 0){ |
- MIKRO_GetPosition (node, &pos); |
- printf("%d\n",pos); |
- } |
- break; |
- default: // '?' |
- help(); |
- break; |
- } |
- } |
- if (argc==1) help(); |
- MIKRO_Close (); |
- return 0; |
-} |
Index: sipmscan/trunk/MIKRO/MIKRO.h |
=================================================================== |
--- sipmscan/trunk/MIKRO/MIKRO.h (revision 117) |
+++ sipmscan/trunk/MIKRO/MIKRO.h (nonexistent) |
@@ -1,21 +0,0 @@ |
- |
-#define _VI_FUNC |
-int _VI_FUNC MIKRO_Open (char *dev); |
- |
-int _VI_FUNC MIKRO_Reset (int node); |
- |
-int _VI_FUNC MIKRO_Init (int node, int type); |
- |
-int _VI_FUNC MIKRO_ReferenceMove (int node); |
- |
-int _VI_FUNC MIKRO_MoveFor (int node, int dist); |
- |
-int _VI_FUNC MIKRO_MoveTo (int node, int dest); |
- |
-int _VI_FUNC MIKRO_GetPosition (int node, int pos[]); |
- |
-int _VI_FUNC MIKRO_SetZero (char axes); |
- |
-int _VI_FUNC MIKRO_SetPlain (char axes); |
- |
-void _VI_FUNC MIKRO_Close (void); |
Index: sipmscan/trunk/MIKRO/mikro_ctrl_d |
=================================================================== |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/sipmscan/trunk/MIKRO/mikro_ctrl_d |
Property changes: |
Deleted: svn:mime-type |
## -1 +0,0 ## |
-application/octet-stream |
\ No newline at end of property |
Index: sipmscan/trunk/MIKRO/quick_scan.sh |
=================================================================== |
--- sipmscan/trunk/MIKRO/quick_scan.sh (revision 117) |
+++ sipmscan/trunk/MIKRO/quick_scan.sh (nonexistent) |
@@ -1,15 +0,0 @@ |
-#! /bin/bash |
- |
-#fname=$1 |
-#num_events=$2 |
- |
-#./addheader $fname 1 $num_events 0 0 0 0 0 0 |
-#./addheader $fname 3 0 0 0 0 0 0 |
-#./daq $fname $num_events |
-#./addheader $fname 2 |
- |
-position=`./mikro_ctrl -a | grep -o '[[:digit:]]*' | awk -F : '{if(NR==2 || NR==5){print $1}}'` |
-#pos_x=${position}[0] |
-#pos_y=${position}[1] |
-#echo "position x = " $pos_x " position y = " $pos_y |
-echo $position >> test.txt |
Index: sipmscan/trunk/MIKRO/rs232.c |
=================================================================== |
--- sipmscan/trunk/MIKRO/rs232.c (revision 117) |
+++ sipmscan/trunk/MIKRO/rs232.c (nonexistent) |
@@ -1,125 +0,0 @@ |
-#include <sys/stat.h> |
-#include <fcntl.h> |
-#include <string.h> |
-#include <termios.h> |
- |
-#include "rs232.h" |
-//#define DEBUG |
- |
-const int debug=0; |
- |
-struct termios tattr; |
- |
-int Delay(double sec){ |
- return usleep((int) (sec*1e6) ); |
-} |
- |
-int SetComTime(int fd, double timeout_seconds){ |
- |
- int ntenth; |
- |
- ntenth = (int)(timeout_seconds*10); |
- tattr.c_cc[VTIME] = ntenth; |
- tcsetattr(fd, TCSANOW, &tattr); |
-#ifdef DEBUG |
- printf("SetComTime: %d\n", ntenth); |
-#endif |
- return 0; |
-} |
- |
-int FlushInQ(int fd){ |
- return 0; |
-} |
- |
-int FlushOutQ(int fd){ |
- return 0; |
-} |
- |
-int ComWrt (int fd, char* cmd, int Count ){ |
- |
- int nwr; |
- |
- nwr=write(fd, cmd, Count); |
-#ifdef DEBUG |
- printf ( "ComWrt: %d, %d, %s\n", Count, nwr, cmd); |
-#endif |
- return nwr; |
-} |
- |
-int ComRdTerm (int fd, char *response, int nb, int termchar) |
-{ |
- |
- int nread, nloop; |
- |
- nread=0; |
- nloop=0; |
- |
-#ifdef DEBUG |
- printf ( "ComRdTerm start\n") ; |
-#endif |
-// rewind(fpr); |
- while (1) { |
- if (nloop++ == nb) return -1; |
-// nread += read ( fd, response+nread, nb-nread ); |
- nread += read ( fd, response+nread, 1 ); |
-#ifdef DEBUG |
- response[nread]=0; |
- printf ("ComRdTerm nread: %d %d %s\n", nloop, nread, response) ; |
-#endif |
- if (nread>1) if(response[nread-1] == termchar) break; |
- } |
- |
- nread = nread - 2; |
- response[nread]=0; |
-#ifdef DEBUG |
- printf("CmdRdTerm: %s\n",response); |
-#endif |
- return nread; |
-} |
- |
-int OpenComConfig( char *dev, char * device_name, long Baud_Rate, int Parity, int Data_Bits, |
- int Stop_Bits, int Input_Queue_Size, int Output_Queue_Size ){ |
- |
- int fd; |
- |
- memset (&tattr, 0, sizeof tattr); |
- |
- fd=open(dev, O_RDWR | O_NOCTTY | O_SYNC); |
-// see 'man tcsetattr' |
- tcgetattr (fd, &tattr); |
- cfmakeraw(&tattr); |
- cfsetspeed(&tattr, B38400); |
-// cfsetispeed(&tattr, B38400); |
-// cfsetospeed(&tattr, B38400); |
-// input modes |
- tattr.c_iflag&=~IGNBRK; |
- tattr.c_iflag&=~(IGNCR | ICRNL | INLCR); |
- tattr.c_iflag&=~(IXON | IXOFF | IXANY); |
-// output modess |
- tattr.c_oflag=0; |
-// local modes |
- tattr.c_lflag=0; |
- tattr.c_lflag &= ~(ICANON|ECHO) ; // canonical mode and echo input char |
-// control modes |
- tattr.c_cflag |= (CLOCAL | CREAD); // ignore modem controls, |
- // enable reading |
- tattr.c_cflag &= ~(PARENB | PARODD); // shut off parity |
- tattr.c_cflag &= ~CSTOPB; // set two stop bits |
- tattr.c_cflag &= ~CRTSCTS; // enable RTS/CTS flow control |
- |
- tattr.c_cc[VMIN] = 0; |
- tattr.c_cc[VTIME] = 2; |
- tcsetattr(fd, TCSAFLUSH, &tattr); |
- |
-#ifdef DEBUG |
- printf("OpenComConfig\n"); |
-#endif |
- return fd; ; |
-} |
- |
- |
-int CloseCom (int fd){ |
- |
- close(fd); |
- return; |
-} |
Index: sipmscan/trunk/MIKRO/test.txt |
=================================================================== |
--- sipmscan/trunk/MIKRO/test.txt (revision 117) |
+++ sipmscan/trunk/MIKRO/test.txt (nonexistent) |
@@ -1,4 +0,0 @@ |
-125877 50001 |
-0 3 |
-0 3 |
-0 3 |
Index: sipmscan/trunk/MIKRO/Makefile |
=================================================================== |
--- sipmscan/trunk/MIKRO/Makefile (revision 117) |
+++ sipmscan/trunk/MIKRO/Makefile (nonexistent) |
@@ -1,4 +0,0 @@ |
-mikro_ctrl: mikro_ctrl.c rs232.c rs232.h MIKRO.c |
- gcc mikro_ctrl.c rs232.c MIKRO.c -o mikro_ctrl -lm |
-mikro_ctrl_d: mikro_ctrl.c rs232.c rs232.h MIKRO.c |
- gcc mikro_ctrl.c rs232.c MIKRO.c -o mikro_ctrl_d -lm -DDEBUG |
Index: sipmscan/trunk/wusbxx_dll.h |
=================================================================== |
--- sipmscan/trunk/wusbxx_dll.h (revision 117) |
+++ sipmscan/trunk/wusbxx_dll.h (nonexistent) |
@@ -1,19 +0,0 @@ |
-#ifndef _WUSBXX_DLL_H |
-#define _WUSBXX_DLL_H |
- |
-#include <stdlib.h> |
-#include <stdio.h> |
- |
-#include "libxxusb.h" |
-#include "wusbcc.h" |
-#define _VI_FUNC |
-extern usb_dev_handle *udev; |
- |
-void _VI_FUNC WUSBXX_load (char *module_path); |
-void _VI_FUNC WUSBXX_open (char *serial); |
-void _VI_FUNC WUSBXX_close (void); |
-int _VI_FUNC WUSBXX_CCread (int n, int a, int f, unsigned long *data); |
-int _VI_FUNC WUSBXX_CCwrite (int n, int a, int f, unsigned long data); |
- |
-#endif |
- |
Index: sipmscan/trunk/vxi11_i686/GNU_General_Public_License.txt |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/GNU_General_Public_License.txt (revision 117) |
+++ sipmscan/trunk/vxi11_i686/GNU_General_Public_License.txt (nonexistent) |
@@ -1,340 +0,0 @@ |
- GNU GENERAL PUBLIC LICENSE |
- Version 2, June 1991 |
- |
- Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
- Everyone is permitted to copy and distribute verbatim copies |
- of this license document, but changing it is not allowed. |
- |
- Preamble |
- |
- The licenses for most software are designed to take away your |
-freedom to share and change it. By contrast, the GNU General Public |
-License is intended to guarantee your freedom to share and change free |
-software--to make sure the software is free for all its users. This |
-General Public License applies to most of the Free Software |
-Foundation's software and to any other program whose authors commit to |
-using it. (Some other Free Software Foundation software is covered by |
-the GNU Library General Public License instead.) You can apply it to |
-your programs, too. |
- |
- When we speak of free software, we are referring to freedom, not |
-price. Our General Public Licenses are designed to make sure that you |
-have the freedom to distribute copies of free software (and charge for |
-this service if you wish), that you receive source code or can get it |
-if you want it, that you can change the software or use pieces of it |
-in new free programs; and that you know you can do these things. |
- |
- To protect your rights, we need to make restrictions that forbid |
-anyone to deny you these rights or to ask you to surrender the rights. |
-These restrictions translate to certain responsibilities for you if you |
-distribute copies of the software, or if you modify it. |
- |
- For example, if you distribute copies of such a program, whether |
-gratis or for a fee, you must give the recipients all the rights that |
-you have. You must make sure that they, too, receive or can get the |
-source code. And you must show them these terms so they know their |
-rights. |
- |
- We protect your rights with two steps: (1) copyright the software, and |
-(2) offer you this license which gives you legal permission to copy, |
-distribute and/or modify the software. |
- |
- Also, for each author's protection and ours, we want to make certain |
-that everyone understands that there is no warranty for this free |
-software. If the software is modified by someone else and passed on, we |
-want its recipients to know that what they have is not the original, so |
-that any problems introduced by others will not reflect on the original |
-authors' reputations. |
- |
- Finally, any free program is threatened constantly by software |
-patents. We wish to avoid the danger that redistributors of a free |
-program will individually obtain patent licenses, in effect making the |
-program proprietary. To prevent this, we have made it clear that any |
-patent must be licensed for everyone's free use or not licensed at all. |
- |
- The precise terms and conditions for copying, distribution and |
-modification follow. |
- |
- GNU GENERAL PUBLIC LICENSE |
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
- |
- 0. This License applies to any program or other work which contains |
-a notice placed by the copyright holder saying it may be distributed |
-under the terms of this General Public License. The "Program", below, |
-refers to any such program or work, and a "work based on the Program" |
-means either the Program or any derivative work under copyright law: |
-that is to say, a work containing the Program or a portion of it, |
-either verbatim or with modifications and/or translated into another |
-language. (Hereinafter, translation is included without limitation in |
-the term "modification".) Each licensee is addressed as "you". |
- |
-Activities other than copying, distribution and modification are not |
-covered by this License; they are outside its scope. The act of |
-running the Program is not restricted, and the output from the Program |
-is covered only if its contents constitute a work based on the |
-Program (independent of having been made by running the Program). |
-Whether that is true depends on what the Program does. |
- |
- 1. You may copy and distribute verbatim copies of the Program's |
-source code as you receive it, in any medium, provided that you |
-conspicuously and appropriately publish on each copy an appropriate |
-copyright notice and disclaimer of warranty; keep intact all the |
-notices that refer to this License and to the absence of any warranty; |
-and give any other recipients of the Program a copy of this License |
-along with the Program. |
- |
-You may charge a fee for the physical act of transferring a copy, and |
-you may at your option offer warranty protection in exchange for a fee. |
- |
- 2. You may modify your copy or copies of the Program or any portion |
-of it, thus forming a work based on the Program, and copy and |
-distribute such modifications or work under the terms of Section 1 |
-above, provided that you also meet all of these conditions: |
- |
- a) You must cause the modified files to carry prominent notices |
- stating that you changed the files and the date of any change. |
- |
- b) You must cause any work that you distribute or publish, that in |
- whole or in part contains or is derived from the Program or any |
- part thereof, to be licensed as a whole at no charge to all third |
- parties under the terms of this License. |
- |
- c) If the modified program normally reads commands interactively |
- when run, you must cause it, when started running for such |
- interactive use in the most ordinary way, to print or display an |
- announcement including an appropriate copyright notice and a |
- notice that there is no warranty (or else, saying that you provide |
- a warranty) and that users may redistribute the program under |
- these conditions, and telling the user how to view a copy of this |
- License. (Exception: if the Program itself is interactive but |
- does not normally print such an announcement, your work based on |
- the Program is not required to print an announcement.) |
- |
-These requirements apply to the modified work as a whole. If |
-identifiable sections of that work are not derived from the Program, |
-and can be reasonably considered independent and separate works in |
-themselves, then this License, and its terms, do not apply to those |
-sections when you distribute them as separate works. But when you |
-distribute the same sections as part of a whole which is a work based |
-on the Program, the distribution of the whole must be on the terms of |
-this License, whose permissions for other licensees extend to the |
-entire whole, and thus to each and every part regardless of who wrote it. |
- |
-Thus, it is not the intent of this section to claim rights or contest |
-your rights to work written entirely by you; rather, the intent is to |
-exercise the right to control the distribution of derivative or |
-collective works based on the Program. |
- |
-In addition, mere aggregation of another work not based on the Program |
-with the Program (or with a work based on the Program) on a volume of |
-a storage or distribution medium does not bring the other work under |
-the scope of this License. |
- |
- 3. You may copy and distribute the Program (or a work based on it, |
-under Section 2) in object code or executable form under the terms of |
-Sections 1 and 2 above provided that you also do one of the following: |
- |
- a) Accompany it with the complete corresponding machine-readable |
- source code, which must be distributed under the terms of Sections |
- 1 and 2 above on a medium customarily used for software interchange; or, |
- |
- b) Accompany it with a written offer, valid for at least three |
- years, to give any third party, for a charge no more than your |
- cost of physically performing source distribution, a complete |
- machine-readable copy of the corresponding source code, to be |
- distributed under the terms of Sections 1 and 2 above on a medium |
- customarily used for software interchange; or, |
- |
- c) Accompany it with the information you received as to the offer |
- to distribute corresponding source code. (This alternative is |
- allowed only for noncommercial distribution and only if you |
- received the program in object code or executable form with such |
- an offer, in accord with Subsection b above.) |
- |
-The source code for a work means the preferred form of the work for |
-making modifications to it. For an executable work, complete source |
-code means all the source code for all modules it contains, plus any |
-associated interface definition files, plus the scripts used to |
-control compilation and installation of the executable. However, as a |
-special exception, the source code distributed need not include |
-anything that is normally distributed (in either source or binary |
-form) with the major components (compiler, kernel, and so on) of the |
-operating system on which the executable runs, unless that component |
-itself accompanies the executable. |
- |
-If distribution of executable or object code is made by offering |
-access to copy from a designated place, then offering equivalent |
-access to copy the source code from the same place counts as |
-distribution of the source code, even though third parties are not |
-compelled to copy the source along with the object code. |
- |
- 4. You may not copy, modify, sublicense, or distribute the Program |
-except as expressly provided under this License. Any attempt |
-otherwise to copy, modify, sublicense or distribute the Program is |
-void, and will automatically terminate your rights under this License. |
-However, parties who have received copies, or rights, from you under |
-this License will not have their licenses terminated so long as such |
-parties remain in full compliance. |
- |
- 5. You are not required to accept this License, since you have not |
-signed it. However, nothing else grants you permission to modify or |
-distribute the Program or its derivative works. These actions are |
-prohibited by law if you do not accept this License. Therefore, by |
-modifying or distributing the Program (or any work based on the |
-Program), you indicate your acceptance of this License to do so, and |
-all its terms and conditions for copying, distributing or modifying |
-the Program or works based on it. |
- |
- 6. Each time you redistribute the Program (or any work based on the |
-Program), the recipient automatically receives a license from the |
-original licensor to copy, distribute or modify the Program subject to |
-these terms and conditions. You may not impose any further |
-restrictions on the recipients' exercise of the rights granted herein. |
-You are not responsible for enforcing compliance by third parties to |
-this License. |
- |
- 7. If, as a consequence of a court judgment or allegation of patent |
-infringement or for any other reason (not limited to patent issues), |
-conditions are imposed on you (whether by court order, agreement or |
-otherwise) that contradict the conditions of this License, they do not |
-excuse you from the conditions of this License. If you cannot |
-distribute so as to satisfy simultaneously your obligations under this |
-License and any other pertinent obligations, then as a consequence you |
-may not distribute the Program at all. For example, if a patent |
-license would not permit royalty-free redistribution of the Program by |
-all those who receive copies directly or indirectly through you, then |
-the only way you could satisfy both it and this License would be to |
-refrain entirely from distribution of the Program. |
- |
-If any portion of this section is held invalid or unenforceable under |
-any particular circumstance, the balance of the section is intended to |
-apply and the section as a whole is intended to apply in other |
-circumstances. |
- |
-It is not the purpose of this section to induce you to infringe any |
-patents or other property right claims or to contest validity of any |
-such claims; this section has the sole purpose of protecting the |
-integrity of the free software distribution system, which is |
-implemented by public license practices. Many people have made |
-generous contributions to the wide range of software distributed |
-through that system in reliance on consistent application of that |
-system; it is up to the author/donor to decide if he or she is willing |
-to distribute software through any other system and a licensee cannot |
-impose that choice. |
- |
-This section is intended to make thoroughly clear what is believed to |
-be a consequence of the rest of this License. |
- |
- 8. If the distribution and/or use of the Program is restricted in |
-certain countries either by patents or by copyrighted interfaces, the |
-original copyright holder who places the Program under this License |
-may add an explicit geographical distribution limitation excluding |
-those countries, so that distribution is permitted only in or among |
-countries not thus excluded. In such case, this License incorporates |
-the limitation as if written in the body of this License. |
- |
- 9. The Free Software Foundation may publish revised and/or new versions |
-of the General Public License from time to time. Such new versions will |
-be similar in spirit to the present version, but may differ in detail to |
-address new problems or concerns. |
- |
-Each version is given a distinguishing version number. If the Program |
-specifies a version number of this License which applies to it and "any |
-later version", you have the option of following the terms and conditions |
-either of that version or of any later version published by the Free |
-Software Foundation. If the Program does not specify a version number of |
-this License, you may choose any version ever published by the Free Software |
-Foundation. |
- |
- 10. If you wish to incorporate parts of the Program into other free |
-programs whose distribution conditions are different, write to the author |
-to ask for permission. For software which is copyrighted by the Free |
-Software Foundation, write to the Free Software Foundation; we sometimes |
-make exceptions for this. Our decision will be guided by the two goals |
-of preserving the free status of all derivatives of our free software and |
-of promoting the sharing and reuse of software generally. |
- |
- NO WARRANTY |
- |
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
-REPAIR OR CORRECTION. |
- |
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
-POSSIBILITY OF SUCH DAMAGES. |
- |
- END OF TERMS AND CONDITIONS |
- |
- How to Apply These Terms to Your New Programs |
- |
- If you develop a new program, and you want it to be of the greatest |
-possible use to the public, the best way to achieve this is to make it |
-free software which everyone can redistribute and change under these terms. |
- |
- To do so, attach the following notices to the program. It is safest |
-to attach them to the start of each source file to most effectively |
-convey the exclusion of warranty; and each file should have at least |
-the "copyright" line and a pointer to where the full notice is found. |
- |
- <one line to give the program's name and a brief idea of what it does.> |
- Copyright (C) <year> <name of author> |
- |
- This program is free software; you can redistribute it and/or modify |
- it under the terms of the GNU General Public License as published by |
- the Free Software Foundation; either version 2 of the License, or |
- (at your option) any later version. |
- |
- This program is distributed in the hope that it will be useful, |
- but WITHOUT ANY WARRANTY; without even the implied warranty of |
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- GNU General Public License for more details. |
- |
- You should have received a copy of the GNU General Public License |
- along with this program; if not, write to the Free Software |
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
- |
- |
-Also add information on how to contact you by electronic and paper mail. |
- |
-If the program is interactive, make it output a short notice like this |
-when it starts in an interactive mode: |
- |
- Gnomovision version 69, Copyright (C) year name of author |
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
- This is free software, and you are welcome to redistribute it |
- under certain conditions; type `show c' for details. |
- |
-The hypothetical commands `show w' and `show c' should show the appropriate |
-parts of the General Public License. Of course, the commands you use may |
-be called something other than `show w' and `show c'; they could even be |
-mouse-clicks or menu items--whatever suits your program. |
- |
-You should also get your employer (if you work as a programmer) or your |
-school, if any, to sign a "copyright disclaimer" for the program, if |
-necessary. Here is a sample; alter the names: |
- |
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
- `Gnomovision' (which makes passes at compilers) written by James Hacker. |
- |
- <signature of Ty Coon>, 1 April 1989 |
- Ty Coon, President of Vice |
- |
-This General Public License does not permit incorporating your program into |
-proprietary programs. If your program is a subroutine library, you may |
-consider it more useful to permit linking proprietary applications with the |
-library. If this is what you want to do, use the GNU Library General |
-Public License instead of this License. |
Index: sipmscan/trunk/vxi11_i686/CHANGELOG.txt |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/CHANGELOG.txt (revision 117) |
+++ sipmscan/trunk/vxi11_i686/CHANGELOG.txt (nonexistent) |
@@ -1,199 +0,0 @@ |
------------------------------------------------------------------------------- |
-vxi11_1.08 - 3/09/2009 |
- |
-Added a sanity check for link->maxRecvSize to make sure it's >0. This gets |
-around a bug in some versions of the Agilent Infiniium scope software. |
- |
-Changed the erroneous strncpy() to memcpy() in vxi11_send, as we could be |
-sending binary data (not just strings). |
- |
-Changed a lot of char *'s to const char *'s in an attempt to get rid of |
-pedantic gcc compiler warnings. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.07 - 9/10/2007 |
- |
-Minor change to vxi11_receive_data_block(), this fn now copes with instruments |
-that return just "#0" (for whatever reason). Suggestion by Jarek Sadowski, |
-gratefully received. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.06 - 31/08/2007 |
- |
-Bug fix in vxi11_receive(), to ensure that no more than "len" bytes are ever |
-received (and so avoiding a segmentation fault). This was a bug introduced in |
-release 1.04 whilst making some other changes to the vxi11_receive() fn. |
- |
-Many thanks to Rob Penny for spotting the bug and providing a patch. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.05 - 11/07/2007 |
- |
-Added the ability to specify a "device name" when calling vxi11_open_device(). |
-For regular VXI11-based instruments, such as scopes and AFGs, the device name |
-is usually "hard wired" to be "inst0", and up to now this has been hard wired |
-into the vxi11_user code. However, devices such as LAN to GPIB gateways need |
-some way of distinguishing between different devices... they are a single |
-client (one IP address), with multiple devices. |
- |
-The vxi11_user fn, vxi11_open_device(), now takes a third argument |
-(char *device). |
-This gets passed to the core vxi11_open_device() fn (the one that deals with |
-separate clients and links), and the core vxi11_open_link() fn; these two |
-core functions have also had an extra parameter added accordingly. In order |
-to not break the API, a wrapper function is provided in the form of the |
-original vxi11_open_device() fn, that just takes 2 arguments |
-(char *ip, CLINK *clink), this then passes "inst0" as the device argument. |
-Backwards-compatible wrappers for the core functions have NOT been provided. |
-These are generally not used from userland anyway. Hopefully this won't |
-upset anyone! |
- |
-vxi11_cmd, the simple test utility, has also been updated. You can now, |
-optionally, pass the device_name as a second argument (after the ip |
-address). The source has been renamed to vxi11_cmd.cc (from vxi11_cmd.c), as |
-it is C++ code not C. |
- |
-Some minor tidying up in vxi11_user.h |
- |
-With thanks to Oliver Schulz for bringing LAN to GPIB gateways to my |
-attention, for suggesting changes to the vxi11_user library to allow them to |
-be accommodated, and for tidying some things up. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.04 - 10/07/2007 |
- |
-Patch applied, which was kindly provided by Robert Larice. This sorts out |
-the confusion (on my part) about the structures returned by the rpcgen |
-generated *_1() functions... these are statically allocated temporary structs, |
-apparently. In the words of Robert Larice: |
- |
-****** |
-Hello Dr. Sharples, |
- |
- I'm sending some patches for your nice gem "vxi11_1.03" |
- |
- In the source code there were some strange comments, concerning |
- a commented free() around ... Manfred S. ... |
- and some notes, suggesting you had trouble to get more than one link |
- working. |
- |
- I think thats caused by some misuse of the rpcgen generated subroutines. |
- 1) those rpcgen generated *_1 functions returned pointers to |
- statically allocated temporary structs. |
- those where meant to be instantly copied to the user's space, |
- which wasn't done |
- thus instead of |
- Device_ReadResp *read_resp; |
- read_resp = device_read_1(...) |
- one should have written someting like: |
- Device_ReadResp *read_resp; |
- read_resp = malloc(...) |
- memcpy(read_resp, device_read_1(...), ...) |
- 2) but a better fix is to use the rpcgen -M Flag |
- which allows to pass the memory space as a third argument |
- so one can write |
- Device_ReadResp *read_resp; |
- read_resp = malloc(...) |
- device_read_1(..., read_resp, ...) |
- furthermore this is now automatically thread save |
- 3) the rpcgen function device_read_1 |
- expects a target buffer to be passed via read_resp |
- which was not done. |
- 4) the return value of vxi11_receive() was computed incorrectly |
- 5) minor, Makefile typo's |
- CFLAGS versus |
- CLFAGS |
- |
-****** |
- |
-Robert didn't have more than one device to try the patch with, but I've just |
-tried it and everything seems fine. So I've removed all references to the |
-VXI11_ENABLE_MULTIPLE_CLIENTS global variable, and removed the call to |
-vxi11_open_link() from the vxi11_send() fn. There has been an associated |
-tidying of functions, and removal of some comments. |
- |
-Thanks once again to Robert Larice for the patch and the explanation! |
- |
------------------------------------------------------------------------------- |
-vxi11_1.03 - 29/01/2007 |
- |
-Some bug-fixes (thanks to Manfred S.), and extra awareness of the |
-possibility that instruments could time out after receiving a query WITHOUT |
-causing an error condition. In some cases (prior to these changes) this |
-could have resulted in a segmentation fault. |
- |
-Specifically: |
- |
-(1) removed call to ANSI free() fn in vxi11_receive, which according to |
- Manfred S. "is not necessary and wrong (crashes)". |
- |
-(2) added extra check in vxi11_receive() to see if read_resp==NULL. |
- read_resp can apparently be NULL if (eg) you send an instrument a |
- query, but the instrument is so busy with something else for so long |
- that it forgets the original query. So this extra check is for that |
- situation, and vxi11_receive returns -VXI11_NULL_READ_RESP to the |
- calling function. |
- |
-(3) vxi11_send_and_receive() is now aware of the possibility of being |
- returned -VXI11_NULL_READ_RESP. If so, it re-sends the query, until |
- either getting a "regular" read error (read_resp->error!=0) or a |
- successful read. |
- |
-(4) Similar to (2)... added extra check in vxi11_send() to see if |
- write_resp==NULL. If so, return -VXI11_NULL_WRITE_RESP. As with (3), |
- send_and_receive() is now aware of this possibility. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.02 - 25/08/2006 |
- |
-Important changes to the core vxi11_send() function, which should be |
-invisible to the user. |
- |
-For those interested, the function now takes note of the value of |
-link->maxRecvSize, which is the maximum number of bytes that the vxi11 |
-intrument you're talking to can receive in one go. For many instruments |
-this may be a few kB, which isn't a problem for sending short commands; |
-however, sending large chunks of data (for example sending waveforms |
-to instruments) may exceed this maxRecvSize. The core vxi11_send() function |
-has been re-written to ensure that only a maximum of [maxRecvSize] bytes are |
-written in one go... the function sits in a loop until all the message/ |
-data is written. |
- |
-Also tidied up some of the return values (specifically with regard to |
-vxi11_send() and vxi11_send_data_block() ). |
- |
------------------------------------------------------------------------------- |
-vxi11_1.01 - 06/07/2006 |
- |
-Fair few changes since v1.00, all in vxi11_user.c and vxi11_user.h |
- |
-Found I was having problems talking to multiple links on the same |
-client, if I created a different client for each one. So introduced |
-a few global variables to keep track of all the ip addresses of |
-clients that the library is asked to create, and only creating new |
-clients if the ip address is different. This puts a limit of how |
-many unique ip addresses (clients) a single process can connect to. |
-Set this value at 256 (should hopefully be enough!). |
- |
-Next I found that talking to different clients on different ip |
-addresses didn't work. It turns out that create_link_1() creates |
-a static structure. This this link is associated with a given |
-client (and hence a given IP address), then the only way I could |
-think of making things work was to add a call to an |
-vxi11_open_link() function before each send command (no idea what |
-this adds to overheads and it's very messy!) - at least I was |
-able to get this to only happen when we are using more than one |
-client/ip address. |
- |
-Also, while I was at it, I re-ordered the functions a little - |
-starts with core user functions, extra user functions, then core |
-library functions at the end. Added a few more comments. Tidied |
-up. Left some debugging info in, but commented out. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.00 - 23/06/2006 |
- |
-Initial release. |
- |
------------------------------------------------------------------------------- |
- |
Index: sipmscan/trunk/vxi11_i686/Makefile.old |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/Makefile.old (revision 117) |
+++ sipmscan/trunk/vxi11_i686/Makefile.old (nonexistent) |
@@ -1,23 +0,0 @@ |
-#CFLAGS = -Wall -g |
-CFLAGS = -g |
- |
-vxi11_cmd: vxi11_cmd.o vxi11_user.o vxi11_clnt.o vxi11_xdr.o |
- g++ $(CFLAGS) -o vxi11_cmd vxi11_cmd.o vxi11_user.o vxi11_clnt.o vxi11_xdr.o |
- |
-vxi11_cmd.o: vxi11_cmd.cc vxi11_user.cc vxi11.h |
- g++ $(CFLAGS) -c vxi11_cmd.cc -o vxi11_cmd.o |
- |
-vxi11_user.o: vxi11_user.cc vxi11.h |
- g++ $(CFLAGS) -c vxi11_user.cc -o vxi11_user.o |
- |
-vxi11.h vxi11_clnt.c vxi11_xdr.c : vxi11.x |
- rpcgen -M vxi11.x |
- |
-TAGS: $(wildcard *.c) $(wildcard *.h) $(wildcard *.cc) |
- etags $^ |
- |
-clean: |
- rm -f *.o vxi11_cmd vxi11.h vxi11_svc.c vxi11_xdr.c vxi11_clnt.c TAGS |
- |
-install: |
- cp -f vxi11_cmd /usr/local/bin/ |
Index: sipmscan/trunk/vxi11_i686/vxi11_user.cc |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/vxi11_user.cc (revision 117) |
+++ sipmscan/trunk/vxi11_i686/vxi11_user.cc (nonexistent) |
@@ -1,728 +0,0 @@ |
-/* Revision history: */ |
-/* $Id: vxi11_user.cc,v 1.17 2008/10/20 07:59:54 sds Exp $ */ |
-/* |
- * $Log: vxi11_user.cc,v $ |
- * Revision 1.17 2008/10/20 07:59:54 sds |
- * Removed Manfred's surname at his request from the comments/acknowledgments. |
- * |
- * Revision 1.16 2008/09/03 14:30:13 sds |
- * added sanity check for link->maxRecvSize to make sure it's >0. |
- * This got around a bug in some versions of the Agilent Infiniium |
- * scope software. |
- * |
- * Revision 1.15 2007/10/30 12:55:15 sds |
- * changed the erroneous strncpy() to memcpy() in vxi11_send, |
- * as we could be sending binary data (not just strings). |
- * |
- * Revision 1.14 2007/10/30 12:46:48 sds |
- * changed a lot of char *'s to const char *'s in an attempt to get |
- * rid of pedantic gcc compiler warnings. |
- * |
- * Revision 1.13 2007/10/09 08:42:57 sds |
- * Minor change to vxi11_receive_data_block(), this fn now |
- * copes with instruments that return just "#0" (for whatever |
- * reason). Suggestion by Jarek Sadowski. |
- * |
- * Revision 1.12 2007/08/31 10:32:39 sds |
- * Bug fix in vxi11_receive(), to ensure that no more than "len" |
- * bytes are ever received (and so avoiding a segmentation fault). |
- * This was a bug introduced in release 1.04 (RCS 1.10) whilst |
- * making some other changes to the vxi11_receive() fn. Many thanks |
- * to Rob Penny for spotting the bug and providing a patch. |
- * |
- * Revision 1.11 2007/07/10 13:49:18 sds |
- * Changed the vxi11_open_device() fn to accept a third argument, char *device. |
- * This gets passed to the core vxi11_open_device() fn (the one that deals with |
- * separate clients and links), and the core vxi11_open_link() fn; these two |
- * core functions have also had an extra parameter added accordingly. In order |
- * to not break the API, a wrapper function is provided in the form of the |
- * original vxi11_open_device() fn, that just takes 2 arguments |
- * (char *ip, CLINK *clink), this then passes "inst0" as the device argument. |
- * Backwards-compatible wrappers for the core functions have NOT been provided. |
- * These are generally not used from userland anyway. Hopefully this won't |
- * upset anyone! |
- * |
- * Revision 1.10 2007/07/10 11:12:12 sds |
- * Patches provided by Robert Larice. This basically solves the problem |
- * of having to recreate a link each time you change client. In the words |
- * of Robert: |
- * |
- * --------- |
- * In the source code there were some strange comments, suggesting |
- * you had trouble to get more than one link working. |
- * |
- * I think thats caused by some misuse of the rpcgen generated subroutines. |
- * 1) those rpcgen generated *_1 functions returned pointers to |
- * statically allocated temporary structs. |
- * those where meant to be instantly copied to the user's space, |
- * which wasn't done, thus instead of |
- * Device_ReadResp *read_resp; |
- * read_resp = device_read_1(...) |
- * one should have written someting like: |
- * Device_ReadResp *read_resp; |
- * read_resp = malloc(...) |
- * memcpy(read_resp, device_read_1(...), ...) |
- * 2) but a better fix is to use the rpcgen -M Flag |
- * which allows to pass the memory space as a third argument |
- * so one can write |
- * Device_ReadResp *read_resp; |
- * read_resp = malloc(...) |
- * device_read_1(..., read_resp, ...) |
- * furthermore this is now automatically thread save |
- * 3) the rpcgen function device_read_1 |
- * expects a target buffer to be passed via read_resp |
- * which was not done. |
- * 4) the return value of vxi11_receive() was computed incorrectly |
- * 5) minor, Makefile typo's |
- * --------- |
- * So big thanks to Robert Larice for the patch! I've tested it |
- * (briefly) on more than one scope, and with multiple links per |
- * client, and it seems to work fine. I've thus removed all references |
- * to VXI11_ENABLE_MULTIPLE_CLIENTS, and deleted the vxi11_open_link() |
- * function that WASN'T passed an ip address (that was only called |
- * from the vxi11_send() fn, when there was more than one client). |
- * |
- * Revision 1.9 2006/12/08 12:06:58 ijc |
- * Basically the same changes as revision 1.8, except replace all |
- * references to "vxi11_receive" with "vxi11_send" and all references |
- * to "-VXI11_NULL_READ_RESP" with "-VXI11_NULL_WRITE_RESP". |
- * |
- * Revision 1.8 2006/12/07 12:22:20 sds |
- * Couple of changes, related. |
- * (1) added extra check in vxi11_receive() to see if read_resp==NULL. |
- * read_resp can apparently be NULL if (eg) you send an instrument a |
- * query, but the instrument is so busy with something else for so long |
- * that it forgets the original query. So this extra check is for that |
- * situation, and vxi11_receive returns -VXI11_NULL_READ_RESP to the |
- * calling function. |
- * (2) vxi11_send_and_receive() is now aware of the possibility of |
- * being returned -VXI11_NULL_READ_RESP. If so, it re-sends the query, |
- * until either getting a "regular" read error (read_resp->error!=0) or |
- * a successful read. |
- * |
- * Revision 1.7 2006/12/06 16:27:47 sds |
- * removed call to ANSI free() fn in vxi11_receive, which according to |
- * Manfred S. "is not necessary and wrong (crashes)". |
- * |
- * Revision 1.6 2006/08/25 13:45:12 sds |
- * Major improvements to the vxi11_send function. Now takes |
- * link->maxRecvSize into account, and writes a chunk at a time |
- * until the entire message is sent. Important for sending large |
- * data sets, because the data you want to send may be larger than |
- * the instrument's "input buffer." |
- * |
- * Revision 1.5 2006/08/25 13:06:44 sds |
- * tidied up some of the return values, and made sure that if a |
- * sub-function returned an error value, this would also be |
- * returned by the calling function. |
- * |
- * Revision 1.4 2006/07/06 13:04:59 sds |
- * Lots of changes this revision. |
- * Found I was having problems talking to multiple links on the same |
- * client, if I created a different client for each one. So introduced |
- * a few global variables to keep track of all the ip addresses of |
- * clients that the library is asked to create, and only creating new |
- * clients if the ip address is different. This puts a limit of how |
- * many unique ip addresses (clients) a single process can connect to. |
- * Set this value at 256 (should hopefully be enough!). |
- * Next I found that talking to different clients on different ip |
- * addresses didn't work. It turns out that create_link_1() creates |
- * a static structure. This this link is associated with a given |
- * client (and hence a given IP address), then the only way I could |
- * think of making things work was to add a call to an |
- * vxi11_open_link() function before each send command (no idea what |
- * this adds to overheads and it's very messy!) - at least I was |
- * able to get this to only happen when we are using more than one |
- * client/ip address. |
- * Also, while I was at it, I re-ordered the functions a little - |
- * starts with core user functions, extra user functions, then core |
- * library functions at the end. Added a few more comments. Tidied |
- * up. Left some debugging info in, but commented out. |
- * |
- * Revision 1.3 2006/06/26 12:40:56 sds |
- * Introduced a new CLINK structure, to reduce the number of arguments |
- * passed to functions. Wrote wrappers for open(), close(), send() |
- * and receieve() functions, then adjusted all the other functions built |
- * on those to make use of the CLINK structure. |
- * |
- * Revision 1.2 2006/06/26 10:29:48 sds |
- * Added GNU GPL and copyright notices. |
- * |
- */ |
- |
-/* vxi11_user.cc |
- * Copyright (C) 2006 Steve D. Sharples |
- * |
- * User library for opening, closing, sending to and receiving from |
- * a device enabled with the VXI11 RPC ethernet protocol. Uses the files |
- * generated by rpcgen vxi11.x. |
- * |
- * This program is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU General Public License |
- * as published by the Free Software Foundation; either version 2 |
- * of the License, or (at your option) any later version. |
- * |
- * This program is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with this program; if not, write to the Free Software |
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- * |
- * The author's email address is steve.sharples@nottingham.ac.uk |
- */ |
- |
-#include "vxi11_user.h" |
- |
-/***************************************************************************** |
- * GENERAL NOTES |
- ***************************************************************************** |
- * |
- * There are four functions at the heart of this library: |
- * |
- * int vxi11_open_device(char *ip, CLIENT **client, VXI11_LINK **link) |
- * int vxi11_close_device(char *ip, CLIENT *client, VXI11_LINK *link) |
- * int vxi11_send(CLIENT *client, VXI11_LINK *link, char *cmd, unsigned long len) |
- * long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout) |
- * |
- * Note that all 4 of these use separate client and link structures. All the |
- * other functions are built on these four core functions, and the first layer |
- * of abstraction is to combine the CLIENT and VXI11_LINK structures into a |
- * single entity, which I've called a CLINK. For the send and receive |
- * functions, this is just a simple wrapper. For the open and close functions |
- * it's a bit more complicated, because we somehow have to keep track of |
- * whether we've already opened a device with the same IP address before (in |
- * which case we need to recycle a previously created client), or whether |
- * we've still got any other links to a given IP address left when we are |
- * asked to close a clink (in which case we can sever the link, but have to |
- * keep the client open). This is so the person using this library from |
- * userland does not have to keep track of whether they are talking to a |
- * different physical instrument or not each time they establish a connection. |
- * |
- * So the base functions that the user will probably want to use are: |
- * |
- * int vxi11_open_device(char *ip, CLINK *clink) |
- * int vxi11_close_device(char *ip, CLINK *clink) |
- * int vxi11_send(CLINK *clink, char *cmd, unsigned long len) |
- * --- or --- (if sending just text) |
- * int vxi11_send(CLINK *clink, char *cmd) |
- * long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) |
- * |
- * There are then useful (to me, anyway) more specific functions built on top |
- * of these: |
- * |
- * int vxi11_send_data_block(CLINK *clink, char *cmd, char *buffer, unsigned long len) |
- * long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) |
- * long vxi11_send_and_receive(CLINK *clink, char *cmd, char *buf, unsigned long buf_len, unsigned long timeout) |
- * long vxi11_obtain_long_value(CLINK *clink, char *cmd, unsigned long timeout) |
- * double vxi11_obtain_double_value(CLINK *clink, char *cmd, unsigned long timeout) |
- * |
- * (then there are some shorthand wrappers for the above without specifying |
- * the timeout due to sheer laziness---explore yourself) |
- */ |
- |
- |
-/* Global variables. Keep track of multiple links per client. We need this |
- * because: |
- * - we'd like the library to be able to cope with multiple links to a given |
- * client AND multiple links to multiple clients |
- * - we'd like to just refer to a client/link ("clink") as a single |
- * entity from user land, we don't want to worry about different |
- * initialisation procedures, depending on whether it's an instrument |
- * with the same IP address or not |
- */ |
-char VXI11_IP_ADDRESS[VXI11_MAX_CLIENTS][20]; |
-CLIENT *VXI11_CLIENT_ADDRESS[VXI11_MAX_CLIENTS]; |
-int VXI11_DEVICE_NO = 0; |
-int VXI11_LINK_COUNT[VXI11_MAX_CLIENTS]; |
- |
-/***************************************************************************** |
- * KEY USER FUNCTIONS - USE THESE FROM YOUR PROGRAMS OR INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* OPEN FUNCTIONS * |
- * ============== */ |
- |
-/* Use this function from user land to open a device and create a link. Can be |
- * used multiple times for the same device (the library will keep track).*/ |
-int vxi11_open_device(const char *ip, CLINK *clink, char *device) { |
-int ret; |
-int l; |
-int device_no=-1; |
- |
-// printf("before doing anything, clink->link = %ld\n", clink->link); |
- /* Have a look to see if we've already initialised an instrument with |
- * this IP address */ |
- for (l=0; l<VXI11_MAX_CLIENTS; l++){ |
- if (strcmp(ip,VXI11_IP_ADDRESS[l]) == 0 ) { |
- device_no=l; |
-// printf("Open function, search, found ip address %s, device no %d\n",ip,device_no); |
- } |
- } |
- |
- /* Couldn't find a match, must be a new IP address */ |
- if (device_no < 0) { |
- /* Uh-oh, we're out of storage space. Increase the #define |
- * for VXI11_MAX_CLIENTS in vxi11_user.h */ |
- if (VXI11_DEVICE_NO >= VXI11_MAX_CLIENTS) { |
- printf("Error: maximum of %d clients allowed\n",VXI11_MAX_CLIENTS); |
- ret = -VXI11_MAX_CLIENTS; |
- } |
- /* Create a new client, keep a note of where the client pointer |
- * is, for this IP address. Because it's a new client, this |
- * must be link number 1. Keep track of how many devices we've |
- * opened so we don't run out of storage space. */ |
- else { |
- ret = vxi11_open_device(ip, &(clink->client), &(clink->link), device); |
- strncpy(VXI11_IP_ADDRESS[VXI11_DEVICE_NO],ip,20); |
- VXI11_CLIENT_ADDRESS[VXI11_DEVICE_NO] = clink->client; |
- VXI11_LINK_COUNT[VXI11_DEVICE_NO]=1; |
-// printf("Open function, could not find ip address %s.\n",ip); |
-// printf("So now, VXI11_IP_ADDRESS[%d]=%s,\n",VXI11_DEVICE_NO,VXI11_IP_ADDRESS[VXI11_DEVICE_NO]); |
-// printf("VXI11_CLIENT_ADDRESS[%d]=%ld,\n",VXI11_DEVICE_NO,VXI11_CLIENT_ADDRESS[VXI11_DEVICE_NO]); |
-// printf(" clink->client=%ld,\n",clink->client); |
-// printf("VXI11_LINK_COUNT[%d]=%d.\n",VXI11_DEVICE_NO,VXI11_LINK_COUNT[VXI11_DEVICE_NO]); |
- VXI11_DEVICE_NO++; |
- } |
- } |
- /* already got a client for this IP address */ |
- else { |
- /* Copy the client pointer address. Just establish a new link |
- * (not a new client). Add one to the link count */ |
- clink->client = VXI11_CLIENT_ADDRESS[device_no]; |
- ret = vxi11_open_link(ip, &(clink->client), &(clink->link), device); |
-// printf("Found an ip address, copying client from VXI11_CLIENT_ADDRESS[%d]\n",device_no); |
- VXI11_LINK_COUNT[device_no]++; |
-// printf("Have just incremented VXI11_LINK_COUNT[%d], it's now %d\n",device_no,VXI11_LINK_COUNT[device_no]); |
- } |
-// printf("after creating link, clink->link = %ld\n", clink->link); |
- return ret; |
- } |
- |
-/* This is a wrapper function, used for the situations where there is only one |
- * "device" per client. This is the case for most (if not all) VXI11 |
- * instruments; however, it is _not_ the case for devices such as LAN to GPIB |
- * gateways. These are single clients that communicate to many instruments |
- * (devices). In order to differentiate between them, we need to pass a device |
- * name. This gets used in the vxi11_open_link() fn, as the link_parms.device |
- * value. */ |
-int vxi11_open_device(const char *ip, CLINK *clink) { |
- char device[6]; |
- strncpy(device,"inst0",6); |
- return vxi11_open_device(ip, clink, device); |
- } |
- |
- |
- |
-/* CLOSE FUNCTION * |
- * ============== */ |
- |
-/* Use this function from user land to close a device and/or sever a link. Can |
- * be used multiple times for the same device (the library will keep track).*/ |
-int vxi11_close_device(const char *ip, CLINK *clink) { |
-int l,ret; |
-int device_no = -1; |
- |
- /* Which instrument are we referring to? */ |
- for (l=0; l<VXI11_MAX_CLIENTS; l++){ |
- if (strcmp(ip,VXI11_IP_ADDRESS[l]) == 0 ) { |
- device_no=l; |
- } |
- } |
- /* Something's up if we can't find the IP address! */ |
- if (device_no == -1) { |
- printf("vxi11_close_device: error: I have no record of you ever opening device\n"); |
- printf(" with IP address %s\n",ip); |
- ret = -4; |
- } |
- else { /* Found the IP, there's more than one link to that instrument, |
- * so keep track and just close the link */ |
- if (VXI11_LINK_COUNT[device_no] > 1 ) { |
- ret = vxi11_close_link(ip,clink->client, clink->link); |
- VXI11_LINK_COUNT[device_no]--; |
- } |
- /* Found the IP, it's the last link, so close the device (link |
- * AND client) */ |
- else { |
- ret = vxi11_close_device(ip, clink->client, clink->link); |
- } |
- } |
- return ret; |
- } |
- |
- |
-/* SEND FUNCTIONS * |
- * ============== */ |
- |
-/* A _lot_ of the time we are sending text strings, and can safely rely on |
- * strlen(cmd). */ |
-int vxi11_send(CLINK *clink, const char *cmd) { |
- return vxi11_send(clink, cmd, strlen(cmd)); |
- } |
- |
-/* We still need the version of the function where the length is set explicitly |
- * though, for when we are sending fixed length data blocks. */ |
-int vxi11_send(CLINK *clink, const char *cmd, unsigned long len) { |
- return vxi11_send(clink->client, clink->link, cmd, len); |
- } |
- |
- |
-/* RECEIVE FUNCTIONS * |
- * ================= */ |
- |
-/* Lazy wrapper for when I can't be bothered to specify a read timeout */ |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len) { |
- return vxi11_receive(clink, buffer, len, VXI11_READ_TIMEOUT); |
- } |
- |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) { |
- return vxi11_receive(clink->client, clink->link, buffer, len, timeout); |
- } |
- |
- |
- |
-/***************************************************************************** |
- * USEFUL ADDITIONAL HIGHER LEVER USER FUNCTIONS - USE THESE FROM YOUR * |
- * PROGRAMS OR INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* SEND FIXED LENGTH DATA BLOCK FUNCTION * |
- * ===================================== */ |
-int vxi11_send_data_block(CLINK *clink, const char *cmd, char *buffer, unsigned long len) { |
-char *out_buffer; |
-int cmd_len=strlen(cmd); |
-int ret; |
- |
- out_buffer=new char[cmd_len+10+len]; |
- sprintf(out_buffer,"%s#8%08lu",cmd,len); |
- memcpy(out_buffer+cmd_len+10,buffer,(unsigned long) len); |
- ret = vxi11_send(clink, out_buffer, (unsigned long) (cmd_len+10+len)); |
- delete[] out_buffer; |
- return ret; |
- } |
- |
- |
-/* RECEIVE FIXED LENGTH DATA BLOCK FUNCTION * |
- * ======================================== */ |
- |
-/* This function reads a response in the form of a definite-length block, such |
- * as when you ask for waveform data. The data is returned in the following |
- * format: |
- * #800001000<1000 bytes of data> |
- * ||\______/ |
- * || | |
- * || \---- number of bytes of data |
- * |\--------- number of digits that follow (in this case 8, with leading 0's) |
- * \---------- always starts with # |
- */ |
-long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) { |
-/* I'm not sure what the maximum length of this header is, I'll assume it's |
- * 11 (#9 + 9 digits) */ |
-unsigned long necessary_buffer_size; |
-char *in_buffer; |
-int ret; |
-int ndigits; |
-unsigned long returned_bytes; |
-int l; |
-char scan_cmd[20]; |
- necessary_buffer_size=len+12; |
- in_buffer=new char[necessary_buffer_size]; |
- ret=vxi11_receive(clink, in_buffer, necessary_buffer_size, timeout); |
- if (ret < 0) return ret; |
- if (in_buffer[0] != '#') { |
- printf("vxi11_user: data block error: data block does not begin with '#'\n"); |
- printf("First 20 characters received were: '"); |
- for(l=0;l<20;l++) { |
- printf("%c",in_buffer[l]); |
- } |
- printf("'\n"); |
- return -3; |
- } |
- |
- /* first find out how many digits */ |
- sscanf(in_buffer,"#%1d",&ndigits); |
- /* some instruments, if there is a problem acquiring the data, return only "#0" */ |
- if (ndigits > 0) { |
- /* now that we know, we can convert the next <ndigits> bytes into an unsigned long */ |
- sprintf(scan_cmd,"#%%1d%%%dlu",ndigits); |
- sscanf(in_buffer,scan_cmd,&ndigits,&returned_bytes); |
- memcpy(buffer, in_buffer+(ndigits+2), returned_bytes); |
- delete[] in_buffer; |
- return (long) returned_bytes; |
- } |
- else return 0; |
- } |
- |
- |
-/* SEND AND RECEIVE FUNCTION * |
- * ========================= */ |
- |
-/* This is mainly a useful function for the overloaded vxi11_obtain_value() |
- * fn's, but is also handy and useful for user and library use */ |
-long vxi11_send_and_receive(CLINK *clink, const char *cmd, char *buf, unsigned long buf_len, unsigned long timeout) { |
-int ret; |
-long bytes_returned; |
- do { |
- ret = vxi11_send(clink, cmd); |
- if (ret != 0) { |
- if (ret != -VXI11_NULL_WRITE_RESP) { |
- printf("Error: vxi11_send_and_receive: could not send cmd.\n"); |
- printf(" The function vxi11_send returned %d. ",ret); |
- return -1; |
- } |
- else printf("(Info: VXI11_NULL_WRITE_RESP in vxi11_send_and_receive, resending query)\n"); |
- } |
- |
- bytes_returned = vxi11_receive(clink, buf, buf_len, timeout); |
- if (bytes_returned <= 0) { |
- if (bytes_returned >-VXI11_NULL_READ_RESP) { |
- printf("Error: vxi11_send_and_receive: problem reading reply.\n"); |
- printf(" The function vxi11_receive returned %ld. ",bytes_returned); |
- return -2; |
- } |
- else printf("(Info: VXI11_NULL_READ_RESP in vxi11_send_and_receive, resending query)\n"); |
- } |
- } while (bytes_returned == -VXI11_NULL_READ_RESP || ret == -VXI11_NULL_WRITE_RESP); |
- return 0; |
- } |
- |
- |
-/* FUNCTIONS TO RETURN A LONG INTEGER VALUE SENT AS RESPONSE TO A QUERY * |
- * ==================================================================== */ |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd, unsigned long timeout) { |
-char buf[50]; /* 50=arbitrary length... more than enough for one number in ascii */ |
- memset(buf, 0, 50); |
- if (vxi11_send_and_receive(clink, cmd, buf, 50, timeout) != 0) { |
- printf("Returning 0\n"); |
- return 0; |
- } |
- return strtol(buf, (char **)NULL, 10); |
- } |
- |
-/* Lazy wrapper function with default read timeout */ |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd) { |
- return vxi11_obtain_long_value(clink, cmd, VXI11_READ_TIMEOUT); |
- } |
- |
- |
-/* FUNCTIONS TO RETURN A DOUBLE FLOAT VALUE SENT AS RESPONSE TO A QUERY * |
- * ==================================================================== */ |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd, unsigned long timeout) { |
-char buf[50]; /* 50=arbitrary length... more than enough for one number in ascii */ |
-double val; |
- memset(buf, 0, 50); |
- if (vxi11_send_and_receive(clink, cmd, buf, 50, timeout) != 0) { |
- printf("Returning 0.0\n"); |
- return 0.0; |
- } |
- val = strtod(buf, (char **)NULL); |
- return val; |
- } |
- |
-/* Lazy wrapper function with default read timeout */ |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd) { |
- return vxi11_obtain_double_value(clink, cmd, VXI11_READ_TIMEOUT); |
- } |
- |
- |
-/***************************************************************************** |
- * CORE FUNCTIONS - YOU SHOULDN'T NEED TO USE THESE FROM YOUR PROGRAMS OR * |
- * INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* OPEN FUNCTIONS * |
- * ============== */ |
-int vxi11_open_device(const char *ip, CLIENT **client, VXI11_LINK **link, char *device) { |
- |
- *client = clnt_create(ip, DEVICE_CORE, DEVICE_CORE_VERSION, "tcp"); |
- |
- if (*client == NULL) { |
- clnt_pcreateerror(ip); |
- return -1; |
- } |
- |
- return vxi11_open_link(ip, client, link, device); |
- } |
- |
-int vxi11_open_link(const char *ip, CLIENT **client, VXI11_LINK **link, char *device) { |
- |
-Create_LinkParms link_parms; |
- |
- /* Set link parameters */ |
- link_parms.clientId = (long) *client; |
- link_parms.lockDevice = 0; |
- link_parms.lock_timeout = VXI11_DEFAULT_TIMEOUT; |
- link_parms.device = device; |
- |
- *link = (Create_LinkResp *) calloc(1, sizeof(Create_LinkResp)); |
- |
- if (create_link_1(&link_parms, *link, *client) != RPC_SUCCESS) { |
- clnt_perror(*client, ip); |
- return -2; |
- } |
- return 0; |
- } |
- |
- |
-/* CLOSE FUNCTIONS * |
- * =============== */ |
-int vxi11_close_device(const char *ip, CLIENT *client, VXI11_LINK *link) { |
-int ret; |
- |
- ret = vxi11_close_link(ip, client, link); |
- |
- clnt_destroy(client); |
- |
- return ret; |
- } |
- |
-int vxi11_close_link(const char *ip, CLIENT *client, VXI11_LINK *link) { |
-Device_Error dev_error; |
- memset(&dev_error, 0, sizeof(dev_error)); |
- |
- if (destroy_link_1(&link->lid, &dev_error, client) != RPC_SUCCESS) { |
- clnt_perror(client,ip); |
- return -1; |
- } |
- |
- return 0; |
- } |
- |
- |
-/* SEND FUNCTIONS * |
- * ============== */ |
- |
-/* A _lot_ of the time we are sending text strings, and can safely rely on |
- * strlen(cmd). */ |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd) { |
- return vxi11_send(client, link, cmd, strlen(cmd)); |
- } |
- |
-/* We still need the version of the function where the length is set explicitly |
- * though, for when we are sending fixed length data blocks. */ |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd, unsigned long len) { |
-Device_WriteParms write_parms; |
-int bytes_left = (int)len; |
-char *send_cmd; |
- |
- send_cmd = new char[len]; |
- memcpy(send_cmd, cmd, len); |
- |
- write_parms.lid = link->lid; |
- write_parms.io_timeout = VXI11_DEFAULT_TIMEOUT; |
- write_parms.lock_timeout = VXI11_DEFAULT_TIMEOUT; |
- |
-/* We can only write (link->maxRecvSize) bytes at a time, so we sit in a loop, |
- * writing a chunk at a time, until we're done. */ |
- |
- do { |
- Device_WriteResp write_resp; |
- memset(&write_resp, 0, sizeof(write_resp)); |
- |
- if (bytes_left <= link->maxRecvSize) { |
- write_parms.flags = 8; |
- write_parms.data.data_len = bytes_left; |
- } |
- else { |
- write_parms.flags = 0; |
- /* We need to check that maxRecvSize is a sane value (ie >0). Believe it |
- * or not, on some versions of Agilent Infiniium scope firmware the scope |
- * returned "0", which breaks Rule B.6.3 of the VXI-11 protocol. Nevertheless |
- * we need to catch this, otherwise the program just hangs. */ |
- if (link->maxRecvSize > 0) { |
- write_parms.data.data_len = link->maxRecvSize; |
- } |
- else { |
- write_parms.data.data_len = 4096; /* pretty much anything should be able to cope with 4kB */ |
- } |
- } |
- write_parms.data.data_val = send_cmd + (len - bytes_left); |
- |
- if(device_write_1(&write_parms, &write_resp, client) != RPC_SUCCESS) { |
- delete[] send_cmd; |
- return -VXI11_NULL_WRITE_RESP; /* The instrument did not acknowledge the write, just completely |
- dropped it. There was no vxi11 comms error as such, the |
- instrument is just being rude. Usually occurs when the instrument |
- is busy. If we don't check this first, then the following |
- line causes a seg fault */ |
- } |
- if (write_resp . error != 0) { |
- printf("vxi11_user: write error: %d\n",write_resp . error); |
- delete[] send_cmd; |
- return -(write_resp . error); |
- } |
- bytes_left -= write_resp . size; |
- } while (bytes_left > 0); |
- |
- delete[] send_cmd; |
- return 0; |
- } |
- |
- |
-/* RECEIVE FUNCTIONS * |
- * ================= */ |
- |
-// It appeared that this function wasn't correctly dealing with more data available than specified in len. |
-// This patch attempts to fix this issue. RDP 2007/8/13 |
- |
-/* wrapper, for default timeout */ long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len) { return vxi11_receive(client, link, buffer, len, VXI11_READ_TIMEOUT); |
- } |
- |
-#define RCV_END_BIT 0x04 // An end indicator has been read |
-#define RCV_CHR_BIT 0x02 // A termchr is set in flags and a character which matches termChar is transferred |
-#define RCV_REQCNT_BIT 0x01 // requestSize bytes have been transferred. This includes a request size of zero. |
- |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout) { |
-Device_ReadParms read_parms; |
-Device_ReadResp read_resp; |
-long curr_pos = 0; |
- |
- read_parms.lid = link->lid; |
- read_parms.requestSize = len; |
- read_parms.io_timeout = timeout; /* in ms */ |
- read_parms.lock_timeout = timeout; /* in ms */ |
- read_parms.flags = 0; |
- read_parms.termChar = 0; |
- |
- do { |
- memset(&read_resp, 0, sizeof(read_resp)); |
- |
- read_resp.data.data_val = buffer + curr_pos; |
- read_parms.requestSize = len - curr_pos; // Never request more total data than originally specified in len |
- |
- if(device_read_1(&read_parms, &read_resp, client) != RPC_SUCCESS) { |
- return -VXI11_NULL_READ_RESP; /* there is nothing to read. Usually occurs after sending a query |
- which times out on the instrument. If we don't check this first, |
- then the following line causes a seg fault */ |
- } |
- if (read_resp . error != 0) { |
- /* Read failed for reason specified in error code. |
- * 0 no error |
- * 4 invalid link identifier |
- * 11 device locked by another link |
- * 15 I/O timeout |
- * 17 I/O error |
- * 23 abort |
- */ |
- |
- printf("vxi11_user: read error: %d\n",read_resp . error); |
- return -(read_resp . error); |
- } |
- |
- if((curr_pos + read_resp . data.data_len) <= len) { |
- curr_pos += read_resp . data.data_len; |
- } |
- if( (read_resp.reason & RCV_END_BIT) || (read_resp.reason & RCV_CHR_BIT) ) { |
- break; |
- } |
- else if( curr_pos == len ) { |
- printf("xvi11_user: read error: buffer too small. Read %d bytes without hitting terminator.\n", curr_pos ); |
- return -100; |
- } |
- } while(1); |
- return (curr_pos); /*actual number of bytes received*/ |
- |
- } |
- |
Index: sipmscan/trunk/vxi11_i686/vxi11_user.h |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/vxi11_user.h (revision 117) |
+++ sipmscan/trunk/vxi11_i686/vxi11_user.h (nonexistent) |
@@ -1,136 +0,0 @@ |
-/* Revision history: */ |
-/* $Id: vxi11_user.h,v 1.10 2007/10/30 12:47:33 sds Exp $ */ |
-/* |
- * $Log: vxi11_user.h,v $ |
- * Revision 1.10 2007/10/30 12:47:33 sds |
- * changed a lot of char *'s to const char *'s in an attempt to get |
- * rid of pedantic gcc compiler warnings. |
- * |
- * Revision 1.9 2007/07/11 14:20:56 sds |
- * removed #include <iostream> as not needed |
- * removed using namespace std |
- * |
- * Revision 1.8 2007/07/10 13:54:11 sds |
- * Added extra function: |
- * int vxi11_open_device(char *ip, CLINK *clink, char *device); |
- * This replaces the original vxi11_open_device fn, which did not pass |
- * a char *device. Wrapper fn used for backwards compatibility. |
- * |
- * Revision 1.7 2007/07/10 11:20:43 sds |
- * removed the following function: |
- * int vxi11_open_link(CLIENT **client, VXI11_LINK **link); |
- * ...since it was no longer needed, following the patch by |
- * Robert Larice. |
- * |
- * Revision 1.6 2006/12/08 11:47:14 ijc |
- * error on last ci, sorted. |
- * |
- * Revision 1.5 2006/12/08 11:45:29 ijc |
- * added #define VXI11_NULL_READ_RESP |
- * |
- * Revision 1.4 2006/12/07 12:26:17 sds |
- * added VXI11_NULL_READ_RESP #define |
- * |
- * Revision 1.3 2006/07/06 13:03:28 sds |
- * Surrounded the whole header with #ifndef __VXI11_USER__. |
- * Added a couple of vxi11_open_link() fns and a vxi11_close_link() fn, to |
- * separate the link stuff from the client stuff. |
- * |
- * Revision 1.2 2006/06/26 12:42:54 sds |
- * Introduced a new CLINK structure, to reduce the number of arguments |
- * passed to functions. Wrote wrappers for open(), close(), send() |
- * and receieve() functions, then adjusted all the other functions built |
- * on those to make use of the CLINK structure. |
- * |
- * Revision 1.1 2006/06/26 10:36:02 sds |
- * Initial revision |
- * |
- */ |
- |
-/* vxi11_user.h |
- * Copyright (C) 2006 Steve D. Sharples |
- * |
- * User library for opening, closing, sending to and receiving from |
- * a device enabled with the VXI11 RPC ethernet protocol. Uses the files |
- * generated by rpcgen vxi11.x. |
- * |
- * This program is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU General Public License |
- * as published by the Free Software Foundation; either version 2 |
- * of the License, or (at your option) any later version. |
- * |
- * This program is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with this program; if not, write to the Free Software |
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- * |
- * The author's email address is steve.sharples@nottingham.ac.uk |
- */ |
- |
-#ifndef __VXI11_USER__ |
-#define __VXI11_USER__ |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
- |
-#include <rpc/rpc.h> |
-#include "vxi11.h" |
- |
-#define VXI11_DEFAULT_TIMEOUT 10000 /* in ms */ |
-#define VXI11_READ_TIMEOUT 2000 /* in ms */ |
-#define VXI11_CLIENT CLIENT |
-#define VXI11_LINK Create_LinkResp |
-#define VXI11_MAX_CLIENTS 256 /* maximum no of unique IP addresses/clients */ |
-#define VXI11_NULL_READ_RESP 50 /* vxi11_receive() return value if a query |
- * times out ON THE INSTRUMENT (and so we have |
- * to resend the query again) */ |
-#define VXI11_NULL_WRITE_RESP 51 /* vxi11_send() return value if a sent command |
- * times out ON THE INSTURMENT. */ |
- |
-struct CLINK { |
- VXI11_CLIENT *client; |
- VXI11_LINK *link; |
- } ; |
-typedef struct CLINK CLINK; |
- |
-/* The four main functions: open, close, send, receieve (plus a couple of wrappers) */ |
-/* In fact all 6 of these are wrappers to the original functions listed at the |
- * bottom, that use separate CLIENT and VXI11_LINK structures. It was easier to |
- * write wrappers for these functions than to re-write the original functions |
- * themselves. These are the 4 (or 6 if you like) key user functions that you |
- * should probably be using. They all use the CLINK structure. */ |
-int vxi11_open_device(const char *ip, CLINK *clink); |
-int vxi11_open_device(const char *ip, CLINK *clink, char *device); |
-int vxi11_close_device(const char *ip, CLINK *clink); |
-int vxi11_send(CLINK *clink, const char *cmd); |
-int vxi11_send(CLINK *clink, const char *cmd, unsigned long len); |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len); |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout); |
-int vxi11_queryxx(CLINK *clink, char *mycmd); |
-/* Utility functions, that use send() and receive(). Use these too. */ |
-int vxi11_send_data_block(CLINK *clink, const char *cmd, char *buffer, unsigned long len); |
-long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout); |
-long vxi11_send_and_receive(CLINK *clink, const char *cmd, char *buf, unsigned long buf_len, unsigned long timeout); |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd, unsigned long timeout); |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd, unsigned long timeout); |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd); |
-double vxi11_obtain_double_value(CLINK *link, const char *cmd); |
- |
-/* When I first wrote this library I used separate client and links. I've |
- * retained the original functions and just written clink wrappers for them |
- * (see above) as it's perhaps a little clearer this way. Probably not worth |
- * delving this deep in use, but it's where the real nitty gritty is. */ |
-int vxi11_open_device(const char *ip, CLIENT **client, VXI11_LINK **link, char *device); |
-int vxi11_open_link(const char *ip, CLIENT **client, VXI11_LINK **link, char *device); |
-int vxi11_close_device(const char *ip, CLIENT *client, VXI11_LINK *link); |
-int vxi11_close_link(const char *ip, CLIENT *client, VXI11_LINK *link); |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd); |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd, unsigned long len); |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len); |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout); |
- |
-#endif |
Index: sipmscan/trunk/vxi11_i686/Makefile |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/Makefile (revision 117) |
+++ sipmscan/trunk/vxi11_i686/Makefile (nonexistent) |
@@ -1,18 +0,0 @@ |
-VERSION=1.08 |
- |
-#CFLAGS = -Wall -g |
-CFLAGS = -g |
-CXX = g++ |
- |
-.PHONY: clean objs |
- |
-objs: vxi11.h |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_user.cc |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_clnt.c |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_xdr.c |
- |
-vxi11.h: vxi11.x |
- rpcgen -M vxi11.x |
- |
-clean: |
- rm -f *.o vxi11_cmd vxi11.h vxi11_svc.c vxi11_xdr.c vxi11_clnt.c #TAGS |
Index: sipmscan/trunk/vxi11_i686/vxi11.x |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/vxi11.x (revision 117) |
+++ sipmscan/trunk/vxi11_i686/vxi11.x (nonexistent) |
@@ -1,317 +0,0 @@ |
-/* This file, vxi11.x, is the amalgamation of vxi11core.rpcl and vxi11intr.rpcl |
- * which are part of the asynDriver (R4-5) EPICS module, which, at time of |
- * writing, is available from: |
- * http://www.aps.anl.gov/epics/modules/soft/asyn/index.html |
- * More general information about EPICS is available from: |
- * http://www.aps.anl.gov/epics/ |
- * This code is open source, and is covered under the copyright notice and |
- * software license agreement shown below, and also at: |
- * http://www.aps.anl.gov/epics/license/open.php |
- * |
- * In order to comply with section 4.3 of the software license agreement, here |
- * is a PROMINENT NOTICE OF CHNAGES TO THE SOFTWARE |
- * =========================================== |
- * (1) This file, vxi11.x, is the concatenation of the files vxi11core.rpcl and |
- * vxi11intr.rpcl |
- * (2) Tab spacing has been tidied up |
- * |
- * It is intended as a lightweight base for the vxi11 rpc protocol. If you |
- * run rpcgen on this file, it will generate C files and headers, from which |
- * it is relatively simple to write C programs to communicate with a range |
- * of ethernet-enabled instruments, such as oscilloscopes and function |
- * generated by manufacturers such as Agilent and Tektronix (amongst many |
- * others). |
- * |
- * For what it's worth, this concatenation was done by Steve Sharples at |
- * the University of Nottingham, UK, on 1 June 2006. |
- * |
- * Copyright notice and software license agreement follow, then the |
- * original comments from vxi11core.rpcl etc. |
- * |
- ****************************************************************************** |
- * Copyright © 2006 <University of Chicago and other copyright holders>. All |
- * rights reserved. |
- ****************************************************************************** |
- * |
- ****************************************************************************** |
- * vxi11.x is distributed subject to the following license conditions: |
- * SOFTWARE LICENSE AGREEMENT |
- * Software: vxi11.x |
- * |
- * 1. The "Software", below, refers to vxi11.x (in either source code, or |
- * binary form and accompanying documentation). Each licensee is addressed |
- * as "you" or "Licensee." |
- * |
- * 2. The copyright holders shown above and their third-party licensors hereby |
- * grant Licensee a royalty-free nonexclusive license, subject to the |
- * limitations stated herein and U.S. Government license rights. |
- * |
- * 3. You may modify and make a copy or copies of the Software for use within |
- * your organization, if you meet the following conditions: |
- * 1. Copies in source code must include the copyright notice and this |
- * Software License Agreement. |
- * 2. Copies in binary form must include the copyright notice and this |
- * Software License Agreement in the documentation and/or other |
- * materials provided with the copy. |
- * |
- * 4. You may modify a copy or copies of the Software or any portion of it, |
- * thus forming a work based on the Software, and distribute copies of such |
- * work outside your organization, if you meet all of the following |
- * conditions: |
- * 1. Copies in source code must include the copyright notice and this |
- * Software License Agreement; |
- * 2. Copies in binary form must include the copyright notice and this |
- * Software License Agreement in the documentation and/or other |
- * materials provided with the copy; |
- * 3. Modified copies and works based on the Software must carry |
- * prominent notices stating that you changed specified portions of |
- * the Software. |
- * |
- * 5. Portions of the Software resulted from work developed under a U.S. |
- * Government contract and are subject to the following license: the |
- * Government is granted for itself and others acting on its behalf a |
- * paid-up, nonexclusive, irrevocable worldwide license in this computer |
- * software to reproduce, prepare derivative works, and perform publicly |
- * and display publicly. |
- * |
- * 6. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY OF |
- * ANY KIND. THE COPYRIGHT HOLDERS, THEIR THIRD PARTY LICENSORS, THE UNITED |
- * STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND THEIR EMPLOYEES: (1) |
- * DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO |
- * ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
- * PURPOSE, TITLE OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY |
- * OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR USEFULNESS OF THE |
- * SOFTWARE, (3) DO NOT REPRESENT THAT USE OF THE SOFTWARE WOULD NOT INFRINGE |
- * PRIVATELY OWNED RIGHTS, (4) DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION |
- * UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL BE CORRECTED. |
- * |
- * 7. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDERS, THEIR |
- * THIRD PARTY LICENSORS, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF |
- * ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, INCIDENTAL, |
- * CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF ANY KIND OR NATURE, |
- * INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS OR LOSS OF DATA, FOR ANY |
- * REASON WHATSOEVER, WHETHER SUCH LIABILITY IS ASSERTED ON THE BASIS OF |
- * CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, |
- * EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE POSSIBILITY OF SUCH |
- * LOSS OR DAMAGES. |
- ****************************************************************************** |
- */ |
- |
-/****************************************************************************** |
- * |
- * vxi11core.rpcl |
- * |
- * This file is best viewed with a tabwidth of 4 |
- * |
- ****************************************************************************** |
- * |
- * TODO: |
- * |
- ****************************************************************************** |
- * |
- * Original Author: someone from VXIbus Consortium |
- * Current Author: Benjamin Franksen |
- * Date: 03-06-97 |
- * |
- * RPCL description of the core- and abort-channel of the TCP/IP Instrument |
- * Protocol Specification. |
- * |
- * |
- * Modification Log: |
- * ----------------- |
- * .00 03-06-97 bfr created this file |
- * |
- ****************************************************************************** |
- * |
- * Notes: |
- * |
- * This stuff is literally from |
- * |
- * VXI-11, Ref 1.0 : TCP/IP Instrument Protocol Specification |
- * |
- */ |
- |
-typedef long Device_Link; |
- |
-enum Device_AddrFamily |
-{ |
- DEVICE_TCP, |
- DEVICE_UDP |
-}; |
- |
-typedef long Device_Flags; |
- |
-typedef long Device_ErrorCode; |
- |
-struct Device_Error |
-{ |
- Device_ErrorCode error; |
-}; |
- |
-struct Create_LinkParms |
-{ |
- long clientId; /* implementation specific value */ |
- bool lockDevice; /* attempt to lock the device */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- string device<>; /* name of device */ |
-}; |
-struct Create_LinkResp |
-{ |
- Device_ErrorCode error; |
- Device_Link lid; |
- unsigned short abortPort; /* for the abort RPC */ |
- unsigned long maxRecvSize; /* max # of bytes accepted on write */ |
-}; |
-struct Device_WriteParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- Device_Flags flags; /* flags with options */ |
- opaque data<>; /* the data length and the data itself */ |
-}; |
-struct Device_WriteResp |
-{ |
- Device_ErrorCode error; |
- unsigned long size; /* # of bytes written */ |
-}; |
-struct Device_ReadParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- unsigned long requestSize; /* # of bytes requested */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- Device_Flags flags; /* flags with options */ |
- char termChar; /* valid if flags & termchrset */ |
-}; |
-struct Device_ReadResp |
-{ |
- Device_ErrorCode error; |
- long reason; /* why read completed */ |
- opaque data<>; /* the data length and the data itself */ |
-}; |
-struct Device_ReadStbResp |
-{ |
- Device_ErrorCode error; |
- unsigned char stb; /* the returned status byte */ |
-}; |
-struct Device_GenericParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* flags with options */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
-}; |
-struct Device_RemoteFunc |
-{ |
- unsigned long hostAddr; /* host servicing interrupt */ |
- unsigned long hostPort; /* valid port # on client */ |
- unsigned long progNum; /* DEVICE_INTR */ |
- unsigned long progVers; /* DEVICE_INTR_VERSION */ |
- Device_AddrFamily progFamily; /* DEVICE_UDP | DEVICE_TCP */ |
-}; |
-struct Device_EnableSrqParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- bool enable; /* enable or disable intr's */ |
- opaque handle<40>; /* host specific data */ |
-}; |
-struct Device_LockParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* contains the waitlock flag */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
-}; |
-struct Device_DocmdParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* flags with options */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- long cmd; /* which command to execute */ |
- bool network_order; /* client's byte order */ |
- long datasize; /* size of individual data elements */ |
- opaque data_in<>; /* docmd data parameters */ |
-}; |
-struct Device_DocmdResp |
-{ |
- Device_ErrorCode error; |
- opaque data_out<>; /* returned data parameters */ |
-}; |
- |
-program DEVICE_ASYNC |
-{ |
- version DEVICE_ASYNC_VERSION |
- { |
- Device_Error device_abort (Device_Link) = 1; |
- } = 1; |
-} = 0x0607B0; |
- |
-program DEVICE_CORE |
-{ |
- version DEVICE_CORE_VERSION |
- { |
- Create_LinkResp create_link (Create_LinkParms) = 10; |
- Device_WriteResp device_write (Device_WriteParms) = 11; |
- Device_ReadResp device_read (Device_ReadParms) = 12; |
- Device_ReadStbResp device_readstb (Device_GenericParms) = 13; |
- Device_Error device_trigger (Device_GenericParms) = 14; |
- Device_Error device_clear (Device_GenericParms) = 15; |
- Device_Error device_remote (Device_GenericParms) = 16; |
- Device_Error device_local (Device_GenericParms) = 17; |
- Device_Error device_lock (Device_LockParms) = 18; |
- Device_Error device_unlock (Device_Link) = 19; |
- Device_Error device_enable_srq (Device_EnableSrqParms) = 20; |
- Device_DocmdResp device_docmd (Device_DocmdParms) = 22; |
- Device_Error destroy_link (Device_Link) = 23; |
- Device_Error create_intr_chan (Device_RemoteFunc) = 25; |
- Device_Error destroy_intr_chan (void) = 26; |
- } = 1; |
-} = 0x0607AF; |
- |
-/****************************************************************************** |
- * |
- * vxi11intr.rpcl |
- * |
- * This file is best viewed with a tabwidth of 4 |
- * |
- ****************************************************************************** |
- * |
- * TODO: |
- * |
- ****************************************************************************** |
- * |
- * Original Author: someone from VXIbus Consortium |
- * Current Author: Benjamin Franksen |
- * Date: 03-06-97 |
- * |
- * RPCL description of the intr-channel of the TCP/IP Instrument Protocol |
- * Specification. |
- * |
- * |
- * Modification Log: |
- * ----------------- |
- * .00 03-06-97 bfr created this file |
- * |
- ****************************************************************************** |
- * |
- * Notes: |
- * |
- * This stuff is literally from |
- * |
- * "VXI-11, Ref 1.0 : TCP/IP Instrument Protocol Specification" |
- * |
- */ |
- |
-struct Device_SrqParms |
-{ |
- opaque handle<>; |
-}; |
- |
-program DEVICE_INTR |
-{ |
- version DEVICE_INTR_VERSION |
- { |
- void device_intr_srq (Device_SrqParms) = 30; |
- } = 1; |
-} = 0x0607B1; |
Index: sipmscan/trunk/vxi11_i686/vxi11_cmd.cc |
=================================================================== |
--- sipmscan/trunk/vxi11_i686/vxi11_cmd.cc (revision 117) |
+++ sipmscan/trunk/vxi11_i686/vxi11_cmd.cc (nonexistent) |
@@ -1,237 +0,0 @@ |
-/*Predelava vmesnika vxi11 za lastne potrebe IJS F9*/ |
- |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
-#include <time.h> |
-#include "vxi11_user.h" |
-#define BUF_LEN 100000 |
- |
-CLINK *clink; |
-FILE *test,*test1; |
- |
-int query(char *mycmd){ |
-char buf[BUF_LEN]; |
- |
-memset(buf, 0, BUF_LEN); |
-vxi11_send(clink, mycmd); |
-int bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
-if (bytes_returned > 0) { |
- printf("%s\n",buf); |
-} else if (bytes_returned == -15) printf("*** [ NOTHING RECEIVED ] ***\n"); |
- |
-return 0; |
-} |
- |
-int command(char *mycmd){ |
-char buf[BUF_LEN]; |
- |
-memset(buf, 0, BUF_LEN); |
-vxi11_send(clink, mycmd); |
- |
-return 0; |
-} |
- |
-int queryrep(char *mycmd,char *mycmp,int i){ |
-char buf[BUF_LEN]; |
- |
-memset(buf, 0, BUF_LEN); |
-vxi11_send(clink, mycmd); |
-int bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
- |
-if(strcmp(buf,mycmp)!=0){ |
- if (bytes_returned > 0) fprintf(test1,"%d %s",i,buf); |
- else if (bytes_returned == -15) printf("*** [ NOTHING RECEIVED ] ***\n"); |
- |
- } |
- strcpy(mycmp,buf); |
- |
-return 0; |
-} |
- |
-/*float *fbuf; |
-fbuf= (float *) buf; |
-if (bytes_returned > 0){ |
- for (int j=1;j<3;j++) printf("%f\n",fbuf[j]); |
- } |
-*/ |
- |
-int main(void) { |
- |
-static char *device_ip; |
-static char *device_name; |
-char cmd[256],ukaz[256],end[256]; |
-char buf[BUF_LEN],pr1[BUF_LEN],pr2[BUF_LEN]; |
-int ret; |
-long bytes_returned; |
- |
-int i,m,vnos; |
- |
-clink = new CLINK; |
-time_t t1,t2; |
- |
-/* |
- fread(buf,1,size,fp); |
- float *fbuf=(float *) buf; |
- fbuf[0] |
- |
-*/ |
- memset(ukaz, 0, 256); |
- printf("\nIJS F9 - September 2010 - Pripravil: Jaka Mur - Beta verzija\n\nProgram za povezavo in nadzor Tektronix ali LeCroy osciloskopa.\nAvtomatsko se program poveze z IP naslovom 194.249.156.91.\nVnesi 'a' za nadaljevanje, 'q' za izhod ali IP za drugo napravo: "); |
- |
- while(1){ |
- scanf("%s",&ukaz); |
- |
- if (strncasecmp(ukaz, "q",1) == 0) return 0; |
- |
- else if (strncasecmp(ukaz, "a",1) != 0) ret=vxi11_open_device(ukaz,clink); |
- else ret=vxi11_open_device("194.249.156.91",clink); //privzeti IP naprave |
- |
- printf("\nPovezan z "); |
- |
- memset(buf, 0, BUF_LEN); |
- vxi11_send(clink, "*IDN?"); |
- bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
- if (bytes_returned > 0) { |
- printf("%s",buf); |
- break;} |
- else if (bytes_returned == -15) { |
- printf("Error."); |
- if (strncasecmp(ukaz, "a",1) == 0) ret=vxi11_close_device("194.249.156.91",clink); |
- else ret=vxi11_close_device(ukaz,clink); |
- return 0; |
- } |
- |
- } |
- |
- printf("\nNekatere pomembnejse nastavitve:\n"); |
- command("HEADER ON"); |
- command("DATA:SOURCE CH1"); |
- query("DAT?"); |
- |
- char odg[256]; |
- printf("Zelite spreminjati nastavitve? y/n/q: "); |
- scanf("%s",&odg); |
- fgets(cmd,256,stdin); |
- |
- if (strncasecmp(odg, "q",1) == 0) { |
- if (strncasecmp(ukaz, "a",1) == 0) ret=vxi11_close_device("194.249.156.91",clink); |
- else ret=vxi11_close_device(ukaz,clink); |
- return 0; |
- } |
- else if (strncasecmp(odg, "y",1) == 0){ |
- printf("\nSpisek komand je v Programmer Manualu!\n"); |
- while(1){ |
- memset(cmd, 0, 256); |
- memset(buf, 0, BUF_LEN); |
- |
- printf("Vnesi ukaz, vprasanje, 'q' za izhod ali 'x' za nadaljevanje: "); |
- fgets(cmd,256,stdin); |
- cmd[strlen(cmd)-1] = 0; |
- if (strncasecmp(cmd, "q",1) == 0) { |
- if (strncasecmp(ukaz, "a",1) == 0) ret=vxi11_close_device("194.249.156.91",clink); |
- else ret=vxi11_close_device(ukaz,clink); |
- return 0; |
- } |
- if (strncasecmp(cmd, "x",1) == 0) break; |
- |
- if (vxi11_send(clink, cmd) < 0) break; |
- if (strstr(cmd, "?") != 0) { |
- bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
- if (bytes_returned > 0) { |
- printf("%s\n",buf); |
- } |
- else if (bytes_returned == -15) { |
- printf("*** [ NOTHING RECEIVED ] ***\n"); |
- } |
- else break; |
- } |
- } |
- } |
- |
- command("HEADER OFF"); |
- |
- printf("\nIzbor serije meritev\n1 = za zapis waveformov v binarnem formatu\n2 = MEASU:IMM test\n3 = Shenanigans\nVnesi #: "); |
- scanf("%d",&vnos); |
-//prva opcija |
- if (vnos==1){ |
- |
- printf("\nTrenutno je nastavljeno zapisovanje celotnih waveformov iz CH1 v datoteko 'test.txt'. Vnesite zeljeno stevilo ponovitev: "); |
- scanf("%d",&m); |
- |
- test=fopen("/media/disk/vxi11_1.08/test.txt","w"); |
- command("DATA:SOURCE CH1"); |
- command("DATA:START 1"); |
- command("DATA:STOP 1000"); |
- command("DATA:ENCDG RPBINARY"); |
- |
-(void) time(&t1); |
- query("ACQUIRE:NUMFRAMESACQUIRED?"); |
- |
- for(i=1;i<m+1;i++) { //zajem binarnih podatkov |
- |
- memset(buf, 0, BUF_LEN); |
- vxi11_send(clink, "CURVE?"); |
- int bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
- |
- if (bytes_returned > 0) fwrite(buf,1,bytes_returned,test); |
- if(strcmp(buf,pr1)!=0){ |
- if (bytes_returned > 0) fwrite(buf,1,1000,test); |
- else if (bytes_returned == -15) printf("*** [ NOTHING RECEIVED ] ***\n"); |
- } |
- strcpy(pr1,buf); |
- } |
- |
- query("ACQUIRE:NUMFRAMESACQUIRED?"); |
-(void) time(&t2); |
- |
- printf("Koncano!\n"); |
- printf("Trajanje: %ld s\n",(int)t2-t1); |
- fclose(test); |
- |
- } |
-//druga opcija |
- else if (vnos==2){ |
- |
- test1=fopen("/media/disk/vxi11_1.08/test1.txt","w"); |
- |
- printf("Vnesi zeljeno stevilo meritev minimuma LeCroy: "); |
- scanf("%d",&m); |
- |
- for (i=0;i<m;i++) queryrep("C1:PAVA? MIN",pr2,i); |
- |
- fclose(test1); |
- } |
-//tretja opcija |
- else if (vnos==3){ |
- |
- test1=fopen("/media/disk/vxi11_1.08/test1.txt","w"); |
- |
- printf("Vnesi zeljeno stevilo zajemov: "); |
- scanf("%d",&m); |
- |
- command("DATA:SOURCE CH1, CH2"); |
- command("DATA:START 1"); |
- command("DATA:STOP 1000"); |
- command("DATA:ENCDG ASCII"); |
- |
- query("ACQUIRE:NUMFRAMESACQUIRED?"); |
- |
- for (i=0;i<m;i++) queryrep("CURVE?",pr2,i); |
- |
- query("ACQUIRE:NUMFRAMESACQUIRED?"); |
- |
- fclose(test1); |
- } |
- |
- if (strncasecmp(ukaz, "a",1) == 0) ret=vxi11_close_device("194.249.156.91",clink); |
- else ret=vxi11_close_device(ukaz,clink); |
- |
- printf("Meritve opravljene!\nZa zakljucek pritisni 'q'! "); |
- scanf("%s",&end); |
- |
- if (strcmp(end,"q")==0); |
- |
- return 0; |
-} |
- |
Index: sipmscan/trunk/daqscope.h |
=================================================================== |
--- sipmscan/trunk/daqscope.h (revision 117) |
+++ sipmscan/trunk/daqscope.h (nonexistent) |
@@ -1,62 +0,0 @@ |
-#ifndef _daqscope_h_ |
-#define _daqscope_h_ |
- |
-#define WAVE_LEN 100000 |
- |
-//class VmUsbStack; |
-class daqscope { |
-public: |
-// VmUsbStack * fStack; |
-// VmUsbStack * fInit; |
- |
- int OSrepetition; |
- int OSmeasu; |
- int OSmeasuchan; |
- int OSgating; |
- int OSsaving; |
- int OSinf; |
- int nmeaslc; |
- char OSchannels[1024]; |
- char IP[1024]; |
- char lecroycmd[1024]; |
- char lecroycmd2[1024]; |
- char lecroywfm[1024]; |
- int lecroystate; |
- char pch[1024]; |
- char lecroyadd[1024]; |
- 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 fPoints; |
- int fStop; |
- int fMode; |
- int clear(); |
- int end(); |
- int event(); |
- int lecroyevent(); |
- void measurement(float&); |
- void measulecroy(float&); |
- void measumult(); |
- int init(); |
- int initlecroy(); |
- int connect(char* IPaddr); |
- int disconnect(char* IPaddr); |
- void fileopen(const char*); |
- void fileclose(); |
- void countcontrol(); |
- void fastacq(int setting); /* GKM - gets tek out of fastacq*/ |
- void header(); |
- void measuheader(); |
- void lecroyheader(); |
- void lecroywave(); |
- double tekunit(char*); |
- double lcunit(char*); |
- daqscope(); |
-// daqscope(const char *); |
- ~daqscope(); |
-}; |
- |
-#endif |
Index: sipmscan/trunk/vxi11_x86_64/GNU_General_Public_License.txt |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/GNU_General_Public_License.txt (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/GNU_General_Public_License.txt (nonexistent) |
@@ -1,340 +0,0 @@ |
- GNU GENERAL PUBLIC LICENSE |
- Version 2, June 1991 |
- |
- Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
- Everyone is permitted to copy and distribute verbatim copies |
- of this license document, but changing it is not allowed. |
- |
- Preamble |
- |
- The licenses for most software are designed to take away your |
-freedom to share and change it. By contrast, the GNU General Public |
-License is intended to guarantee your freedom to share and change free |
-software--to make sure the software is free for all its users. This |
-General Public License applies to most of the Free Software |
-Foundation's software and to any other program whose authors commit to |
-using it. (Some other Free Software Foundation software is covered by |
-the GNU Library General Public License instead.) You can apply it to |
-your programs, too. |
- |
- When we speak of free software, we are referring to freedom, not |
-price. Our General Public Licenses are designed to make sure that you |
-have the freedom to distribute copies of free software (and charge for |
-this service if you wish), that you receive source code or can get it |
-if you want it, that you can change the software or use pieces of it |
-in new free programs; and that you know you can do these things. |
- |
- To protect your rights, we need to make restrictions that forbid |
-anyone to deny you these rights or to ask you to surrender the rights. |
-These restrictions translate to certain responsibilities for you if you |
-distribute copies of the software, or if you modify it. |
- |
- For example, if you distribute copies of such a program, whether |
-gratis or for a fee, you must give the recipients all the rights that |
-you have. You must make sure that they, too, receive or can get the |
-source code. And you must show them these terms so they know their |
-rights. |
- |
- We protect your rights with two steps: (1) copyright the software, and |
-(2) offer you this license which gives you legal permission to copy, |
-distribute and/or modify the software. |
- |
- Also, for each author's protection and ours, we want to make certain |
-that everyone understands that there is no warranty for this free |
-software. If the software is modified by someone else and passed on, we |
-want its recipients to know that what they have is not the original, so |
-that any problems introduced by others will not reflect on the original |
-authors' reputations. |
- |
- Finally, any free program is threatened constantly by software |
-patents. We wish to avoid the danger that redistributors of a free |
-program will individually obtain patent licenses, in effect making the |
-program proprietary. To prevent this, we have made it clear that any |
-patent must be licensed for everyone's free use or not licensed at all. |
- |
- The precise terms and conditions for copying, distribution and |
-modification follow. |
- |
- GNU GENERAL PUBLIC LICENSE |
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
- |
- 0. This License applies to any program or other work which contains |
-a notice placed by the copyright holder saying it may be distributed |
-under the terms of this General Public License. The "Program", below, |
-refers to any such program or work, and a "work based on the Program" |
-means either the Program or any derivative work under copyright law: |
-that is to say, a work containing the Program or a portion of it, |
-either verbatim or with modifications and/or translated into another |
-language. (Hereinafter, translation is included without limitation in |
-the term "modification".) Each licensee is addressed as "you". |
- |
-Activities other than copying, distribution and modification are not |
-covered by this License; they are outside its scope. The act of |
-running the Program is not restricted, and the output from the Program |
-is covered only if its contents constitute a work based on the |
-Program (independent of having been made by running the Program). |
-Whether that is true depends on what the Program does. |
- |
- 1. You may copy and distribute verbatim copies of the Program's |
-source code as you receive it, in any medium, provided that you |
-conspicuously and appropriately publish on each copy an appropriate |
-copyright notice and disclaimer of warranty; keep intact all the |
-notices that refer to this License and to the absence of any warranty; |
-and give any other recipients of the Program a copy of this License |
-along with the Program. |
- |
-You may charge a fee for the physical act of transferring a copy, and |
-you may at your option offer warranty protection in exchange for a fee. |
- |
- 2. You may modify your copy or copies of the Program or any portion |
-of it, thus forming a work based on the Program, and copy and |
-distribute such modifications or work under the terms of Section 1 |
-above, provided that you also meet all of these conditions: |
- |
- a) You must cause the modified files to carry prominent notices |
- stating that you changed the files and the date of any change. |
- |
- b) You must cause any work that you distribute or publish, that in |
- whole or in part contains or is derived from the Program or any |
- part thereof, to be licensed as a whole at no charge to all third |
- parties under the terms of this License. |
- |
- c) If the modified program normally reads commands interactively |
- when run, you must cause it, when started running for such |
- interactive use in the most ordinary way, to print or display an |
- announcement including an appropriate copyright notice and a |
- notice that there is no warranty (or else, saying that you provide |
- a warranty) and that users may redistribute the program under |
- these conditions, and telling the user how to view a copy of this |
- License. (Exception: if the Program itself is interactive but |
- does not normally print such an announcement, your work based on |
- the Program is not required to print an announcement.) |
- |
-These requirements apply to the modified work as a whole. If |
-identifiable sections of that work are not derived from the Program, |
-and can be reasonably considered independent and separate works in |
-themselves, then this License, and its terms, do not apply to those |
-sections when you distribute them as separate works. But when you |
-distribute the same sections as part of a whole which is a work based |
-on the Program, the distribution of the whole must be on the terms of |
-this License, whose permissions for other licensees extend to the |
-entire whole, and thus to each and every part regardless of who wrote it. |
- |
-Thus, it is not the intent of this section to claim rights or contest |
-your rights to work written entirely by you; rather, the intent is to |
-exercise the right to control the distribution of derivative or |
-collective works based on the Program. |
- |
-In addition, mere aggregation of another work not based on the Program |
-with the Program (or with a work based on the Program) on a volume of |
-a storage or distribution medium does not bring the other work under |
-the scope of this License. |
- |
- 3. You may copy and distribute the Program (or a work based on it, |
-under Section 2) in object code or executable form under the terms of |
-Sections 1 and 2 above provided that you also do one of the following: |
- |
- a) Accompany it with the complete corresponding machine-readable |
- source code, which must be distributed under the terms of Sections |
- 1 and 2 above on a medium customarily used for software interchange; or, |
- |
- b) Accompany it with a written offer, valid for at least three |
- years, to give any third party, for a charge no more than your |
- cost of physically performing source distribution, a complete |
- machine-readable copy of the corresponding source code, to be |
- distributed under the terms of Sections 1 and 2 above on a medium |
- customarily used for software interchange; or, |
- |
- c) Accompany it with the information you received as to the offer |
- to distribute corresponding source code. (This alternative is |
- allowed only for noncommercial distribution and only if you |
- received the program in object code or executable form with such |
- an offer, in accord with Subsection b above.) |
- |
-The source code for a work means the preferred form of the work for |
-making modifications to it. For an executable work, complete source |
-code means all the source code for all modules it contains, plus any |
-associated interface definition files, plus the scripts used to |
-control compilation and installation of the executable. However, as a |
-special exception, the source code distributed need not include |
-anything that is normally distributed (in either source or binary |
-form) with the major components (compiler, kernel, and so on) of the |
-operating system on which the executable runs, unless that component |
-itself accompanies the executable. |
- |
-If distribution of executable or object code is made by offering |
-access to copy from a designated place, then offering equivalent |
-access to copy the source code from the same place counts as |
-distribution of the source code, even though third parties are not |
-compelled to copy the source along with the object code. |
- |
- 4. You may not copy, modify, sublicense, or distribute the Program |
-except as expressly provided under this License. Any attempt |
-otherwise to copy, modify, sublicense or distribute the Program is |
-void, and will automatically terminate your rights under this License. |
-However, parties who have received copies, or rights, from you under |
-this License will not have their licenses terminated so long as such |
-parties remain in full compliance. |
- |
- 5. You are not required to accept this License, since you have not |
-signed it. However, nothing else grants you permission to modify or |
-distribute the Program or its derivative works. These actions are |
-prohibited by law if you do not accept this License. Therefore, by |
-modifying or distributing the Program (or any work based on the |
-Program), you indicate your acceptance of this License to do so, and |
-all its terms and conditions for copying, distributing or modifying |
-the Program or works based on it. |
- |
- 6. Each time you redistribute the Program (or any work based on the |
-Program), the recipient automatically receives a license from the |
-original licensor to copy, distribute or modify the Program subject to |
-these terms and conditions. You may not impose any further |
-restrictions on the recipients' exercise of the rights granted herein. |
-You are not responsible for enforcing compliance by third parties to |
-this License. |
- |
- 7. If, as a consequence of a court judgment or allegation of patent |
-infringement or for any other reason (not limited to patent issues), |
-conditions are imposed on you (whether by court order, agreement or |
-otherwise) that contradict the conditions of this License, they do not |
-excuse you from the conditions of this License. If you cannot |
-distribute so as to satisfy simultaneously your obligations under this |
-License and any other pertinent obligations, then as a consequence you |
-may not distribute the Program at all. For example, if a patent |
-license would not permit royalty-free redistribution of the Program by |
-all those who receive copies directly or indirectly through you, then |
-the only way you could satisfy both it and this License would be to |
-refrain entirely from distribution of the Program. |
- |
-If any portion of this section is held invalid or unenforceable under |
-any particular circumstance, the balance of the section is intended to |
-apply and the section as a whole is intended to apply in other |
-circumstances. |
- |
-It is not the purpose of this section to induce you to infringe any |
-patents or other property right claims or to contest validity of any |
-such claims; this section has the sole purpose of protecting the |
-integrity of the free software distribution system, which is |
-implemented by public license practices. Many people have made |
-generous contributions to the wide range of software distributed |
-through that system in reliance on consistent application of that |
-system; it is up to the author/donor to decide if he or she is willing |
-to distribute software through any other system and a licensee cannot |
-impose that choice. |
- |
-This section is intended to make thoroughly clear what is believed to |
-be a consequence of the rest of this License. |
- |
- 8. If the distribution and/or use of the Program is restricted in |
-certain countries either by patents or by copyrighted interfaces, the |
-original copyright holder who places the Program under this License |
-may add an explicit geographical distribution limitation excluding |
-those countries, so that distribution is permitted only in or among |
-countries not thus excluded. In such case, this License incorporates |
-the limitation as if written in the body of this License. |
- |
- 9. The Free Software Foundation may publish revised and/or new versions |
-of the General Public License from time to time. Such new versions will |
-be similar in spirit to the present version, but may differ in detail to |
-address new problems or concerns. |
- |
-Each version is given a distinguishing version number. If the Program |
-specifies a version number of this License which applies to it and "any |
-later version", you have the option of following the terms and conditions |
-either of that version or of any later version published by the Free |
-Software Foundation. If the Program does not specify a version number of |
-this License, you may choose any version ever published by the Free Software |
-Foundation. |
- |
- 10. If you wish to incorporate parts of the Program into other free |
-programs whose distribution conditions are different, write to the author |
-to ask for permission. For software which is copyrighted by the Free |
-Software Foundation, write to the Free Software Foundation; we sometimes |
-make exceptions for this. Our decision will be guided by the two goals |
-of preserving the free status of all derivatives of our free software and |
-of promoting the sharing and reuse of software generally. |
- |
- NO WARRANTY |
- |
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
-REPAIR OR CORRECTION. |
- |
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
-POSSIBILITY OF SUCH DAMAGES. |
- |
- END OF TERMS AND CONDITIONS |
- |
- How to Apply These Terms to Your New Programs |
- |
- If you develop a new program, and you want it to be of the greatest |
-possible use to the public, the best way to achieve this is to make it |
-free software which everyone can redistribute and change under these terms. |
- |
- To do so, attach the following notices to the program. It is safest |
-to attach them to the start of each source file to most effectively |
-convey the exclusion of warranty; and each file should have at least |
-the "copyright" line and a pointer to where the full notice is found. |
- |
- <one line to give the program's name and a brief idea of what it does.> |
- Copyright (C) <year> <name of author> |
- |
- This program is free software; you can redistribute it and/or modify |
- it under the terms of the GNU General Public License as published by |
- the Free Software Foundation; either version 2 of the License, or |
- (at your option) any later version. |
- |
- This program is distributed in the hope that it will be useful, |
- but WITHOUT ANY WARRANTY; without even the implied warranty of |
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- GNU General Public License for more details. |
- |
- You should have received a copy of the GNU General Public License |
- along with this program; if not, write to the Free Software |
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
- |
- |
-Also add information on how to contact you by electronic and paper mail. |
- |
-If the program is interactive, make it output a short notice like this |
-when it starts in an interactive mode: |
- |
- Gnomovision version 69, Copyright (C) year name of author |
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
- This is free software, and you are welcome to redistribute it |
- under certain conditions; type `show c' for details. |
- |
-The hypothetical commands `show w' and `show c' should show the appropriate |
-parts of the General Public License. Of course, the commands you use may |
-be called something other than `show w' and `show c'; they could even be |
-mouse-clicks or menu items--whatever suits your program. |
- |
-You should also get your employer (if you work as a programmer) or your |
-school, if any, to sign a "copyright disclaimer" for the program, if |
-necessary. Here is a sample; alter the names: |
- |
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
- `Gnomovision' (which makes passes at compilers) written by James Hacker. |
- |
- <signature of Ty Coon>, 1 April 1989 |
- Ty Coon, President of Vice |
- |
-This General Public License does not permit incorporating your program into |
-proprietary programs. If your program is a subroutine library, you may |
-consider it more useful to permit linking proprietary applications with the |
-library. If this is what you want to do, use the GNU Library General |
-Public License instead of this License. |
Index: sipmscan/trunk/vxi11_x86_64/CHANGELOG.txt |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/CHANGELOG.txt (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/CHANGELOG.txt (nonexistent) |
@@ -1,218 +0,0 @@ |
------------------------------------------------------------------------------- |
-vxi11_1.10 - 9/09/2010 |
- |
-Bug fix (thanks to Stephan Mahr): in vxi11_close(), remove the IP address |
-from the global array that keeps track of them so that if the same device |
-is opened again, then a new client is created, rather than it attempting |
-to use the old one (which was destroyed on the previous close). |
- |
------------------------------------------------------------------------------- |
-vxi11_1.09 - 7/06/2010 |
- |
-Moved over to bazaar VCS (from RCS). |
- |
-Makefile cleanups. Fixed signed/unsigned comparisons. Use consistent (and |
-sane) struct separator spacing in code. |
- |
-Fix int casting on printf statements to fix new compiler warnings/errors |
-(thanks to Shouri Chatterjee for pointing this out). |
- |
------------------------------------------------------------------------------- |
-vxi11_1.08 - 3/09/2009 |
- |
-Added a sanity check for link->maxRecvSize to make sure it's >0. This gets |
-around a bug in some versions of the Agilent Infiniium scope software. |
- |
-Changed the erroneous strncpy() to memcpy() in vxi11_send, as we could be |
-sending binary data (not just strings). |
- |
-Changed a lot of char *'s to const char *'s in an attempt to get rid of |
-pedantic gcc compiler warnings. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.07 - 9/10/2007 |
- |
-Minor change to vxi11_receive_data_block(), this fn now copes with instruments |
-that return just "#0" (for whatever reason). Suggestion by Jarek Sadowski, |
-gratefully received. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.06 - 31/08/2007 |
- |
-Bug fix in vxi11_receive(), to ensure that no more than "len" bytes are ever |
-received (and so avoiding a segmentation fault). This was a bug introduced in |
-release 1.04 whilst making some other changes to the vxi11_receive() fn. |
- |
-Many thanks to Rob Penny for spotting the bug and providing a patch. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.05 - 11/07/2007 |
- |
-Added the ability to specify a "device name" when calling vxi11_open_device(). |
-For regular VXI11-based instruments, such as scopes and AFGs, the device name |
-is usually "hard wired" to be "inst0", and up to now this has been hard wired |
-into the vxi11_user code. However, devices such as LAN to GPIB gateways need |
-some way of distinguishing between different devices... they are a single |
-client (one IP address), with multiple devices. |
- |
-The vxi11_user fn, vxi11_open_device(), now takes a third argument |
-(char *device). |
-This gets passed to the core vxi11_open_device() fn (the one that deals with |
-separate clients and links), and the core vxi11_open_link() fn; these two |
-core functions have also had an extra parameter added accordingly. In order |
-to not break the API, a wrapper function is provided in the form of the |
-original vxi11_open_device() fn, that just takes 2 arguments |
-(char *ip, CLINK *clink), this then passes "inst0" as the device argument. |
-Backwards-compatible wrappers for the core functions have NOT been provided. |
-These are generally not used from userland anyway. Hopefully this won't |
-upset anyone! |
- |
-vxi11_cmd, the simple test utility, has also been updated. You can now, |
-optionally, pass the device_name as a second argument (after the ip |
-address). The source has been renamed to vxi11_cmd.cc (from vxi11_cmd.c), as |
-it is C++ code not C. |
- |
-Some minor tidying up in vxi11_user.h |
- |
-With thanks to Oliver Schulz for bringing LAN to GPIB gateways to my |
-attention, for suggesting changes to the vxi11_user library to allow them to |
-be accommodated, and for tidying some things up. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.04 - 10/07/2007 |
- |
-Patch applied, which was kindly provided by Robert Larice. This sorts out |
-the confusion (on my part) about the structures returned by the rpcgen |
-generated *_1() functions... these are statically allocated temporary structs, |
-apparently. In the words of Robert Larice: |
- |
-****** |
-Hello Dr. Sharples, |
- |
- I'm sending some patches for your nice gem "vxi11_1.03" |
- |
- In the source code there were some strange comments, concerning |
- a commented free() around ... Manfred S. ... |
- and some notes, suggesting you had trouble to get more than one link |
- working. |
- |
- I think thats caused by some misuse of the rpcgen generated subroutines. |
- 1) those rpcgen generated *_1 functions returned pointers to |
- statically allocated temporary structs. |
- those where meant to be instantly copied to the user's space, |
- which wasn't done |
- thus instead of |
- Device_ReadResp *read_resp; |
- read_resp = device_read_1(...) |
- one should have written someting like: |
- Device_ReadResp *read_resp; |
- read_resp = malloc(...) |
- memcpy(read_resp, device_read_1(...), ...) |
- 2) but a better fix is to use the rpcgen -M Flag |
- which allows to pass the memory space as a third argument |
- so one can write |
- Device_ReadResp *read_resp; |
- read_resp = malloc(...) |
- device_read_1(..., read_resp, ...) |
- furthermore this is now automatically thread save |
- 3) the rpcgen function device_read_1 |
- expects a target buffer to be passed via read_resp |
- which was not done. |
- 4) the return value of vxi11_receive() was computed incorrectly |
- 5) minor, Makefile typo's |
- CFLAGS versus |
- CLFAGS |
- |
-****** |
- |
-Robert didn't have more than one device to try the patch with, but I've just |
-tried it and everything seems fine. So I've removed all references to the |
-VXI11_ENABLE_MULTIPLE_CLIENTS global variable, and removed the call to |
-vxi11_open_link() from the vxi11_send() fn. There has been an associated |
-tidying of functions, and removal of some comments. |
- |
-Thanks once again to Robert Larice for the patch and the explanation! |
- |
------------------------------------------------------------------------------- |
-vxi11_1.03 - 29/01/2007 |
- |
-Some bug-fixes (thanks to Manfred S.), and extra awareness of the |
-possibility that instruments could time out after receiving a query WITHOUT |
-causing an error condition. In some cases (prior to these changes) this |
-could have resulted in a segmentation fault. |
- |
-Specifically: |
- |
-(1) removed call to ANSI free() fn in vxi11_receive, which according to |
- Manfred S. "is not necessary and wrong (crashes)". |
- |
-(2) added extra check in vxi11_receive() to see if read_resp==NULL. |
- read_resp can apparently be NULL if (eg) you send an instrument a |
- query, but the instrument is so busy with something else for so long |
- that it forgets the original query. So this extra check is for that |
- situation, and vxi11_receive returns -VXI11_NULL_READ_RESP to the |
- calling function. |
- |
-(3) vxi11_send_and_receive() is now aware of the possibility of being |
- returned -VXI11_NULL_READ_RESP. If so, it re-sends the query, until |
- either getting a "regular" read error (read_resp->error!=0) or a |
- successful read. |
- |
-(4) Similar to (2)... added extra check in vxi11_send() to see if |
- write_resp==NULL. If so, return -VXI11_NULL_WRITE_RESP. As with (3), |
- send_and_receive() is now aware of this possibility. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.02 - 25/08/2006 |
- |
-Important changes to the core vxi11_send() function, which should be |
-invisible to the user. |
- |
-For those interested, the function now takes note of the value of |
-link->maxRecvSize, which is the maximum number of bytes that the vxi11 |
-intrument you're talking to can receive in one go. For many instruments |
-this may be a few kB, which isn't a problem for sending short commands; |
-however, sending large chunks of data (for example sending waveforms |
-to instruments) may exceed this maxRecvSize. The core vxi11_send() function |
-has been re-written to ensure that only a maximum of [maxRecvSize] bytes are |
-written in one go... the function sits in a loop until all the message/ |
-data is written. |
- |
-Also tidied up some of the return values (specifically with regard to |
-vxi11_send() and vxi11_send_data_block() ). |
- |
------------------------------------------------------------------------------- |
-vxi11_1.01 - 06/07/2006 |
- |
-Fair few changes since v1.00, all in vxi11_user.c and vxi11_user.h |
- |
-Found I was having problems talking to multiple links on the same |
-client, if I created a different client for each one. So introduced |
-a few global variables to keep track of all the ip addresses of |
-clients that the library is asked to create, and only creating new |
-clients if the ip address is different. This puts a limit of how |
-many unique ip addresses (clients) a single process can connect to. |
-Set this value at 256 (should hopefully be enough!). |
- |
-Next I found that talking to different clients on different ip |
-addresses didn't work. It turns out that create_link_1() creates |
-a static structure. This this link is associated with a given |
-client (and hence a given IP address), then the only way I could |
-think of making things work was to add a call to an |
-vxi11_open_link() function before each send command (no idea what |
-this adds to overheads and it's very messy!) - at least I was |
-able to get this to only happen when we are using more than one |
-client/ip address. |
- |
-Also, while I was at it, I re-ordered the functions a little - |
-starts with core user functions, extra user functions, then core |
-library functions at the end. Added a few more comments. Tidied |
-up. Left some debugging info in, but commented out. |
- |
------------------------------------------------------------------------------- |
-vxi11_1.00 - 23/06/2006 |
- |
-Initial release. |
- |
------------------------------------------------------------------------------- |
- |
Index: sipmscan/trunk/vxi11_x86_64/Makefile.old |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/Makefile.old (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/Makefile.old (nonexistent) |
@@ -1,40 +0,0 @@ |
-VERSION=1.08 |
- |
-#CFLAGS = -Wall -g |
-CFLAGS = -g |
-INSTALL = install |
-prefix = /usr/local |
-CXX = g++ |
- |
-.PHONY : install clean dist distclean |
- |
-vxi11_cmd: vxi11_cmd.o vxi11_user.o vxi11_clnt.o vxi11_xdr.o |
- $(CXX) -fPIC $(CFLAGS) -o $@ $^ |
- |
-vxi11_cmd.o: vxi11_cmd.cc vxi11_user.cc vxi11.h |
- $(CXX) -fPIC $(CFLAGS) -c $< -o $@ |
- |
-vxi11_user.o: vxi11_user.cc vxi11.h |
- $(CXX) -fPIC $(CFLAGS) -c $< -o $@ |
- |
-vxi11.h vxi11_clnt.c vxi11_xdr.c : vxi11.x |
- rpcgen -M vxi11.x |
- |
-TAGS: $(wildcard *.c) $(wildcard *.h) $(wildcard *.cc) |
- etags $^ |
- |
-clean: |
- rm -f *.o vxi11_cmd vxi11.h vxi11_svc.c vxi11_xdr.c vxi11_clnt.c TAGS |
- |
-install: vxi11_cmd |
- $(INSTALL) vxi11_cmd $(DESTDIR)$(prefix)/bin/ |
- |
-dist : distclean |
- mkdir vxi11-$(VERSION) |
- cp -p vxi11_cmd.cc vxi11_user.cc vxi11_user.h vxi11.x vxi11-$(VERSION)/ |
- cp -p Makefile CHANGELOG.txt README.txt GNU_General_Public_License.txt vxi11-$(VERSION)/ |
- tar -zcf vxi11-$(VERSION).tar.gz vxi11-$(VERSION) |
- |
-distclean : |
- rm -rf vxi11-$(VERSION) |
- rm -f vxi11-$(VERSION).tar.gz |
Index: sipmscan/trunk/vxi11_x86_64/vxi11_user.cc |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/vxi11_user.cc (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/vxi11_user.cc (nonexistent) |
@@ -1,589 +0,0 @@ |
-/* vxi11_user.cc |
- * Copyright (C) 2006 Steve D. Sharples |
- * |
- * User library for opening, closing, sending to and receiving from |
- * a device enabled with the VXI11 RPC ethernet protocol. Uses the files |
- * generated by rpcgen vxi11.x. |
- * |
- * This program is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU General Public License |
- * as published by the Free Software Foundation; either version 2 |
- * of the License, or (at your option) any later version. |
- * |
- * This program is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with this program; if not, write to the Free Software |
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- * |
- * The author's email address is steve.sharples@nottingham.ac.uk |
- */ |
- |
-#include "vxi11_user.h" |
- |
-/***************************************************************************** |
- * GENERAL NOTES |
- ***************************************************************************** |
- * |
- * There are four functions at the heart of this library: |
- * |
- * int vxi11_open_device(char *ip, CLIENT **client, VXI11_LINK **link) |
- * int vxi11_close_device(char *ip, CLIENT *client, VXI11_LINK *link) |
- * int vxi11_send(CLIENT *client, VXI11_LINK *link, char *cmd, unsigned long len) |
- * long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout) |
- * |
- * Note that all 4 of these use separate client and link structures. All the |
- * other functions are built on these four core functions, and the first layer |
- * of abstraction is to combine the CLIENT and VXI11_LINK structures into a |
- * single entity, which I've called a CLINK. For the send and receive |
- * functions, this is just a simple wrapper. For the open and close functions |
- * it's a bit more complicated, because we somehow have to keep track of |
- * whether we've already opened a device with the same IP address before (in |
- * which case we need to recycle a previously created client), or whether |
- * we've still got any other links to a given IP address left when we are |
- * asked to close a clink (in which case we can sever the link, but have to |
- * keep the client open). This is so the person using this library from |
- * userland does not have to keep track of whether they are talking to a |
- * different physical instrument or not each time they establish a connection. |
- * |
- * So the base functions that the user will probably want to use are: |
- * |
- * int vxi11_open_device(char *ip, CLINK *clink) |
- * int vxi11_close_device(char *ip, CLINK *clink) |
- * int vxi11_send(CLINK *clink, char *cmd, unsigned long len) |
- * --- or --- (if sending just text) |
- * int vxi11_send(CLINK *clink, char *cmd) |
- * long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) |
- * |
- * There are then useful (to me, anyway) more specific functions built on top |
- * of these: |
- * |
- * int vxi11_send_data_block(CLINK *clink, char *cmd, char *buffer, unsigned long len) |
- * long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) |
- * long vxi11_send_and_receive(CLINK *clink, char *cmd, char *buf, unsigned long buf_len, unsigned long timeout) |
- * long vxi11_obtain_long_value(CLINK *clink, char *cmd, unsigned long timeout) |
- * double vxi11_obtain_double_value(CLINK *clink, char *cmd, unsigned long timeout) |
- * |
- * (then there are some shorthand wrappers for the above without specifying |
- * the timeout due to sheer laziness---explore yourself) |
- */ |
- |
- |
-/* Global variables. Keep track of multiple links per client. We need this |
- * because: |
- * - we'd like the library to be able to cope with multiple links to a given |
- * client AND multiple links to multiple clients |
- * - we'd like to just refer to a client/link ("clink") as a single |
- * entity from user land, we don't want to worry about different |
- * initialisation procedures, depending on whether it's an instrument |
- * with the same IP address or not |
- */ |
-char VXI11_IP_ADDRESS[VXI11_MAX_CLIENTS][20]; |
-CLIENT *VXI11_CLIENT_ADDRESS[VXI11_MAX_CLIENTS]; |
-int VXI11_DEVICE_NO = 0; |
-int VXI11_LINK_COUNT[VXI11_MAX_CLIENTS]; |
- |
-/***************************************************************************** |
- * KEY USER FUNCTIONS - USE THESE FROM YOUR PROGRAMS OR INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* OPEN FUNCTIONS * |
- * ============== */ |
- |
-/* Use this function from user land to open a device and create a link. Can be |
- * used multiple times for the same device (the library will keep track).*/ |
-int vxi11_open_device(const char *ip, CLINK *clink, char *device) { |
-int ret; |
-int l; |
-int device_no=-1; |
- |
-// printf("before doing anything, clink->link = %ld\n", clink->link); |
- /* Have a look to see if we've already initialised an instrument with |
- * this IP address */ |
- for (l=0; l<VXI11_MAX_CLIENTS; l++){ |
- if (strcmp(ip,VXI11_IP_ADDRESS[l]) == 0 ) { |
- device_no=l; |
-// printf("Open function, search, found ip address %s, device no %d\n",ip,device_no); |
- } |
- } |
- |
- /* Couldn't find a match, must be a new IP address */ |
- if (device_no < 0) { |
- /* Uh-oh, we're out of storage space. Increase the #define |
- * for VXI11_MAX_CLIENTS in vxi11_user.h */ |
- if (VXI11_DEVICE_NO >= VXI11_MAX_CLIENTS) { |
- printf("Error: maximum of %d clients allowed\n",VXI11_MAX_CLIENTS); |
- ret = -VXI11_MAX_CLIENTS; |
- } |
- /* Create a new client, keep a note of where the client pointer |
- * is, for this IP address. Because it's a new client, this |
- * must be link number 1. Keep track of how many devices we've |
- * opened so we don't run out of storage space. */ |
- else { |
- ret = vxi11_open_device(ip, &(clink->client), &(clink->link), device); |
- strncpy(VXI11_IP_ADDRESS[VXI11_DEVICE_NO],ip,20); |
- VXI11_CLIENT_ADDRESS[VXI11_DEVICE_NO] = clink->client; |
- VXI11_LINK_COUNT[VXI11_DEVICE_NO]=1; |
-// printf("Open function, could not find ip address %s.\n",ip); |
-// printf("So now, VXI11_IP_ADDRESS[%d]=%s,\n",VXI11_DEVICE_NO,VXI11_IP_ADDRESS[VXI11_DEVICE_NO]); |
-// printf("VXI11_CLIENT_ADDRESS[%d]=%ld,\n",VXI11_DEVICE_NO,VXI11_CLIENT_ADDRESS[VXI11_DEVICE_NO]); |
-// printf(" clink->client=%ld,\n",clink->client); |
-// printf("VXI11_LINK_COUNT[%d]=%d.\n",VXI11_DEVICE_NO,VXI11_LINK_COUNT[VXI11_DEVICE_NO]); |
- VXI11_DEVICE_NO++; |
- } |
- } |
- /* already got a client for this IP address */ |
- else { |
- /* Copy the client pointer address. Just establish a new link |
- * (not a new client). Add one to the link count */ |
- clink->client = VXI11_CLIENT_ADDRESS[device_no]; |
- ret = vxi11_open_link(ip, &(clink->client), &(clink->link), device); |
-// printf("Found an ip address, copying client from VXI11_CLIENT_ADDRESS[%d]\n",device_no); |
- VXI11_LINK_COUNT[device_no]++; |
-// printf("Have just incremented VXI11_LINK_COUNT[%d], it's now %d\n",device_no,VXI11_LINK_COUNT[device_no]); |
- } |
-// printf("after creating link, clink->link = %ld\n", clink->link); |
- return ret; |
- } |
- |
-/* This is a wrapper function, used for the situations where there is only one |
- * "device" per client. This is the case for most (if not all) VXI11 |
- * instruments; however, it is _not_ the case for devices such as LAN to GPIB |
- * gateways. These are single clients that communicate to many instruments |
- * (devices). In order to differentiate between them, we need to pass a device |
- * name. This gets used in the vxi11_open_link() fn, as the link_parms.device |
- * value. */ |
-int vxi11_open_device(const char *ip, CLINK *clink) { |
- char device[6]; |
- strncpy(device,"inst0",6); |
- return vxi11_open_device(ip, clink, device); |
- } |
- |
- |
- |
-/* CLOSE FUNCTION * |
- * ============== */ |
- |
-/* Use this function from user land to close a device and/or sever a link. Can |
- * be used multiple times for the same device (the library will keep track).*/ |
-int vxi11_close_device(const char *ip, CLINK *clink) { |
-int l,ret; |
-int device_no = -1; |
- |
- /* Which instrument are we referring to? */ |
- for (l=0; l<VXI11_MAX_CLIENTS; l++){ |
- if (strcmp(ip,VXI11_IP_ADDRESS[l]) == 0 ) { |
- device_no=l; |
- } |
- } |
- /* Something's up if we can't find the IP address! */ |
- if (device_no == -1) { |
- printf("vxi11_close_device: error: I have no record of you ever opening device\n"); |
- printf(" with IP address %s\n",ip); |
- ret = -4; |
- } |
- else { /* Found the IP, there's more than one link to that instrument, |
- * so keep track and just close the link */ |
- if (VXI11_LINK_COUNT[device_no] > 1 ) { |
- ret = vxi11_close_link(ip,clink->client, clink->link); |
- VXI11_LINK_COUNT[device_no]--; |
- } |
- /* Found the IP, it's the last link, so close the device (link |
- * AND client) */ |
- else { |
- ret = vxi11_close_device(ip, clink->client, clink->link); |
- /* Remove the IP address, so that if we re-open the same device |
- * we do it properly */ |
- memset(VXI11_IP_ADDRESS[device_no], 0, 20); |
- } |
- } |
- return ret; |
- } |
- |
- |
-/* SEND FUNCTIONS * |
- * ============== */ |
- |
-/* A _lot_ of the time we are sending text strings, and can safely rely on |
- * strlen(cmd). */ |
-int vxi11_send(CLINK *clink, const char *cmd) { |
- return vxi11_send(clink, cmd, strlen(cmd)); |
- } |
- |
-/* We still need the version of the function where the length is set explicitly |
- * though, for when we are sending fixed length data blocks. */ |
-int vxi11_send(CLINK *clink, const char *cmd, unsigned long len) { |
- return vxi11_send(clink->client, clink->link, cmd, len); |
- } |
- |
- |
-/* RECEIVE FUNCTIONS * |
- * ================= */ |
- |
-/* Lazy wrapper for when I can't be bothered to specify a read timeout */ |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len) { |
- return vxi11_receive(clink, buffer, len, VXI11_READ_TIMEOUT); |
- } |
- |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) { |
- return vxi11_receive(clink->client, clink->link, buffer, len, timeout); |
- } |
- |
- |
- |
-/***************************************************************************** |
- * USEFUL ADDITIONAL HIGHER LEVER USER FUNCTIONS - USE THESE FROM YOUR * |
- * PROGRAMS OR INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* SEND FIXED LENGTH DATA BLOCK FUNCTION * |
- * ===================================== */ |
-int vxi11_send_data_block(CLINK *clink, const char *cmd, char *buffer, unsigned long len) { |
-char *out_buffer; |
-int cmd_len=strlen(cmd); |
-int ret; |
- |
- out_buffer=new char[cmd_len+10+len]; |
- sprintf(out_buffer,"%s#8%08lu",cmd,len); |
- memcpy(out_buffer+cmd_len+10,buffer,(unsigned long) len); |
- ret = vxi11_send(clink, out_buffer, (unsigned long) (cmd_len+10+len)); |
- delete[] out_buffer; |
- return ret; |
- } |
- |
- |
-/* RECEIVE FIXED LENGTH DATA BLOCK FUNCTION * |
- * ======================================== */ |
- |
-/* This function reads a response in the form of a definite-length block, such |
- * as when you ask for waveform data. The data is returned in the following |
- * format: |
- * #800001000<1000 bytes of data> |
- * ||\______/ |
- * || | |
- * || \---- number of bytes of data |
- * |\--------- number of digits that follow (in this case 8, with leading 0's) |
- * \---------- always starts with # |
- */ |
-long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout) { |
-/* I'm not sure what the maximum length of this header is, I'll assume it's |
- * 11 (#9 + 9 digits) */ |
-unsigned long necessary_buffer_size; |
-char *in_buffer; |
-int ret; |
-int ndigits; |
-unsigned long returned_bytes; |
-int l; |
-char scan_cmd[20]; |
- necessary_buffer_size=len+12; |
- in_buffer=new char[necessary_buffer_size]; |
- ret=vxi11_receive(clink, in_buffer, necessary_buffer_size, timeout); |
- if (ret < 0) return ret; |
- if (in_buffer[0] != '#') { |
- printf("vxi11_user: data block error: data block does not begin with '#'\n"); |
- printf("First 20 characters received were: '"); |
- for(l=0;l<20;l++) { |
- printf("%c",in_buffer[l]); |
- } |
- printf("'\n"); |
- return -3; |
- } |
- |
- /* first find out how many digits */ |
- sscanf(in_buffer,"#%1d",&ndigits); |
- /* some instruments, if there is a problem acquiring the data, return only "#0" */ |
- if (ndigits > 0) { |
- /* now that we know, we can convert the next <ndigits> bytes into an unsigned long */ |
- sprintf(scan_cmd,"#%%1d%%%dlu",ndigits); |
- sscanf(in_buffer,scan_cmd,&ndigits,&returned_bytes); |
- memcpy(buffer, in_buffer+(ndigits+2), returned_bytes); |
- delete[] in_buffer; |
- return (long) returned_bytes; |
- } |
- else return 0; |
- } |
- |
- |
-/* SEND AND RECEIVE FUNCTION * |
- * ========================= */ |
- |
-/* This is mainly a useful function for the overloaded vxi11_obtain_value() |
- * fn's, but is also handy and useful for user and library use */ |
-long vxi11_send_and_receive(CLINK *clink, const char *cmd, char *buf, unsigned long buf_len, unsigned long timeout) { |
-int ret; |
-long bytes_returned; |
- do { |
- ret = vxi11_send(clink, cmd); |
- if (ret != 0) { |
- if (ret != -VXI11_NULL_WRITE_RESP) { |
- printf("Error: vxi11_send_and_receive: could not send cmd.\n"); |
- printf(" The function vxi11_send returned %d. ",ret); |
- return -1; |
- } |
- else printf("(Info: VXI11_NULL_WRITE_RESP in vxi11_send_and_receive, resending query)\n"); |
- } |
- |
- bytes_returned = vxi11_receive(clink, buf, buf_len, timeout); |
- if (bytes_returned <= 0) { |
- if (bytes_returned >-VXI11_NULL_READ_RESP) { |
- printf("Error: vxi11_send_and_receive: problem reading reply.\n"); |
- printf(" The function vxi11_receive returned %ld. ",bytes_returned); |
- return -2; |
- } |
- else printf("(Info: VXI11_NULL_READ_RESP in vxi11_send_and_receive, resending query)\n"); |
- } |
- } while (bytes_returned == -VXI11_NULL_READ_RESP || ret == -VXI11_NULL_WRITE_RESP); |
- return 0; |
- } |
- |
- |
-/* FUNCTIONS TO RETURN A LONG INTEGER VALUE SENT AS RESPONSE TO A QUERY * |
- * ==================================================================== */ |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd, unsigned long timeout) { |
-char buf[50]; /* 50=arbitrary length... more than enough for one number in ascii */ |
- memset(buf, 0, 50); |
- if (vxi11_send_and_receive(clink, cmd, buf, 50, timeout) != 0) { |
- printf("Returning 0\n"); |
- return 0; |
- } |
- return strtol(buf, (char **)NULL, 10); |
- } |
- |
-/* Lazy wrapper function with default read timeout */ |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd) { |
- return vxi11_obtain_long_value(clink, cmd, VXI11_READ_TIMEOUT); |
- } |
- |
- |
-/* FUNCTIONS TO RETURN A DOUBLE FLOAT VALUE SENT AS RESPONSE TO A QUERY * |
- * ==================================================================== */ |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd, unsigned long timeout) { |
-char buf[50]; /* 50=arbitrary length... more than enough for one number in ascii */ |
-double val; |
- memset(buf, 0, 50); |
- if (vxi11_send_and_receive(clink, cmd, buf, 50, timeout) != 0) { |
- printf("Returning 0.0\n"); |
- return 0.0; |
- } |
- val = strtod(buf, (char **)NULL); |
- return val; |
- } |
- |
-/* Lazy wrapper function with default read timeout */ |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd) { |
- return vxi11_obtain_double_value(clink, cmd, VXI11_READ_TIMEOUT); |
- } |
- |
- |
-/***************************************************************************** |
- * CORE FUNCTIONS - YOU SHOULDN'T NEED TO USE THESE FROM YOUR PROGRAMS OR * |
- * INSTRUMENT LIBRARIES * |
- *****************************************************************************/ |
- |
-/* OPEN FUNCTIONS * |
- * ============== */ |
-int vxi11_open_device(const char *ip, CLIENT **client, VXI11_LINK **link, char *device) { |
- |
- *client = clnt_create(ip, DEVICE_CORE, DEVICE_CORE_VERSION, "tcp"); |
- |
- if (*client == NULL) { |
- clnt_pcreateerror(ip); |
- return -1; |
- } |
- |
- return vxi11_open_link(ip, client, link, device); |
- } |
- |
-int vxi11_open_link(const char *ip, CLIENT **client, VXI11_LINK **link, char *device) { |
- |
-Create_LinkParms link_parms; |
- |
- /* Set link parameters */ |
- link_parms.clientId = (long) *client; |
- link_parms.lockDevice = 0; |
- link_parms.lock_timeout = VXI11_DEFAULT_TIMEOUT; |
- link_parms.device = device; |
- |
- *link = (Create_LinkResp *) calloc(1, sizeof(Create_LinkResp)); |
- |
- if (create_link_1(&link_parms, *link, *client) != RPC_SUCCESS) { |
- clnt_perror(*client, ip); |
- return -2; |
- } |
- return 0; |
- } |
- |
- |
-/* CLOSE FUNCTIONS * |
- * =============== */ |
-int vxi11_close_device(const char *ip, CLIENT *client, VXI11_LINK *link) { |
-int ret; |
- |
- ret = vxi11_close_link(ip, client, link); |
- |
- clnt_destroy(client); |
- |
- return ret; |
- } |
- |
-int vxi11_close_link(const char *ip, CLIENT *client, VXI11_LINK *link) { |
-Device_Error dev_error; |
- memset(&dev_error, 0, sizeof(dev_error)); |
- |
- if (destroy_link_1(&link->lid, &dev_error, client) != RPC_SUCCESS) { |
- clnt_perror(client,ip); |
- return -1; |
- } |
- |
- return 0; |
- } |
- |
- |
-/* SEND FUNCTIONS * |
- * ============== */ |
- |
-/* A _lot_ of the time we are sending text strings, and can safely rely on |
- * strlen(cmd). */ |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd) { |
- return vxi11_send(client, link, cmd, strlen(cmd)); |
- } |
- |
-/* We still need the version of the function where the length is set explicitly |
- * though, for when we are sending fixed length data blocks. */ |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd, unsigned long len) { |
-Device_WriteParms write_parms; |
-unsigned int bytes_left = len; |
-char *send_cmd; |
- |
- send_cmd = new char[len]; |
- memcpy(send_cmd, cmd, len); |
- |
- write_parms.lid = link->lid; |
- write_parms.io_timeout = VXI11_DEFAULT_TIMEOUT; |
- write_parms.lock_timeout = VXI11_DEFAULT_TIMEOUT; |
- |
-/* We can only write (link->maxRecvSize) bytes at a time, so we sit in a loop, |
- * writing a chunk at a time, until we're done. */ |
- |
- do { |
- Device_WriteResp write_resp; |
- memset(&write_resp, 0, sizeof(write_resp)); |
- |
- if (bytes_left <= link->maxRecvSize) { |
- write_parms.flags = 8; |
- write_parms.data.data_len = bytes_left; |
- } |
- else { |
- write_parms.flags = 0; |
- /* We need to check that maxRecvSize is a sane value (ie >0). Believe it |
- * or not, on some versions of Agilent Infiniium scope firmware the scope |
- * returned "0", which breaks Rule B.6.3 of the VXI-11 protocol. Nevertheless |
- * we need to catch this, otherwise the program just hangs. */ |
- if (link->maxRecvSize > 0) { |
- write_parms.data.data_len = link->maxRecvSize; |
- } |
- else { |
- write_parms.data.data_len = 4096; /* pretty much anything should be able to cope with 4kB */ |
- } |
- } |
- write_parms.data.data_val = send_cmd + (len - bytes_left); |
- |
- if(device_write_1(&write_parms, &write_resp, client) != RPC_SUCCESS) { |
- delete[] send_cmd; |
- return -VXI11_NULL_WRITE_RESP; /* The instrument did not acknowledge the write, just completely |
- dropped it. There was no vxi11 comms error as such, the |
- instrument is just being rude. Usually occurs when the instrument |
- is busy. If we don't check this first, then the following |
- line causes a seg fault */ |
- } |
- if (write_resp.error != 0) { |
- printf("vxi11_user: write error: %d\n", (int)write_resp.error); |
- delete[] send_cmd; |
- return -(write_resp.error); |
- } |
- bytes_left -= write_resp.size; |
- } while (bytes_left > 0); |
- |
- delete[] send_cmd; |
- return 0; |
- } |
- |
- |
-/* RECEIVE FUNCTIONS * |
- * ================= */ |
- |
-// It appeared that this function wasn't correctly dealing with more data available than specified in len. |
-// This patch attempts to fix this issue. RDP 2007/8/13 |
- |
-/* wrapper, for default timeout */ long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len) { return vxi11_receive(client, link, buffer, len, VXI11_READ_TIMEOUT); |
- } |
- |
-#define RCV_END_BIT 0x04 // An end indicator has been read |
-#define RCV_CHR_BIT 0x02 // A termchr is set in flags and a character which matches termChar is transferred |
-#define RCV_REQCNT_BIT 0x01 // requestSize bytes have been transferred. This includes a request size of zero. |
- |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout) { |
-Device_ReadParms read_parms; |
-Device_ReadResp read_resp; |
-unsigned long curr_pos = 0; |
- |
- read_parms.lid = link->lid; |
- read_parms.requestSize = len; |
- read_parms.io_timeout = timeout; /* in ms */ |
- read_parms.lock_timeout = timeout; /* in ms */ |
- read_parms.flags = 0; |
- read_parms.termChar = 0; |
- |
- do { |
- memset(&read_resp, 0, sizeof(read_resp)); |
- |
- read_resp.data.data_val = buffer + curr_pos; |
- read_parms.requestSize = len - curr_pos; // Never request more total data than originally specified in len |
- |
- if(device_read_1(&read_parms, &read_resp, client) != RPC_SUCCESS) { |
- return -VXI11_NULL_READ_RESP; /* there is nothing to read. Usually occurs after sending a query |
- which times out on the instrument. If we don't check this first, |
- then the following line causes a seg fault */ |
- } |
- if (read_resp.error != 0) { |
- /* Read failed for reason specified in error code. |
- * (From published VXI-11 protocol, section B.5.2) |
- * 0 no error |
- * 1 syntax error |
- * 3 device not accessible |
- * 4 invalid link identifier |
- * 5 parameter error |
- * 6 channel not established |
- * 8 operation not supported |
- * 9 out of resources |
- * 11 device locked by another link |
- * 12 no lock held by this link |
- * 15 I/O timeout |
- * 17 I/O error |
- * 21 invalid address |
- * 23 abort |
- * 29 channel already established |
- */ |
- |
- printf("vxi11_user: read error: %d\n", (int)read_resp.error); |
- return -(read_resp.error); |
- } |
- |
- if((curr_pos + read_resp.data.data_len) <= len) { |
- curr_pos += read_resp.data.data_len; |
- } |
- if( (read_resp.reason & RCV_END_BIT) || (read_resp.reason & RCV_CHR_BIT) ) { |
- break; |
- } |
- else if( curr_pos == len ) { |
- printf("xvi11_user: read error: buffer too small. Read %d bytes without hitting terminator.\n", (int)curr_pos ); |
- return -100; |
- } |
- } while(1); |
- return (curr_pos); /*actual number of bytes received*/ |
- |
- } |
- |
Index: sipmscan/trunk/vxi11_x86_64/README.txt |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/README.txt (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/README.txt (nonexistent) |
@@ -1,98 +0,0 @@ |
-RPC PROTOCOL FOR COMMUNICATING WITH VXI11-ENABLED DEVICES OVER ETHERNET FROM LINUX |
-================================================================================== |
-(including instruments such as oscilloscopes, by manufacturers such as |
-Agilent and Tektronix, amongst others). |
- |
-By Steve D. Sharples, June 2006. |
- |
-This is a collection of source code that will allow you to talk to ethernet- |
-enabled instruments that use the VXI11 protocol, from Linux. This includes |
-a wide range of instruments (including oscilloscopes, logic analysers, |
-function generators etc) by a wide range of manufacturers (including |
-Tektronix and Agilent to name just a couple). An interactive "send and |
-receive" utility is included as an example. |
- |
-You may want to build on to this libraries for your specific instruments - |
-I'm currently working on libraries for talking to Agilent Infiniium scopes, |
-and will probably do the same for Tektronix scopes too. Basically if you've |
-got a Programmer's Reference for your instrument, and this code, you should |
-be able to cobble something together. |
- |
-This collection of code has been produced because I grew frustrated at how |
-difficult it seemed to be to do a relatively simple task. None of the |
-major manufacturers had any "out of the box" Linux solutions to talking to |
-their instruments (although often I would talk to technical folks who would |
-try their best to help). One of the solutions offered was to use something |
-called NI VISA; parts of this are closed source, it was enormous, and I had |
-worries about legacy issues with changing PC hardware. |
- |
-Via Guy McBride at Agilent, I obtained a copy of a vxi11.x RPC file similar |
-to the one included here (although no-one at Agilent seemed to know or care |
-where it came from). After lots of searching on the information superhighway |
-I located what I believe is the original source (or something like it); see |
-the section on vxi11.x below. This source seems to have literally been written |
-from the published VXI11 protocol. I also received from Agilent a simple |
-example program that showed you how to use the protocol; working from this |
-and the (open) source that uses the vxi11.x that is included here, I wrote |
-vxi11_cmd and the user libraries. |
- |
-This collection of source code consists of: |
- |
-(1) vxi11.x |
-This file, vxi11.x, is the amalgamation of vxi11core.rpcl and vxi11intr.rpcl |
-which are part of the asynDriver (R4-5) EPICS module, which, at time of |
-writing, is available from: |
-http://www.aps.anl.gov/epics/modules/soft/asyn/index.html |
-More general information about EPICS is available from: |
-http://www.aps.anl.gov/epics/ |
-This code is open source, and is covered under the copyright notice and |
-software license agreement shown below, and also at: |
-http://www.aps.anl.gov/epics/license/open.php |
- |
-It is intended as a lightweight base for the vxi11 rpc protocol. If you |
-run rpcgen on this file, it will generate C files and headers, from which |
-it is relatively simple to write C programs to communicate with a range |
-of ethernet-enabled instruments, such as oscilloscopes and function |
-generators by manufacturers such as Agilent and Tektronix (amongst many |
-others). |
- |
-(2) vxi11_user.cc (and vxi11_user.h) |
-These are (fairly) friendly user libraries. At the core are 4 key functions: |
-vxi11_open(), vxi11_close(), vxi11_send() and vxi11_receive(). These allow |
-you to talk to your device. There are also some other functions that I |
-considered to be generally useful (send_and_receive, functions for sending |
-and receiving fixed length data blocks etc) that are all non-instrument- |
-specific. |
- |
-(3) vxi11_cmd.c |
-This is a fairly simple interactive utility that allows you to send |
-commands and queries to your vxi11-enabled instrument, which you |
-locate by way of IP address. I recommend you start with *IDN? It shows you |
-how the vxi11_user library works |
- |
-(4) Makefile |
-Type "make" to compile the source above. Type "make clean" to remove |
-old object files and ./vxi11_cmd. Type "make install" to copy |
-./vxi11_cmd to /usr/local/bin/ |
- |
-(5) GNU_General_Public_License.txt |
-Fairly obvious. All programs, source, readme files etc NOT covered by any |
-other license (e.g. vxi11.x, which is covered by its own open source |
-license) are covered by this license. |
- |
-These programs are free software; you can redistribute it and/or |
-modify it under the terms of the GNU General Public License |
-as published by the Free Software Foundation; either version 2 |
-of the License, or (at your option) any later version. |
- |
-These programs are distributed in the hope that they will be useful, |
-but WITHOUT ANY WARRANTY; without even the implied warranty of |
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-GNU General Public License for more details. |
- |
-You should have received a copy of the GNU General Public License |
-along with this program; if not, write to the Free Software |
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- |
-The author's email address is steve.no.spam.sharples@nottingham.ac.uk |
-(you can work it out!) |
Index: sipmscan/trunk/vxi11_x86_64/vxi11_user.h |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/vxi11_user.h (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/vxi11_user.h (nonexistent) |
@@ -1,87 +0,0 @@ |
-/* vxi11_user.h |
- * Copyright (C) 2006 Steve D. Sharples |
- * |
- * User library for opening, closing, sending to and receiving from |
- * a device enabled with the VXI11 RPC ethernet protocol. Uses the files |
- * generated by rpcgen vxi11.x. |
- * |
- * This program is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU General Public License |
- * as published by the Free Software Foundation; either version 2 |
- * of the License, or (at your option) any later version. |
- * |
- * This program is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with this program; if not, write to the Free Software |
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- * |
- * The author's email address is steve.sharples@nottingham.ac.uk |
- */ |
- |
-#ifndef __VXI11_USER__ |
-#define __VXI11_USER__ |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
- |
-#include <rpc/rpc.h> |
-#include "vxi11.h" |
- |
-#define VXI11_DEFAULT_TIMEOUT 10000 /* in ms */ |
-#define VXI11_READ_TIMEOUT 2000 /* in ms */ |
-#define VXI11_CLIENT CLIENT |
-#define VXI11_LINK Create_LinkResp |
-#define VXI11_MAX_CLIENTS 256 /* maximum no of unique IP addresses/clients */ |
-#define VXI11_NULL_READ_RESP 50 /* vxi11_receive() return value if a query |
- * times out ON THE INSTRUMENT (and so we have |
- * to resend the query again) */ |
-#define VXI11_NULL_WRITE_RESP 51 /* vxi11_send() return value if a sent command |
- * times out ON THE INSTURMENT. */ |
- |
-struct CLINK { |
- VXI11_CLIENT *client; |
- VXI11_LINK *link; |
- } ; |
-typedef struct CLINK CLINK; |
- |
-/* The four main functions: open, close, send, receieve (plus a couple of wrappers) */ |
-/* In fact all 6 of these are wrappers to the original functions listed at the |
- * bottom, that use separate CLIENT and VXI11_LINK structures. It was easier to |
- * write wrappers for these functions than to re-write the original functions |
- * themselves. These are the 4 (or 6 if you like) key user functions that you |
- * should probably be using. They all use the CLINK structure. */ |
-int vxi11_open_device(const char *ip, CLINK *clink); |
-int vxi11_open_device(const char *ip, CLINK *clink, char *device); |
-int vxi11_close_device(const char *ip, CLINK *clink); |
-int vxi11_send(CLINK *clink, const char *cmd); |
-int vxi11_send(CLINK *clink, const char *cmd, unsigned long len); |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len); |
-long vxi11_receive(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout); |
- |
-/* Utility functions, that use send() and receive(). Use these too. */ |
-int vxi11_send_data_block(CLINK *clink, const char *cmd, char *buffer, unsigned long len); |
-long vxi11_receive_data_block(CLINK *clink, char *buffer, unsigned long len, unsigned long timeout); |
-long vxi11_send_and_receive(CLINK *clink, const char *cmd, char *buf, unsigned long buf_len, unsigned long timeout); |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd, unsigned long timeout); |
-double vxi11_obtain_double_value(CLINK *clink, const char *cmd, unsigned long timeout); |
-long vxi11_obtain_long_value(CLINK *clink, const char *cmd); |
-double vxi11_obtain_double_value(CLINK *link, const char *cmd); |
- |
-/* When I first wrote this library I used separate client and links. I've |
- * retained the original functions and just written clink wrappers for them |
- * (see above) as it's perhaps a little clearer this way. Probably not worth |
- * delving this deep in use, but it's where the real nitty gritty is. */ |
-int vxi11_open_device(const char *ip, CLIENT **client, VXI11_LINK **link, char *device); |
-int vxi11_open_link(const char *ip, CLIENT **client, VXI11_LINK **link, char *device); |
-int vxi11_close_device(const char *ip, CLIENT *client, VXI11_LINK *link); |
-int vxi11_close_link(const char *ip, CLIENT *client, VXI11_LINK *link); |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd); |
-int vxi11_send(CLIENT *client, VXI11_LINK *link, const char *cmd, unsigned long len); |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len); |
-long vxi11_receive(CLIENT *client, VXI11_LINK *link, char *buffer, unsigned long len, unsigned long timeout); |
- |
-#endif |
Index: sipmscan/trunk/vxi11_x86_64/Makefile |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/Makefile (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/Makefile (nonexistent) |
@@ -1,18 +0,0 @@ |
-VERSION=1.08 |
- |
-#CFLAGS = -Wall -g |
-CFLAGS = -g |
-CXX = g++ |
- |
-.PHONY: clean objs |
- |
-objs: vxi11.h |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_user.cc |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_clnt.c |
- $(CXX) -c -fPIC $(CFLAGS) vxi11_xdr.c |
- |
-vxi11.h: vxi11.x |
- rpcgen -M vxi11.x |
- |
-clean: |
- rm -f *.o vxi11_cmd vxi11.h vxi11_svc.c vxi11_xdr.c vxi11_clnt.c #TAGS |
Index: sipmscan/trunk/vxi11_x86_64/vxi11.x |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/vxi11.x (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/vxi11.x (nonexistent) |
@@ -1,317 +0,0 @@ |
-/* This file, vxi11.x, is the amalgamation of vxi11core.rpcl and vxi11intr.rpcl |
- * which are part of the asynDriver (R4-5) EPICS module, which, at time of |
- * writing, is available from: |
- * http://www.aps.anl.gov/epics/modules/soft/asyn/index.html |
- * More general information about EPICS is available from: |
- * http://www.aps.anl.gov/epics/ |
- * This code is open source, and is covered under the copyright notice and |
- * software license agreement shown below, and also at: |
- * http://www.aps.anl.gov/epics/license/open.php |
- * |
- * In order to comply with section 4.3 of the software license agreement, here |
- * is a PROMINENT NOTICE OF CHNAGES TO THE SOFTWARE |
- * =========================================== |
- * (1) This file, vxi11.x, is the concatenation of the files vxi11core.rpcl and |
- * vxi11intr.rpcl |
- * (2) Tab spacing has been tidied up |
- * |
- * It is intended as a lightweight base for the vxi11 rpc protocol. If you |
- * run rpcgen on this file, it will generate C files and headers, from which |
- * it is relatively simple to write C programs to communicate with a range |
- * of ethernet-enabled instruments, such as oscilloscopes and function |
- * generated by manufacturers such as Agilent and Tektronix (amongst many |
- * others). |
- * |
- * For what it's worth, this concatenation was done by Steve Sharples at |
- * the University of Nottingham, UK, on 1 June 2006. |
- * |
- * Copyright notice and software license agreement follow, then the |
- * original comments from vxi11core.rpcl etc. |
- * |
- ****************************************************************************** |
- * Copyright © 2006 <University of Chicago and other copyright holders>. All |
- * rights reserved. |
- ****************************************************************************** |
- * |
- ****************************************************************************** |
- * vxi11.x is distributed subject to the following license conditions: |
- * SOFTWARE LICENSE AGREEMENT |
- * Software: vxi11.x |
- * |
- * 1. The "Software", below, refers to vxi11.x (in either source code, or |
- * binary form and accompanying documentation). Each licensee is addressed |
- * as "you" or "Licensee." |
- * |
- * 2. The copyright holders shown above and their third-party licensors hereby |
- * grant Licensee a royalty-free nonexclusive license, subject to the |
- * limitations stated herein and U.S. Government license rights. |
- * |
- * 3. You may modify and make a copy or copies of the Software for use within |
- * your organization, if you meet the following conditions: |
- * 1. Copies in source code must include the copyright notice and this |
- * Software License Agreement. |
- * 2. Copies in binary form must include the copyright notice and this |
- * Software License Agreement in the documentation and/or other |
- * materials provided with the copy. |
- * |
- * 4. You may modify a copy or copies of the Software or any portion of it, |
- * thus forming a work based on the Software, and distribute copies of such |
- * work outside your organization, if you meet all of the following |
- * conditions: |
- * 1. Copies in source code must include the copyright notice and this |
- * Software License Agreement; |
- * 2. Copies in binary form must include the copyright notice and this |
- * Software License Agreement in the documentation and/or other |
- * materials provided with the copy; |
- * 3. Modified copies and works based on the Software must carry |
- * prominent notices stating that you changed specified portions of |
- * the Software. |
- * |
- * 5. Portions of the Software resulted from work developed under a U.S. |
- * Government contract and are subject to the following license: the |
- * Government is granted for itself and others acting on its behalf a |
- * paid-up, nonexclusive, irrevocable worldwide license in this computer |
- * software to reproduce, prepare derivative works, and perform publicly |
- * and display publicly. |
- * |
- * 6. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY OF |
- * ANY KIND. THE COPYRIGHT HOLDERS, THEIR THIRD PARTY LICENSORS, THE UNITED |
- * STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND THEIR EMPLOYEES: (1) |
- * DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO |
- * ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
- * PURPOSE, TITLE OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY |
- * OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR USEFULNESS OF THE |
- * SOFTWARE, (3) DO NOT REPRESENT THAT USE OF THE SOFTWARE WOULD NOT INFRINGE |
- * PRIVATELY OWNED RIGHTS, (4) DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION |
- * UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL BE CORRECTED. |
- * |
- * 7. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDERS, THEIR |
- * THIRD PARTY LICENSORS, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF |
- * ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, INCIDENTAL, |
- * CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF ANY KIND OR NATURE, |
- * INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS OR LOSS OF DATA, FOR ANY |
- * REASON WHATSOEVER, WHETHER SUCH LIABILITY IS ASSERTED ON THE BASIS OF |
- * CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, |
- * EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE POSSIBILITY OF SUCH |
- * LOSS OR DAMAGES. |
- ****************************************************************************** |
- */ |
- |
-/****************************************************************************** |
- * |
- * vxi11core.rpcl |
- * |
- * This file is best viewed with a tabwidth of 4 |
- * |
- ****************************************************************************** |
- * |
- * TODO: |
- * |
- ****************************************************************************** |
- * |
- * Original Author: someone from VXIbus Consortium |
- * Current Author: Benjamin Franksen |
- * Date: 03-06-97 |
- * |
- * RPCL description of the core- and abort-channel of the TCP/IP Instrument |
- * Protocol Specification. |
- * |
- * |
- * Modification Log: |
- * ----------------- |
- * .00 03-06-97 bfr created this file |
- * |
- ****************************************************************************** |
- * |
- * Notes: |
- * |
- * This stuff is literally from |
- * |
- * VXI-11, Ref 1.0 : TCP/IP Instrument Protocol Specification |
- * |
- */ |
- |
-typedef long Device_Link; |
- |
-enum Device_AddrFamily |
-{ |
- DEVICE_TCP, |
- DEVICE_UDP |
-}; |
- |
-typedef long Device_Flags; |
- |
-typedef long Device_ErrorCode; |
- |
-struct Device_Error |
-{ |
- Device_ErrorCode error; |
-}; |
- |
-struct Create_LinkParms |
-{ |
- long clientId; /* implementation specific value */ |
- bool lockDevice; /* attempt to lock the device */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- string device<>; /* name of device */ |
-}; |
-struct Create_LinkResp |
-{ |
- Device_ErrorCode error; |
- Device_Link lid; |
- unsigned short abortPort; /* for the abort RPC */ |
- unsigned long maxRecvSize; /* max # of bytes accepted on write */ |
-}; |
-struct Device_WriteParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- Device_Flags flags; /* flags with options */ |
- opaque data<>; /* the data length and the data itself */ |
-}; |
-struct Device_WriteResp |
-{ |
- Device_ErrorCode error; |
- unsigned long size; /* # of bytes written */ |
-}; |
-struct Device_ReadParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- unsigned long requestSize; /* # of bytes requested */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- Device_Flags flags; /* flags with options */ |
- char termChar; /* valid if flags & termchrset */ |
-}; |
-struct Device_ReadResp |
-{ |
- Device_ErrorCode error; |
- long reason; /* why read completed */ |
- opaque data<>; /* the data length and the data itself */ |
-}; |
-struct Device_ReadStbResp |
-{ |
- Device_ErrorCode error; |
- unsigned char stb; /* the returned status byte */ |
-}; |
-struct Device_GenericParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* flags with options */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
-}; |
-struct Device_RemoteFunc |
-{ |
- unsigned long hostAddr; /* host servicing interrupt */ |
- unsigned long hostPort; /* valid port # on client */ |
- unsigned long progNum; /* DEVICE_INTR */ |
- unsigned long progVers; /* DEVICE_INTR_VERSION */ |
- Device_AddrFamily progFamily; /* DEVICE_UDP | DEVICE_TCP */ |
-}; |
-struct Device_EnableSrqParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- bool enable; /* enable or disable intr's */ |
- opaque handle<40>; /* host specific data */ |
-}; |
-struct Device_LockParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* contains the waitlock flag */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
-}; |
-struct Device_DocmdParms |
-{ |
- Device_Link lid; /* link id from create_link */ |
- Device_Flags flags; /* flags with options */ |
- unsigned long io_timeout; /* time to wait for I/O */ |
- unsigned long lock_timeout; /* time to wait for lock */ |
- long cmd; /* which command to execute */ |
- bool network_order; /* client's byte order */ |
- long datasize; /* size of individual data elements */ |
- opaque data_in<>; /* docmd data parameters */ |
-}; |
-struct Device_DocmdResp |
-{ |
- Device_ErrorCode error; |
- opaque data_out<>; /* returned data parameters */ |
-}; |
- |
-program DEVICE_ASYNC |
-{ |
- version DEVICE_ASYNC_VERSION |
- { |
- Device_Error device_abort (Device_Link) = 1; |
- } = 1; |
-} = 0x0607B0; |
- |
-program DEVICE_CORE |
-{ |
- version DEVICE_CORE_VERSION |
- { |
- Create_LinkResp create_link (Create_LinkParms) = 10; |
- Device_WriteResp device_write (Device_WriteParms) = 11; |
- Device_ReadResp device_read (Device_ReadParms) = 12; |
- Device_ReadStbResp device_readstb (Device_GenericParms) = 13; |
- Device_Error device_trigger (Device_GenericParms) = 14; |
- Device_Error device_clear (Device_GenericParms) = 15; |
- Device_Error device_remote (Device_GenericParms) = 16; |
- Device_Error device_local (Device_GenericParms) = 17; |
- Device_Error device_lock (Device_LockParms) = 18; |
- Device_Error device_unlock (Device_Link) = 19; |
- Device_Error device_enable_srq (Device_EnableSrqParms) = 20; |
- Device_DocmdResp device_docmd (Device_DocmdParms) = 22; |
- Device_Error destroy_link (Device_Link) = 23; |
- Device_Error create_intr_chan (Device_RemoteFunc) = 25; |
- Device_Error destroy_intr_chan (void) = 26; |
- } = 1; |
-} = 0x0607AF; |
- |
-/****************************************************************************** |
- * |
- * vxi11intr.rpcl |
- * |
- * This file is best viewed with a tabwidth of 4 |
- * |
- ****************************************************************************** |
- * |
- * TODO: |
- * |
- ****************************************************************************** |
- * |
- * Original Author: someone from VXIbus Consortium |
- * Current Author: Benjamin Franksen |
- * Date: 03-06-97 |
- * |
- * RPCL description of the intr-channel of the TCP/IP Instrument Protocol |
- * Specification. |
- * |
- * |
- * Modification Log: |
- * ----------------- |
- * .00 03-06-97 bfr created this file |
- * |
- ****************************************************************************** |
- * |
- * Notes: |
- * |
- * This stuff is literally from |
- * |
- * "VXI-11, Ref 1.0 : TCP/IP Instrument Protocol Specification" |
- * |
- */ |
- |
-struct Device_SrqParms |
-{ |
- opaque handle<>; |
-}; |
- |
-program DEVICE_INTR |
-{ |
- version DEVICE_INTR_VERSION |
- { |
- void device_intr_srq (Device_SrqParms) = 30; |
- } = 1; |
-} = 0x0607B1; |
Index: sipmscan/trunk/vxi11_x86_64/vxi11_cmd.cc |
=================================================================== |
--- sipmscan/trunk/vxi11_x86_64/vxi11_cmd.cc (revision 117) |
+++ sipmscan/trunk/vxi11_x86_64/vxi11_cmd.cc (nonexistent) |
@@ -1,83 +0,0 @@ |
-/* vxi11_cmd.c |
- * Copyright (C) 2006 Steve D. Sharples |
- * |
- * A simple interactive utility that allows you to send commands and queries to |
- * a device enabled with the VXI11 RPC ethernet protocol. Uses the files |
- * generated by rpcgen vxi11.x, and the vxi11_user.h user libraries. |
- * |
- * This program is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU General Public License |
- * as published by the Free Software Foundation; either version 2 |
- * of the License, or (at your option) any later version. |
- * |
- * This program is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
- * GNU General Public License for more details. |
- * |
- * You should have received a copy of the GNU General Public License |
- * along with this program; if not, write to the Free Software |
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
- * |
- * The author's email address is steve.sharples@nottingham.ac.uk |
- */ |
- |
-#include "vxi11_user.h" |
-#define BUF_LEN 100000 |
- |
-int main(int argc, char *argv[]) { |
- |
-static char *device_ip; |
-static char *device_name; |
-char cmd[256]; |
-char buf[BUF_LEN]; |
-int ret; |
-long bytes_returned; |
-CLINK *clink; |
- |
- clink = new CLINK; |
- |
- if (argc < 2) { |
- printf("usage: %s your.inst.ip.addr [device_name]\n",argv[0]); |
- exit(1); |
- } |
- |
- device_ip = argv[1]; |
- if (argc > 2) { |
- device_name = argv[2]; |
- ret=vxi11_open_device(device_ip,clink,device_name); |
- } |
- else { |
- ret=vxi11_open_device(device_ip,clink); |
- } |
- |
- if (ret != 0) { |
- printf("Error: could not open device %s, quitting\n",device_ip); |
- exit(2); |
- } |
- |
- while(1){ |
- memset(cmd, 0, 256); // initialize command string |
- memset(buf, 0, BUF_LEN); // initialize buffer |
- printf("Input command or query ('q' to exit): "); |
- fgets(cmd,256,stdin); |
- cmd[strlen(cmd)-1] = 0; // just gets rid of the \n |
- if (strncasecmp(cmd, "q",1) == 0) break; |
- |
- if (vxi11_send(clink, cmd) < 0) break; |
- if (strstr(cmd, "?") != 0) { |
- bytes_returned = vxi11_receive(clink, buf, BUF_LEN); |
- if (bytes_returned > 0) { |
- printf("%s\n",buf); |
- } |
- else if (bytes_returned == -15) { |
- printf("*** [ NOTHING RECEIVED ] ***\n"); |
- } |
- else break; |
- } |
- } |
- |
- ret=vxi11_close_device(device_ip,clink); |
- return 0; |
- } |
- |
Index: sipmscan/trunk/libxxusb.h |
=================================================================== |
--- sipmscan/trunk/libxxusb.h (revision 117) |
+++ sipmscan/trunk/libxxusb.h (nonexistent) |
@@ -1,111 +0,0 @@ |
-#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); |
- |