| 1 | // toillsstproducer.cc
 | 
|---|
| 2 | // Eric Aubourg         CEA/DAPNIA/SPP   octobre 1999
 | 
|---|
| 3 | 
 | 
|---|
| 4 | #include "toillsstproducer.h"
 | 
|---|
| 5 | #include "archfileset.h"
 | 
|---|
| 6 | #include "toimanager.h"
 | 
|---|
| 7 | #include "requesthandler.h"
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #define sstChannel    "sstChannel"
 | 
|---|
| 10 | #define sstChannelCN  "sstChannelCN"
 | 
|---|
| 11 | #define sstDiode      "sstDiode"
 | 
|---|
| 12 | #define sstDiodeCN    "sstDiodeCN"
 | 
|---|
| 13 | 
 | 
|---|
| 14 | // diodpermut[i] = channel de la diode i
 | 
|---|
| 15 | // int TOILLSSTProducer::diodpermut[46]=
 | 
|---|
| 16 | //  { 8,24,40, 9,25,41,10,26,42,11,
 | 
|---|
| 17 | //   27,43,16,32, 1,17,33, 2,18,34,
 | 
|---|
| 18 | //    3,19,35,12,28,44,13,29,45,14,
 | 
|---|
| 19 | //   30,46,15,31,47,20,36, 5,21,37,
 | 
|---|
| 20 | //    6,22,38, 7,23,39};
 | 
|---|
| 21 | int TOILLSSTProducer::diodpermut[46]=
 | 
|---|
| 22 |  { 8,24,40, 9,25,41,10,26,42,11,
 | 
|---|
| 23 |   27,43,16,32, 1,17,33, 2,18,34,
 | 
|---|
| 24 |    3,19,35,12,28,44,13,29,45,14,
 | 
|---|
| 25 |   30,46,15,31,47,20,36, 5,21,37,
 | 
|---|
| 26 |    6,38,22, 7,23,39};
 | 
|---|
| 27 |  // voies 0 et 4 non connectees, voie 1 en panne.
 | 
|---|
| 28 | 
 | 
|---|
| 29 | 
 | 
|---|
| 30 | TOILLSSTProducer::TOILLSSTProducer()
 | 
|---|
| 31 | {
 | 
|---|
| 32 |   possibleTOIs.insert(TOI(sstChannel,       TOI::all, "", "ADU"));  
 | 
|---|
| 33 |   possibleTOIs.insert(TOI(sstChannelCN,     TOI::all, "", "ADU"));
 | 
|---|
| 34 |   possibleTOIs.insert(TOI(sstDiode,         TOI::all, "", "ADU"));  
 | 
|---|
| 35 |   possibleTOIs.insert(TOI(sstDiodeCN,       TOI::all, "", "ADU"));
 | 
|---|
| 36 | }
 | 
|---|
| 37 | 
 | 
|---|
| 38 | string TOILLSSTProducer::getName() {
 | 
|---|
| 39 |   return("TOILLSSTProducer 1.0");
 | 
|---|
| 40 | }
 | 
|---|
| 41 | 
 | 
|---|
| 42 | 
 | 
|---|
| 43 | void TOILLSSTProducer::registerProcessor(SSTDataProcessor* p) {
 | 
|---|
| 44 |   processors.push_back(p);
 | 
|---|
| 45 | }
 | 
|---|
| 46 | 
 | 
|---|
| 47 | void TOILLSSTProducer::DecodeTMBlock(block_type_sst* blk, int i, int* diod)
 | 
|---|
| 48 | {
 | 
|---|
| 49 |   int j; // 0-5 : numero du bloc de 8 diodes
 | 
|---|
| 50 |   int k; // 0-2 : indice du bloc de 4 bits (une diode = 12 bits = 3 blocs de 4 bits)
 | 
|---|
| 51 |   int l; // 0-7 : indice de la diode dans son bloc (8 diodes * 4 bits = 1 mot de 32 bits)
 | 
|---|
| 52 |   
 | 
|---|
| 53 |   // numero de la diode (0-47) = j*8+l;
 | 
|---|
| 54 |   // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
 | 
|---|
| 55 |   // indice dans mot de 32 bits du premier bit utile = 4*l;
 | 
|---|
| 56 |     
 | 
|---|
| 57 |   for (j=0; j<48; j++) diod[j] = 0;
 | 
|---|
| 58 |   
 | 
|---|
| 59 |   for (j=0; j<6; j++)
 | 
|---|
| 60 |     for (k=0; k<3; k++)
 | 
|---|
| 61 |       for (l=0; l<8; l++) {
 | 
|---|
| 62 |         int4 word = blk->sst[i][j*3+k];
 | 
|---|
| 63 |         word = (word >> (4*l)) & 0xF;
 | 
|---|
| 64 |         diod[j*8+l] = (diod[j*8+l] << 4) + word;
 | 
|---|
| 65 |       }
 | 
|---|
| 66 | 
 | 
|---|
| 67 |   for (j=0; j<48; j++)  diod[j] -= 2048;
 | 
|---|
| 68 | }
 | 
|---|
| 69 | 
 | 
|---|
| 70 | double TOILLSSTProducer::getSSTRawSignalCN(ArchFileSet* fs, int ichannel, int imesure) {
 | 
|---|
| 71 |   // Si pas bloc comprime -> 0.5
 | 
|---|
| 72 |   if (fs->lastSSTComp() == NULL) return .5;
 | 
|---|
| 73 |   if (numero_block(fs->lastSSTComp()) != numero_block(fs->lastSST())) return 0.5;
 | 
|---|
| 74 |   
 | 
|---|
| 75 |   // Attention, on ne transmet pas les canaux 0 et 4....
 | 
|---|
| 76 |   if (ichannel == 0 || ichannel == 4) return 0;
 | 
|---|
| 77 |   int i = ichannel - 1;
 | 
|---|
| 78 |   if (i >= 4) i--;
 | 
|---|
| 79 |   unsigned int4* data = fs->lastSSTComp()->sst[i];
 | 
|---|
| 80 |   // Les deux premieres valeurs sont codees directement...
 | 
|---|
| 81 |   if (imesure<2) return 0.5;
 | 
|---|
| 82 |   int iExp = (imesure-2)/7 + 1;
 | 
|---|
| 83 |   int expo = data[iExp] & 0xf;
 | 
|---|
| 84 |   int noise = 1 << expo;
 | 
|---|
| 85 |   return noise/2.;
 | 
|---|
| 86 | }
 | 
|---|
| 87 | 
 | 
|---|
| 88 | void TOILLSSTProducer::handleBlock(ArchFileSet* fs)
 | 
|---|
| 89 | {
 | 
|---|
| 90 |   block_type_sst* blk = fs->lastSST();
 | 
|---|
| 91 |   long sample0 = numero_block(blk)*72;
 | 
|---|
| 92 |   int channels[48];
 | 
|---|
| 93 |   int diodes[46];
 | 
|---|
| 94 |   for (int j=0; j<nb_per_block*2; j++) {
 | 
|---|
| 95 |     DecodeTMBlock(blk, j, channels);
 | 
|---|
| 96 |     for (int i=0; i<46; i++)
 | 
|---|
| 97 |       diodes[i] = channels[diodpermut[i]];
 | 
|---|
| 98 |     for (vector<SSTDataProcessor*>::iterator i = processors.begin(); 
 | 
|---|
| 99 |          i != processors.end(); i++) {
 | 
|---|
| 100 |       (*i)->dataFeed(sample0 + j, diodes);    
 | 
|---|
| 101 |     }
 | 
|---|
| 102 |     for (set<TOI>::iterator i = producedTOIs.begin(); i != producedTOIs.end(); i++) {
 | 
|---|
| 103 |       int ich = (*i).index;
 | 
|---|
| 104 |       if ((*i).name == sstChannel) {
 | 
|---|
| 105 |         computedValue((*i), sample0+j, channels[ich]);
 | 
|---|
| 106 |       } else if ((*i).name == sstDiode) {
 | 
|---|
| 107 |         computedValue((*i), sample0+j, diodes[ich]);
 | 
|---|
| 108 |       } else if ((*i).name == sstChannelCN) {
 | 
|---|
| 109 |         computedValue((*i), sample0+j, getSSTRawSignalCN(fs, ich, j));
 | 
|---|
| 110 |       } else if ((*i).name == sstDiodeCN) {
 | 
|---|
| 111 |         computedValue((*i), sample0+j, getSSTRawSignalCN(fs, diodpermut[ich], j));
 | 
|---|
| 112 |       }
 | 
|---|
| 113 |     }
 | 
|---|
| 114 |   }
 | 
|---|
| 115 | }
 | 
|---|
| 116 | 
 | 
|---|