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)