INSTRUMENT DEVELOPMENT LABORATORY
UNIVERSITY OF HAWAII MANOA
DALIREVB
TECHNICAL NOTES
By
Mavourneen Wilcox
INSTRUMENT DEVELOPMENT LABORATORY
DALIREVB Users Manual
06/17/04
Manoa, Hawaii questions: idlab.phys.hawaii.edu
TABLE of CONTENTS
1. C-PROGRAM VERSION 11………………………………………………………3
2. DALIREVB Gui Code Version 11…………………………………...…………..13
3. FIRMWARE DALIREVB_SALTY_BUSY...... ……………………………….19
4. FIRMWARE DALIREVB_SALTY……………………………………………….28
1 DALIREVB Code Version 11
//////////////////////////////////////////////////////////////
// File - dalib_v11.c
//
// Initial code was generated by DriverWizard v6.03 -
// The library accesses the hardware via WinDriver functions.
//
// Version 01 for testing the DALI Rev. B board
// Version 02 implements automatic register set and trigger holdoff
// Version 03 toy version for 1050MHz play
// Version 04 for read1out speed evaluation
// Version 05 version for interface with Pyhton
// Version 06 has pedestal sub. for dalib_b3,b4,b1,b5
// calib1,2,3,4 respectively. This version also allows for
// multi board read out
// Version 07 adding
// Version 11 writes data to a time stampped file. Has problem when interfacing with GUI... PM
////////////////////////////////////////////////////////////////
#include <limits.h>
#include "testapp_lib.h"
#include "samples/shared/pci_diag_lib.h"
#include <stdio.h>
#include "include/status_strings.h"
#include <sys/timeb.h>
#include "dalib.h"
//global cal1
struct PCIData ave_sca;
// Driver handle passed between routines
//TESTAPP_HANDLE hTESTAPP=NULL;
TESTAPP_HANDLE hTESTAPPm[BOARD_MAX];
// input command from user
static char line[256];
int cards;
float corr2[SCA_MAX];
float correction2;
struct timeb start_all_time,error_time;
struct timeb trigger_time;
int first_error=1;
int setup(){
DWORD dwOffset=0x54; // GPIOC address offset
DWORD dwVal;
HANDLE hWD;
int i,xxx,sca,chan,chip;
FILE *fp99,*fp;
int sca_a;
//get the beginning time
ftime (&start_all_time);
printf("Start time is %d \n",&start_all_time.time);
// Make sure WinDriver is loaded
if (!PCI_Get_WD_handle(&hWD))
return 0;
WD_Close (hWD);
cards= TESTAPP_CountCards (VENDOR_ID, DEVICE_ID);
printf("Found %u matching PCI cards\n", (UINT)cards);
for(i=0;i<cards;i++){
//make sure calibration 1 values are initalized
for(sca=0;sca<SCA_MAX;sca++)
{
for(chan=0;chan<CHAN_MAX;chan++)
{
for(chip=0;chip<CHIP_MAX;chip++)
{
ave_sca.data[sca][chan][chip][i]=0;
}
}
}
}
//read in corr2
/* fp99=fopen("cal2_good.txt","r"); */
/* if(fp99==NULL) { */
/* printf("Error: can't open file.\n"); */
/* exit(-1); */
/* } */
/* else { */
/* printf("File opened successfully. fp99\n"); */
/* sca_a=0; */
/* while(!feof(fp99)&sca_a<256) { */
/* /\* loop through and store the numbers into the array *\/ */
/* fscanf(fp99,"%d %f \n",&sca ,&correction2); */
/* corr2[sca]=correction2; */
/* //printf("sca %d %f \n",sca,corr2[sca]); */
/* } */
/* fclose(fp99); */
/* } */
for(i=0;i<cards;i++)
{
if (!TESTAPP_Open (&hTESTAPPm[i], VENDOR_ID, DEVICE_ID, i))
{
printf ("%s", TESTAPP_ErrorString);
return 0;
}
// read in calib1-4.txt file and assign ave_sca values
//slots are 0,1,2,3.. starting from far right of crate
//slot 1 dali_b3 calib2.txt i=0
//slot 2 dali_b4 calib2.txt i=1
//slot 3 dali_b1 calib2.txt i=2
//slot 4 dali_b5 calib2.txt i=3
if(i==0) {fp=fopen("noise_slot1.txt","r");}
if(i==1) {fp=fopen("noise_slot1.txt","r");}
if(i==2) {fp=fopen("noise_slot1.txt","r");}
if(i==3) {fp=fopen("noise_slot1.txt","r");}
if(fp==NULL) {
printf("Error: can't open file.\n");
fcloseall(); /* close any open files */
exit(-1);
}
else {
printf("File opened successfully.\n");
sca=0;
chan=0;
chip=0;
while(!feof(fp)) {
//printf("File opened successfully.\n");
/* loop through and store the numbers into the array */
fscanf(fp,"%d %d %d %d",&sca,&chan,&chip,&xxx);
ave_sca.data[sca][chan][chip][i]=xxx;
//printf("%d %d %d %d %d \n",sca,chan,chip,i,ave_sca.data[sca][chan][chip][i]);
}
fclose(fp);
fcloseall(); /* close any open files */
}
// Master Reset (MRS) for FIFO
dwVal = 0x004B2000; // force MRS on
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
printf("GPIOC Register set to (force mrs): %x\n",dwVal);
dwVal = 0x004B6000; // force MRS off
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
printf("GPIOC Register set to(force mrs off): %x\n\n",dwVal);
// Clear Trigger Holdoff
dwVal = 0x005B6000; // force Evt Clear on
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
printf("GPIOC Register set to(clear trigger holdoff): %x\n",dwVal);
dwVal = 0x004B6000; // force Evt Clear off
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
printf("GPIOC Register set to(force evt clear off): %x\n\n",dwVal);
// clear busy for board i=0 dali_b3
dwVal = 0x00DB6000;
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
dwVal = 0x004B6000;
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
}
/* // clear busy for board i=0 dali_b3 */
/* dwVal = 0x00DB6000; */
/* TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal); */
/* dwVal = 0x004B6000; */
/* TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal); */
return 1;
}
int TESTAPP_BlockRead(TESTAPP_HANDLE hTESTAPP, TESTAPP_ADDR ad_sp, TESTAPP_MODE ad_mode,int board,struct PCIData *D)
{
int i,first;
int sca,chan,chip,trig_sca[SCA_MAX][CHAN_MAX][BOARD_MAX];
static int min[SCA_MAX][CHAN_MAX][CHIP_MAX][BOARD_MAX],max[SCA_MAX][CHAN_MAX][CHIP_MAX][BOARD_MAX];
static int first_call=1;
int sca_a,ch_a,chip_a,dummy;
UINT addr = 0;
UINT start_err=1;
UINT stop_err=1;
struct PCIData raw;
if(first_call){
for(sca=0;sca<SCA_MAX;sca++)
for(chan=0;chan<CHAN_MAX;chan++)
for(chip=0;chip<CHIP_MAX;chip++){
int iboard;
for(iboard=0;iboard<BOARD_MAX;iboard++){
max[sca][chan][chip][iboard]=0;
min[sca][chan][chip][iboard]=0;
}
}
first_call=0;
}
// read in data
raw.data[0][0][0][board] = TESTAPP_ReadWord(hTESTAPP, ad_sp, addr);
for(sca=0;sca<SCA_MAX;sca++){
for(chan=0;chan<CHAN_MAX;chan++){
if(!(sca==0 & chan==0) ) // skip first locations due to STRAW CPLD logic
{
for(chip=0;chip<CHIP_MAX;chip++)
raw.data[sca][(chan+CHAN_MAX-1)%CHAN_MAX][chip][board] = TESTAPP_ReadWord(hTESTAPP, ad_sp, addr);
if (DALIDEBUG>=9)
printf("Raw SCA, channel, chip, board = %d, %d, %d, %d: %x \n",sca,chan,chip,board,
raw.data[sca][chan][chip][board]);
}
}
}
// return 0;
//
// format data for display
//
for(chip=0;chip<CHIP_MAX;chip++){
for(chan=0;chan<CHAN_MAX;chan++) {
for(sca=0;sca<SCA_MAX;sca++){
//if(board==0 & raw.data[sca][chan][chip][board]>0x0200) {
// printf("%x \n",raw.data[sca][chan][chip][board]);
//}
if( ((raw.data[sca][chan][chip][board])&0x8000)==0x8000 )
{
if (DALIDEBUG>=3){
printf("Start Marker found!\n");
printf("SCA, channel, chip = %d, %d, %d : %x \n",sca,chan,chip,
raw.data[sca][chan][chip][board]);
}
raw.data[sca][chan][chip][board]^=0x8000; // Mask out start flag
start_err = 0;
}
if( ((raw.data[sca][chan][chip][board])&0x4000)==0x4000 )
{
if (DALIDEBUG>=3){
printf("Stop Marker found!\n");
printf("SCA, channel, chip = %d, %d, %d : %x \n",sca,chan,chip,
raw.data[sca][chan][chip][board]);
}
raw.data[sca][chan][chip][board]^=0x4000; // Mask out stop flag
stop_err = 0;
}
if( ((raw.data[sca][chan][chip][board])&0x2000)==0x2000 )
{
trig_sca[chan][chip][board]=sca;
D->data[sca][chan][chip][board]=raw.data[sca][chan][chip][board]=0;
}
if(!(((raw.data[sca][chan][chip][board])&0x2000)==0x2000))
{
if(raw.data[sca][chan][chip][board]!=0)
{
raw.data[sca][chan][chip][board]-=ave_sca.data[sca][chan][chip][board];
D->data[sca][chan][chip][board] = (raw.data[sca][chan][chip][board])/corr2[sca];
}
}
}
}
}
if(start_err == 1){
DWORD dwVal;
DWORD dwOffset=0x54; // GPIOC address offset
//ftime(&error_time);
printf("Error! No Start Marker detected for card %d at time %d.%03d secs \n",board,trigger_time.time-trigger_time.millitm);
if(DALIDEBUG){
dwVal = TESTAPP_ReadDword(hTESTAPPm[0], 0, dwOffset);
printf("GPIOC Register set to: %x\n",dwVal);
}
}
if(stop_err == 1){
DWORD dwVal;
DWORD dwOffset=0x54; // GPIOC address offset
//ftime(&error_time);
printf("Error! No Stop Marker detected for card %d at time %d.%03d secs \n",board,trigger_time.time-trigger_time.millitm);
if (DALIDEBUG){
dwVal = TESTAPP_ReadDword(hTESTAPPm[0], 0, dwOffset);
printf("GPIOC Register set to: %x\n",dwVal);
}
}
if(DALIDEBUG>=2){
if((start_err || stop_err) & first_error){
printf("ERROR!! Event frame corrupted\n Data Dump follows:\n\n");
for(chip=0;chip<CHIP_MAX;chip++)
for(chan=0;chan<CHAN_MAX;chan++)
for(sca=0;sca<SCA_MAX;sca++)
printf("SCA, channel, chip, board = %d, %d, %d, %d: %x \n",sca,chan,chip,board,raw.data[sca][chan][chip][board]);
first_error=0;
}
}
/// Wrap the pulse around
for(chip=0;chip<CHIP_MAX;chip++){
for(chan=0;chan<CHAN_MAX;chan++){
int slide_sca;
for(sca=0,slide_sca=(trig_sca[chan][chip][board]);sca<SCA_MAX;sca++,slide_sca++){
if(slide_sca>=(SCA_MAX)) {
slide_sca=0;
D->data[sca][chan][chip][board]=raw.data[slide_sca][chan][chip][board];
}
D->data[sca][chan][chip][board]=raw.data[slide_sca][chan][chip][board];
}
//zero out the remains of the trigger
D->data[255][chan][chip][board]=0;
D->data[254][chan][chip][board]=0;
D->data[253][chan][chip][board]=0;
D->data[252][chan][chip][board]=0;
D->data[251][chan][chip][board]=0;
D->data[250][chan][chip][board]=0;
D->data[249][chan][chip][board]=0;
D->data[248][chan][chip][board]=0;
//D->data[247][chan][chip][board]=0;
//D->data[246][chan][chip][board]=0;
// D->data[245][chan][chip][board]=0;
//D->data[244][chan][chip][board]=0;
//D->data[243][chan][chip][board]=0;
}
}
return (start_err || stop_err);
}
void readData(struct PCIData *D){
int sca,chip,chan;
DWORD dwOffset=0x54; // GPIOC address offset
DWORD dwVal;
int i,xxx,readOK=0;
char filename[1024];
FILE *outFp;
// Loop that waits for the trigger (temporary?)
//printf("Waiting for trigger\n");
dwVal = 0x00000000;
while(!((dwVal & 0x00000800)==0x00000800)) // EoE
{
dwVal = TESTAPP_ReadDword(hTESTAPPm[0], 0, dwOffset);
if (DALIDEBUG>=2) printf("GPIOC Register set to: %x\n",dwVal);
}
ftime(&trigger_time);
for(i=0;i<cards;i++){
if(hTESTAPPm[i]){
if(hTESTAPPm[i]) readOK=TESTAPP_BlockRead(hTESTAPPm[i],2,TESTAPP_MODE_WORD,i,D);
// Clear FIFO, Trigger Holdoff
// clear busy for board i=0 dali_b3
dwVal = 0x005B6000; // force Evt Clear
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
dwVal = 0x004B6000; // force Evt Clear
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
/*
if(!readOK){
dwVal = 0x00496000; // force PRS on
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
dwVal = 0x004B6000; // force PRS off
TESTAPP_WriteDword(hTESTAPPm[i], 0, dwOffset, dwVal);
// clear busy for board i=0 dali_b3
dwVal = 0x00DB6000;
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
dwVal = 0x004B6000;
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
}
*/
}
//printf("Done card %d\n",i);
}
dwVal = 0x00CB6000; // force BUSY clear
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
dwVal = 0x004B6000;
TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal);
/* // clear busy for board i=0 dali_b3 */
/* dwVal = 0x00DB6000; */
/* TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal); */
/* dwVal = 0x004B6000; */
/* TESTAPP_WriteDword(hTESTAPPm[0], 0, dwOffset, dwVal); */
// printf("Cleared busy; done with the readData\n");
/* // Record data to a file */
/* sprintf(filename,"data/wv%d%03d.dat",trigger_time.time,trigger_time.millitm); */
/* outFp=fopen(filename,"w"); */
/* if(outFp==NULL){ */
/* printf("Error unable to open file %s for output.\n",filename); */
/* }else{ */
/* if(fwrite(D->data,sizeof(int),SCA_MAX*CHAN_MAX*CHIP_MAX*BOARD_MAX,outFp)!=SCA_MAX*CHAN_MAX*CHIP_MAX*BOARD_MAX) */
/* printf("Error writing to a file file %s.\n",filename); */
/* fclose(outFp); */
/* } */
}
TESTAPP_HANDLE TESTAPP_LocateAndOpenBoard(DWORD dwVendorID, DWORD dwDeviceID)
{
DWORD cards, my_card;
TESTAPP_HANDLE hTESTAPP = NULL;
if (dwVendorID==0)
{
printf ("Enter VendorID: ");
fgets(line, sizeof(line), stdin);
sscanf (line, "%x",&dwVendorID);
if (dwVendorID==0) return NULL;
printf ("Enter DeviceID: ");
fgets(line, sizeof(line), stdin);
sscanf (line, "%x",&dwDeviceID);
}
cards = TESTAPP_CountCards (dwVendorID, dwDeviceID);
if (cards==0)
{
printf ("%s", TESTAPP_ErrorString);
return NULL;
}
else if (cards==1)
my_card = 1;
else
{
UINT i;
if (DALIDEBUG) printf ("Found %u matching PCI cards\n", (UINT)cards);
if (DALIDEBUG) printf ("Select card (1-%u): ", (UINT)cards);
i = 0;
fgets(line, sizeof(line), stdin);
sscanf (line, "%d",&i);
if (i>=1 & i <=cards) my_card = i;
else
{
printf ("Choice is out of range\n");
return NULL;
}
}
if (!TESTAPP_Open (&hTESTAPP, dwVendorID, dwDeviceID, my_card - 1))
{
printf ("%s", TESTAPP_ErrorString);
return NULL;
}
if (DALIDEBUG) printf ("TESTAPP PCI card found!\n");
return hTESTAPP;
}
void cleanup(){
int i,cards;
cards = TESTAPP_CountCards (VENDOR_ID, DEVICE_ID);
for(i=0;i<cards;i++){
if (hTESTAPPm[i])
TESTAPP_Close(hTESTAPPm[i]);
}
}
int main(int argc, char *argv[])
{
int cmd,evtnum;
int chip,chan,sca;
int max[SCA_MAX][CHAN_MAX][CHIP_MAX][BOARD_MAX];
float zmax[SCA_MAX];
int maxevent=INT_MAX;
int gap=1;
//FILE *fp77;
struct PCIData D,E;
struct timeb start_time;//declaring start time
struct timeb end_time; //declaring the end time
ftime(&start_time); //getting start time of program
int i;
/* See how many events to read out */
if(argc>1){
maxevent=atoi(argv[1]);
}
//fp77=fopen("cal2.txt","w");
if(!setup()) exit(0);
printf ("\n DALI Rev. B diagnostic utility.\n");
for(evtnum=0;evtnum<maxevent;evtnum++)
{
if(evtnum==gap){
printf("Event # = %d \n\n",evtnum);
gap*=2;
}
//printf("time = %d seconds \n",start_time.time);
readData(&D);
//for(i=0;i<cards;i++){
//for(chip=0;chip<CHIP_MAX;chip++){
// for(chan=0;chan<CHAN_MAX;chan++){
// for(sca=0;sca<SCA_MAX;sca++){
// printf("time = %d seconds",start_time.time);
// }
// }
//}
//}
}
//getting the ending time. and printing it.
ftime (&end_time);
if(end_time.millitm<start_time.millitm)
{
// printf("time = %d seconds",start_time.time);
printf("Elapsed Time = %d seconds",end_time.time-start_time.time-1);
printf(" %d milliseconds\n",(end_time.millitm+1000)-start_time.millitm);
}
else
{
printf("Elapsed Time = %d seconds",end_time.time-start_time.time);
printf(" %d milliseconds\n",end_time.millitm-start_time.millitm);
}
// fclose(fp);
cleanup();
return 0;
}
2 DALIREVB Gui Code Version 11
#!/usr/bin/python
from dalib import *
from grapher3 import *
from aniviewTools import *
axisColor='gray'
waveformLineColor=('red','green','blue','purple','cyan',
'orange','yellow3','magenta','brown',
'gray','DeepPink','ForestGreen','IndianRed',
'gold','salmon','YellowGreen')
waveformWidth=575
waveformHeight=200
SCA_step=0.3668 # ns
testLine=GraphObjects([GraphLine([(0,0),(1,1)],color='white',smooth=0)])
class waveformGraph(AniViewGraphBase):
def __init__(self,master,chan,varFFT,width=200, height=100, **kw):
if kw.has_key('line'):
self.line = kw['line']
del kw['line']
else:
self.line = 'blue'
if 0<=chan<CHAN_MAX:
self.chan = chan
else:
raise "CHAN value %d to large"%chan
self.varFFT=varFFT
apply(AniViewGraphBase.__init__,(self,master,width, height,),kw)
self.bind('<Map>',lambda event:self.redraw())
self.redraw()
def _zoom(self,box):
AniViewGraphBase._zoom(self,box)
self.exportFFT()
def redraw(self):
global pci,boardSelection,chipSelection
if not self.winfo_ismapped(): return
pts = []
self.dx=dx=SCA_step
self.delay=x=0
self.data=[]
board = boardSelection.get()
chip = chipSelection.get()
for sca in range(SCA_MAX):
self.data.append(getPCIValue(pci,sca,self.chan,chip,board))
#self.data.append(getPCIValue(pci,sca,self.chan+1,chip,board))
if self.data and dx:
for pt in self.data:
pts.append((x,pt))
x+=dx
else:
pts=[(0,0),(1,0)]
self.clear()
#self.draw(testLine)
self.draw(GraphObjects([GraphLine(pts,color=self.line,smooth=0)]),
'minimal', 'minimal',
xaxisText='time [ns]',
yaxisText='ADC [V]')
self.exportFFT()
def exportFFT(self):
from Numeric import array
from FFT import real_fft
from math import log10
if not fftMode.get(): return
# Assuming data in mV
dx = self.dx
delay = self.delay
if not self.data:
self.varFFT.set('')
return
if not self._zoomedBox: # No zoom, this is easy
loId,hiId = 0,len(self.data)
else: # Find the visible range
loX,hiX = self._zoomedBox[0][0],self._zoomedBox[1][0]
loId = int(loX/dx)-delay
hiId = int(hiX/dx)-delay+1
if loId < 0 : loId=0
if hiId >= len(self.data): hiId = len(self.data)-1
# Do the FFT
vector = array(self.data[loId:hiId])
f = real_fft(vector)
output=[]
dx2df = dx/(2*len(f)) # This is dx^2*df we need to normalize FFT power
for i in range(len(f)):
p = abs(f[i])**2*dx2df # should be in mV^2/GHz
if i>0 and i<len(f)-1: p*=2 # Account for symmetry
p/=1e9 # convert to V^2/MHz
if p>0:
p=10*log10(p) # get dB V^2/MHz
else:
p=-100
output.append(p)
self.varFFT.set(" ".join(map(str,output)))
class fftGraph(waveformGraph):
def __init__(self,master,chan,varFFT,width=200, height=100, **kw):
varFFT.trace('w',lambda *args:self.redraw())
apply(waveformGraph.__init__,(self,master,chan,varFFT,width,height),kw)
def _zoom(self,box):
AniViewGraphBase._zoom(self,box)
def redraw(self):
if not self.winfo_ismapped(): return
data = map(float,self.varFFT.get().split())
dx = SCA_step
if data:
fmax = 1./(2*dx) # In GHz
df=fmax/len(data)
pts = []
f=0
for pt in data:
pts.append((f,pt))
f+=df
else:
pts=[(0,0),(1,0)]
self.clear()
self.draw(GraphObjects([GraphLine(pts,color=self.line,smooth=0)]),
'minimal', 'minimal',
xaxisText='f [GHz]',
yaxisText='power [dB V^2/MHz]')
class waveformWidget(Frame,GuiMixin):
def __init__(self,master):
Frame.__init__(self,master)
self.pack()
self.makeSubWidgets()
self.bind('<Configure>',lambda event:self._change_state())
def makeSubWidgets(self):
ftop = Frame(self)
ftop.pack(side=TOP,anchor=N,fill=X)
self.fmid = Frame(self,width=waveformWidth,height=waveformHeight)
self.fmid.pack(side=TOP,anchor=N,fill=BOTH,expand=YES)
self.fbot = Frame(self,width=waveformWidth,height=waveformHeight)
self.fft=[]
self.graphWidget=[]
for i in range(CHAN_MAX):
self.fft.append(StringVar())
self.graphWidget.append(waveformGraph(self.fmid,i,self.fft[-1],waveformWidth,waveformHeight,
relief=SUNKEN,border=2,
fill=axisColor,
line=waveformLineColor[i]))
self.fftWidget=[]
for i in range(CHAN_MAX):
self.fftWidget.append(fftGraph(self.fbot,i,self.fft[i],waveformWidth,waveformHeight,
relief=SUNKEN,border=2,
fill=axisColor,
line=waveformLineColor[i]))
self.graphState=[]
buttons = []
for i in range(CHAN_MAX):
global chanDefaultList
self.graphState.append(IntVar())
if i in chanDefaultList:
self.graphState[-1].set(1)
else:
self.graphState[-1].set(0)
self.graphState[-1].trace('w',lambda *args:self._change_state())
buttons.append((str(i),self.graphState[i],
waveformLineColor[i],
self.graphState[i].get()))
AniViewLinkedCheckbar(ftop,buttons).pack(side=LEFT,anchor=W,expand=YES,
fill=X)
self._change_state()
# Method resizes waveform displays as needed
def _change_state(self):
global fftMode
width=self.winfo_width()
# Arrange waveform plots
open=seen=0
for i in range(len(self.graphState)): open+=self.graphState[i].get()
for i in range(len(self.graphState)):
if self.graphState[i].get():
self.graphWidget[i].place(rely=seen/float(open),relx=0,
width=width,
relheight=1/float(open))
seen+=1
else:
self.graphWidget[i].place_forget()
# Arrange FFT plots
if fftMode.get():
self.fbot.pack(side=BOTTOM,anchor=N,fill=BOTH,expand=YES)
seen=0
for i in range(len(self.graphState)):
if self.graphState[i].get():
self.fftWidget[i].place(rely=seen/float(open),relx=0,
width=width,
relheight=1/float(open))
seen+=1
else:
self.fftWidget[i].place_forget()
else:
self.fbot.forget()
# Method that refreshes all waveform graphs
def refresh(self):
for graph in self.graphWidget:
graph.clear()
graph.redraw()
class TitledRadioButtons(Frame):
def __init__(self,master,label,var,com,opts):
Frame.__init__(self,master)
self.var=var
self.com=com
Label(self,text=label).pack(side=LEFT,anchor=W)
for value,label in opts:
Radiobutton(self,text=label,command=com,variable=var,
value=value).pack(side=LEFT,anchor=W)
if __name__=='__main__':
import sys,getopt
# Method that reads a new event
def newEvent():
global pci,wvPlots,fftPlots
readData(pci)
wvPlots.refresh()
fftPlots.refresh()
scheduleNewEvent()
# Method that schedules next automated readout
def scheduleNewEvent():
global root,runMode
if not root._timer==None: root.after_cancel(root._timer)
if runMode.get():
root._timer=root.after(10,newEvent)
else:
root._timer=None
# Method to exit cleanly after releasing driver resources
def finish():
cleanup()
root.quit()
def usage():
print """dalib_gui [-Dfh]
-D Debug mode
-b <n> Start with board <n> (default: 0)
-c <n> Start with chip <n> (default: 0)
-C n,m,...Channels to start with (default: 0)
-f Start in FFT mode (default: off)
-h This help"""
# Check for command line arguments
try:
opts, args = getopt.getopt(sys.argv[1:], "Dfb:c:C:h", ["debug","fft","board=","chip=","channel=","help"])
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
# Global defaults
debugMode=0
fftDefault=0
chipDefault=0
boardDefault=0
chanDefaultList=[0]
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-D", "--Debug"):
debugMode = 1
if o in ("-f", "--fft"):
fftDefault = 1
if o in ("-c", "--chip"):
try: chipDefault=int(a)
except ValueError: pass
if o in ("-b", "--board"):
try: boardDefault=int(a)
except ValueError: pass
if o in ("-C", "--channel"):
try: chanDefaultList=map(int,a.split(','))
except ValueError: pass
# Generate data structure
pci=initPCIData()
# Create all windows needed
root = Tk()
root.protocol('WM_DELETE_WINDOW',finish)
root._timer=None
boardSelection=IntVar()
boardSelection.set(boardDefault) # Default to board 0
boardOptions=((0,'0'),(1,'1'),(2,'2'),(3,'3'))
chipSelection=IntVar()
chipSelection.set(chipDefault) # Default to chip 0
chipOptions=((0,'0'),(1,'1'))
runMode=IntVar()
runMode.set(0) # Single trigger mode
runOptions=((0,'single'),(1,'continuous'))
fftMode=IntVar()
fftMode.set(fftDefault) # Disable FFT mode
f=Frame(root)
f.pack(side=TOP,expand=YES,fill=BOTH)
buttonRow=Frame(root)
buttonRow.pack(side=BOTTOM,expand=NO,fill=X)
wvFrame=Frame(f)
wvFrame.pack(side=TOP,expand=YES,fill=BOTH)
wvPlots=waveformWidget(wvFrame)
wvPlots.pack(side=TOP,expand=YES,fill=BOTH)
fftFrame=Frame(f)
fftPlots=waveformWidget(fftFrame)