4 test data ...idlab/project_files/salt... · web viewuniversity of hawaii manoa dalirevb technical...

39
INSTRUMENT DEVELOPMENT LABORATORY UNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES 1

Upload: others

Post on 12-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

INSTRUMENT DEVELOPMENT LABORATORY UNIVERSITY OF HAWAII MANOA

DALIREVB TECHNICAL NOTES

By Mavourneen Wilcox

1

Page 2: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual06/17/04Manoa, Hawaii www.phys.hawaii.edu/~idlab Technical 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

2

Page 3: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

1 DALIREVB Code Version 11

//////////////////////////////////////////////////////////////// File - dalib_v11.c//// Initial code was generated by DriverWizard v6.03 - http://www.jungo.com.// 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 userstatic 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;

3

Page 4: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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;

4

Page 5: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

} // 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

5

Page 6: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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

{

6

Page 7: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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))

7

Page 8: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

{ 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++){

8

Page 9: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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 triggerD->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

9

Page 10: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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_b3dwVal = 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: ");

10

Page 11: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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]); }}

11

Page 12: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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);

12

Page 13: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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=575waveformHeight=200SCA_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)

13

Page 14: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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)):

14

Page 15: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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=[]

15

Page 16: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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():

16

Page 17: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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]

17

Page 18: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

-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()

18

Page 19: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

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) fftPlots.pack(side=TOP,expand=YES,fill=BOTH)

# Quit button (always place first, so that it is last to disappear) Button(buttonRow, text='Quit', command=finish).pack(side=RIGHT) # Single trigger button Button(buttonRow, text='Trigger', command=newEvent).pack(side=LEFT) # Board selector buttons TitledRadioButtons(buttonRow,'Board:',boardSelection,wvPlots.refresh,boardOptions).pack(side=LEFT,expand=YES,fill=X) # Chip selector buttons TitledRadioButtons(buttonRow,'Chip:',chipSelection,wvPlots.refresh,chipOptions).pack(side=LEFT,expand=YES,fill=X) # Run type mode selection TitledRadioButtons(buttonRow,'Trigger:',runMode,scheduleNewEvent,runOptions).pack(side=LEFT,expand=YES,fill=X) # FFT calculation selection Checkbutton(buttonRow,text='FFT',variable=fftMode,command=wvPlots._change_state).pack(side=LEFT,expand=YES,fill=X)

# Debug buttons if debugMode: from debug import * Button(buttonRow, text='Refs', command=get_refs).pack(side=RIGHT) Button(buttonRow, text='GC', command=collect).pack(side=RIGHT)

# Initialize DALI board if not setup(): import sys print "Error opening comms to DALI board. Quiting!" sys.exit(0)

# Start main loop root.mainloop()

19

Page 20: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

3 Firmware DALIREVB_SALTY_BUSY

20

Page 21: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

21

Page 22: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

22

Page 23: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

23

Page 24: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

24

Page 25: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

25

Page 26: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

26

Page 27: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

27

Page 28: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

4 Firmware DALIREVB_SALTY

28

Page 29: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

29

Page 30: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

30

Page 31: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

31

Page 32: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

32

Page 33: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

33

Page 34: 4 TEST DATA ...idlab/project_files/salt... · Web viewUNIVERSITY OF HAWAII MANOA DALIREVB TECHNICAL NOTES By Mavourneen Wilcox INSTRUMENT DEVELOPMENT LABORATORY DALIREVB Users Manual

34