- Timestamp:
- Oct 18, 2009, 11:10:33 AM (16 years ago)
- Location:
- trunk/AddOn/TAcq
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AddOn/TAcq/README
r3635 r3658 6 6 Module CVSSophya/AddOn/TAcq 7 7 ########################################################### 8 ####### VOIR HISTORIQUE DES MODIFS a la fin (points 6,7...) 8 9 9 10 1/ programmes de test debit I/O disque … … 58 59 minifits acquisition 59 60 Ajout fichiers : mcrd.cc , brfitsrd.h .cc , brproc.h .cc 61 62 7/ --- Septembre/Octobre 2009 63 o Ajout possibilite de creation de spectre temps-frequence ds mcrd 64 o Amelioration de la classe RAcqMemZoneMgr pour la gestion multi-fibres (donnees 65 de plusieurs fibres dans un meme objet RAcqMemZoneMgr 66 o Amelioration de la classe MiniFITSFile pour permettre l'ajout d'information ds l'entete FITS -
trunk/AddOn/TAcq/brpaqu.cc
r3642 r3658 14 14 15 15 /* --Methode__ */ 16 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap )16 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap,int binMin,int nbBin ) 17 17 // swapall = true -> on swap tout le paquet, sinon swap entete seulement 18 18 { … … 24 24 UInt32* src32 = (UInt32*)src; 25 25 UInt32* dst32 = (UInt32*)dst; 26 26 Byte* tmp = new Byte[sz_]; 27 27 28 switch ( fgswap ) { 28 29 case BR_DoNothing : // rien a faire … … 31 32 memcpy(dst_, src, sz_); 32 33 break; 34 case BR_Copy_Reduc : // copie directe 35 memcpy(dst_, src, HeaderSize()); 36 37 memcpy(dst_+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin); 38 memcpy(dst_+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin); 39 memcpy(dst_+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize()); 40 41 SetPaqLen( nbBin/2); 42 break; 43 33 44 case BR_Swap32 : // On swappe toutes les donnees du paquet 34 45 // les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de … … 37 48 dst32[ka] = src32[ka+1]; 38 49 dst32[ka+1] = src32[ka]; 39 } 40 50 } 41 51 break; 42 52 case BR_SwapAll: … … 47 57 } 48 58 } 49 59 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) { 50 60 for(int kb=0; kb<4; kb++) { 51 61 dst_[ka+kb] = src[ka+3-kb+4]; … … 100 110 dst32[ka+1] = src32[ka]; 101 111 } 102 112 break; 103 113 case BR_FFTOneChanNoSwap : 104 114 case BR_FFTTwoChanNoSwap : … … 117 127 // copie du trailler uniquement : 118 128 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 129 break; 130 case BR_CpHdrTrl : 131 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka]; 132 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 133 break; 134 135 case BR_FFTOneChanNoSwapReduct : 136 case BR_FFTTwoChanNoSwapReduct : 137 // copie du header uniquement 119 138 120 break; 139 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka]; 140 141 //DEL on a plus de swapdonc il faut copier dans dst 142 //DEL memcpy(dst_, src, sz_); 143 144 // on reoordonne les coeff FFT (pas de swap) 145 if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap(src+HeaderSize(), tmp+HeaderSize(), DataSize()); 146 else if (fgswap == BR_FFTTwoChanNoSwap) { 147 ReorderFFTDataNoSwap(src+HeaderSize(), tmp+HeaderSize(), DataSize()/2); 148 ReorderFFTDataNoSwap(src+HeaderSize()+DataSize()/2, tmp+HeaderSize()+DataSize()/2, DataSize()/2); 149 } 150 memcpy(tmp+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin); 151 memcpy(tmp+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin); 152 memcpy(tmp+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize()); 153 memcpy(dst_+ HeaderSize(),tmp+ HeaderSize(),( 2* nbBin)+TrailerSize()); 154 SetPaqLen( nbBin/2); 155 156 // copie du trailler uniquement : 157 // for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 158 break; 121 159 } // Fin switch 122 160 -
trunk/AddOn/TAcq/brpaqu.h
r3640 r3658 99 99 BR_FFTTwoChan32, 100 100 BR_FFTOneChanNoSwap, 101 BR_FFTTwoChanNoSwap 101 BR_FFTTwoChanNoSwap, 102 BR_CpHdrTrl, 103 BR_Copy_Reduc, 104 BR_FFTOneChanNoSwapReduct, 105 BR_FFTTwoChanNoSwapReduct 102 106 }; 103 107 … … 106 110 public: 107 111 // Cree d'un objet BRPaquet avec copie/swap depuis src -> dst (si src != NULL) 108 BRPaquet(Byte* src, Byte* dst, int paqsz= 4096, BRDataFmtConv fgswap=BR_SwapAll);109 // Cree d'un objet BRPaquet de taille paqsz sur la zone dst110 BRPaquet(Byte* srcdst, int paqsz= 4096);111 // ~BRPaquet();112 BRPaquet(Byte* src, Byte* dst, int paqsz=16424, BRDataFmtConv fgswap=BR_Copy,int minBin=0,int nbBin=0); 113 // Cree d'un objet BRPaquet de taille paqsz sur la zone dst 114 BRPaquet(Byte* srcdst, int paqsz=16424); 115 // ~BRPaquet(); 112 116 113 117 // Acces diverses tailles … … 171 175 int sz_; //taille du paquet 172 176 Byte* dst_; 177 173 178 }; 174 179 -
trunk/AddOn/TAcq/brproc.cc
r3656 r3658 151 151 uint_8 firsttt=0; 152 152 bool fgfirst=true; 153 double moysig[2]={0.,0.}; 154 double sigsig[2]={0.,0.}; 155 uint_8 nbsig[2]={0,0}; 156 153 157 for (uint_4 kmz=0; kmz<nmax_; kmz++) { 154 158 if (stop_) break; … … 176 180 r_4 vts=(r_4)(*(paq.Data1()+j)); 177 181 h1.Add((r_8)vts); 182 moysig[0] += (double)vts; 183 sigsig[0] += ((double)vts)*((double)vts); 184 nbsig[0]++; 178 185 vx(j) = vts-127.5; 179 186 } … … 201 208 r_4 vts=(r_4)(*(paq.Data2()+j)); 202 209 h2.Add((r_8)vts); 210 moysig[1] += (double)vts; 211 sigsig[1] += ((double)vts)*((double)vts); 212 nbsig[1]++; 203 213 vx(j) = vts-127.5; 204 214 } … … 306 316 po << PPFNameTag(tagh1) << h1; 307 317 po << PPFNameTag(tagh2) << h2; 308 } 318 319 double sspvmax[3] = {0.,0.,0.}; 320 int_4 sspvmaxidx[3] = {-1,-1,-1}; 321 for(int jji=1;jji<visiV12.Size()-1;jji++) { 322 r_4 zmv2 = Zmod2(visiV12(jji)); 323 if (zmv2>sspvmax[2]) { sspvmax[2]=zmv2; sspvmaxidx[2]=jji; } 324 } 325 TVector<r_4>& sspv = spectreV1; 326 for(int ic=0; ic<2; ic++) { 327 if (ic==1) sspv = spectreV2; 328 for(int jji=1;jji<sspv.Size()-1;jji++) 329 if (sspv(jji)>sspvmax[ic]) { sspvmax[ic]=sspv(jji); sspvmaxidx[ic]=jji; } 330 if (nbsig[ic] < 1) { moysig[ic]=sigsig[ic]=-1.; } 331 else { 332 moysig[ic] /= (double)nbsig[ic]; 333 sigsig[ic] /= (double)nbsig[ic]; 334 sigsig[ic] -= (moysig[ic]*moysig[ic]); 335 sigsig[ic] = sqrt(sigsig[ic]); 336 cout << "===Voie " << ic << " Moy=" << moysig[ic] << " Sig=" << sigsig[ic] 337 << " MaxSpec Amp= " << sqrt(sspvmax[ic])/double(pq.DataSize()/2/2) 338 << " Pos=" << sspvmaxidx[ic] << " (NPts=" << nbsig[ic] << ")" << endl; 339 } 340 } 341 cout << "=== Voie1x2 MaxSpec Amp= " << sqrt(sqrt(sspvmax[2])/double(pq.DataSize()/2/2)) 342 << " Pos=" << sspvmaxidx[2] << endl; 343 } // fin if (fghist_) 344 309 345 if (fgtimfreq) { 310 346 timfreqV1 /= (r_4)nzm; … … 320 356 h1.Zero(); 321 357 h2.Zero(); 358 moysig[0]=moysig[1]=0.; 359 sigsig[0]=sigsig[1]=0.; 360 nbsig[0]=nbsig[1]=0; 322 361 } 323 362 if (fgtimfreq) { -
trunk/AddOn/TAcq/makefile
r3646 r3658 1 1 include $(SOPHYABASE)/include/sophyamake.inc 2 3 OBJ = ./Objs/ 4 EXE = ./Objs/ 2 5 3 6 # all : traidio tmtfft tstminifits tbrpaq tpciew tmtacq tstrdfits mfits2spec tsok 4 7 # all : traidio tmtfft tstminifits tmtacq tstrdfits mfits2spec tsok mcrd 5 all : traidio tstminifits tmtacq mfits2spec mcrd svv2mtx 8 all : traidio tstminifits tmtacq mfits2spec mcrd svv2mtx tsok 6 9 7 10 clean : 11 rm -f $(OBJ)*.o $(EXE)* 12 13 cleanold : 8 14 rm -f *.o traidio tmtfft tstminifits tpciew tbrpaq tmtacq tstrdfits mfits2spec mcrd svv2mtx 9 rm -f mfits2spec tsok*.ppf *.fits15 rm -f Objs/* *.ppf *.fits 10 16 11 17 ######################################################## 12 18 13 19 ## -------------- 14 tmtacq : tmtacq.o racqumem.o racqurw.o racquproc.o brpaqu.o pciewrap.o minifits.o15 $(CXXLINK) -o tmtacq tmtacq.o racqumem.o racqurw.o racquproc.o brpaqu.o pciewrap.o minifits.o $(SOPHYAALLSLBLIST)20 tmtacq : $(EXE)tmtacq 21 echo '---tmtacq made' 16 22 17 tmtacq.o : tmtacq.cc racquproc.h racqurw.h racqumem.h 18 $(CXXCOMPILE) -c -DNOPCIECARD -o tmtacq.o tmtacq.cc 23 $(EXE)tmtacq : $(OBJ)tmtacq.o $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \ 24 $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o 25 $(CXXLINK) -o $(EXE)tmtacq $(OBJ)tmtacq.o $(OBJ)racqumem.o $(OBJ)racqurw.o $(OBJ)racquproc.o \ 26 $(OBJ)brpaqu.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST) 19 27 20 racqumem.o : racqumem.cc racqumem.h21 $(CXXCOMPILE) -c - o racqumem.o racqumem.cc28 $(OBJ)tmtacq.o : tmtacq.cc racquproc.h racqurw.h racqumem.h brpaqu.h 29 $(CXXCOMPILE) -c -DNOPCIECARD -o $(OBJ)tmtacq.o tmtacq.cc 22 30 23 racqurw.o : racqurw.cc racqurw.hracqumem.h24 $(CXXCOMPILE) -c -o racqurw.o racqurw.cc31 $(OBJ)racqumem.o : racqumem.cc racqumem.h 32 $(CXXCOMPILE) -c -o $(OBJ)racqumem.o racqumem.cc 25 33 26 racquproc.o : racquproc.cc racquproc.h racqurw.h racqumem.h 27 $(CXXCOMPILE) -c -o racquproc.o racquproc.cc 34 $(OBJ)racqurw.o : racqurw.cc racqurw.h racqumem.h brpaqu.h 35 $(CXXCOMPILE) -c -o $(OBJ)racqurw.o racqurw.cc 36 37 $(OBJ)racquproc.o : racquproc.cc racquproc.h racqurw.h racqumem.h brpaqu.h 38 $(CXXCOMPILE) -c -o $(OBJ)racquproc.o racquproc.cc 28 39 29 40 ## Lecture / traitement minifits multi-thread 30 41 ## -------------- 31 mcrd : mcrd.o racqumem.o brfitsrd.o brproc.o racquproc.o brpaqu.o racqurw.o pciewrap.o minifits.o32 $(CXXLINK) -o mcrd mcrd.o racqumem.o brfitsrd.o brproc.o racquproc.o brpaqu.o racqurw.o pciewrap.o minifits.o $(SOPHYAALLSLBLIST)42 mcrd : $(EXE)mcrd 43 echo '---mcrd made' 33 44 34 mcrd.o : mcrd.cc brfitsrd.h racqumem.h brproc.h racqurw.h 35 $(CXXCOMPILE) -c -o mcrd.o mcrd.cc 45 $(EXE)mcrd : $(OBJ)mcrd.o $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o $(OBJ)brpaqu.o \ 46 $(OBJ)racqurw.o $(OBJ)pciewrap.o $(OBJ)minifits.o 47 $(CXXLINK) -o $(EXE)mcrd $(OBJ)mcrd.o $(OBJ)racqumem.o $(OBJ)brfitsrd.o $(OBJ)brproc.o $(OBJ)racquproc.o \ 48 $(OBJ)brpaqu.o $(OBJ)racqurw.o $(OBJ)pciewrap.o $(OBJ)minifits.o $(SOPHYAALLSLBLIST) 36 49 37 brfitsrd.o : brfitsrd.cc brfitsrd.h racqumem.h38 $(CXXCOMPILE) -c -o brfitsrd.o brfitsrd.cc50 $(OBJ)mcrd.o : mcrd.cc brfitsrd.h racqumem.h brproc.h racqurw.h 51 $(CXXCOMPILE) -c -o $(OBJ)mcrd.o mcrd.cc 39 52 40 brproc.o : brproc.cc brproc.h racqumem.h 41 $(CXXCOMPILE) -c -o brproc.o brproc.cc 53 $(OBJ)brfitsrd.o : brfitsrd.cc brfitsrd.h racqumem.h brpaqu.h 54 $(CXXCOMPILE) -c -o $(OBJ)brfitsrd.o brfitsrd.cc 55 56 $(OBJ)brproc.o : brproc.cc brproc.h racqumem.h brpaqu.h 57 $(CXXCOMPILE) -c -o $(OBJ)brproc.o brproc.cc 42 58 43 59 ## -------------- 44 svv2mtx : svv2mtx.o45 $(CXXLINK) -o svv2mtx svv2mtx.o $(SOPHYAEXTSLBLIST)60 svv2mtx : $(EXE)svv2mtx 61 echo '---svv2mtx made' 46 62 47 svv2mtx.o : svv2mtx.cc 48 $(CXXCOMPILE) -o svv2mtx.o svv2mtx.cc 63 $(EXE)svv2mtx : $(OBJ)svv2mtx.o 64 $(CXXLINK) -o $(EXE)svv2mtx $(OBJ)svv2mtx.o $(SOPHYAEXTSLBLIST) 65 66 $(OBJ)svv2mtx.o : svv2mtx.cc 67 $(CXXCOMPILE) -o $(OBJ)svv2mtx.o svv2mtx.cc 49 68 50 69 ## -------------- 51 tbrpaq : tbrpaq.o brpaqu.o racqumem.o racqurw.o racquproc.o52 $(CXXLINK) -o tbrpaq tbrpaq.o brpaqu.o $(SOPHYAALLSLBLIST)70 tbrpaq : $(EXE)tbrpaq 71 echo '---tbrpaq made' 53 72 54 tbrpaq.o : tbrpaq.cc brpaqu.h 55 $(CXX COMPILE) -c -o tbrpaq.o tbrpaq.cc73 $(EXE)tbrpaq : $(OBJ)tbrpaq.o $(OBJ)brpaqu.o 74 $(CXXLINK) -o $(EXE)tbrpaq $(OBJ)tbrpaq.o $(OBJ)brpaqu.o $(SOPHYAALLSLBLIST) 56 75 57 brpaqu.o : brpaqu.cc brpaqu.h 58 $(CXXCOMPILE) -c -o brpaqu.o brpaqu.cc 76 $(OBJ)tbrpaq.o : tbrpaq.cc brpaqu.h 77 $(CXXCOMPILE) -c -o $(OBJ)tbrpaq.o tbrpaq.cc 78 79 $(OBJ)brpaqu.o : brpaqu.cc brpaqu.h 80 $(CXXCOMPILE) -c -o $(OBJ)brpaqu.o brpaqu.cc 59 81 60 82 ## -------------- 61 tpciew : tpciew.o pciewrap.o62 $(CXXLINK) -o tpciew tpciew.o pciewrap.o $(SOPHYAEXTSLBLIST)83 tpciew : $(EXE)tpciew 84 echo '---tpciew made' 63 85 64 tpciew.o : tpciew.cc pciewrap.h 65 $(CXX COMPILE) -o tpciew.o tpciew.cc86 $(EXE)tpciew : $(OBJ)tpciew.o $(OBJ)pciewrap.o 87 $(CXXLINK) -o $(EXE)tpciew $(OBJ)tpciew.o $(OBJ)pciewrap.o $(SOPHYAEXTSLBLIST) 66 88 67 pciewrap.o : pciewrap.cc pciewrap.h68 $(CXXCOMPILE) -o pciewrap.o pciewrap.cc89 $(OBJ)tpciew.o : tpciew.cc pciewrap.h 90 $(CXXCOMPILE) -o $(OBJ)tpciew.o tpciew.cc 69 91 70 ## -------------- 92 $(OBJ)pciewrap.o : pciewrap.cc pciewrap.h 93 $(CXXCOMPILE) -o $(OBJ)pciewrap.o pciewrap.cc 71 94 72 mfits2spec : mfits2spec.o minifits.o brpaqu.o 73 $(CXXLINK) -o mfits2spec mfits2spec.o minifits.o brpaqu.o $(SOPHYAEXTSLBLIST) 95 ## -------------- Lecture minifits et calcul de spectre 96 mfits2spec : $(EXE)mfits2spec 97 echo '---mfits2spec made' 74 98 75 mfits2spec.o : mfits2spec.cc minifits.h brpaqu.h76 $(CXX COMPILE) -o mfits2spec.o mfits2spec.cc99 $(EXE)mfits2spec : $(OBJ)mfits2spec.o $(OBJ)minifits.o $(OBJ)brpaqu.o 100 $(CXXLINK) -o $(EXE)mfits2spec $(OBJ)mfits2spec.o $(OBJ)minifits.o $(OBJ)brpaqu.o $(SOPHYAEXTSLBLIST) 77 101 78 tstrdfits : tstrdfits.o minifits.o 79 $(CXX LINK) -o tstrdfits tstrdfits.o minifits.o $(SOPHYAEXTSLBLIST)102 $(OBJ)mfits2spec.o : mfits2spec.cc minifits.h brpaqu.h 103 $(CXXCOMPILE) -o $(OBJ)mfits2spec.o mfits2spec.cc 80 104 81 tstrdfits.o : tstrdfits.cc minifits.h 82 $(CXXCOMPILE) -o tstrdfits.o tstrdfits.cc 105 ## -------------- Tests minifits 106 tstrdfits : $(EXE)tstrdfits 107 echo '---tstrdfits made' 83 108 84 tstminifits : tstminifits.ominifits.o85 $(CXXLINK) -o tst minifits tstminifits.ominifits.o $(SOPHYAEXTSLBLIST)109 $(EXE)tstrdfits : $(OBJ)tstrdfits.o $(OBJ)minifits.o 110 $(CXXLINK) -o tstrdfits $(OBJ)tstrdfits.o $(OBJ)minifits.o $(SOPHYAEXTSLBLIST) 86 111 87 tstminifits.o : tstminifits.cc minifits.h88 $(CXXCOMPILE) -o tstminifits.o tstminifits.cc112 $(OBJ)tstrdfits.o : tstrdfits.cc minifits.h 113 $(CXXCOMPILE) -o $(OBJ)tstrdfits.o tstrdfits.cc 89 114 90 minifits.o : minifits.cc minifits.h 91 $(CXXCOMPILE) -o minifits.o minifits.cc115 tstminifits : $(EXE)tstminifits 116 echo '---tstrdfits made' 92 117 93 ## -------------- 94 traidio : traidio.o 95 $(CXXLINK) -o traidio traidio.o $(SOPHYAEXTSLBLIST) 118 $(EXE)tstminifits : $(OBJ)tstminifits.o $(OBJ)minifits.o 119 $(CXXLINK) -o $(EXE)tstminifits $(OBJ)tstminifits.o $(OBJ)minifits.o $(SOPHYAEXTSLBLIST) 96 120 97 traidio.o : traidio.cc 98 $(CXXCOMPILE) -o traidio.o traidio.cc121 $(OBJ)tstminifits.o : tstminifits.cc minifits.h 122 $(CXXCOMPILE) -o $(OBJ)tstminifits.o tstminifits.cc 99 123 100 tmtfft : tmtfft.o 101 $(CXX LINK) -o tmtfft tmtfft.o $(SOPHYAEXTSLBLIST)124 $(OBJ)minifits.o : minifits.cc minifits.h 125 $(CXXCOMPILE) -o $(OBJ)minifits.o minifits.cc 102 126 103 tmtfft.o : tmtfft.cc 104 $(CXXCOMPILE) -o tmtfft.o tmtfft.cc 127 ## -------------- Tests performances I/O et FFT multi-threads 128 traidio : $(EXE)traidio 129 echo '---traidio made' 130 131 $(EXE)traidio : $(OBJ)traidio.o 132 $(CXXLINK) -o $(EXE)traidio $(OBJ)traidio.o $(SOPHYAEXTSLBLIST) 133 134 $(OBJ)traidio.o : traidio.cc 135 $(CXXCOMPILE) -o $(OBJ)traidio.o traidio.cc 136 137 tmtfft : $(EXE)tmtfft 138 echo '---tmtfft made' 139 140 $(EXE)tmtfft : $(OBJ)tmtfft.o 141 $(CXXLINK) -o $(EXE)tmtfft $(OBJ)tmtfft.o $(SOPHYAEXTSLBLIST) 142 143 $(OBJ)tmtfft.o : tmtfft.cc 144 $(CXXCOMPILE) -o $(OBJ)tmtfft.o tmtfft.cc 105 145 106 146 107 147 ## -------------- Ex.repertoire Remote --------- 148 ## Classes de serveur et client TCP/IP 149 tsok : $(EXE)tsok 150 echo '---tsok made' 108 151 109 tsok : tsok.o swrapsock.o sockrawstream.oburawstream.o110 $(CXXLINK) -o tsok tsok.o swrapsock.osockrawstream.o \111 burawstream.o $(SOPHYASLBLIST)152 $(EXE)tsok : $(OBJ)tsok.o $(OBJ)swrapsock.o $(OBJ)sockrawstream.o $(OBJ)burawstream.o 153 $(CXXLINK) -o $(EXE)tsok $(OBJ)tsok.o $(OBJ)swrapsock.o $(OBJ)sockrawstream.o \ 154 $(OBJ)burawstream.o $(SOPHYASLBLIST) 112 155 113 tsok.o : tsok.cc swrapsock.h sockrawstream.h114 $(CXXCOMPILE) tsok.cc156 $(OBJ)tsok.o : tsok.cc swrapsock.h sockrawstream.h 157 $(CXXCOMPILE) -o $(OBJ)tsok.o tsok.cc 115 158 116 swrapsock.o : swrapsock.cc swrapsock.h117 $(CXXCOMPILE) swrapsock.cc159 $(OBJ)swrapsock.o : swrapsock.cc swrapsock.h 160 $(CXXCOMPILE) -o $(OBJ)swrapsock.o swrapsock.cc 118 161 119 sockrawstream.o : sockrawstream.cc sockrawstream.h120 $(CXXCOMPILE) sockrawstream.cc162 $(OBJ)sockrawstream.o : sockrawstream.cc sockrawstream.h 163 $(CXXCOMPILE) -o $(OBJ)sockrawstream.o sockrawstream.cc 121 164 122 burawstream.o : burawstream.cc burawstream.h123 $(CXXCOMPILE) burawstream.cc165 $(OBJ)burawstream.o : burawstream.cc burawstream.h 166 $(CXXCOMPILE) -o $(OBJ)burawstream.o burawstream.cc -
trunk/AddOn/TAcq/mcrd.cc
r3656 r3658 170 170 << " PaqSz=" << paqsz << " NMean=" << NMean << endl; 171 171 } 172 RAcqMemZoneMgr mmgr(NZones, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz);172 RAcqMemZoneMgr mmgr(NZones, 1, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz); 173 173 mmgr.SetFinalizedMask((uint_4)MemZS_ProcA); 174 174 … … 226 226 << " PaqSz=" << paqsz << " NMean=" << NMean << endl; 227 227 } 228 RAcqMemZoneMgr mmgr1(NZones, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz);228 RAcqMemZoneMgr mmgr1(NZones, 1, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz); 229 229 mmgr1.SetFinalizedMask((uint_4)(MemZS_ProcA)|(uint_4)(MemZS_ProcB)); 230 230 // mmgr1.SetFinalizedMask((uint_4)(MemZS_ProcA)); 231 RAcqMemZoneMgr mmgr2(NZones, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz);231 RAcqMemZoneMgr mmgr2(NZones, 1, NPaqinZone, paqsz, sizeof(complex<r_4>)*paqsz); 232 232 mmgr2.SetFinalizedMask((uint_4)(MemZS_ProcA)|(uint_4)(MemZS_ProcB)); 233 233 // mmgr2.SetFinalizedMask((uint_4)(MemZS_ProcA)); -
trunk/AddOn/TAcq/minifits.cc
r3639 r3658 5 5 // #include <iostream> 6 6 7 ////////////////////////////////////////////////////////////////////// 8 /// Classe MiniFITSException 9 ////////////////////////////////////////////////////////////////////// 10 11 12 /* --Methode-- */ 13 MiniFITSException::MiniFITSException(const char * m) throw() 14 { 15 if (m!=NULL) { 16 strncpy(msg_, m, MFEX_MAXMSGLEN-1); 17 msg_[MFEX_MAXMSGLEN-1] = '\0'; 18 } 19 else msg_[0] = '\0'; 20 } 21 22 /* --Methode-- */ 23 MiniFITSException::MiniFITSException(const string& m) throw() 24 { 25 strncpy(msg_, m.c_str(), MFEX_MAXMSGLEN-1); 26 msg_[MFEX_MAXMSGLEN-1] = '\0'; 27 } 28 29 /* --Methode-- */ 30 MiniFITSException::~MiniFITSException() throw() 31 { 32 } 33 34 /* --Methode-- */ 35 const char* MiniFITSException::what() const throw() 36 { 37 return msg_; 38 } 39 40 /* --Methode-- */ 41 string const MiniFITSException::Msg() const 42 { 43 return (string(msg_)); 44 } 45 46 ////////////////////////////////////////////////////////////////////// 47 /// Classe MiniFITSFile 48 ////////////////////////////////////////////////////////////////////// 49 7 50 #define MFITSHLEN 2880 8 51 52 /* --Methode-- */ 9 53 MiniFITSFile::MiniFITSFile() 10 54 { … … 12 56 } 13 57 58 /* --Methode-- */ 14 59 MiniFITSFile::MiniFITSFile(string const & nom, MiniFITS_Mode rwm) 15 60 { … … 18 63 } 19 64 65 /* --Methode-- */ 20 66 MiniFITSFile::MiniFITSFile(const char* nom, MiniFITS_Mode rwm) 21 67 { … … 25 71 26 72 73 /* --Methode-- */ 27 74 MiniFITSFile::~MiniFITSFile() 28 75 { … … 31 78 } 32 79 80 /* --Methode-- */ 33 81 void MiniFITSFile::Init() 34 82 { … … 40 88 totwsz = 0; 41 89 header = new char[MFITSHLEN]; 42 43 } 44 90 for(int i=0; i<MFITSHLEN; i++) header[i]=' '; 91 nkeya_ = 0; 92 } 93 94 /* --Methode-- */ 45 95 void MiniFITSFile::Open(const char* nom, MiniFITS_Mode rwm) 46 96 { … … 65 115 } 66 116 117 /* --Methode-- */ 67 118 void MiniFITSFile::Close() 68 119 { … … 71 122 // on remplit avec des zeros pour avoir une longueur multiple de 2880 72 123 size_t padsz = MFITSHLEN-(totwsz%MFITSHLEN); 73 for(size_t k=0; k<padsz; k++) header[k]=0; 74 fwrite(header, 1, padsz, fip); 124 char zeros[160]; 125 for(size_t k=0; k<160; k++) zeros[k]=0; 126 while(padsz>160) { 127 fwrite(zeros, 1, 160, fip); 128 padsz-=160; 129 } 130 if (padsz>0) fwrite(zeros, 1, padsz, fip); 75 131 // On reecrit l'entete 76 132 FillHeader(); … … 84 140 } 85 141 142 /* --Methode-- */ 86 143 void MiniFITSFile::setDTypeNaxis(MiniFITS_DT dt, size_t na1, size_t na2) 87 144 { … … 95 152 } 96 153 154 /* --Methode-- */ 97 155 string MiniFITSFile::DataTypeToString() 98 156 { … … 103 161 } 104 162 163 /* --Methode-- */ 105 164 int MiniFITSFile::Write(void* data, size_t sz) 106 165 { … … 110 169 } 111 170 171 /* --Methode-- */ 112 172 int MiniFITSFile::Read(void* data, size_t sz, size_t offset) 113 173 { … … 117 177 } 118 178 179 /* --Methode-- */ 119 180 void MiniFITSFile::FillHeader() 120 181 { 121 for(int i=0; i<MFITSHLEN; i++) header[i]=' ';122 182 strcpy(header, "SIMPLE = T / file does conform to FITS standard"); 123 183 header[strlen(header)] = ' '; … … 138 198 sprintf(buff, "NAXIS2 = %20ld / number of bits per data pixel", (long)nax2); 139 199 buff[strlen(buff)] = ' '; 140 buff = header+400 ;200 buff = header+400+nkeya_*80; 141 201 strcpy(buff,"COMMENT BAO-Radio / MiniFITSFile "); 142 202 buff[strlen(buff)] = ' '; 143 buff = header+480 ;203 buff = header+480+nkeya_*80; 144 204 strcpy(buff,"END"); 145 205 buff[strlen(buff)] = ' '; … … 148 208 } 149 209 150 210 /* --Methode-- */ 211 int MiniFITSFile::AddKeyI(const char* key, long val, const char* comm) 212 { 213 if (nkeya_ >= 29) return 0; 214 char cle[10]; 215 strncpy(cle,key,8); 216 cle[8]='='; 217 for(int i=0;i<8;i++) 218 if (cle[i]=='\0') cle[i]=' '; 219 cle[9]='\0'; 220 char* buff=header+400+nkeya_*80; 221 if (comm!=NULL) { 222 char tcom[50]; 223 strncpy(tcom,comm,48); 224 tcom[48]='\0'; 225 sprintf(buff,"%s %20ld / %s", cle, val, tcom); 226 } 227 else sprintf(buff,"%s %20ld / ", cle, val); 228 buff[strlen(buff)]=' '; 229 nkeya_++; 230 return nkeya_; 231 } 232 233 /* --Methode-- */ 234 int MiniFITSFile::AddKeyD(const char* key, double val, const char* comm) 235 { 236 if (nkeya_ >= 29) return 0; 237 char cle[10]; 238 strncpy(cle,key,8); 239 cle[8]='='; 240 for(int i=0;i<8;i++) 241 if (cle[i]=='\0') cle[i]=' '; 242 cle[9]='\0'; 243 char* buff=header+400+nkeya_*80; 244 if (comm!=NULL) { 245 char tcom[50]; 246 strncpy(tcom,comm,48); 247 tcom[48]='\0'; 248 sprintf(buff,"%s %20lg / %s", cle, val, tcom); 249 } 250 else sprintf(buff,"%s %20ld / ", cle, val); 251 buff[strlen(buff)] = ' '; 252 nkeya_++; 253 return nkeya_; 254 } 255 256 /* --Methode-- */ 257 int MiniFITSFile::AddKeyS(const char* key, const char* val, const char* comm) 258 { 259 if (nkeya_ >= 29) return 0; 260 char cle[10]; 261 strncpy(cle,key,8); 262 cle[8]='='; 263 for(int i=0;i<8;i++) 264 if (cle[i]=='\0') cle[i]=' '; 265 cle[9]='\0'; 266 char tcom[72]; 267 tcom[0]='\''; 268 strncpy(tcom+1,val,65); 269 int l=strlen(tcom); 270 strcpy(tcom+l,"' / "); 271 l+=4; 272 if ((l<70)&&(comm!=NULL)) strncpy(tcom+l,comm,70-l); 273 tcom[70]='\0'; 274 char* buff=header+400+nkeya_*80; 275 sprintf(buff,"%s %s", cle, tcom); 276 buff[strlen(buff)] = ' '; 277 nkeya_++; 278 return nkeya_; 279 } 280 281 /* --Methode-- */ 151 282 void MiniFITSFile::DecodeHeader() 152 283 { -
trunk/AddOn/TAcq/minifits.h
r3592 r3658 3 3 4 4 #include <stdio.h> 5 #include <exception> 5 6 #include <string> 6 7 … … 14 15 using namespace std; 15 16 16 class MiniFITSException { 17 #define MFEX_MAXMSGLEN 160 18 19 class MiniFITSException : public std::exception { 17 20 public: 18 explicit MiniFITSException(const char * m) { msg = m; } 19 explicit MiniFITSException(const string& m) { msg = m; } 20 virtual ~MiniFITSException() { } 21 virtual string const& Msg() const {return msg;} 21 explicit MiniFITSException(const char * m) throw() ; 22 explicit MiniFITSException(const string& m) throw() ; 23 virtual ~MiniFITSException() throw() ; 24 //! Implementation of std::exception what() method, returning the exception message 25 virtual const char* what() const throw(); 26 virtual string const Msg() const ; 22 27 private: 23 string msg;28 char msg_[MFEX_MAXMSGLEN]; 24 29 }; 25 30 … … 68 73 { return ( Write((void *)data, nel*sizeof(Float32)) ); } 69 74 75 // Ajout de mots-cle a l'entete FITS 76 int AddKeyI(const char* key, long val, const char* comm=NULL); 77 inline int AddKeyI(string const& key, long val) 78 { return AddKeyI(key.c_str(), val); } 79 inline int AddKeyI(string const& key, long val, string const& comm) 80 { return AddKeyI(key.c_str(), val, comm.c_str()); } 81 int AddKeyD(const char* key, double val, const char* comm=NULL); 82 inline int AddKeyD(string const& key, double val) 83 { return AddKeyD(key.c_str(), val); } 84 inline int AddKeyD(string const& key, double val, string const& comm) 85 { return AddKeyD(key.c_str(), val, comm.c_str()); } 86 int AddKeyS(const char* key, const char* val, const char* comm=NULL); 87 inline int AddKeyS(string const& key, string const& val) 88 { return AddKeyS(key.c_str(), val.c_str()); } 89 inline int AddKeyS(string const& key, string const& val, string const& comm) 90 { return AddKeyS(key.c_str(), val.c_str(), comm.c_str()); } 91 70 92 // string getKey(string& key); 71 93 protected: … … 80 102 size_t totwsz; // total bytes ecrits 81 103 char* header; // entete FITS 104 int nkeya_; // 82 105 }; 83 106 -
trunk/AddOn/TAcq/racqumem.cc
r3640 r3658 7 7 8 8 /* --Methode-- */ 9 RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz, uint_4 procpsz) 10 : mex(true), nzones(nz), npaq(np), paqsz(psz), procpaqsz(procpsz),stop_(false) 9 RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz) 10 : mex(true), nzones(nz), nfibres(1), npaq(np), paqsz(psz), procpaqsz(0), stop_(false), runstate_(MemZR_Running) 11 { 12 Init(); 13 } 14 15 /* --Methode-- */ 16 RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nzon, uint_4 nfib, uint_4 npaq, uint_4 paqsz, uint_4 procsz) 17 : mex(true), nzones(nzon), nfibres(nfib), npaq(npaq), paqsz(paqsz), procpaqsz(procsz), 18 stop_(false), runstate_(MemZR_Running) 19 { 20 Init(); 21 } 22 23 /* --Methode-- */ 24 void RAcqMemZoneMgr::Init() 11 25 { 12 26 St_MemZ st; … … 16 30 st.stat = (uint_4)MemZS_Free; 17 31 for(int k=0; k<6; k++) st.nbact[k] = 0; 18 uint_8 mzsz = n paq*paqsz;19 uint_8 procmzsz = n paq*procpaqsz;20 21 for( int k=0; k<NbZones(); k++) {32 uint_8 mzsz = nfibres*npaq*paqsz; 33 uint_8 procmzsz = nfibres*npaq*procpaqsz; 34 35 for(unsigned int k=0; k<NbZones(); k++) { 22 36 memzones.push_back(new Byte[mzsz] ); 23 37 states.push_back(st); … … 31 45 RAcqMemZoneMgr::~RAcqMemZoneMgr() 32 46 { 33 for(uint_4 k=0; k<NbZones(); k++) delete[] memzones[k]; 47 for(uint_4 k=0; k<NbZones(); k++) { 48 delete[] memzones[k]; 49 if (procpaqsz > 0) delete[] procmemzones[k]; 50 } 34 51 } 35 52 … … 203 220 // cout << "RAcqMemZoneMgr::Stop() ........ STOP BROADCAST" <<endl; 204 221 stop_ = true; 222 runstate_ = MemZR_Stopped; 205 223 mex.broadcast(); 206 224 } -
trunk/AddOn/TAcq/racqumem.h
r3635 r3658 31 31 } St_MemZ; 32 32 33 33 34 // Les flags (bits) correspondant aux operations effectuees sur une zone 34 35 // Free->libre, Filled->rempli(par DMA), Saved(ecrit sur disque), Proc(Traitement) … … 39 40 enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4, 40 41 MemZA_ProcA=8, MemZA_ProcB=16, MemZA_ProcC=32 }; 42 43 // configuration du RAcqMemZoneMgr 44 enum MemZconfig { MemZConf_SingleFiberDataOnly=0, MemZConf_MultiFiberDataOnly=1, 45 MemZConf_SingleFiberProcDataOnly=2, MemZConf_MultiFiberProcDataOnly=3, 46 MemZConf_SingleFiberDataAndProcData=4, MemZConf_MultiFiberDataAndProcData=5 }; 47 // L'etat d'execution en cours : running, waiting, stopped 48 enum MemZRunState { MemZR_Running=0, MemZR_Waiting=1, MemZR_Stopped=2}; 49 50 41 51 42 52 // ------------------------------------------------------------------- … … 49 59 // Si procpsz>0 , on alloue aussi des zones memoire pour donnees traitees 50 60 // dans ce cas, procpsz à la taille memoire des donnees traites pour chaque paquet 51 RAcqMemZoneMgr(uint_4 nz, uint_4 np=256, uint_4 psz=4096, uint_4 procpsz=0); 61 // Constructeur 1 : l'objet ne contient que les donnees d'une fibre 62 // garde pour maintenir la compatibilite avec version TAcq v <= 6.0 63 RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz); 64 // Constructeur 2 : l'objet peut contenir plusieurs fibres, et des donnees processes en plus 65 RAcqMemZoneMgr(uint_4 nzon, uint_4 nfib, uint_4 npaq, uint_4 paqsz, uint_4 procsz=0); 66 52 67 ~RAcqMemZoneMgr(); 53 68 69 // Retourne le nombre de fibres dans chaque zone 70 inline uint_4 NbZones() { return nzones; } 54 71 // Retourne le nombre de zones memoire 55 inline uint_4 Nb Zones() { return nzones; }72 inline uint_4 NbFibres() { return nfibres; } 56 73 // Retourne la taille de paquet 57 74 inline uint_4 PaqSize() { return paqsz; } … … 59 76 inline uint_4 NbPaquets() { return npaq; } 60 77 // Retourne la taille totale d'une zone 61 inline uint_4 ZoneSize() { return npaq*paqsz; } 78 inline uint_4 ZoneSize() { return nfibres*npaq*paqsz; } 79 inline uint_4 OneFiberZoneSize() { return npaq*paqsz; } 62 80 63 81 // Retourne la taille de la zone memoire correspondant aux donnees traitees d'un paquet 64 82 inline uint_4 ProcPaqSize() { return procpaqsz; } 65 83 // Retourne la taille totale d'une zone de donnees traitees 66 inline uint_4 ProcZoneSize() { return npaq*procpaqsz; } 67 84 inline uint_4 ProcZoneSize() { return nfibres*npaq*procpaqsz; } 85 inline uint_4 OneFiberProcZoneSize() { return npaq*procpaqsz; } 86 68 87 // Definit l'etat des operations obligatoires avant qu'une zone 69 88 // remplie ne puisse etre recyclee (re-remplie) … … 76 95 // Libere une zone memoire en marquant son etat 77 96 int FreeMemZone(int id, MemZStatus st); 78 // Retourne le pointeur de la zone numero k 97 // Retourne le pointeur de la zone numero k pour les datas 98 99 // Retourne le pointeur de la zone numero k pour les datas pour une fibre donnee 100 inline Byte* GetMemZone(int id, int fib) { 101 if ((id < 0) || (id >=(int) memzones.size())) return NULL; 102 if ((fib < 0) || (fib >=(int) nfibres)) return NULL; 103 return memzones[id]+fib*OneFiberZoneSize(); 104 } 105 // Retourne le pointeur de la zone numero k pour les resultats de traitement pour une fibre donnee 106 inline Byte* GetProcMemZone(int id, int fib) { 107 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL; 108 return procmemzones[id]+fib*OneFiberProcZoneSize(); 109 } 110 // Retourne le pointeur de la zone numero k pour les datas 79 111 inline Byte* GetMemZone(int id) { 80 112 if ((id < 0) || (id >=(int) memzones.size())) return NULL; 81 113 return memzones[id]; 82 114 } 115 // Retourne le pointeur de la zone numero k pour les resultats de traitement 83 116 inline Byte* GetProcMemZone(int id) { 84 117 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL; … … 87 120 88 121 ostream& Print(ostream& os); 122 89 123 void Stop(); 90 124 inline MemZRunState GetRunState() 125 { return runstate_; } 126 inline MemZRunState ChangeRunState( MemZRunState st) 127 { runstate_ = st; return runstate_; } 128 91 129 protected: 130 void Init(); // Fait l'allocation des differents buffers - est appele par les constructeurs 131 92 132 // ... variables membres 93 133 ZMutex mex; 94 uint_4 nzones, npaq, paqsz, procpaqsz;134 uint_4 nzones, nfibres, npaq, paqsz, procpaqsz; 95 135 // DMAMgrInterface &dma_; 96 136 vector< Byte* > memzones; … … 98 138 vector< Byte* > procmemzones; 99 139 bool stop_; 140 MemZRunState runstate_; 100 141 uint_4 mask_finalized_; 101 142 uint_8 serial_; -
trunk/AddOn/TAcq/racqurw.cc
r3644 r3658 59 59 void PCIEReader::run() 60 60 { 61 struct sigaction act;62 struct sigaction old_act;63 61 //Precision insuffisante ResourceUsage ru; ru.Update(); // Pour recuperer le temps passe 64 62 struct timeval tv1, tv2; … … 70 68 setRC(1); 71 69 72 uint_4 cpt=0;70 73 71 // sigaddset(&act.sa_mask,SIGINT); // pour proteger le transfert DMA 74 72 //sigaction(SIGINT,&act,NULL); … … 232 230 uint_4 fnum=0; 233 231 uint_4 paqsz = memgr.PaqSize(); 232 cout << " ============================ DataSaver::run() PaqSize " << paqsz <<endl; 234 233 bool fgnulldev = false; 235 234 if (path_ == "/dev/null") { … … 253 252 // Entete correspondant a l'ecriture tout le paquet - trailer compris (modif Mai 2009) 254 253 mff.setDTypeNaxis(MF_Byte, paq0.PaquetSize(), npaqperfile); 254 255 255 // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); 256 256 } … … 353 353 cout << " ... RAcqMemZoneMgr not used - using s fixed memory location for packets decoding ..." << endl; 354 354 355 uint_4 cpt=0;355 356 356 // sigaddset(&act.sa_mask,SIGINT); // pour proteger le transfert DMA 357 357 //sigaction(SIGINT,&act,NULL); … … 363 363 364 364 Byte* Datas = NULL; 365 Byte* locdata = new Byte[paqsz ];365 Byte* locdata = new Byte[paqsz*memgr.NbPaquets()*memgr.NbZones()]; 366 366 Byte* tampon = new Byte[paqsz]; 367 367 … … 375 375 if (fgarret) break; 376 376 377 Byte* nextdma = locdata ;377 Byte* nextdma = locdata+((kmz%memgr.NbZones())*(paqsz*memgr.NbPaquets())); 378 378 uint_4 npaqfait = 0; 379 379 // for (uint_4 i=0; i<memgr.NbPaquets(); i += pktInDMATr) { // attention pktInDMATr paquets dans 1 seul DMA … … 419 419 while((curoff+paqsz)<=dmasz) { 420 420 // BRPaquet paq((Byte*)(Datas)+((paqsz*j)), nextdma+j*paqsz, paqsz, swapall_); 421 BRPaquet paq(Datas+curoff, locdata, paqsz, swapall_); 421 // BRPaquet paq(Datas+curoff, locdata, paqsz, swapall_); 422 BRPaquet paq(Datas+curoff, nextdma+npaqfait*paqsz, paqsz, swapall_); 422 423 curoff += paqsz; // On avance l'index dans le buffer du DMA 423 424 npaqfait++; // Ne pas oublier le compteur de paquets faits … … 457 458 458 459 } 460 //////////////////////////////////////////////////////////////////////////////////////////////////////// 461 //---------------------------------------------------------------------------------------------------------- 462 // Classe thread de lecture PCI-Express + Check pour tests de verification de debit/etc avec un seul thread 463 //---------------------------------------------------------------------------------------------------------- 464 465 /* --Methode-- */ 466 PCIEMultiReader::PCIEMultiReader(vector<PCIEWrapperInterface*> vec_pciw,uint_4 sizeFrame,uint_4 packSize ,RAcqMemZoneMgr& mem, uint_4 nmax, BRDataFmtConv swapall,int binMin, int nbBin) 467 : memgr(mem) , vec_pciw_ (vec_pciw) 468 { 469 nmax_ = nmax; 470 swapall_ = swapall; // select data swap/format conversion for BRPaquet 471 stop_ = false; 472 packSize_ = packSize; 473 packSizeInMgr_=memgr.PaqSize(); 474 sizeFr_ =sizeFrame; 475 binMin_= binMin; 476 nbBin_= nbBin; 477 if (vec_pciw.size() != memgr.NbFibres()) { 478 cout << " PCIEMultiReader()PbArgs: vec_pciw.size()= " << vec_pciw.size() << " memgr.NbFibres()=" <<memgr.NbFibres()<< endl; 479 throw ParmError("PCIEMultiReader:ERROR/ arguments incompatibles vec_pciw.size() != memgr.NbFibres() "); 480 } 481 if (vec_pciw.size() > MAXNBFIB) 482 throw ParmError("PCIEMultiReader:ERROR/ vec_pciw.size() > MAXNBFIB "); 483 nbDma_= vec_pciw.size(); 484 mid_=-2; 485 mmbuf_=NULL; 486 max_targ_npaq = memgr.NbPaquets(); 487 for (int fid=0 ; fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL; 488 } 489 490 /* --Methode-- */ 491 void PCIEMultiReader::run() 492 { 493 494 struct timeval tv1,tv2; 495 gettimeofday(&tv1, NULL); 496 497 cout << " PCIEMultiReader::run() - Starting , NMaxMemZones=" << nmax_ 498 << " memgr.NbPaquets()=" << memgr.NbPaquets() << "Paqsize " << packSize_<< endl; 499 setRC(1); 500 501 // sigaddset(&act.sa_mask,SIGINT); // pour proteger le transfert DMA 502 //sigaction(SIGINT,&act,NULL); 503 // uint_4 paqsz = memgr[0]->PaqSize(); 504 uint_4 paqsz = packSize_; 505 uint_4 dmasz = vec_pciw_[0]->TransferSize(); 506 vec_pciw_[0]->StartTransfers(); 507 508 BRPaqChecker pcheck[MAXNBFIB]; // Verification/comptage des paquets 509 Byte* Datas[MAXNBFIB]; 510 Byte* tampon[MAXNBFIB] ; 511 Byte* nextpaq=NULL; 512 uint_4 off_acheval=0; 513 514 int nerrdma = 0; 515 int maxerrdma = 10; 516 bool fgarret = false; 517 518 // Initialisation des tampons pour recopie des paquets a cheval pour chaque DMA 519 for (int i=0;i< (int)nbDma_ ;i++) { 520 tampon[i]= new Byte[paqsz]; 521 } 522 523 ofstream header[MAXNBFIB]; 524 for(uint_4 fib=0; fib<nbDma_; fib++) { 525 char hfnm[128]; 526 sprintf(hfnm, "./HDRCountPaqs%d.txt", fib); 527 header[fib].open(hfnm); 528 } 529 530 uint_4 npaqfait[MAXNBFIB] ; 531 for (int i=0;i< (int)nbDma_ ;i++) npaqfait[i]=0; 532 // Byte* nextdma = locdata+((kmz%memgr.NbZones())*(paqsz*memgr.NbPaquets())); 533 uint_4 npaqfaitg = 0; 534 // for (uint_4 i=0; i<memgr.NbPaquets(); i += pktInDMATr) { // attention pktInDMATr paquets dans 1 seul DMA 535 while (npaqfaitg < nmax_*memgr.NbPaquets()) { // Boucle global G 536 if (fgarret) break; 537 if (stop_) break; 538 539 // Lancement des DMA 540 for (int dma=0; dma < (int)nbDma_ ;dma++) vec_pciw_[dma]->StartTransfers(); 541 542 // On pointe vers le debut de la zone a remplir aver le prochain DMA 543 //-- Zone memoire locale Byte* nextdma = buff+i*paqsz; 544 545 bool fgbaddma=false; 546 // On boucle sur les nbDma_ en attente de leurs terminaison 547 for (int dma=0; dma <(int) nbDma_ ;dma++) { 548 Datas[dma]=vec_pciw_[dma]->GetData(); 549 if (Datas[dma] == NULL) { // No data Read in DMA 550 nerrdma ++; fgbaddma=true; 551 cout << "PCIEMultiReaderChecker/Erreur Waiting for datas ..." << endl; 552 vec_pciw_[dma]->PrintStatus(cout); 553 if (nerrdma>=maxerrdma) { fgarret = true; break; } 554 } 555 } 556 if (fgbaddma) continue; 557 uint_4 curoff=0; 558 //1- On traite le paquet a cheval, rempli partiellement avec le DMA d'avant si necessaire pour les n fibres 559 if (off_acheval > 0) { // IF Numero B 560 if ((paqsz-off_acheval)< dmasz) { // IF Numero A 561 for(uint_4 fib=0; fib<nbDma_; fib++) 562 memcpy((void *)((tampon[fib])+off_acheval), (void *)Datas[fib], paqsz-off_acheval); 563 curoff = paqsz-off_acheval; off_acheval = 0; 564 if ( MoveToNextTarget() ) { 565 cout << "PCIEMultiReader::run()/Error-A- MoveToNextTarget() returned true ->STOP 9" << endl; 566 setRC(9); fgarret=true; break; 567 } 568 for(uint_4 fib=0; fib<nbDma_; fib++) { 569 nextpaq=GetPaquetTarget(fib); 570 if (nextpaq == NULL) { // Cela ne devrait pas arriver 571 cout << "PCIEReader::run()/Error-A2- GetPaquetTarget(fib) returned NULL ->STOP 9" << endl; 572 setRC(9); fgarret=true; break; 573 } 574 BRPaquet paq(tampon[fib], nextpaq, paqsz, swapall_,binMin_,nbBin_); 575 npaqfait[fib]++; 576 if (fib==nbDma_-1) npaqfaitg++; // Ne pas oublier le compteur de paquets faits 577 pcheck[fib].Check(paq); // Verification du paquet / FrameCounter 578 header[fib] << dec << paq.FrameCounter()<< endl; ; 579 } 580 } 581 else { // se rapporte au IF numero A 582 for(uint_4 fib=0; fib<nbDma_; fib++) 583 memcpy((void *)(tampon[fib]+off_acheval), (void *)Datas[fib], dmasz); 584 curoff =dmasz; 585 off_acheval = (dmasz+off_acheval); 586 } 587 } // Fin IF Numero B 588 589 //2- On traite les paquets complets qui se trouvent dans la zone du DMA 590 while ((curoff+paqsz)<=dmasz) { // while numero C 591 // if ((dma==nbDma_-1)&&(npaqfait >= nmax_* memgr.NbPaquets())) break; 592 if ( MoveToNextTarget() ) { 593 cout << "PCIEMultiReader::run()/Error-B- MoveToNextTarget() returned true ->STOP 9" << endl; 594 setRC(9); fgarret=true; break; 595 } 596 for(uint_4 fib=0; fib<nbDma_; fib++) { 597 if (npaqfait[fib] >= nmax_*memgr.NbPaquets()) continue; 598 nextpaq=GetPaquetTarget(fib); 599 if (nextpaq == NULL) { // Cela ne devrait pas arriver 600 cout << "PCIEReader::run()/Error-B2- GetPaquetTarget(fib) returned NULL ->STOP 9" << endl; 601 setRC(9); fgarret=true; break; 602 } 603 BRPaquet paq(Datas[fib]+curoff, nextpaq, paqsz, swapall_,binMin_,nbBin_); 604 npaqfait[fib]++; 605 if (fib==nbDma_-1) npaqfaitg++; // Ne pas oublier le compteur de paquets faits 606 pcheck[fib].Check(paq); // Verification du paquet / FrameCounter 607 header[fib] << dec << paq.FrameCounter()<< endl; ; 608 } 609 curoff += paqsz; // On avance l'index dans le buffer du DMA 610 } // -- FIN traitement des paquets complets ds un DMA - FIN du while numero C 611 //3- On copie si besoin la fin du DMA dans la zone tampon 612 if (curoff < dmasz) { // IF numero D 613 off_acheval = dmasz-curoff; 614 for(uint_4 fib=0; fib<nbDma_; fib++) 615 memcpy(tampon[fib], (void*)(Datas[fib]+curoff), off_acheval); 616 // ne sert a rien curoff += off_acheval; 617 } // FIN du if numero D 618 } // FIN Boucle global G 619 620 621 setRC(0); 622 gettimeofday(&tv2, NULL); 623 double tmelaps2 = (tv2.tv_sec-tv1.tv_sec)*1000.+(tv2.tv_usec-tv1.tv_usec)/1000.; 624 if (tmelaps2<0.1) tmelaps2=0.1; 625 cout << " ---------- PCIEMultiReader::run()-End summary NPaqFait=" << npaqfaitg << "------------- " << endl; 626 for (int dma=0; dma < (int)nbDma_ ;dma++) { 627 cout << " --Fib=" << dma << " NPaqFait=" << npaqfait[dma] << " TotTransfer=" 628 << vec_pciw_[dma]->TotTransferBytes()/1024 629 << " kb , ElapsTime=" << tmelaps2 << " ms ->" 630 << (double)vec_pciw_[dma]->TotTransferBytes()/tmelaps2 << " kb/s" << endl; 631 pcheck[dma].Print(cout); 632 } 633 cout << " --------------------------------------------------------------------" << endl; 634 635 // //// Nettoyage final 636 MZoneManage(true); 637 for(uint_4 fib=0; fib<nbDma_; fib++) header[fib].close(); 638 for (int i=0;i< (int)nbDma_ ;i++) delete[] tampon[i]; 639 //DBG cout << " fin thread ========================" <<endl; 640 return; 641 } 642 643 /* --Methode-- */ 644 bool PCIEMultiReader::MZoneManage(bool fgclean) // Retourne true si probleme 645 { 646 /* Pour debug 647 cout << " PCIEReader::MZoneManage() mid_=" << mid_ << " arg_npaq_= " << targ_npaq_ 648 << " max_targ_npaq=" << max_targ_npaq << endl; 649 */ 650 if (mid_ >= 0) memgr.FreeMemZone(mid_, MemZS_Filled); 651 mmbuf_ = NULL; targ_npaq_ = 0; mid_ = -2; 652 for (int fid=0;fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL; 653 if (fgclean) return false; 654 mid_ = memgr.FindMemZoneId(MemZA_Fill); 655 mmbuf_ = memgr.GetMemZone(mid_); 656 if (mmbuf_==NULL) return true; 657 for (int fid=0;fid<(int)nbDma_ ;fid++) mmbufib_[fid]=memgr.GetMemZone(mid_,fid); 658 return false; 659 } 660 661 /* 662 bool PCIEMultiReader::MZoneManage(int zone,bool fgclean) // Retourne true si probleme 663 { 664 // Pour debug 665 //cout << " PCIEReader::MZoneManage() mid_=" << mid_ << " arg_npaq_= " << targ_npaq_ 666 << " max_targ_npaq=" << max_targ_npaq << endl; 667 if (mid_[zone] >= 0) memgr[zone]->FreeMemZone(mid_[zone], MemZS_Filled); 668 mmbuf_[zone] = NULL; targ_npaq_[zone] = 0; mid_[zone] = -2; 669 if (fgclean) return false; 670 mid_[zone] = memgr[zone]->FindMemZoneId(MemZA_Fill); 671 mmbuf_[zone] = memgr[zone]->GetMemZone(mid_[zone]); 672 if (mmbuf_[zone]==NULL) return true; 673 return false; 674 } 675 */ 676 677 /* --Methode-- */ 678 void PCIEMultiReader::Stop() 679 { 680 // cout << " PCIEReaderChecker::stop() ........ STOP" <<endl; 681 stop_ = true; 682 683 } 684 685 686 //-------------------------------------------------------------------- 687 // Classe thread de sauvegarde sur fichiers avec gestion multifibres 688 //-------------------------------------------------------------------- 689 690 MultiDataSaver::MultiDataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nfiles, uint_4 nblocperfile, bool savesig) 691 : memgr(mem) 692 { 693 nfiles_ = nfiles; 694 nblocperfile_ = nblocperfile; 695 nmax_ = nblocperfile_*nfiles_; 696 savesig_ = savesig; // Si false, pas d'ecriture des fichiers FITS du signal 697 stop_ = false; 698 path_ = path; 699 } 700 void MultiDataSaver::Stop() 701 { 702 // cout<< " MultiDataSaver:Stop ........ " << endl; 703 stop_=true; 704 705 } 706 void MultiDataSaver::run() 707 { 708 setRC(1); 709 BRPaqChecker pcheck[MAXNBFIB]; // Verification/comptage des paquets 710 711 try { 712 TimeStamp ts; 713 cout << " MultiDataSaver::run() - Starting " << ts << " \n NbFiles=" << nfiles_ << " NBloc/File=" 714 << nblocperfile_ << " NMaxMemZones=" << nmax_ << endl; 715 char fname[512]; 716 717 sprintf(fname,"%s/msaver.log",path_.c_str()); 718 ofstream filog(fname); 719 filog << " MultiDataSaver::run() - starting log file " << ts << " NFibres= " << memgr.NbFibres() << endl; 720 filog << " NbFiles=" << nfiles_ << " NBloc/File=" << nblocperfile_ << " NMaxMemZones=" << nmax_ << endl; 721 722 // Fichiers entete ascii et signal FITS 723 ofstream header[MAXNBFIB]; 724 MiniFITSFile mff[MAXNBFIB]; 725 726 uint_4 fnum=0; 727 uint_4 paqsz = memgr.PaqSize(); 728 cout << " ============================ MultiDataSaver::run() PaqSize " << paqsz <<endl; 729 bool fgnulldev = false; 730 if (path_ == "/dev/null") { 731 cout << " MultiDataSaver::run()/Warning /dev/null path specified, filenames=/dev/null" << endl; 732 fgnulldev = true; 733 } 734 for (uint_4 nbFile=0;nbFile<nfiles_ ;nbFile++) { 735 if (stop_ ) break; 736 if (memgr.GetRunState() == MemZR_Stopped) break; 737 738 if (savesig_) 739 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { 740 if (fgnulldev) strcpy(fname,"/dev/null"); 741 else sprintf(fname,"%s/Fibre%d/HDRfits%d.txt",path_.c_str(),fib+1,fnum); 742 header[fib].open(fname); 743 } 744 BRPaquet paq0(NULL, NULL, paqsz); 745 uint_4 npaqperfile = memgr.NbPaquets()*nblocperfile_; // Nombre de paquets ecrits dans un fichier 746 747 if (savesig_) { //Reza - Ouverture conditionnel fichier 748 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { 749 if (fgnulldev) strcpy(fname,"/dev/null"); 750 else sprintf(fname,"%s/Fibre%d/signal%d.fits",path_.c_str(),fib+1,(int)fnum); 751 mff[fib].Open(fname,MF_Write); //Reza - Ouverture conditionnel fichier 752 // Entete correspondant a l'ecriture tout le paquet - trailer compris (modif Mai 2009) 753 mff[fib].setDTypeNaxis(MF_Byte, paq0.PaquetSize(), npaqperfile); 754 } 755 fnum++; 756 // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); 757 } 758 else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum++); 759 760 for (uint_4 kmz=0; kmz<nblocperfile_; kmz++) { 761 if (stop_) break; 762 //DBG cout << " MultiDataSaver::run()- nbFile=" << nbFile << " kmz=" << kmz << endl; 763 int mid = memgr.FindMemZoneId(MemZA_Save); 764 Byte* buffg = memgr.GetMemZone(mid); 765 if (buffg == NULL) { 766 cout << " MultiDataSaver::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl; 767 setRC(2); 768 return; 769 } 770 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { // Boucle sur les fibres 771 Byte* buff = memgr.GetMemZone(mid,fib); 772 if (buff == NULL) { // Ceci ne devrait pas arriver - suite au test buffg ci-dessus 773 cout << " MultiDataSaver::run()/ERROR memgr.GetMemZone(" << mid << "," << fib << ") -> NULL" << endl; 774 setRC(2); 775 return; 776 } 777 for(uint_4 i=0; i<memgr.NbPaquets(); i++) { // boucle sur les paquets 778 BRPaquet paq(NULL, buff+i*paqsz, paqsz); 779 pcheck[fib].Check(paq); // Verification du paquet / FrameCounter 780 if (savesig_) 781 header[fib] << hex << paq.HDRMarker() << " " << paq.TRLMarker() << " " 782 << paq.TimeTag2()<< " "<< paq.TimeTag1()<< " " 783 << paq.FrameCounter() << " " << paq.PaqLen() << endl; 784 if (savesig_) // Reza - Ecriture conditionnel fichier fits signal 785 mff[fib].WriteB(paq.Header(),paq.PaquetSize()); // ecriture tout le paquet (modif Mai 2009) 786 } // Fin de la boucle sur les paquets 787 } // Fin de la boucle sur les fibres 788 memgr.FreeMemZone(mid, MemZS_Saved); 789 } // Boucle sur les blocs dans un meme fichier 790 ts.SetNow(); 791 filog << ts << " : OK data files " << endl; 792 cout << " MultiDataSaver::run() " << ts << " : OK data files " << endl; 793 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { 794 if (savesig_) { 795 if (fgnulldev) strcpy(fname,"/dev/null"); 796 else sprintf(fname,"%s/Fibre%d/signal%d.fits",path_.c_str(),fib+1,(int)fnum-1); 797 } 798 else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum-1); 799 filog << " Fib " << fib << " -> " << fname << endl; 800 cout << " Fib " << fib << " -> " << fname << endl; 801 } 802 if (savesig_) 803 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { 804 header[fib].close(); 805 mff[fib].Close(); 806 } 807 } // Fin de boucle sur les fichiers 808 cout << " -------------------- MultiDataSaver::run() -------------------- " << endl; 809 for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) { 810 cout << " MultiDataSaver/Summary Fib " << fib << endl; 811 pcheck[fib].Print(cout); 812 filog << " MultiDataSaver/Summary Fib " << fib << endl; 813 pcheck[fib].Print(filog); 814 } 815 cout << " ---------------------------------------------------------- " << endl; 816 ts.SetNow(); 817 filog << " MultiDataSaver::run() - End of processing/run() " << ts << endl; 818 819 } 820 catch (MiniFITSException& exc) { 821 cout << " MultiDataSaver::run()/catched MiniFITSException " << exc.Msg() << endl; 822 setRC(3); 823 return; 824 } 825 catch(...) { 826 cout << " MultiDataSaver::run()/catched unknown ... exception " << endl; 827 setRC(4); 828 return; 829 } 830 setRC(0); 831 return; 832 } 833 -
trunk/AddOn/TAcq/racqurw.h
r3628 r3658 22 22 23 23 24 // Quelques definitions globales 25 // Nombre maximum de fibres geres par les classes MultiReader / MultiDiskWriter 26 #define MAXNBFIB 4 24 27 25 28 //------------------------------------------------------- … … 89 92 class PCIEReaderChecker : public ZThread { 90 93 public: 91 PCIEReaderChecker( PCIEWrapperInterface &pciw , uint_4 sizeFrame,uint_4 paqSize ,RAcqMemZoneMgr& mem,94 PCIEReaderChecker( PCIEWrapperInterface &pciw , uint_4 sizeFrame,uint_4 paqSize, RAcqMemZoneMgr& mem, 92 95 uint_4 nmax=100, BRDataFmtConv swapall=BR_SwapAll); 93 96 virtual void run(); … … 103 106 uint_4 packSize_; 104 107 }; 108 //------------------------------------------------------------------ 109 // Classe thread de lecture PCI-Express multi fibre (ou multi DMA) 110 //------------------------------------------------------------------ 111 112 class PCIEMultiReader : public ZThread { 113 public: 114 PCIEMultiReader( vector<PCIEWrapperInterface*> vec_pciw , uint_4 sizeFrame,uint_4 paqSize, RAcqMemZoneMgr& mem, 115 uint_4 nmax=100, BRDataFmtConv swapall=BR_SwapAll,int binMin=0, int nbBin=0); 116 virtual void run(); 117 void Stop(); 118 inline void STOP() { stop_ = true; } 119 120 protected: 121 // Permet d'avancer d'un paquet dans la zone - renvoie true si probleme 122 inline bool MoveToNextTarget() { 123 if ((mmbuf_ == NULL )||(targ_npaq_ >= max_targ_npaq)) 124 if (MZoneManage()) return true; 125 targ_npaq_++; 126 return false; 127 } 128 inline Byte* GetPaquetTarget(int numfib) { 129 if ((mmbufib_[numfib] == NULL )||(targ_npaq_ > max_targ_npaq)||(targ_npaq_ == 0)) return NULL; 130 Byte* rb=mmbufib_[numfib]+(targ_npaq_-1)*packSizeInMgr_; 131 return rb; 132 } 133 bool MZoneManage(bool clean=false); // Renvoie true si probleme 134 135 RAcqMemZoneMgr& memgr; 136 uint_4 nmax_; // Nombre maxi de blocs MemZone traites 137 BRDataFmtConv swapall_; // select data swap/format conversion for BRPaquet 138 bool stop_; 139 unsigned int sizeFr_ ; 140 vector<PCIEWrapperInterface *> vec_pciw_; 141 uint_4 packSize_; 142 uint_4 packSizeInMgr_; 143 uint_4 nbDma_; 144 int nbBin_; 145 int binMin_; 146 int mid_; // Identificateur zone memoire 147 uint_4 targ_npaq_; // Numero de paquet dans une seule zone memoire 148 uint_4 max_targ_npaq; // = mmgr.NbPaquets() = Max de targ_npaq_ 149 Byte* mmbuf_; // Pointeur zone memoire rendu par RAcqMemZoneMgr 150 Byte* mmbufib_[MAXNBFIB]; // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr 151 152 }; 153 154 155 156 //---------------------------------------------------------------------------------------- 157 // Classe thread de sauvegarde sur fichiers - gerant plusieurs fibres dans RAcqMemZoneMgr 158 //---------------------------------------------------------------------------------------- 159 160 class MultiDataSaver : public ZThread { 161 public: 162 MultiDataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nfiles=100, uint_4 nblocperfile=1, bool savesig=true); 163 164 virtual void run(); 165 void Stop(); 166 inline void STOP() { stop_ = true; } 167 protected: 168 RAcqMemZoneMgr& memgr; 169 uint_4 nfiles_; // Nombre maxi de fichiers cree 170 uint_4 nblocperfile_; // Nombre de bloc (zone memoire) mis dans un fichier 171 uint_4 nmax_; // Nombre maxi de blocs MemZone traites = nfiles * nblocperfile_ 172 bool savesig_; // Si false, pas d'ecriture des fichiers FITS du signal 173 bool stop_; 174 string path_; 175 struct sigaction act; 176 177 }; 105 178 106 179 #endif -
trunk/AddOn/TAcq/tstminifits.cc
r3542 r3658 58 58 mff.setDTypeNaxis(MF_Float32, sx, sy); 59 59 mff.Open("tmf.fits", MF_Write); 60 // Exemple d'ajout d'information dans l'entete FITS 61 mff.AddKeyI("CleI_A", 12); 62 mff.AddKeyD("CleD_B", 3.1415, " Valeur de Pi"); 63 mff.AddKeyS("CleS_C", "Prog. tstminifits", " Cle de type string"); 64 // Ajout de date-heure dans l'entete FITS 65 TimeStamp tsc; 66 string cdtu=tsc.ToString(); 67 mff.AddKeyS("DATEOBS", cdtu.c_str(), " Observation Time (YYYY-MM-DDThh:mm:ss UT) "); 60 68 mff.WriteI(ta.Data(), sx*sy); 61 69 } … … 65 73 mff.setDTypeNaxis(MF_Int16, sx, sy); 66 74 mff.Open("tmf2.fits", MF_Write); 75 TimeStamp tsc; 76 string cdtu=tsc.ToString(); 77 mff.AddKeyS("DATE", cdtu.c_str(), " File Creation time(YYYY-MM-DDThh:mm:ss UT) "); 67 78 mff.WriteF(arr.Data(), sx*sy); 68 79 }
Note:
See TracChangeset
for help on using the changeset viewer.