// DAQ internal test #include "rtxcapi.h" //defines TICKS #include "n3c.h" #include "daq.h" #include "mcf5xxx.h" #include "netComm.h" //#include "debug.h" #define MAXEVENTSIZE 10240 //bytes //&RA if MAXEVENTSIZE > 1400 then daqcapture fails with message // "Missed a packet, bumping sequence. Expecting 2, got 0" struct EVBUF { char padding[8];//really 4 bytes used by datasink_sendData uint8 buf[MAXEVENTSIZE]; }gevbuf; struct EVHEADER { uint8 type; // event type uint8 tlen; // trailer length uint8 user; // uint8 hlen; // header length uint32 evnum; // event number // not necessary useful stuff uint32 stamp; // stamp 0x900DC0DE uint32 pattern; uint32 timer; } g_evh; // external variables extern int datasink_active; extern int gUserRun; // global variables, useful for debugging // they can easily be changed using BDM "set variable = value" command int gDBG_evsize = 64; int gDBG_print_event = 0; //-1;//print everything int gDBG_pattern = 0xa5a5a5a5; int daq_setup() { // Called during "dqsu" and "jusr u" command // and, of course, in daq_init(). // If you changed some gDBGxxx variables, then this is a right place // to react on it. g_evh.pattern = gDBG_pattern; printl("daq_setup() done\n"); } int daq_init() { // Called once when program started // Do your DAQ one-time initialization here //... // setup constants in the header g_evh.hlen = sizeof(g_evh); g_evh.type = DAQ_EVTYPE_TEST; g_evh.tlen = sizeof(long); // for CRC g_evh.user = 0; g_evh.stamp = 0x900DC0DE; daq_setup(); // And call daq_setup() printl("daq_init() done\n"); } int daq_print_header() { char txt[]= "Current event header: 12345678 12345678 12345678 12345678 12345678 "; uint32 *ptrl = (uint32*)&g_evh; sprintf(txt+22,"%08x %08x %08x %08x %08x\n", ptrl[0],ptrl[1],ptrl[2],ptrl[3],ptrl[4]); printl(txt); netComm_netPrint(txt); return 0; } int process_event() { uint32 *pevh = (uint32*)gevbuf.buf; register uint32 *pev = pevh, crc=0; uint32 *phdr = (uint32*)&g_evh; uint8 *ptrb; char txt[256]; register int ii,nn; int evsize,i1; evsize = gDBG_evsize; if(evsize>MAXEVENTSIZE) { sprintf(txt,"Event size 0x%x too big\n",evsize); printl(txt); return 1; } if(evsize==0) return 0; //make event type | event length *pev = evsize; crc ^= *pev++; //build an event header g_evh.evnum++; g_evh.timer = TS_GetCounterAcc(TIMEBASE); // I cannot find better timer for(ii=0;iidaq_send_header(0x%x)\n",evtype);printl(txt); evbuf.ev = ((evtype&0xff)<<24) | sizeof(evbuf.ev); sprintf(txt,"0x%x\n",evbuf.ev);printl(txt); ii=datasink_sendData(&(evbuf.ev),sizeof(evbuf.ev)); sprintf(txt,"Sent 0x%x bytes out of 0x%x header=0x%x\n", ii,sizeof(evbuf.ev),evtype&0xff); printl(txt); } int32 g_evn=0; int daq_resume(char *param) { char txt[]="Resuming for "; daq_setup(); if(param) sscanf(param,"%i",&g_evn); sprintf(txt+13,"0x%x events\n",g_evn); printl(txt); gUserRun |= RUN_DAQ; } int daq_suspend() { daq_print_header(); gUserRun &= ~RUN_DAQ; } int daq_send_start_run(char *param) { char txt[] = "daq_send_start_run( "; int ii=1; // default: take one event sprintf(txt+19,"%08x)\n",param);printl(txt); g_evh.evnum = 0; // inform daqcapture that run begun daq_send_header(DAQ_EVTYPE_START_RUN); // if no parameters - do not resume run // otherwise use parameter as number of events to collect if(param) daq_resume(param); } int daq_send_stop_run() { char txt[] = "Run stopped, events received 0xxxxxxxxx "; sprintf(txt+32,"%08x\n",g_evh.evnum); printl(txt); return daq_send_header(DAQ_EVTYPE_STOP_RUN); } int daq_run() { // Called in main event loop char txt[] = "Run suspended at event 0xxxxxxxxx "; if(g_evn--) process_event(); if(g_evn==0) { gUserRun &= ~RUN_DAQ; sprintf(txt+25,"%08x\n",g_evh.evnum); printl(txt); netComm_netPrint(txt); daq_print_header(); } }