/*FGROUP ALItools To be written. We do not need it untill any L2 inputs exits */ int take3SSM(int ntimes){ int i,dontcare; int boards[3]; int offset1,offset2; boards[0]=1; boards[1]=2; boards[2]=3; setomSSM(1,0xa); setomSSM(2,0xa); setomSSM(3,0xa); for(i=0;i<ntimes;i++){ if(startSSMnor(3,boards)){ printf("startSSM error: SSMs have not started inside one ORBIT. Sync not possible \n"); } } usleep(40000); readSSM(1); readSSM(2); readSSM(3); IDread++; dontcare= syncSSM(3,boards); printf("offsets: %i %i %i\n",sms[1].offset,sms[2].offset,sms[3].offset); offset1=sms[1].offset-sms[2].offset; offset2=sms[1].offset-sms[3].offset; add2SSM0(sms[1].sm,8,31,0,0); add2SSM0(sms[2].sm,8,31,1,offset1); add2SSM0(sms[3].sm,6,17,2,offset2); return 0; }
/*FGROUP ALItools --------------------------------------------------------------------------------------- Record and read and synchronise 2 SSMs */ int take2SSM(int board1,int board2,int ntimes){ int boards[2]; int i,dontcare; int rare,counter; int chan01,chanM1,level1; int chan02,chanM2,level2; w32 offset; rare = (board1 == RareFlag.board) || (board2 == RareFlag.board); if(board2 == RareFlag.board){ // board1 assumed to have flag int board = board2; board2=board1; board1=board; } printf("take2SSM: rare= %i\n",rare); if(rare){ counter=findcounter(RareFlag.board,RareFlag.mode,RareFlag.input); if(counter == 0){ printf("take2SSM: Unknown input: %i \n",RareFlag.input); return 1; } setomSSM(board1,0xb); setomSSM(board2,0xb); }else{ setomSSM(board1,0xa); setomSSM(board2,0xa); } board2pars(board1,&chan01,&chanM1,&level1); board2pars(board2,&chan02,&chanM2,&level2); boards[0]=board1; boards[1]=board2; // board2 starts first for(i=0;i<ntimes;i++){ if(startSSMnor(2,boards)){ printf("startSSM error: SSMs have not started inside one ORBIT. Sync not possible \n"); } usleep(40000); if(rare){ condstopSSM(board1,counter,100,10000,4); stopSSM(board2); }else{ stopSSM(board1); stopSSM(board2); } readSSM(board1); readSSM(board2); IDread++; dontcare= syncSSM(2,boards); printf("offsets: %i %i\n",sms[board1].offset,sms[board2].offset); offset=sms[1].offset-sms[2].offset; add2SSM0(sms[board1].sm,chan01,chanM1,level1,0); add2SSM0(sms[board2].sm,chan02,chanM2,level2,offset); } return 0; }
/*FGROUP ALItools ---------------------------------------------------------------------------- Record and read 1SSM */ void takerbSSM(int ntimes){ int i,chan0=0,chanM=31,level=24; int rare,counter; int board=1; rare = (board == RareFlag.board) && (RareFlag.mode == 1); if(rare){ counter=findcounter(RareFlag.board,RareFlag.mode,RareFlag.input); if(counter == 0){ printf("take1SSM: Unknown input: %i \n",RareFlag.input); return; } setomSSM(board,0x3); }else setomSSM(board,0x2); for(i=0;i<ntimes;i++){ startSSM1(board); usleep(30000); if(rare){ condstopSSM(board,counter,5000,13000,ccread_inputs); }else{ stopSSM(board); } readSSM(board); IDread++; //filter(sms[board].sm,25); add2SSM0(sms[board].sm,chan0,chanM,level,0); } }
/*FGROUP ALItools ------------------------------------------------------------------------------ Record and read 1SSM */ void take1SSM(int board,int ntimes){ int i,chan0,chanM,level,rare,counter; rare = (board == RareFlag.board) && (RareFlag.mode == 0); board2pars(board,&chan0,&chanM,&level); if(rare){ counter=findcounter(RareFlag.board,RareFlag.mode,RareFlag.input); if(counter == 0){ printf("take1SSM: Unknown input: %i \n",RareFlag.input); return; } setomSSM(board,0xb); } else setomSSM(board,0xa); //before after printf("take1SSM: rare,board,counter: %i %i %i\n",rare,board,counter); for(i=0;i<ntimes;i++){ startSSM1(board); usleep(30000); if(rare){ printf("take1SSM: 2 rare,board,counter: %i %i %i ",rare,board,counter); condstopSSM(board,counter,100,10000,ccread_inputs); printf(" finished succesfuly \n"); }else{ stopSSM(board); } readSSM(board); IDread++; add2SSM0(sms[board].sm,chan0,chanM,level,0); } }
int main(int argc, char *argv[]) { SensorA sens_data; SSM_sid sensA_sid; double measured_time; int tid; double now_time; initSSM(); sensA_sid = openSSM("sensor_A", 0, 0); while (1) { now_time = gettimeSSM(); //現在時刻を取得 //現在時刻の1秒前のデータを取得 tid = readSSM_time(sensA_sid, (char*) &sens_data, now_time - 1, &measured_time); printf("nowtime=%f\n time=%f tid=%d a=%f b=%f c=%d\n", gettimeSSM() - 1, measured_time, tid, sens_data.a, sens_data.b, sens_data.c); //その一つ後のデータを取得 //tid++; tid = readSSM(sensA_sid, (char*) &sens_data, &measured_time, tid + 1); printf(" time=%f tid=%d a=%f b=%f c=%d\n\n", measured_time, tid, sens_data.a, sens_data.b, sens_data.c); sleep(1); } }
/*FGROUP SSM */ void printSSM(int words) { w32 ssm[Mega]; int ix,rc; rc=readSSM(ssm); printf("readSSM rc:%d\n",rc); for(ix=0; ix<words; ix++) { printf("%4d: %8x\n", ix, ssm[ix]); }; }
/*FGROUP SimpleTests vmeadd: vme address on FO in pedja notation to be used as trigger e.g.: to trigger on serial number vmeadd= 0x2 timeout: number of loops to wait if timeout == 0, than infinite loop busy: inmon l0: outmon l1: outmon l2: inmon fo:inmono1 NO ALIGNMENT os snapshots. */ int trdssmtrigger(int vmeadd,int timeout){ int i,j,ret,n=0; //w32 cntmem[NCOUNTERS]; int flag=0,flag2=1; int boards[NSSMBOARDS]; //int boards[NCTPBOARDS]; w32 cntval1,cntval2; int cntpos; int counter=0; if(timeout == 0){ flag=1; flag2=0; } for(i=0;i<NSSMBOARDS;i++)boards[i]=0; vmeadd=0x1000+4*vmeadd; // none for backward compatibility setboard(&n,NSSMBOARDS-1,boards,0x0,"none"); // L0 counters cntpos=counter+65; //L1 counters //cntpos=counter+165; //condstopSSM(board,counter,5000,13000); //busy board: inmon, continuos setboard(&n,0,boards,0xb,"busy_inmon"); //l0 board: inmon, continuos setboard(&n,1,boards,0x3,"l0_outmon"); //l1 board: setboard(&n,2,boards,0x3,"l1_outmon"); //l2 board: inmon, continuos setboard(&n,3,boards,0xb,"l2_inmon"); //int board: inmon, continuos //setomSSM(4,0xb); //setsmssw(4,"int_inmon"); //fo1 board: inmon, continuos - setboard(&n,5,boards,0x13,"fo_inmonl1"); //setboard(&n,6,boards,0x13,"fo_inmonl1"); //setboard(&n,7,boards,0x13,"fo_inmonl1"); //setboard(&n,8,boards,0x13,"fo_inmonl1"); //setboard(&n,9,boards,0x13,"fo_inmonl1"); //setboard(&n,10,boards,0x13,"fo_inmonl1"); // read counters 1st time //readCounters(cntmem, NCOUNTERS, 0); cntval1=cntmem[cntpos]; cntval1=vmer32(vmeadd); printf("cntval1=%u \n",cntval1); // start SSM //startBoardsN(n,boards,0,0); for(i=1;i<n;i++){ int boardoffset=BSP*ctpboards[boards[i]].dial; vmew32(SSMaddress+boardoffset,0); vmew32(SSMstart+boardoffset, DUMMYVAL); } //for(i=0;i<n;i++)printf("%i %i\n",i,boards[i]);printf("\n"); // usleep(1000000); j=0; while((j<timeout) || flag){ //readCounters(cntmem, NCOUNTERS, 0); cntval2=cntmem[cntpos]; cntval2=vmer32(vmeadd); //printf("cntval2=%u \n",cntval2); //if(cntval2 != cntval1 || flag2){ if(cntval2 != 0){ //for(i=1;i<n;i++)stopSSM(boards[n-i]); for(i=1;i<n;i++){ //stopSSM(boards[i]); w32 busy; int boardoffset=BSP*ctpboards[boards[i]].dial; vmew32(SSMstop+boardoffset,DUMMYVAL); busy = vmer32(SSMstatus+boardoffset); //printf(" 0x%x\n",busy); busy = busy & 0x100; if(busy){ printf("HW error board %i\n",boards[i]); return 0; } } printf("Error detected: 0x%x\n",cntval2); break; } j++; } //usleep(100000); for(i=1;i<n;i++){ printf("Reading board %i\n",boards[i]); readSSM(boards[i]); } // synchronise //FindOrbitChannel(NCTPBOARDS,boards); sms[boards[0]].orbit=33; for(i=1;i<n;i++){ printf("board %i %i\n",i,boards[i]); sms[boards[i]].orbit = 0; } ret=syncSSM2(n,boards); printf("cntval2=%u \n",cntval2); return ret; }