Changeset 342 in Sophya


Ignore:
Timestamp:
Aug 2, 1999, 3:45:52 PM (26 years ago)
Author:
ansari
Message:

archtoi 2 aout 99

Location:
trunk/Poubelle/archTOI.old
Files:
18 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Poubelle/archTOI.old/archeops.c

    r315 r342  
    1 //#include "manip.h"
    2 #include <stdio.h>
    3 #include "archeops.h"
    4 
    5 
    6 /**********  coefficients  pour  les  mesures  bolo    ********************************/
    7 /*                         toutes les puissances en pW                                */
    8 /*      -1-     loi de reponse thermique des bolos  avec R en ohms et T en Kelvin     */
    9 /*                                                                                    */
    10 /*      T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                       */
    11 /*                                                                                    */
    12 /*      -2-     fuite thermique du bolo   coef 3,4                                    */
    13 /*                                                                                    */
    14 /*      Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )          */
    15 /*                                                                                    */
    16 /*      -3-     calcul empirique de Pciel et de  tau      coef  5,6                   */
    17 /*                                                                                    */
    18 /*      Pciel   =       coef5   - Pelec         coef5= I * Ai (tables xavier)         */
    19 /*      tau     =       - ln ( 1 +  Pciel / coef6 )     coef6= I * Bi (tables xavier) */
    20 /*                                                                                    */
    21 /**************************************************************************************/
    22 
    23 
    24 /**************************************************************************************/
    25 /*                                                                                    */
    26 /*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
    27 /*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
    28 /*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
    29 /*   pour les cartes modifiees : mettre diviseur=0                                    */
    30 /*                         et capa = la resistance de chage en Megohm                 */
    31 /*                                                                                    */
    32 /**************************************************************************************/
    33 
    34 
    35 /*  nom  ,  on/off  ,  0 = MLPA       , N° bolo ,  gain_pa  , capa*1000 , diviseur , coef*10000
    36 /*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     ,
    37 /*                     10 = Bediff    ,         ,           ,
    38 
    39 /* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo
    40 /*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc
    41 
    42 
    43 /*debut_param*/
    44 /*----------------------------------  fenetre :  -----------------------------------*/
    45 
    46 param_bolo  parametr={24,24,36,88,18,
    47 
    48 {
    49 { "v1-bedif1"  , 1,10,1 ,  200, 22000,  200, { 5000   , 123100 , 334200 } },           
    50 { "v1-bedif2"  , 1,10,2 ,  200, 22000,  200, { 5000    , 12.31 , 33.42          } },
    51 { "v1-bedif3"  , 1,10,3 ,  200, 22000,  200, { 5000    , 50.0 , 14.0            } },
    52 { "v1-bedif4"  , 1,10,4 ,  200, 22000,  200,  { 5000    , 12.31 , 33.42         } },
    53 { "v1-bedif5"  , 1,10,5 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42        } },
    54 { "v1-bedif6"  , 1,10,6 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42        } },
    55 
    56 { "v1-bedif7"  , 1,10,9 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                 } },
    57 { "v1-bedif8"  , 1,10,10, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                 } },
    58 { "v1-bedif9"  , 1,10,11, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                 } },
    59 { "v1-bedif10" , 1,10,12, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42                  } },
    60 { "v1-bedif11" , 1,10,13, 1000, 4700, 1000, { 5000     , 12.31 , 33.42           } },
    61 { "v1-bedif12" , 1,10,14, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                 } },
    62 
    63 { "v1-bedif13" , 1,10,17, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                 } },
    64 { "v1-bedif14" , 1,10,18, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42                  } },
    65 { "germanium"  , 3,10,19, 1000, 22000 ,    0,  { 5000      , 12.31 , 33.42               } },
    66 { "therm_4k"   , 3,10,20, 1000, 1000  ,    0,  { 5000      , 12.31 , 33.42               } },
    67 { "therm_1.6k" , 3,10,21, 1000, 1000  ,    0,  { 5000      , 12.31 , 33.42               } },
    68 { "therm_10k"  , 3,10,22, 1000, 1000  ,    0,  { 5000     , 12.31 , 33.42                } },
    69 
    70 { "v1-bedif19"  , 2,10,25 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42               } },
    71 { "v1-bedif20"  , 2,10,26, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                } },
    72 { "v1-bedif21"  , 2,10,27, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                } },
    73 { "v1-bedif22"  , 2,10,28, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42                 } },
    74 { "v1-bedif23"  , 2,10,29, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42                 } },
    75 { "v1-bedif24"  , 2,10,30, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42                } }
    76 
    77 }
    78 };
    79 /*fin_param*/
    80 
    81 
    82 
    83 /* bolos campagne 1998-1999     */
    84 /*
    85 reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,     .5                      ,519.6  , 8.286
    86 v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41               
    87 v1-232...N, 1, 0, 3, 100, 4.7, 333,             
    88 v1-237...E, 1, 0, 4, 100, 4.7, 333,
    89 
    90 reg_JamieO, 1, 0, 5, 100, 4.7, 101,
    91 
    92 V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
    93 V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
    94 V2-205...Q, 1, 0, 8, 100, 4.7, 333,     .518 , 81    , 25.2
    95 V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
    96 
    97 */
    98 /*bolos campagne 1997-1998      */
    99 /*
    100 
    101 v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42               
    102 v1-232...L, 1, 0, 2, 100, 4.7, 333,             
    103 v1-205...N, 1, 0, 3, 100, 4.7, 333,     .518 , 81    , 25.2     
    104 v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,     .5                      ,519.6  , 8.286
    105 Jamie....O, 1, 0, 5, 100, 4.7, 101,
    106 V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
    107 V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
    108 V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
    109 V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
    110 
    111 */
    112 
    113 
    114 
    115 
    116 
    117 /*debut_nom_reglage*/
    118 /* 0->aa*/
    119 /* 1->bb*/
    120 /* 2->cc*/
    121 /* 3->reglage 3  */
    122 /* 4->reglage 4  */
    123 /* 5->reglage 5  */
    124 /* 6->reglage 6  */
    125 /* 7->reglage 7  */
    126 /*fin_nom_reglage*/
    127 
    128 
    129 
    130 
    131 
    132 
    133 
    134 reglage_bolo  reglage_standard[8]={{
    135 
    136 
    137 /*debut reglage 0 */
    138 {30,76,9,1},
    139 {0
    140 ,10
    141 ,1
    142 ,3
    143 ,10
    144 ,2
    145 ,0
    146 ,0
    147 ,1
    148 ,0
    149 ,0
    150 ,0
    151 ,0
    152 ,0
    153 ,0
    154 ,0
    155 ,0
    156 ,0
    157 ,0
    158 ,0
    159 },{
    160 {22,100663296}
    161 ,{-100646890,1}
    162 ,{-100646890,1}
    163 ,{22,0}
    164 ,{-100638698,1}
    165 ,{22,253952}
    166 ,{-100646890,1}
    167 ,{22,0}
    168 ,{-100646890,1}
    169 ,{-100646890,1}
    170 ,{22,0}
    171 ,{235388950,221185}
    172 ,{20,0}
    173 ,{20,0}
    174 ,{16406,0}
    175 ,{24598,0}
    176 ,{22,0}
    177 ,{24598,0}
    178 },{
    179 {1,22,0,1}
    180 ,{0,20,0,1}
    181 ,{0,20,0,1}
    182 ,{0,20,0,1}
    183 ,{0,20,0,1}
    184 ,{0,20,0,1}
    185 },{
    186 {0,1,9,1,0,0,0}
    187 ,{0,1,9,1,0,0,0}
    188 ,{0,1,9,1,0,0,0}
    189 ,{0,1,9,1,0,0,0}
    190 },{0,0,0,0,0,0,0,0}
    191 /*fin_reglage*/
    192 
    193 },{
    194 
    195 /*debut reglage 1 */
    196 {30,76,9,1},
    197 {0
    198 ,10
    199 ,1
    200 ,3
    201 ,10
    202 ,2
    203 ,0
    204 ,0
    205 ,1
    206 ,0
    207 ,0
    208 ,0
    209 ,0
    210 ,0
    211 ,0
    212 ,0
    213 ,0
    214 ,0
    215 ,0
    216 ,0
    217 },{
    218 {22,100663296}
    219 ,{-100646890,1}
    220 ,{-100646890,1}
    221 ,{22,0}
    222 ,{-100638698,1}
    223 ,{22,253952}
    224 ,{-100646890,1}
    225 ,{22,0}
    226 ,{-100646890,1}
    227 ,{-100646890,1}
    228 ,{22,0}
    229 ,{235388950,221185}
    230 ,{20,0}
    231 ,{20,0}
    232 ,{16406,0}
    233 ,{24598,0}
    234 ,{22,0}
    235 ,{24598,0}
    236 },{
    237 {1,22,0,1}
    238 ,{0,20,0,1}
    239 ,{0,20,0,1}
    240 ,{0,20,0,1}
    241 ,{0,20,0,1}
    242 ,{0,20,0,1}
    243 },{
    244 {0,1,9,1,0,0,0}
    245 ,{0,1,9,1,0,0,0}
    246 ,{0,1,9,1,0,0,0}
    247 ,{0,1,9,1,0,0,0}
    248 },{0,0,0,0,0,0,0,0}
    249 /*fin_reglage*/
    250 
    251 },{
    252 
    253 /*debut reglage 2 */
    254 {31,76,9,0},
    255 {0
    256 ,-14
    257 ,-31
    258 ,-63
    259 ,-83
    260 ,-103
    261 ,-122
    262 ,127
    263 ,1
    264 ,97
    265 ,14
    266 ,-32
    267 ,-93
    268 ,-87
    269 ,-72
    270 ,-80
    271 ,-101
    272 ,-112
    273 ,-113
    274 ,-121
    275 },{
    276 {22,100663296}
    277 ,{1040629782,204800}
    278 ,{1040834582,221184}
    279 ,{22,0}
    280 ,{-100450282,2}
    281 ,{22,253952}
    282 ,{-100458474,2}
    283 ,{22,0}
    284 ,{-100442090,2}
    285 ,{-100253674,253954}
    286 ,{22,0}
    287 ,{303013910,221184}
    288 ,{20,0}
    289 ,{20,0}
    290 ,{9238,0}
    291 ,{24598,301989888}
    292 ,{22,0}
    293 ,{24598,0}
    294 ,{0,0}
    295 ,{0,0}
    296 ,{0,0}
    297 ,{0,0}
    298 ,{0,0}
    299 ,{0,0}
    300 },{
    301 {-15,-9,-13,-38}
    302 ,{-83,-109,-90,-68}
    303 ,{-99,-101,-67,-61}
    304 ,{-64,-60,-38,-19}
    305 ,{-28,-57,-77,-75}
    306 ,{-66,-55,-51,-68}
    307 },{
    308 {31,76,9,0,0,-35,-4643}
    309 ,{-55,-77,-69,-55,-44,-43,-12336}
    310 ,{-56,-85,-128,99,111,-116,-28030}
    311 ,{105,107,101,101,106,111,31615}
    312 },{-102,-88,-94,-113,-126,101,73,70}
    313 /*fin_reglage*/
    314 
    315 },{
    316 
    317 /*debut reglage 3 */
    318 {31,76,9,0},
    319 {0
    320 ,-14
    321 ,-31
    322 ,-63
    323 ,-83
    324 ,-103
    325 ,-122
    326 ,127
    327 ,1
    328 ,99
    329 ,13
    330 ,96
    331 ,-93
    332 ,-87
    333 ,-72
    334 ,-80
    335 ,-101
    336 ,-112
    337 ,-113
    338 ,-121
    339 },{
    340 {22,100663296}
    341 ,{1040629782,204800}
    342 ,{1040834582,221184}
    343 ,{22,0}
    344 ,{-100450282,2}
    345 ,{22,253952}
    346 ,{-100458474,2}
    347 ,{22,0}
    348 ,{-100442090,2}
    349 ,{-100253674,253954}
    350 ,{22,0}
    351 ,{303013910,221184}
    352 ,{20,0}
    353 ,{20,0}
    354 ,{9238,0}
    355 ,{24598,301989888}
    356 ,{22,0}
    357 ,{24598,0}
    358 ,{0,0}
    359 ,{0,0}
    360 ,{0,0}
    361 ,{0,0}
    362 ,{0,0}
    363 ,{0,0}
    364 },{
    365 {-15,-9,-13,-38}
    366 ,{-83,-109,-90,-68}
    367 ,{-99,-101,-67,-61}
    368 ,{-64,-60,-38,-19}
    369 ,{-28,-57,-77,-75}
    370 ,{-66,-55,-51,-68}
    371 },{
    372 {31,76,9,0,0,-35,-4643}
    373 ,{-55,-77,-69,-55,-44,-43,-12336}
    374 ,{-56,-85,-128,99,111,-116,-28030}
    375 ,{105,107,101,101,106,111,31615}
    376 },{-102,-88,-94,-113,-126,101,73,70}
    377 /*fin_reglage*/
    378 
    379 },{
    380 
    381 /*debut reglage 4 */
    382 {31,76,9,0},
    383 {0
    384 ,-14
    385 ,-31
    386 ,-63
    387 ,-83
    388 ,-103
    389 ,-122
    390 ,127
    391 ,1
    392 ,99
    393 ,13
    394 ,112
    395 ,-93
    396 ,-87
    397 ,-72
    398 ,-80
    399 ,-101
    400 ,-112
    401 ,-113
    402 ,-121
    403 },{
    404 {22,100663296}
    405 ,{1040629782,204800}
    406 ,{1040834582,221184}
    407 ,{22,0}
    408 ,{-100450282,2}
    409 ,{22,253952}
    410 ,{-100458474,2}
    411 ,{22,0}
    412 ,{-100442090,2}
    413 ,{-100253674,253954}
    414 ,{22,0}
    415 ,{303013910,221184}
    416 ,{20,0}
    417 ,{20,0}
    418 ,{9238,0}
    419 ,{24598,301989888}
    420 ,{22,0}
    421 ,{24598,0}
    422 ,{0,0}
    423 ,{0,0}
    424 ,{0,0}
    425 ,{0,0}
    426 ,{0,0}
    427 ,{0,0}
    428 },{
    429 {-15,-9,-13,-38}
    430 ,{-83,-109,-90,-68}
    431 ,{-99,-101,-67,-61}
    432 ,{-64,-60,-38,-19}
    433 ,{-28,-57,-77,-75}
    434 ,{-66,-55,-51,-68}
    435 },{
    436 {31,76,9,0,0,-35,-4643}
    437 ,{-55,-77,-69,-55,-44,-43,-12336}
    438 ,{-56,-85,-128,99,111,-116,-28030}
    439 ,{105,107,101,101,106,111,31615}
    440 },{-102,-88,-94,-113,-126,101,73,70}
    441 /*fin_reglage*/
    442 
    443 },{
    444 
    445 /*debut reglage 5 */
    446 {31,76,9,0},
    447 {0
    448 ,-14
    449 ,-31
    450 ,-63
    451 ,-83
    452 ,-103
    453 ,-122
    454 ,127
    455 ,1
    456 ,97
    457 ,14
    458 ,-80
    459 ,-93
    460 ,-87
    461 ,-72
    462 ,-80
    463 ,-101
    464 ,-112
    465 ,-113
    466 ,-121
    467 },{
    468 {22,100663296}
    469 ,{1040629782,204800}
    470 ,{1040834582,221184}
    471 ,{22,0}
    472 ,{-100450282,2}
    473 ,{22,253952}
    474 ,{-100458474,2}
    475 ,{22,0}
    476 ,{-100442090,2}
    477 ,{-100253674,253954}
    478 ,{22,0}
    479 ,{303013910,221184}
    480 ,{20,0}
    481 ,{20,0}
    482 ,{9238,0}
    483 ,{24598,301989888}
    484 ,{22,0}
    485 ,{24598,0}
    486 ,{0,0}
    487 ,{0,0}
    488 ,{0,0}
    489 ,{0,0}
    490 ,{0,0}
    491 ,{0,0}
    492 },{
    493 {-15,-9,-13,-38}
    494 ,{-83,-109,-90,-68}
    495 ,{-99,-101,-67,-61}
    496 ,{-64,-60,-38,-19}
    497 ,{-28,-57,-77,-75}
    498 ,{-66,-55,-51,-68}
    499 },{
    500 {31,76,9,0,0,-35,-4643}
    501 ,{-55,-77,-69,-55,-44,-43,-12336}
    502 ,{-56,-85,-128,99,111,-116,-28030}
    503 ,{105,107,101,101,106,111,31615}
    504 },{-102,-88,-94,-113,-126,101,73,70}
    505 /*fin_reglage*/
    506 
    507 },{0
    508 
    509 /*debut reglage 6 */
    510 /*fin_reglage*/
    511 
    512 },{0
    513 
    514 /*debut reglage 7 */
    515 /*fin_reglage*/
    516 
    517 } };
    518 
    519 /* ------------------------------------   corps  des fonctions   ------------------------------ */
    520 /* -------------------------------------------------------------------------------------------- */
    521 
    522 
    523 
    524 unsigned long   val_long(char x)
    525 {
    526 unsigned long a,xl;
    527 a=x-2;  if(x<3)  xl=x;  else    xl=((a&1) + 2)<<(a>>1);
    528 return(xl);
    529 }
    530 
    531 
    532 double  val_double(char x)
    533 {
    534 unsigned long a,xl;
    535 if(x<0) x=-x;   a=x;    if(!a)  xl=0;   else    xl=((a&1) + 2)<<(a>>1);
    536 if(x>0) return(1e-4*(double)xl);        else    return(-1e-4*(double)xl);
    537 }
    538 
    539 int     new_val_dac(int a,char  code)
    540 {
    541 if(code&0x80)   a=(code&0x7f) <<5 ;
    542 else    {
    543         if(code&0x40)   a+=code&0x3f;   
    544         else            a-=code&0x3f;   
    545         }
    546 return(a);
    547 }
    548 
    549 
    550 
    551 
    552 int     calcul_somme_block(block_type_modele* blk,int longueur)
    553 {
    554 int i,so=0;;
    555 for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
    556 /* somme sur tous les mots internes     : on exclus le dbut, les codes et la fin        */
    557 return((so^(so>>16))&0xffff);
    558 }
    559 
    560 
    561 
    562 
    563 void  valide_block(block_type_modele* blk,int type,int block_num)
    564 {
    565 int somme,longueur;
    566 def_long_block
    567 longueur=long_block[type];
    568 /*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
    569 /*              ,(unsigned)blk,type,block_num,longueur);*/
    570 blk->debut              =       debut_block_mesure;
    571 blk->code2              =       (((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
    572 
    573 blk->mot[longueur/4-4]  =       fin_block_mesure;
    574 somme=calcul_somme_block(blk,longueur);
    575 blk->code1              =       (((long)longueur)<<16)  |       somme;
    576 }
    577 
    578 
    579 /* Quand on est sur une machine swappee, on ne cherche pas a verifier */
    580 /* le checksum, puisqu'on a modifie les blocs, sans swapper par exemple */
    581 /* les chars des noms de bolometres et des chaines GPS... */
    582 #ifdef __alpha
    583 #define SWAP
    584 #endif
    585 #if defined(Linux)  || defined(linux)
    586 #define SWAP
    587 #endif
    588 
    589 int  verifie_block(block_type_modele* blk)
    590 {
    591 int type,lg,som;
    592 def_long_block
    593 if(blk->debut != debut_block_mesure)                                    return(block_debut_erreur);
    594 type=type_block(blk);           if( (type<0) ||(type>=nb_type_blocks) ) return(block_type_inconnu);     
    595 lg=longueur_block(blk);         if( lg != long_block[type] )            return(block_longueur_erreur); 
    596 if( blk->mot[(lg/4)-4]  !=      fin_block_mesure)                       return(block_fin_erreur);       
    597 #ifndef SWAP
    598 som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))             return(block_somme_erreur);
    599 #endif
    600 return(block_correct);
    601 }
    602 
    603 
    604 int  verifie_block_printf(block_type_modele* blk)
    605 {
    606 int type,lg,som;
    607 def_long_block
    608 def_nom_block
    609 if(blk->debut != debut_block_mesure)
    610         {
    611         printf(" erreur dans le code debut de block      \n");
    612         return(block_debut_erreur);
    613         }       
    614 
    615 type=type_block(blk);
    616 if( (type<0) || (type>nb_type_blocks) )
    617         {
    618         printf(" block de type %d  inconnu\n",type);
    619         return(block_type_inconnu);
    620         }
    621 
    622 lg=longueur_block(blk);
    623 if( lg!=long_block[type] )     
    624         {
    625         printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
    626                         ,nom_block[type],long_block[type],lg);
    627         return(block_longueur_erreur);
    628         }
    629 
    630 som=calcul_somme_block(blk,lg);
    631 if( som!=somme_block(blk) )     
    632         {
    633         printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
    634                         ,nom_block[type],som,somme_block(blk) );
    635         return(block_somme_erreur);
    636         }
    637        
    638 if(blk->mot[(lg/4)-4]   != fin_block_mesure)   
    639         {
    640         printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
    641                         ,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
    642         return(block_fin_erreur);
    643         }
    644 
    645 return(block_correct);
    646 }
    647 
    648 
    649 
    650 
    651 
    652 
    653 
     1#include "archeops_28.c"
  • trunk/Poubelle/archTOI.old/archeops.h

    r319 r342  
    1 
    2 /*======================================================================*/
    3 /*                                                                      */
    4 /*               archeops.h  :  structure de données                    */
    5 /*                                                                      */
    6 /*======================================================================*/
    7 
    8 #define         _archeops
    9 #define         version_num             24
    10 
    11 
    12 /*======================================================================*/
    13 /*                                                                      */
    14 /*                      historique des modifications                    */
    15 /*                                                                      */
    16 /*                                                                      */
    17 /*  VERSION 24:                                                         */
    18 /*                                                                      */
    19 /*      - utilise le fichier archeops.c                                 */
    20 /*      - nb_max_bolo=24  avec nb_bolo_util=18                          */
    21 /*      - change la structure du block dilution                         */
    22 /*                                                                      */
    23 /*                                                                      */
    24 /*                                                                      */
    25 /*                                                                      */
    26 /*======================================================================*/
    27 
    28 
    29 /*======================================================================*/
    30 /*  ---------------  parametres generaux de definition   -------------  */
    31 /*======================================================================*/
    32 
    33 #ifndef int4
    34 #ifdef __alpha
    35 #define int4 int
    36 #undef programme
    37 #else
    38 #define int4 long
    39 #endif
    40 #endif
    41 
    42 #ifdef linux
    43 #undef programme
    44 #endif
    45 
    46 #ifdef  _planck
    47 #define _archeops
    48 #define _trapani
    49 #define _sans_transputer
    50 #endif
    51 
    52 #ifdef  _archeops
    53 /*#define _test_diabolo  relecture des blocks fabriques avec diabolo    */
    54 #define _trapani                /*  configuration  prevue pour Trapani  */
    55 /*#define _kiruna                 block standard prevu pour kiruna      */
    56 #endif
    57 
    58 
    59 
    60 /*======================================================================*/
    61 /*  --------------      valeurs des parametres dans     -------------   */
    62 /*  --------------      les différentes configurations  -------------   */
    63 /*======================================================================*/
    64 /*                                                                      */
    65 /*  configuration pour Trapani : 3 bebos  /  12 bolos                   */
    66 /*                                                                      */
    67 /*  bebo1 :   voies  1  à  6    -->  bolo  1 a  6                       */
    68 /*  bebo2 :   voies  9  à  14   -->  bolo  7 à 12                       */
    69 /*                                                                      */
    70 /*  bebo6 :                                                             */
    71 /*      voies  41 42 43 44      =  carte simplifiee avec AMP01          */
    72 /*      voies  45 et 46         = chauffage pour regulation             */   
    73 /*      on ecrira plus tard le stockage des donnees simplifiees         */
    74 /*                                                                      */
    75 /*                                                                      */
    76 /*======================================================================*/
    77 
    78 /*      nb_per_block    doit etre divisible par 2                                               */
    79 /*      nb_max_bolo     doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )     */
    80 /*      nb_bolo_util    doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )     */
    81 
    82 
    83 #ifdef  _trapani
    84 #define nb_max_bolo             24      /*  nombre maxi de bolos                                */
    85 #define nb_bolo_util            18      /*  nombre de bolos réellement transmis                 */
    86 #define nb_per_block            36      /*  nombre de periodes entieres dans un block           */
    87 #define nb_max_mes_per          88      /*  nb de points maxi dans une periode complete         */
    88 #define nb_photo_diodes         46      /*  nb de canaux de mesure du senseur stellaire         */
    89 #endif
    90 
    91 #ifdef  _kiruna
    92 #define nb_max_bolo             36      /*  nombre maxi de bolos                                */
    93 #define nb_bolo_util            32      /*  nombre de bolos réellement transmis                 */
    94 #define nb_per_block            36      /*  nombre de periodes entieres dans un block           */
    95 #define nb_max_mes_per          88      /*  nb de points maxi dans une periode complete         */
    96 #define nb_photo_diodes         46      /*  nb de canaux de mesure du senseur stellaire         */
    97 #endif
    98 
    99 
    100 #ifdef  _diabolo
    101 #define nb_max_bolo             9       /*  nombre maxi de bolos                                */
    102 #define nb_bolo_util            9       /*  nombre de bolos réellement transmis                 */
    103 #define nb_per_block            20      /*  nombre de periodes entieres dans un block           */
    104 #define nb_max_mes_per          128     /*  nb de points maxi dans une periode complete         */
    105 #define nb_photo_diodes         0       /*  nb de canaux de mesure du senseur stellaire         */
    106 #endif
    107 
    108 #ifdef  _test_diabolo
    109 #define nb_max_bolo             9       /*  nombre maxi de bolos                                */
    110 #define nb_bolo_util            9       /*  nombre de bolos réellement transmis                 */
    111 #define nb_per_block            20      /*  nombre de periodes entieres dans un block           */
    112 #define nb_max_mes_per          128     /*  nb de points maxi dans une periode complete         */
    113 #define nb_photo_diodes         0       /*  nb de canaux de mesure du senseur stellaire         */
    114 #endif
    115 
    116 
    117 #ifdef  _sans_transputer
    118 #define nb_byte_mot             5       /*  nombre d'octets dans un mot d'acquisition planck    */
    119 #else
    120 #define nb_byte_mot             8       /*  nombre d'octets dans un mot d'acquisition archeops  */
    121 #endif
    122 
    123 #define nb_sync                 6       /*  nombre de signaux de synchro                        */
    124 #define nb_element_catalog      256     /* nombre d'éléments catalog par reponse enregistreur   */
    125 
    126 
    127 #ifdef  transmet_data_brute
    128 #define         taille_maxi_block_archeops      sizeof(block_type_data_brute)
    129 #else                                   /*      le plus gros des différents blocks de télémesure*/
    130 #define         taille_maxi_block_archeops      sizeof(block_type_bolo)
    131 #endif
    132 
    133 #define         nombre_de_regul         4
    134 #define         nombre_de_voies         6
    135 #define         nb_type_blocks          20      /*  nombre de type de blocks (multiple de 4)    */
    136 
    137 
    138 /*======================================================================*/
    139 /*  -------     codes  de  controle  pour  la  transmission    -----    */
    140 /*=======================   télécommande      ==========================*/
    141 /*======================================================================*/
    142 
    143 
    144 /*   --------------   codes de reconnaissance des paquets de télécommande       --------------   */   
    145 
    146 #define         debut_telecommande              0x23456789
    147 #define         fin_telecommande                0x98765432
    148 
    149 /*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops   --------------   */   
    150 
    151 #define         tc_dir_transputer               1
    152 #define         tc_dir_reset_epld               3
    153 
    154 /*  -------------  codes  des  prefix des  telecommandes traités le transputer  --------------   */
    155 
    156 #define         tc_horloge                      255     /* (-1) */
    157 #define         tc_cadence1                     128
    158 #define         tc_cadence2                     129
    159 #define         tc_cadence3                     130
    160 #define         tc_regul                        251     /* (-5) */
    161 #define         tc_switch_dil                   250
    162 #define         tc_dac_dil                      249
    163 
    164 /*======================================================================*/
    165 /*      telecommande reduite  sur 18 bit                                */
    166 /*======================================================================*/
    167 
    168 /*______________________________________________________________________________________________*/
    169 /*      1er mot :       code de debut de telecommande reduite                                   */
    170 #define         tc_reduite                      248     
    171 /*______________________________________________________________________________________________*/
    172 /*      2eme mot:       4bit:   16 codes  de direction  tc2                                     */
    173 enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
    174         ,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
    175         ,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution};                   /* 11 codes: reste 5 disponibles*/
    176 
    177 
    178 /*______________________________________________________________________________________________*/
    179 /*      3eme mot:       6bit:                                                                   */
    180 
    181 /*      code2=dac-gain-voie     :       numero de bolo                                          */
    182 
    183 /*      code2=tc2_horloge       :                                                               */
    184 /*              soit un code defini                                                             */
    185 /*              soit le code tc3_vitesse+i avec i=0.. nb_type_block                             */
    186 enum{tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag,tc3_vitesse};
    187 #define tc3_suite       tc3_vitesse+nb_type_block
    188 
    189 
    190 /*      code2=tc2_regul :                                                                       */
    191 
    192 
    193 /*      code2=tc2_auto_bolo     :                                               */
    194 
    195 
    196 /*      code2=tc2_auto_dilu     :                                               */
    197 /*      les valeurs des parametres d'auto_dilu ne depassent pas 128             */
    198 
    199 
    200 /*      code2=tc2_dilution      :                                               */
    201 
    202 
    203 /*______________________________________________________________________________*/
    204 /*      4eme mot:       8bit:   valeur a ecrire                 */             
    205 
    206 
    207 /*======================================================================*/
    208 /*  -------     codes  de  controle  pour  la  transmission    -----    */
    209 /*=========================   télémesure    ============================*/
    210 /*======================================================================*/
    211 
    212 /*   -------   codes de reconnaissance des paquets de télémesure        */   
    213 
    214 #define         debut_block_mesure              ((int4)0x45627491)
    215 #define         fin_block_mesure                ((int4)0x83260432)
    216 
    217 
    218 
    219 
    220 
    221 /*======================================================================*/
    222 /*  ------------------------------------------------------------------  */
    223 /*  ---------   Les  formats  des  blocks  type   ARCHEOPS      ------- */
    224 /*  ------------------------------------------------------------------  */
    225 /*======================================================================*/
    226 
    227 
    228 
    229 /*==============================================================================================*/
    230 
    231 /*      Le tableau est lut dans le desordre par le mac en lecture de la carte pci :             */
    232 
    233 /*      Les entiers long sont ecrits tels quels                                                 */
    234 /*      Les short sont ecrits permuté 2 a 2 par le tansputer                                    */
    235 /*      Les tables char sont ecrits permuté 4 / 4 par le transputer                             */
    236 /*      A la lecture dans le mac, tout est bon                                                  */
    237 
    238 
    239 /*  ---------    structures N° 0 :   parametres de mesure des bolometres        -------------   */
    240 /*  -----------------------------------------------------------------------------------------   */
    241 
    242 typedef struct 
    243         {
    244         char            bolo_nom[32];           /*  le nom de chaque bolometre                  */
    245         int4            bolo_code_util;         /*  le code d'utilisation du bolo               */
    246         int4            bolo_bebo;              /*  le type d'acquisition:  0 pour MLPA 10 pour BEBODIFF */
    247         int4            bolo_num;               /*  l'adresse hard du bolo                      */
    248         int4            bolo_gain;              /*  le gain du preampli                         */
    249         int4            bolo_capa;              /*  la valeur capa du modulateur                */
    250         int4            bolo_diviseur;          /*  le diviseur de la compensation              */
    251         int4            coef[7];                /*  les coef pour le calcul de la température   */
    252         }
    253         param_un_bolo;
    254 /* code_util des bolos  */
    255 enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
    256 
    257        
    258 typedef struct          /*              table des parametres de mesure bolometre                */
    259                         /*      cette table ne change pas (en principe) en cours de mesure      */
    260         {
    261         int4            numero_version;                 /*  numero de version du header archeops.h      */
    262         int4            n_max_bolo;                     /*  nombre maxi de bolos  (divisible par 4)     */
    263         int4            n_per_block;                    /*  nombre de periodes entieres dans un block   */
    264         int4            n_max_mes_per;                  /*  nb de points maxi dans une periode complete */
    265 
    266         int4            nb_bolo;                        /*  nombre de bolometres effectivement lut      */
    267         param_un_bolo   bolo[nb_max_bolo];
    268         }
    269         param_bolo;
    270        
    271        
    272        
    273        
    274 /*     
    275         long            bolo_code_util[nb_max_bolo];   
    276         char            bolo_nom[nb_max_bolo][32];     
    277 
    278         long            bolo_bebo[nb_max_bolo];         
    279         long            bolo_num[nb_max_bolo];         
    280         long            bolo_gain[nb_max_bolo];         
    281 
    282         long            bolo_capa[nb_max_bolo];         
    283         long            bolo_diviseur[nb_max_bolo];     
    284        
    285         long            coef[nb_max_bolo][7];           
    286 
    287         long            presence_bebo;                 
    288         }
    289         param_bolo;
    290 */
    291 
    292 typedef struct                          /*      La structure de transfert transputer vers mac   */ 
    293         {
    294         int4            debut;          /*      code de reconnaissance de debut de block        */
    295         int4            code1;          /*      code1 du block                                  */
    296         int4            code2;          /*      code2 du block                                  */
    297 
    298         param_bolo      param;          /*      les parametres de mesure des bolometres         */
    299 
    300         int4            fin;            /*      code de reconnaissance de fin de block          */
    301         }
    302         block_type_param;                       
    303        
    304 
    305 
    306 
    307 /*  -------------------   structures N° 1 :   journal de bord        ---------------------      */
    308 /*  -----------------------------------------------------------------------------------------   */
    309 #define long_page       10
    310 typedef struct                           
    311         {
    312         int4            code2;          /*      code de la ligne du journal                     */
    313                                         /*      code idem code2 debut de block :                */
    314                                         /*      contient un code de commande                    */
    315                                         /*      et le numero du block lors de la télécommande   */
    316         char            mot[8];         /*      contenu de la ligne du  journal                 */
    317         }
    318         ligne_journal;                 
    319 
    320 
    321 typedef struct                           
    322         {
    323         int4            debut;          /*      code de reconnaissance de debut de block        */
    324         int4            code1;          /*      code1 du block                                  */
    325         int4            code2;          /*      code2 du block                                  */
    326 
    327         ligne_journal   jj[long_page];  /*      block de 10 lignes de journal                   */
    328 
    329         int4            fin;            /*      code de reconnaissance de fin de block          */
    330         }
    331         block_type_journal;                     
    332        
    333 
    334 /*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------        */
    335 /*  ------------------------------------------------------------------------------------------  */
    336 #define bol_micro_volt(val,gain)        ((1e7*(double)val)/(65536.*gain))
    337 /*  avec  gain = param.bolo_gain[bolo]*gain_ampli(reglage.bolo[bolo])                           */
    338                
    339 
    340 /* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF        */             
    341 #define def_gains       double gains_reels[32]={1,2,4,8,10,20,40,80,100,200,400,800,1000,2000,4000,8000,0.5,2.5,10,50,0.93,3.777,18.974};
    342                 /*                      gain bediff    10->9.3    40->37.77     200->189.74             */
    343 
    344 
    345 /*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]          */
    346 #define         gainbrut(aa)    ((char)(((aa).mot1&0x1f)))             
    347 #define         gain_ampli(aa)  gains_reels[gainbrut(aa)]               
    348 #define         phase(aa)       ((char)(((aa).mot1&0x60)>>5))           
    349 #define         comm(aa)        ((char)(((aa).mot1&0x80)>>7))           
    350 #define         dac_V(aa)       ((int)(((aa).mot1&0xfff00)>>8)  )       
    351 #define         dac_I(aa)       ((int)(((aa).mot1&0xfff00000)>>20))             
    352 
    353 #define         voie(aa)        ((char)(((aa).mot2&0xff)))             
    354 #define         dac_T(aa)       ((int)(((aa).mot2&0xfff00)>>8))         
    355 #define         dac_L(aa)       ((int)(((aa).mot2&0xfff00000)>>20))             
    356 
    357 /*
    358 #define         bolo_mot1(dacV,dacI,gainbrut,phase,comm)        ((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20)
    359 #define         bolo_mot2(dacT,dacL,voie)                       ((voie)&0xff)     | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
    360 */
    361 
    362 #define         bolo_mot1(dacV,dacI,gainbrut,phase,comm)        (((long)(gainbrut))&0x1f) | ((((long)(phase))&3)<<5) | ((((long)(comm))&1)<<7) | ((((long)(dacV))&0xfff)<<8) | ((((long)(dacI))&0xfff)<<20)
    363 #define         bolo_mot2(dacT,dacL,voie)                       (((long)(voie))&0xff)     | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
    364 
    365 
    366 typedef struct 
    367         {
    368         int4    mot1;           /*  dac1 = mot[11..0]; dac2=mot1[23..12]        */
    369                                 /*  gain = mot1[27..24]; phase = mot1[31..28];  */
    370         int4    mot2;           /*  dac3 = mot[11..0]; dac4=mot1[23..12]        */
    371                                 /*  voie pour reglages auto  = mot2[31..24];    */
    372         }
    373         reglage_un_bolo;
    374 
    375 
    376 
    377 #ifdef programme        /***********   structure normale pour le mac   ****************/
    378 
    379 typedef struct 
    380         {
    381         char    periode;
    382         char    nb_mesures;
    383         char    temp_mort;
    384         char    flag;
    385         }
    386         horloge;
    387 
    388 typedef struct
    389         {
    390         char    mode;                   /*   on_off et deglitch                         */
    391         char    num_bolo;               /*   numero du bolo utilisé,    */
    392         char    voie_chauf;             /*   la voie de sortie chauffage                */
    393         char    prop;                   /*   zero dans prop -> chauffage=0;             */
    394         char    integ;
    395         char    deriv;
    396         short   chauffage;              /*      valeur effective du chauffage           */     
    397         }
    398         regul_bolo;                     /*  longueur 2 entiers long                     */
    399 
    400 typedef struct
    401         {
    402         char    mode;
    403         char    gain;
    404         char    courant;
    405         char    delai;
    406         }
    407         auto_bolo;                      /*  longueur 1 entiers long                     */
    408 
    409 typedef struct
    410         {
    411         char    vanne;
    412         char    helium;
    413         char    chauffage;
    414         char    piles;
    415         char    transmission;
    416         char    temps_max_vanne;
    417         char    xx7;
    418         char    xx8;
    419         }
    420         auto_dilu;                      /*  longueur 1 entiers long             */
    421 
    422 
    423 
    424 #else           /***********  structure swappée pour le transputer   ****************/
    425 
    426 typedef struct 
    427         {
    428         char    flag;
    429         char    temp_mort;
    430         char    nb_mesures;
    431         char    periode;
    432         }
    433         horloge;
    434        
    435 
    436 typedef struct
    437         {
    438         char    prop;                   /*   zero dans prop -> chauffage=0;             */
    439         char    voie_chauf;             /*   la voie de sortie chauffage                */
    440         char    num_bolo;               /*   numero du bolo utilisé,    */
    441         char    mode;                   /*   on_off et deglitch                         */
    442         short   chauffage;              /*      valeur effective du chauffage           */     
    443         char    deriv;
    444         char    integ;
    445         }
    446         regul_bolo;                     /*  longueur 2 entiers long             */
    447 
    448 
    449 typedef struct
    450         {
    451         char    delai;
    452         char    courant;
    453         char    gain;
    454         char    mode;
    455         }
    456         auto_bolo;                      /*  longueur 1 entiers long             */
    457 
    458 typedef struct
    459         {
    460         char    piles;
    461         char    chauffage;
    462         char    helium;                 /* periode de mesure            */
    463         char    vanne;         
    464         char    xx8;
    465         char    xx7;
    466         char    temps_max_vanne;
    467         char    transmission;
    468         }
    469         auto_dilu;                      /*  longueur 1 entiers long             */
    470 
    471 
    472 #endif          /***********   fin des structures swappées       ****************/
    473 
    474 enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch};
    475 
    476 #define bit_piles_5V    1
    477 #define bit_piles_15V   2
    478 #define bit_piles_auto  4
    479 
    480 enum{vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_pression_piles,vanne_auto_pression_piles_temps};
    481 enum{trans_rien,trans_normal,trans_rapide,trans_lent};
    482 
    483 
    484 typedef struct                                                  /*  long en mot de 32 bit       */
    485         {
    486         horloge                 horloge;                        /*                      1       */
    487         char                    vitesse[nb_type_blocks];        /*                      5       */
    488         reglage_un_bolo         bolo[nb_max_bolo];              /*      18 * 2  =       36      */
    489         auto_bolo               autom[nombre_de_voies];         /*      6  * 1          6       */                                                             
    490         regul_bolo              regul[nombre_de_regul];         /*      4  * 2  =       8       */                                                                     
    491         auto_dilu               dilu;                           /*                      2       */
    492         }
    493         reglage_bolo;                                           /*      total 58                */
    494 
    495 
    496 typedef struct                           
    497         {
    498         int4            debut;          /*      code de reconnaissance de debut de block        */
    499         int4            code1;          /*      code1 du block                                  */
    500         int4            code2;          /*      code2 du block                                  */
    501         reglage_bolo    reglage;                                                                                       
    502         int4            fin;            /*      code de reconnaissance de fin de block          */
    503         }
    504         block_type_reglage;                     
    505        
    506 /*  ---------------------   structures N° 3 :    etat de la dilution    ----------------------- */
    507 /*  ------------------------------------------------------------------------------------------- */
    508 typedef struct                           
    509         {
    510         int4            debut;          /*      code de reconnaissance de debut de block        */
    511         int4            code1;          /*      code1 du block                                  */
    512         int4            code2;          /*      code2 du block                                  */
    513 /*      int4            data_dil[50];    data brutes de la dilution                             */
    514         int4            switch_dil;
    515         int4            ADC_dil[48];    /*      la lecture des 48 ADC de la carte DIL           */
    516         int4            DAC_dil[4];     /*      les 4 dac de la carte dilution                  */
    517         int4            DAC_sst[4];     /*      les 4 dac de la carte sst                       */
    518         int4            gyro_dil[3][nb_per_block*2];    /* les gyros a supprimer                */
    519         int4            fin;            /*      code de reconnaissance de fin de block          */
    520         }
    521         block_type_dilution;                   
    522 
    523 
    524 /*      signification des bit lus dans switch_dil       */
    525 #define switch_EVF              0x00000080      /*      contact fin de course vanne fermee      */
    526 #define switch_EVO              0x00000040      /*      contact fin de course vanne ouverte     */
    527 
    528 /* les bit suivants sont envoyés par telecommande et relus dans switch_dil      */
    529 #define switch_helium           0x00200000      /*  13: commande sond niveau helium     */
    530 #define switch_pile_par_5       0x00100000      /*  12: mise en parallele des piles pour le 5V  */
    531 #define switch_pile_par_15      0x00080000      /*  11: mise en parallele des piles pour le 15V */
    532 #define vanne_EVB               0x00008000      /*  7: commande vanne brooks    */
    533 #define vanne_EVO               0x00010000      /*  8: commande vanne EVO       */
    534 #define vanne_EVV               0x00020000      /*  9: commande vanne EVV       */
    535 #define vanne_EVF               0x00040000      /*  10: commande vanne EVF      */
    536 #define chauffage1              0x00004000      /*  6: chauffage 1      */
    537 #define chauffage2              0x00002000      /*  6: chauffage 1      */
    538 #define chauffage3              0x00001000      /*  6: chauffage 1      */
    539 #define chauffage4              0x00000800      /*  6: chauffage 1      */
    540 #define chauffage5              0x00000400      /*  6: chauffage 1      */
    541 #define chauffage6              0x00000200      /*  6: chauffage 1      */
    542 #define chauffage7              0x00000100      /*  0: chauffage 7      */
    543 
    544 /*  position des mesures sur les multiplexeurs          */
    545 
    546 enum{
    547 /* multiplex11..18:*/   mul11_  ,mul12_ ,p_haut ,p_memb ,t_h1   ,t_h4   ,t_h3   ,t_h2   
    548 /* multiplex21..28:*/,  mul21_  ,mul22  ,p_charb,p_R4   ,mul25_ ,p_C3   ,p_R3   ,mul28 
    549 /* multiplex31..38:*/,  mul31_  ,p_C4   ,p_air  ,t_a3   ,t_b4   ,t_b1   ,t_b2   ,t_a2   
    550 /* multiplex41..48:*/,  t_b3    ,d_4He  ,RP_He  ,mul44  ,d_3He  ,j_he3  ,j_he7  ,j_he4 
    551 /* multiplex51..58:*/,  j_he5   ,j_he1  ,j_he8  ,j_he2  ,j_he6  ,pirani ,mul57  ,mul58 
    552 /* multiplex61..68:*/,  p_m18B  ,p_10B  ,p_m18D ,mul64  ,p_p18B ,p_10T  ,p_Ch   ,p_p18D         
    553         };
    554 enum{t_a1,t_a4};        /* en attendant de trouver leurs places */
    555 /* reste libres :  mul  11 - 12 - 21 - 22 - 25 - 28 - 31 - 44 - 57 - 58 - 64    */
    556 
    557 
    558 
    559 /*  ---------------------   structures N° 4 :     gps           ------------------------------- */
    560 /*  ------------------------------------------------------------------------------------------- */
    561 
    562 typedef struct                           
    563         {
    564         int4            debut;          /*      code de reconnaissance de debut de block        */
    565         int4            code1;          /*      code1 du block                                  */
    566         int4            code2;          /*      code2 du block                                  */
    567 
    568         char            gps[80];        /*      les données GPS (une chaine maxi 80 cara)       */
    569 
    570         int4            fin;            /*      code de reconnaissance de fin de block          */
    571         }
    572         block_type_gps;                 
    573        
    574 
    575 
    576 /*  ---------------------   structures N° 5 :   tous les bolos 1 periode        --------------- */
    577 /*  ------------------------------------------------------------------------------------------- */
    578 typedef struct                           
    579         {
    580         int4            debut;          /*      code de reconnaissance de debut de block        */
    581         int4            code1;          /*      code1 du block                                  */
    582         int4            code2;          /*      code2 du block                                  */
    583        
    584         short           bol_per[nb_max_bolo][nb_max_mes_per];           
    585 
    586         int4            fin;            /*      code de reconnaissance de fin de block          */
    587         }
    588         block_type_une_periode;                 
    589 
    590 /*  ----------------   structures N° 6 :  signals de synchro (pour test au sol) --------------- */
    591 /*  ------------------------------------------------------------------------------------------- */
    592 typedef struct                           
    593         {
    594         int4            debut;          /*      code de reconnaissance de debut de block        */
    595         int4            code1;          /*      code1 du block                                  */
    596         int4            code2;          /*      code2 du block                                  */
    597         char            synchro[nb_sync][nb_per_block*2];       
    598 
    599         int4            fin;            /*      code de reconnaissance de fin de block          */
    600         }
    601         block_type_synchro_sol;                 
    602 
    603 /*  ---------------------   structures N° 7 : block de données de pointage sol      ----------- */
    604 /*  ------------------------------------------------------------------------------------------- */
    605 typedef struct   
    606         {
    607         int4            debut;          /*      code de reconnaissance de debut de block        */
    608         int4            code1;          /*      code1 du block                                  */
    609         int4            code2;          /*      code2 du block                                  */
    610         char            comment[1024];
    611         int4            fin;            /*      code de reconnaissance de fin de block          */
    612         }
    613         block_type_pointage_sol;                       
    614 
    615 
    616 
    617 /*  -------------   structures N° 8 :   données brutes des bolometres    ---------------------- */
    618 /*  ------------------------------------------------------------------------------------------- */
    619 typedef struct                           
    620         {
    621         int4            debut;          /*      code de reconnaissance de debut de block        */
    622         int4            code1;          /*      code1 du block                                  */
    623         int4            code2;          /*      code2 du block                                  */
    624                                         /*      pour chaque bolo, un vecteur 72 points          */
    625         int4            data_bolo[nb_max_bolo][nb_per_block*2];
    626                                         /*      data D.S.       (en mots de 32 bits)            */
    627         int4            fin;            /*      code de reconnaissance de fin de block          */
    628         }
    629         block_type_bolo;                       
    630 
    631 /*  ---------------------   structures N° 9 :   données des gyroscopes et du magnétometre       */
    632 /*  -----------------------------------------------------------------------------------------   */
    633 typedef struct                           
    634         {
    635         int4            debut;          /*      code de reconnaissance de debut de block        */
    636         int4            code1;          /*      code1 du block                                  */
    637         int4            code2;          /*      code2 du block                                  */
    638                                         /* chaque gyro: un vecteur tde 72 valeurs               */
    639         int4            gyros[3][nb_per_block*2];
    640         int4            magneto[3];     /*      1 bit par echantillonage soit 3*32bit>72        */
    641         int4            fin;            /*      code de reconnaissance de fin de block          */
    642         }
    643         block_type_gyro;                       
    644 
    645 /*  ---------------------   structures N° 10 :   données senseur stellaire        -----------   */
    646 /*  -----------------------------------------------------------------------------------------   */
    647 typedef struct                           
    648         {
    649         int4            debut;          /*      code de reconnaissance de debut de block        */
    650         int4            code1;          /*      code1 du block                                  */
    651         int4            code2;          /*      code2 du block                                  */
    652         int4            sst[nb_per_block*2][18];
    653                                         /* chaque mesure: un paquet de 18 mots de 32 bits       */
    654         int4            fin;            /*      code de reconnaissance de fin de block          */
    655         }
    656         block_type_sst;                 
    657 
    658 /*  ---------------------   structures N° 11 :    rien                    -----------           */
    659 /*  -----------------------------------------------------------------------------------------   */
    660 typedef struct                           
    661         {
    662         int4            debut;          /*      code de reconnaissance de debut de block        */
    663         int4            code1;          /*      code1 du block                                  */
    664         int4            code2;          /*      code2 du block                                  */
    665         int4            fin;            /*      code de reconnaissance de fin de block          */
    666         }
    667         block_type11;                   
    668 
    669 /*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit    ------ */
    670 /*  ------------------------------------------------------------------------------------------- */
    671 typedef struct                           
    672         {
    673         int4            debut;          /*      code de reconnaissance de debut de block        */
    674         int4            code1;          /*      code1 du block                                  */
    675         int4            code2;          /*      code2 du block                                  */
    676                                         /*      nombre de mots = nb valeurs/4 +1                */
    677                                         /*      pour chaque bolo, un vecteur  19 mots           */
    678         int4            data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
    679 
    680         int4            fin;            /*      code de reconnaissance de fin de block          */
    681         }
    682         block_type_bolo_comprime;                       
    683 
    684 /*  ---------------------   structures N° 13 :    block_type_gyro_comprime      -----------     */
    685 /*  -----------------------------------------------------------------------------------------   */
    686 typedef struct                           
    687         {
    688         int4            debut;          /*      code de reconnaissance de debut de block        */
    689         int4            code1;          /*      code1 du block                                  */
    690         int4            code2;          /*      code2 du block                                  */
    691                                         /*      nombre de mots = nb valeurs/4 +1                */
    692         int4            gyro[3][ (nb_per_block/2) +1 ];
    693         int4            fin;            /*      code de reconnaissance de fin de block          */
    694         }
    695         block_type_gyro_comprime;                       
    696 
    697 /*  ---------------------   structures N° 14 :    block_type_sst_comprime       -----------     */
    698 /*  -----------------------------------------------------------------------------------------   */
    699 typedef struct                           
    700         {
    701         int4            debut;          /*      code de reconnaissance de debut de block        */
    702         int4            code1;          /*      code1 du block                                  */
    703         int4            code2;          /*      code2 du block                                  */
    704                                         /*      pour chaque diode, un vecteur  11 mots          */
    705         int4            sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
    706         int4            fin;            /*      code de reconnaissance de fin de block          */
    707         }
    708         block_type_sst_comprime;                       
    709 
    710 
    711 
    712 /*  ---------------------   structures N° 15 : catalog_flash      -------       */
    713 /*  ------------------------------------------------------------------------------------------- */
    714 
    715 typedef struct                          /*      etat de l'enregistreur                          */
    716         {
    717         int4            nb_total_catalog;
    718         int4            memoire_libre;
    719         int4            nb_block_erreur;
    720         }status_flash;
    721 
    722 typedef struct   
    723         {
    724         int4            debut;          /*      code de reconnaissance de debut de block        */
    725         int4            code1;          /*      code1 du block                                  */
    726         int4            code2;          /*      code2 du block                                  */
    727        
    728         int4            commande;       /*      la commande a laquelle ce catalog repond        */
    729         status_flash    status;         /*      etat de l'enregistreur                          */
    730         int4            nombre;         /*                                                      */
    731         int4            code[nb_element_catalog];       /* code type et numero                  */
    732         int4            fin;            /*      code de reconnaissance de fin de block          */
    733         }
    734         block_type_catalog_flash;                       
    735 
    736 
    737 /*  ---------------------   structures N° 16 :    cmd_flash                 -----------         */
    738 /*  -----------------------------------------------------------------------------------------   */
    739 typedef struct                           
    740         {
    741         int4            debut;          /*      code de reconnaissance de debut de block        */
    742         int4            code1;          /*      code1 du block                                  */
    743         int4            code2;          /*      code2 du block                                  */
    744         int4            commande;       /*      type de commande a l'enregistreur flash         */
    745         int4            fin;            /*      code de reconnaissance de fin de block          */
    746         }
    747         block_type_cmd_flash;                   
    748 
    749 enum    {flash_catalog_auto,flash_catalog_debut,flash_catalog_fin,flash_catalog_precedent,flash_catalog_suivant
    750                 ,flash_efface_tout1,flash_efface_tout2,flash_efface_tout3
    751                 ,flash_efface_util1,flash_efface_util2,flash_efface_util3};
    752 
    753 
    754 /*  ---------------------   structures N° 17 : block brut de données ctb pour test      ------- */
    755 /*  ------------------------------------------------------------------------------------------- */
    756 typedef struct   
    757         {
    758         int4            debut;          /*      code de reconnaissance de debut de block        */
    759         int4            code1;          /*      code1 du block                                  */
    760         int4            code2;          /*      code2 du block                                  */
    761 #ifdef  transmet_data_brute
    762         char            data[nb_per_block*nb_max_mes_per*nb_byte_mot];
    763 #endif
    764         int4            fin;            /*      code de reconnaissance de fin de block          */
    765         }
    766         block_type_data_brute;                 
    767 
    768 /*  ---------------------   structures N° 18 : block  vide pour l'instant             -------   */
    769 /*  ------------------------------------------------------------------------------------------- */
    770 typedef struct   
    771         {
    772         int4            debut;          /*      code de reconnaissance de debut de block        */
    773         int4            code1;          /*      code1 du block                                  */
    774         int4            code2;          /*      code2 du block                                  */
    775         int4            fin;            /*      code de reconnaissance de fin de block          */
    776         }
    777         block_type_18;                 
    778 
    779 /*  ---------------------   structures N° 19 : block  vide pour l'instant             -------   */
    780 /*  ------------------------------------------------------------------------------------------- */
    781 typedef struct   
    782         {
    783         int4            debut;          /*      code de reconnaissance de debut de block        */
    784         int4            code1;          /*      code1 du block                                  */
    785         int4            code2;          /*      code2 du block                                  */
    786         int4            fin;            /*      code de reconnaissance de fin de block          */
    787         }
    788         block_type_19;                 
    789 
    790 
    791 
    792 /*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
    793 /*  -----------------------------------------------------------------------------------------   */
    794 
    795 typedef struct                          /*      La structure de transfert transputer vers mac   */ 
    796         {
    797         int4            debut;          /*      code de reconnaissance de debut de block        */
    798         int4            code1;          /*      code1 du block                                  */
    799         int4            code2;          /*      code2 du block                                  */
    800         int4            mot[(taille_maxi_block_archeops)/4];
    801         int4            fin;            /* code de reconnaissance de fin de block               */
    802         }
    803         block_type_modele;                     
    804 
    805 
    806 
    807 
    808 
    809 /*==============================================================================================*/
    810 /*==============================================================================================*/
    811 /*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
    812 /*==============================================================================================*/
    813 /*==============================================================================================*/
    814 
    815 
    816 
    817 enum    {block_param,block_journal,block_reglage,block_dilution,
    818         block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
    819         block_bolo,block_gyro,block_sst,block_11,
    820         block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_catalog_flash,
    821         block_cmd_flash,block_data_brute,block_18,block_19};
    822 
    823 
    824 #define def_nom_block   char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
    825                                         "block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
    826                                         "block_bolo","block_gyro","block_sst","block_11",\
    827                                         "block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_catalog_flash",\
    828                                         "block_cmd_flash","block_data_brute","",""};
    829 
    830 
    831 #define def_long_block  int long_block[nb_type_blocks]={sizeof(block_type_param),sizeof(block_type_journal),sizeof(block_type_reglage),sizeof(block_type_dilution),\
    832                                         sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
    833                                         sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
    834                                         sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_catalog_flash),\
    835                                         sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
    836 
    837 
    838 
    839 
    840 
    841 /*   le code du block contient  8  bit de type                                                  */
    842 /*                              24 bit pour le numero du block(horloge locale)                  */
    843 /*                              12 bit pour la longueur du block  (en octet)                    */
    844 /*                              16 bit pour la somme de test de la validité du block            */
    845 
    846 /*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier    */
    847 
    848 
    849 #define longueur_block(_bk)     ( (int) ((_bk)->code1>>16)      & 0xffff )     
    850 #define somme_block(_bk)        ( (int)  (_bk)->code1           & 0xffff )
    851 
    852 #define type_block(_bk)         ( (int) ((_bk)->code2>>24)      & 0xff )
    853 #define numero_block(_bk)       ( (int)  (_bk)->code2           & 0xffffff )
    854 
    855 /* ce define cree le mot de controle de somme des blocks et de les verifier a la reception      */
    856 
    857 
    858 /*==============================================================================================*/
    859 /*==============================================================================================*/
    860 /*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
    861 /*==============================================================================================*/
    862 /*==============================================================================================*/
    863 
    864 
    865 /* -------------------------------------------------------------------------------------------- */
    866 /* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops       */
    867 /* il faut inclure une seule fois le header archeops.h précéde de :                             */
    868 /*                       #define utilitaires_de_block_archeops                                  */
    869 /* -------------------------------------------------------------------------------------------- */
    870 
    871 
    872 /* ----------------------------   prototypes des fonctions       ------------------------------ */
    873 /* -------------------------------------------------------------------------------------------- */
    874 
    875 
    876 /*      cette fonction calcule le code de somme pour le controle de parité des blocks           */
    877 
    878 int     calcul_somme_block(block_type_modele* blk,int longueur);
    879 
    880 
    881 
    882 
    883 
    884 /*      cette fonction est a apeller lors de la création d'un block apres l'avoir rempli        */
    885 /*      elle permet de creer tous les mots de controle du block                                 */
    886 
    887 void    valide_block(block_type_modele* blk,int type,int block_num);
    888 
    889 
    890 
    891 /*      cette fonction est a apeller pour vérifier la validité d'un block                       */
    892 /*      elle retourne 0 si le block est correct et sinon, un code d'erreur                      */
    893 /*      la seconde fonction sort les erreurs a l'ecran                                          */
    894 
    895 int     verifie_block(block_type_modele* blk);
    896 int     verifie_block_printf(block_type_modele* blk);
    897 
    898 enum    {block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
    899                 ,block_debut_erreur,block_fin_erreur};
    900 
    901 /*      cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique  */
    902 /*      elle est en particulier utilisée pour calculer les coef de la regul                     */
    903 
    904 double  val_double(char x);
    905 
    906 /*      cette fonction transforme un char (sur 8 bit) en entier long (echelle logarythmique)    */
    907 /*      elle est en particulier utilisée pour fixer le courant sur les bolometres               */
    908 
    909 unsigned long   val_long(char x);
    910 
    911 int     new_val_dac(int a,char  code);
    912 
    913 
    914 
     1#include "archeops_28.h"
  • trunk/Poubelle/archTOI.old/archeopsfile.cc

    r315 r342  
    3838 
    3939  SSTHandler sstHandler;
     40  GPSParser  gpsParser;
    4041};
    4142
     
    211212      else if (!llastBolo) {
    212213        llastBolo = new block_type_bolo;
     214      }
     215      if (llastBolo) {
    213216        memcpy(llastBolo, lastBolo, sizeof(block_type_bolo));
    214217      }
     
    286289  fn         = x.fn;
    287290  f = fopen(fn.c_str(), "rb");
     291
     292  rawMJD     = x.rawMJD;
     293  startMJD   = x.startMJD;
     294  utcOffset  = x.utcOffset;
    288295}
    289296
     
    300307  //curBlock = oldFile.curBlock;
    301308  //peekBlock = oldFile.peekBlock;
    302   peekPos = 0;
     309  if (peekPos>0) peekPos = 0;
    303310  setUTCOffset(oldFile.utcOffset);
    304311}
     
    306313
    307314def_nom_block
     315
     316def_long_block
    308317
    309318bool ArcheopsFile::nextBlock() {
     
    316325 
    317326  memcpy(curBlock, peekBlock, sizeof(block_type_modele));
    318  
    319   if (peekPos+12 > fLen) return false;
    320   fseek(f,peekPos,SEEK_SET);
    321   size_t read = fread(peekBlock,1,sizeof(block_type_modele),f);
    322   swapEntete(peekBlock);
    323   if (read < longueur_block(peekBlock)) return false;
    324   swapContent(peekBlock);
    325   if (verifie_block(peekBlock) != block_correct) {
    326   printf("block invalide\n"); throw ArchExc("invalid block");
    327   }
    328   peekPos += longueur_block(peekBlock);
     327  curPos = peekPos;
     328 
     329  while (true) {
     330    if (peekPos+12 > fLen) return false;  // fin de fichier
     331    fseek(f,peekPos,SEEK_SET);            // aller en peekPos
     332    size_t read = fread(peekBlock,1,sizeof(block_type_modele),f);
     333    swapEntete(peekBlock);
     334    if (read < longueur_block(peekBlock) ||
     335        type_block(peekBlock) < 0 || type_block(peekBlock) > 19 ||
     336        longueur_block(peekBlock) != long_block[type_block(peekBlock)]) {
     337      cout << "block de type/longueur invalide" << endl;
     338      memset(peekBlock, 0, sizeof(block_type_modele)); // don't keep trash...
     339      peekPos = searchNextBlock(peekPos);
     340      if (peekPos<0) return false;
     341      continue;
     342    }
     343    swapContent(peekBlock);
     344    if (verifie_block(peekBlock) != block_correct) {
     345      cout << "block invalide " << numero_block(peekBlock);
     346      if (!fixBlock(peekBlock)) {
     347        cout << " -- skipped" << endl;
     348        peekPos += longueur_block(peekBlock);  // la longueur doit etre ok...
     349        continue;
     350      } else {
     351        cout << " -- fixed" << endl;
     352        break;
     353      }
     354    }
     355    break; // tout semble bon pour ce bloc...
     356  }
     357 
     358  peekPos += longueur_block(peekBlock); // on suppose que longueur OK...
    329359  if (curPos < 0) {
    330360    curPos = 0; return true;
    331361  }
    332   curPos += longueur_block(curBlock);
    333   curRawKind = curKind = type_block(curBlock);
    334   //printf("block %d  :  %s \n",numero_block(&curBlock),nom_block[curKind]);
    335   postProcessBlock();
    336   saveCurBlock();
     362  if (curBlock->debut != 0) {
     363    curRawKind = curKind = type_block(curBlock);
     364    postProcessBlock();
     365    saveCurBlock();
     366  } else {
     367    curRawKind = curKind = -1;
     368  }
    337369  return true;
    338370}
     
    346378}
    347379
     380bool ArcheopsFile::fixBlock(block_type_modele* blk) {
     381  return false;
     382}
     383
     384
    348385int  ArcheopsFile::blockKind() {
    349386  return curKind;
     
    363400  double p,f1,f2,f3;
    364401  int pp;
     402  if (!lastReglage()) return -1;
    365403  pp=lastReglage()->reglage.horloge.periode;
    366404  p=pp/5.;
     
    374412
    375413int ArcheopsFile::nEchBlock() {  // Nb d'echantillons dans un bloc
    376   return lastParam()->param.n_per_block*2.;
     414  return lastParam()->param.n_per_block*2;
    377415}
    378416
     
    448486}
    449487
     488void ArcheopsFile::forceBlock(block_type_modele* blk) {
     489  blockSet->setBloc(*blk);
     490}
     491
     492#define place_paquet(i,j)        ((i/8) * 24  + j*8 + (i%8) )
     493
    450494void ArcheopsFile::postProcessBlock() {
    451495  switch (curKind) {
     
    454498       block_type_bolo blk2;
    455499       block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock;
     500       #if version_num <= 25
    456501       for(int j=0;j<nb_bolo_util;j++) 
    457                 {
    458                    decompress_7_2(blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
     502           {
     503                   decompress_7_2((int4*)blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
     504           }
     505           #else
     506           block_type_param* param = lastParam();
     507           int jc=0;for(int j=0;j<nb_max_bolo;j++)       // jc = bolo_comprime  //   j=bolo normal
     508           {
     509                if( (param->param.bolo[j].bolo_code_util==bolo_normal_transmis) &&  (jc<nb_bolo_util)  )
     510                        {
     511                        decompress_7_2((int4 *)blk->data_bolo[jc],blk2.data_bolo[j],nb_per_block*2);
     512                        jc++;
     513                        }
     514                else {
     515                  memset(blk2.data_bolo[j], 0, nb_per_block*2*sizeof(int4));
    459516                }
     517                }
     518
     519           #endif
    460520       valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));   
    461521       memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
     
    464524     }
    465525     case block_sst_comprime: {  // $CHECK$ TBD
     526       blockSet->setRawBloc(blockSet->curBlock);
     527       block_type_sst blk2;
     528       block_type_sst_comprime* blk = (block_type_sst_comprime*) &blockSet->curBlock;
     529       for (int j=0; j<18; j++)
     530         for (int i=0; i<nb_per_block*2; i++)
     531           blk2.sst[i][j] = 0;
     532
     533       int jc=0;
     534       for( int j=0;j<48;j++) {
     535         if ((j!=0) && (j!=4))
     536         {
     537           unsigned int4 sst_vrai[nb_per_block*2];
     538           decompress_4_1((int4*)blk->sst[jc],(int4*)sst_vrai,nb_per_block*2);
     539           for (int k=0;k<nb_per_block*2;k++) {
     540             unsigned int4 a,b0,b1,b2;
     541             b2 = sst_vrai[k] & 0xf;
     542             b1 = (sst_vrai[k] >> 4) & 0xf;
     543             b0 = (sst_vrai[k] >> 8) & 0xf;
     544                 a=place_paquet(j,0);
     545                 blk2.sst[k][a/8] |= (b0 << (a%8)*4);
     546                 a=place_paquet(j,1);
     547                 blk2.sst[k][a/8] |= (b1 << (a%8)*4);
     548                 a=place_paquet(j,2);
     549                 blk2.sst[k][a/8] |= (b2 << (a%8)*4);
     550           }
     551           jc++;
     552         }
     553       }       
     554       valide_block((block_type_modele*)&blk2,block_sst,numero_block(blk));     
     555       memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
     556       curKind = block_sst;
     557       blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
     558       break;
    466559     }
    467560     case block_sst : {
    468561       blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
     562     }
     563     case block_gps : {
     564       blockSet->gpsParser.ProcessBlock((block_type_gps*)&blockSet->curBlock);
    469565     }
    470566  }
     
    519615#endif
    520616
     617#ifdef SWAP
    521618void ArcheopsFile::swapEntete(block_type_modele* blk) {
    522 #ifdef SWAP
    523619  bswap4(&(blk->debut));
    524620  bswap4(&(blk->code1));
    525621  bswap4(&(blk->code2));
    526622  long lg = longueur_block(blk);
    527   bswap4(((char*)blk) + lg - 4);
     623  if (lg < taille_maxi_block_archeops)
     624    bswap4(((char*)blk) + lg - 4);
     625}
     626#else
     627void ArcheopsFile::swapEntete(block_type_modele* ) {
     628}
    528629#endif
    529 }
    530 
     630
     631#ifdef SWAP
    531632void ArcheopsFile::swapContent(block_type_modele* blk) {
    532 #ifdef SWAP
    533633  int typ = type_block(blk);
    534634
     
    550650    for (int i=0; i<nb_max_bolo; i++)
    551651      for (int j=0; j<8; j++)
    552         bswap4(&b->param.bolo[i].bolo_nom[4*j]);
    553   }
    554  
    555   }
     652#if version_num<=25
     653        bswap4(&b->param.bolo[i].bolo_nom[4*j]);
     654#else
     655        bswap4(&b->param.nom_coef[i].bolo_nom[4*j]);
    556656#endif
    557 }
    558  
     657  }
     658 
     659  }
     660}
     661#else
     662void ArcheopsFile::swapContent(block_type_modele* ) {
     663}
     664#endif
     665 
     666long ArcheopsFile::searchNextBlock(long pos) {
     667  static char* buffer = 0;
     668  static int4  debswp = debut_block_mesure;
     669  static int4  longmax = taille_maxi_block_archeops*20;
     670  if (!buffer) {
     671    buffer = new char[longmax];
     672#ifdef SWAP
     673    bswap4(&debswp);
     674#endif
     675  }
     676  fseek(f,pos,SEEK_SET);
     677  size_t read = fread(buffer,1,taille_maxi_block_archeops*2,f);
     678  //if (read<taille_maxi_block_archeops*2) return -1;
     679  for (int i=4; i<read; i+=4) {
     680    if (*(int4*)(buffer+i) == debswp) {
     681      cout << "trying to skip " << i << " bytes to pos="<<pos+i << endl;
     682      return pos+i;
     683    }
     684  }
     685  cout << "cannot find block start" << endl;
     686  return -1;
     687}
     688
    559689 
    560690
     
    562692static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    563693
     694double ArcheopsFile::decodeMJD(string const& dateString) {
     695  //99_04_29-15h36m22  ou  99_05_10
     696  short y,m,d,hh,mm,ss;
     697  char const* p = dateString.c_str();
     698  char const* p2 = dateString.c_str() + dateString.length();
     699  y  = atoi(p); p+=3; if (p>p2) return -1;
     700  m  = atoi(p); p+=3; if (p>p2) return -1;
     701  d  = atoi(p); p+=3;
     702  if (p<p2) {
     703  hh = atoi(p); p+=3; if (p>p2) return -1;
     704  mm = atoi(p); p+=3; if (p>p2) return -1;
     705  ss = atoi(p);
     706  } else {
     707    hh=mm=ss=0;
     708  }
     709
     710  if (y<50) y += 100;
     711  // 1. depuis 0/1/97 minuit
     712  double mjd = (int) (365.25 * (y-97));
     713  for (int i=0; i<m-1; i++)
     714    mjd += mlen[i];
     715  if (y%4 == 0 && m > 2) mjd++;
     716  mjd += d;
     717  mjd += hh/24. + mm/24./60. + ss/24./60./60;
     718 
     719  mjd += 448.5; // 0/1/97 minuit
     720
     721  return mjd;
     722}
     723
    564724void ArcheopsFile::computeMJD(string const& fname) {
    565   //h99_04_29-15h36m22
    566   short y,m,d,hh,mm,ss;
     725  //telemetrie : h99_04_29-15h36m22
     726  //enregistreur : ARKxxxxxx.dat, et MJD = samedi 17 juillet, 21h -> 1377.4
    567727  char const* p = fname.c_str();
    568728  char const* p2 = p  + fname.length()-1;
     
    570730  if (*p2 == ':' || *p2 == '/') p2++;
    571731  if (*p2 == 'h') p2++;
    572   y  = atoi(p2); p2+=3;
    573   m  = atoi(p2); p2+=3;
    574   d  = atoi(p2); p2+=3;
    575   hh = atoi(p2); p2+=3;
    576   mm = atoi(p2); p2+=3;
    577   ss = atoi(p2);
    578  
    579   if (y<50) y += 100;
    580   // 1. depuis 0/1/97 minuit
    581   rawMJD = (int) (365.25 * (y-97));
    582   for (int i=0; i<m-1; i++)
    583     rawMJD += mlen[i];
    584   if (y%4 == 0 && m > 2) rawMJD++;
    585   rawMJD += d;
    586   rawMJD += hh/24. + mm/24./60. + ss/24./60./60;
    587  
    588   rawMJD += 448.5; // 0/1/97 minuit
     732  if (!strncmp(p2, "ARK",3)) {
     733    rawMJD = 1377.4;
     734  } else {
     735    rawMJD = decodeMJD(p2);
     736  }
    589737  startMJD = rawMJD - utcOffset/24.;
    590738}
     
    610758
    611759
     760int ArcheopsFile::getGyroBlockNum() {
     761  if (!lastGyro()) return -1;
     762  return numero_block(lastGyro());
     763}
     764
     765
    612766// GPS
    613767// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
     
    621775double ArcheopsFile::getGPSUTC() {  // en secondes depuis minuit UTC jour courant
    622776  if (!lastGPS()) return -9.e99;
    623   char* p = lastGPS()->gps;
    624   if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
    625   p += 7;
     777  return blockSet->gpsParser.getUTC();
     778/*  char* p = lastGPS()->gps;
     779  //if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     780  //p += 7;
     781  if (*p != '$') return -9.e99;
     782  p += 1;
    626783  double t;
    627784  sscanf(p, "%lg", &t);
    628785  int h = int(t/10000); t -= h*10000;
    629786  int m = int(t/100);   t -= m*100;
    630   return h*3600. + m*60. + t;
     787  return h*3600. + m*60. + t;*/
    631788}
    632789
    633790double ArcheopsFile::getGPSMJD() {  // modified julian day du dernier bloc GPS, JD - 2450000
    634   double t = getGPSUTC()/86400.;
     791  double t = getGPSUTC()/86400. - 0.5;
    635792  if (t<0) return t;
    636793  if (t > (startMJD - int(startMJD))) {
     
    643800double ArcheopsFile::getGPSLat() {  // degres, +  = NORD
    644801  if (!lastGPS()) return -9.e99;
    645   char* p = lastGPS()->gps;
    646   if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     802  return blockSet->gpsParser.getLatitude();
     803  /*char* p = lastGPS()->gps;
     804  //if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     805  if (*p!='$') return -9.e99;
    647806  char* fence = p+80;
    648   p += 7;
     807  p += 1;
    649808  while (*p != ',' && p<fence) p++;
    650809  if (*p != ',') return -9.e99;
     
    658817  p++;
    659818  if (*p == 'S') t = -t;
    660   return t;
    661 }
     819  return t;*/
     820}
     821
    662822
    663823double ArcheopsFile::getGPSLong() { // degres, +  = EST
    664824  if (!lastGPS()) return -9.e99;
    665   char* p = lastGPS()->gps;
    666   if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     825  return blockSet->gpsParser.getLongitude();
     826  /*char* p = lastGPS()->gps;
     827  //if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     828  if (*p!='$') return -9.e99;
    667829  char* fence = p+80;
    668   p += 7;
     830  p += 1;
    669831  for (int i=0; i<3; i++) {
    670832    while (*p != ',' && p<fence) p++;
     
    680842  p++;
    681843  if (*p == 'W') t = -t;
    682   return t;
    683 }
    684 
     844  return t;*/
     845}
     846
     847double ArcheopsFile::getGPSAlt() { // meters from sea level
     848  if (!lastGPS()) return -9.e99;
     849  return blockSet->gpsParser.getAltitude();
     850  /*char* p = lastGPS()->gps;
     851  //if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
     852  if (*p!='$') return -9.e99;
     853  char* fence = p+80;
     854  p += 1;
     855  for (int i=0; i<8; i++) {
     856    while (*p != ',' && p<fence) p++;
     857    if (*p != ',') return -9.e99;
     858    p++;
     859  }
     860  double t;
     861  sscanf(p, "%lg", &t);
     862  return t;*/
     863}
     864
     865bool ArcheopsFile::hasGPSTime() {
     866  if (!lastGPS()) return false;
     867  return blockSet->gpsParser.hasGPSTime();
     868}
     869
     870bool ArcheopsFile::hasGPSPos() {
     871  if (!lastGPS()) return false;
     872  return blockSet->gpsParser.hasPosition();
     873}
     874
     875bool ArcheopsFile::hasGPSAlt() {
     876  if (!lastGPS()) return false;
     877  return blockSet->gpsParser.hasAltitude();
     878}
    685879
    686880
    687881// Bolo
     882#define  val_DS(j,i)  (blk->data_bolo[j][i]&0x1fffff)
     883
    688884
    689885long ArcheopsFile::getRawBolo(int ibolo, int imesure) {    // donnee brute, avec seulement soustraction offset
    690886  int nb_coups,aa; 
    691887  block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
     888  //cout << "raw " << imesure << " ";
    692889  if (imesure < 0) imesure += nEchBlock();
    693890  if (!blk) return 0;
     
    699896 
    700897  int s = imesure % 2 ? 1 : -1;
    701 
    702   return s*(((blk->data_bolo[ibolo][imesure]-aa)<<1)/nb_coups);
     898 
     899  //cout << s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups) << "\n";
     900
     901  return s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups);
    703902}
    704903
     
    706905
    707906double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
    708   double y = (getRawBolo(ibolo, imesure-1) - getRawBolo(ibolo, imesure))/2.;
    709   if (imesure%2) y=-y;
     907  double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.;
     908  //if (imesure%2) y=-y;
    710909  block_type_reglage* reglage = lastReglage();
    711   return ((1e5*y)/(65536.*gain_ampli(reglage->reglage.bolo[ibolo])));
     910  block_type_param*   param = lastParam();
     911  //cout << "muv " << imesure << " " << y << "\n";
     912  return bol_micro_volt(y,(double)param->param.bolo[ibolo].bolo_gain*gain_ampli(reglage->reglage.bolo[ibolo]));
     913  //return ((1e5*y)/(65536.*gain_ampli(reglage->reglage.bolo[ibolo])));
    712914}
    713915
     
    719921}
    720922
    721 
    722923long ArcheopsFile::getSSTSignal(int idiode, int imesure) {
    723924  return blockSet->sstHandler.getSignal(imesure, idiode);
    724925}
     926
     927long ArcheopsFile::getSSTRawSignal(int idiode, int imesure) {
     928  return blockSet->sstHandler.getRawSignal(imesure, idiode);
     929}
     930
     931double ArcheopsFile::getSSTStarZ(int istar, int imesure) {
     932  return blockSet->sstHandler.getStarZ(imesure, istar);
     933}
     934
     935double ArcheopsFile::getSSTStarF(int istar, int imesure) {
     936  return blockSet->sstHandler.getStarF(imesure, istar);
     937}
     938
     939long ArcheopsFile::getGyro(int igyro, int imesure) {   
     940  if (igyro<0 || igyro>2) return 0;
     941  if (imesure<0 || imesure>= nb_per_block*2) return 0;
     942  block_type_gyro* blk = lastGyro() ;
     943  if (!blk) return 0;
     944#if version_num<=25
     945  return blk->gyros[igyro][imesure];
     946#else
     947  return blk->gyro[igyro][imesure];
     948#endif
     949}
     950
     951
     952
    725953// $CHECK$ TBD
    726954
  • trunk/Poubelle/archTOI.old/archeopsfile.h

    r315 r342  
    1616
    1717#include "ssthandler.h"
     18#include "gpsparser.h"
    1819
    1920enum {
     
    3334  block_gyro_comprime_mask = 1 << block_gyro_comprime,
    3435  block_sst_comprime_mask = 1 << block_sst_comprime,
    35   block_catalog_flash_mask = 1 << block_catalog_flash,
     36 // block_catalog_flash_mask = 1 << block_catalog_flash,
    3637  block_cmd_flash_mask = 1 << block_cmd_flash,
    3738  block_data_brute_mask = 1 << block_data_brute,
     
    6364  double getStartMJD();
    6465 
    65   bool nextBlock();   // go to next block, true if block exists
     66  bool nextBlock();   // go to next block, true if block exists (ie not EOF)
    6667  bool nextBlock(long mask); // go to next block matching mask
     68  bool gotValidBlock(); // current block is good
    6769  int  blockKind();   // kind of the current bloc, enum in archeops.h
    6870  int  blockRawKind();   // kind of the current raw bloc, enum in archeops.h
     
    7072  string blockKdName();
    7173  string blockRawKdName();
     74  string filename() {return fn;}
    7275 
    7376  double perEchant(); // periode d'echantillonage pour le dernier bloc reglage
     
    102105  block_type_sst_comprime*  lastSSTComp();
    103106 
     107  void forceBlock(block_type_modele* blk);
     108 
    104109  // Decodage des derniers blocs..
    105110 
     
    109114  // Ces fonctions travaillent sur le dernier bloc GPS
    110115  int getGPSBlockNum();
     116  bool   hasGPSTime();
     117  bool   hasGPSPos();
     118  bool   hasGPSAlt();
    111119  double getGPSUTC();  // en secondes depuis minuit UTC
    112120  double getGPSMJD();  // modified julian day du dernier bloc GPS, JD - 2450000
    113121  double getGPSLat();  // degres, +  = NORD
    114122  double getGPSLong(); // degres, +  = EST
     123  double getGPSAlt();  // meters from sea level
    115124   
    116125  // Bolo
     
    122131  int getSSTBlockNum();
    123132  void needSSTProcessMask(int mask);
     133  long getSSTRawSignal(int iDiode, int imesure);
    124134  long getSSTSignal(int iDiode, int imesure);
     135  double getSSTStarZ(int iStar, int imesure);
     136  double getSSTStarF(int iStar, int imesure);
     137 
     138  int getGyroBlockNum();
     139  long getGyro(int iGyro, int imesure);
    125140 
    126141  double getAzimut(int imesure);
     
    130145  double getAlpha(int imesure);
    131146  double getDelta(int imesure);
     147 
     148  static double decodeMJD(string const& dateString); // sans tenir compte de TU-TLeg
    132149   
    133150protected:
     
    143160 
    144161  void computeMJD(string const& fname);
     162 
     163  bool fixBlock(block_type_modele* blk);
     164  long searchNextBlock(long pos);
    145165   
    146166  int                       curKind;
  • trunk/Poubelle/archTOI.old/compress.h

    r315 r342  
    66/************************************************************************/
    77
    8 #ifndef int4
    9 #ifdef __alpha
    10 #define int4 int
    11 #else
    12 #define int4 long
    13 #endif
    14 #endif
    158
    169
     
    2417/*      pour    n = 72    en sortie     19 mots = 76 octets             */
    2518
    26 void compress_7_1(int4* in,int4*out,int n,int pasin);
     19void compress_7_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
    2720void decompress_7_1(int4* in,int4*out,int n);
    2821
     
    3629/*      pour    n = 72    en sortie     11 mots = 44 octets             */
    3730
    38 void compress_4_1(int4* in,int4*out,int n,int pasin);
     31void compress_4_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
    3932void decompress_4_1(int4* in,int4*out,int n);
    4033
     
    4942
    5043
    51 void compress_3_1(int4* in,int4*out,int n,int pasin);
     44void compress_3_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
    5245void decompress_3_1(int4* in,int4*out,int n);
    5346
     
    7063
    7164
    72 void compress_7_2(int4* in,int4*out,int n,int pasin);
     65void compress_7_2(unsigned int4* in,unsigned int4*out,int n,int pasin);
    7366void decompress_7_2(int4* in,int4*out,int n);
    7467
     
    8578
    8679
    87 void compress_4_2(int4* in,int4*out,int n,int pasin);
     80void compress_4_2(unsigned int4* in,unsigned int4*out,int n,int pasin);
    8881void decompress_4_2(int4* in,int4*out,int n);
    8982
     
    9689/************************************************************************/
    9790
    98 /*Les valeures de la table d'entree sont consideres comme toujopurs positives   */
    99 /* les ecarts sont calculés signés sur 32 bit avant d'etre tronconnés           */
     91/*      tous les nombres sont des entiers unsigned long pour compress                           */
     92/*Les valeures de la table d'entree sont consideres comme toujours positives et sur 21 bits     */
     93/*  les valeurs de reference pour le calcul des ecarts sont augmentees de ecart_bit=0x10000000  */
     94/*      LES ECARTS SONT DES ENTIERS POSITIFS (ecart_bit +  valeur courante - valeur precedente) */
    10095
    101 #define shif(ec,k,q)    {while(ec>q)if(k<kmax_){k++;q<<=1;}else ec=q;while(ec<-q)if(k<kmax_){k++;q<<=1;}else ec=-q;}
    102 #define recup(ec,sss,k) {ec=((R>>sss)&emak_);if(ec & sgbi_ ) ec|= sign_ ; ec<<=k;}
    103 #define arrondi(ec,k)   ((ec &  filtre[k]) +( (ec & test[k]) <<1 ) )   
     96/*  pour tous les compresseurs  */
     97#define kmax_   15              /*  valeur maximum de l'exposant        */
     98#define ecart_bit       0x10000000
     99#define shif(ec,k,q)    {while(ec>(q|ecart_bit))if(k<kmax_){k++;q<<=1;}else ec=(q|ecart_bit);while(ec<ecart_bit-q)if(k<kmax_){k++;q<<=1;}else ec=ecart_bit-q;}
     100#define arrondi(ec,k)   ((ec &  filtre[k]) +( (ec & test[k]) <<1 ) ) /* resultat sur 28 bit  */
     101#define new_val(val,ec,k)       ((val + arrondi(ec,k))&data_mask);
    104102
     103/* pour les decompresseurs      */
     104#define recup(ec,sss,k) {ec=((R>>sss)&ecart_mask);if(ec & sgbi_ ) ec|= sign_ ; ec<<=k;}
     105
  • trunk/Poubelle/archTOI.old/decompress.c

    r315 r342  
     1//#include <manip.h>
     2#include "archeops.h"
    13#include "compress.h"
    24
     
    810//*******************************************************************************************
    911
     12#define ecart_mask              0x7     /*      masque pour l'ecart             */             
     13
    1014void  decom_3(int4 val,int4* in,int4*out,int n);
    1115
    12 #define kmax_   15              /*  valeur maximum de l'exposant        */
    13 #define kmak_   0xf             /*      masque pour l'exposant          */
    14 #define emak_   0x7             /*      masque pour l'ecart             */             
     16#define k_mask  0xf             /*      masque pour l'exposant          */
    1517#define sgbi_   0x4             /*      bit de signe de l'ecart         */
    1618#define sign_   0xfffffff8      /*      masque de signe de l'ecart      */
     
    4244        {
    4345        R=in[i];
    44         k=R&kmak_;
     46        k=R&k_mask;
    4547        recup(ec1,29,k);
    4648        recup(ec2,26,k);
     
    7678void  decom_4_paire(int4 val1,int4 val2,int4* in,int4*out,int n);
    7779
    78 #undef kmax_
    79 #undef  kmak_
    80 #undef  emak_           
     80#undef  ecart_mask             
     81#define ecart_mask      0xf             /*      masque pour l'ecart             */             
    8182#undef  sgbi_
    8283#undef  sign_
     
    8485
    8586
    86 #define kmax_   15              /*  valeur maximum de l'exposant        */
    87 #define kmak_   0xf             /*      masque pour l'exposant          */
    88 #define emak_   0xf             /*      masque pour l'ecart             */             
     87#define k_mask  0xf             /*      masque pour l'exposant          */
    8988#define sgbi_   0x8             /*      bit de signe de l'ecart         */
    9089#define sign_   0xfffffff0      /*      masque de signe de l'ecart      */
     
    117116        {
    118117        R=in[i];
    119         k=R&kmak_;
     118        k=R&k_mask;
    120119        recup(ec1,28,k);
    121120        recup(ec2,24,k);
     
    164163        {
    165164        R=in[i];
    166         k=R&kmak_;
     165        k=R&k_mask;
    167166        recup(ec1,28,k);
    168167        recup(ec2,24,k);
     
    194193//*******************************************************************************************
    195194
    196 
    197 #undef kmax_
    198 #undef  kmak_
    199 #undef  emak_           
    200195#undef  sgbi_
    201196#undef  sign_
    202197
    203198
    204 
    205 #define kmax_   15              /*  valeur maximum de l'exposant        */
    206 #define kmak_   0xf             /*      masque pour l'exposant          */
    207 #define emak_   0x7f            /*      masque pour l'ecart             */             
     199#undef  ecart_mask             
     200#define ecart_mask              0x7f            /*      masque pour l'ecart 7 bits              */             
    208201#define sgbi_   0x40            /*      bit de signe de l'ecart         */
    209202#define sign_   0xffffff80      /*      masque de signe de l'ecart      */
     
    238231        {
    239232        R=in[i];
    240         k=R&kmak_;
     233        k=R&k_mask;
    241234        recup(ec1,25,k);
    242235        recup(ec2,18,k);
     
    281274        {
    282275        R=in[i];
    283         k=R&kmak_;
     276        k=R&k_mask;
    284277        recup(ec1,25,k);
    285278        recup(ec2,18,k);
     
    292285        val2+=ec4;      out[4*i+3]=val2;         
    293286
    294 /*if(i<5)  printf("in=%x  i=%d  k=%d  ec= %x %x %x %x  \n",R,i,k,ec1,ec2,ec3,ec4);      */
    295 
    296         }
    297 }
    298 
    299 
     287/*if(i<5)  printf("in=%x  i=%d  k=%d  ec= %x %x %x %x  \n",R,i,k,ec1,ec2,ec3,ec4);*/   
     288
     289        }
     290}
     291
     292
  • trunk/Poubelle/archTOI.old/ssthandler.cc

    r315 r342  
    77// free parameters = period + phase
    88
    9 #define DIODE_UNUSED_1 3
    10 #define DIODE_UNUSED_2 7
    11 
    129#include <math.h>
    1310#include "ssthandler.h"
     11
     12// diodpermut[i] = channel de la diode i
     13int SSTHandler::diodpermut[46]=
     14 { 8,24,40, 9,25,41,10,26,42,11,
     15  27,43,16,32, 1,17,33, 2,18,34,
     16   3,19,35,12,28,44,13,29,45,14,
     17  30,46,15,31,47,20,36, 5,21,37,
     18   6,22,38, 7,23,39};
     19 // voies 0 et 4 non connectees, voie 1 en panne.
    1420
    1521SSTHandler::SSTHandler()
     
    2127  lastBlkNum = -1;
    2228 
    23   Has2Bars(false);
     29  //Has2Bars(false);
    2430  prcTodo=0;
     31  seuil=100;
     32 
    2533}
    2634
     
    3644   
    3745  prcTodo    = x.prcTodo;
    38   has2bars   = x.has2bars;
    39   elecOffset = x.elecOffset;
     46 // has2bars   = x.has2bars;
     47 // elecOffset = x.elecOffset;
    4048  lastBlkNum = x.lastBlkNum;
     49  seuil      = x.seuil;
    4150}
    4251
     
    5362   
    5463  prcTodo    = x.prcTodo;
    55   has2bars   = x.has2bars;
    56   elecOffset = x.elecOffset;
     64 // has2bars   = x.has2bars;
     65 // elecOffset = x.elecOffset;
    5766  lastBlkNum = x.lastBlkNum;
     67  seuil      = x.seuil;
    5868 
    5969  return *this;
     
    7484}
    7585
     86bool SSTHandler::has2bars = false;
     87int  SSTHandler::elecOffset = 1;
     88
    7689void SSTHandler::Has2Bars(bool has, int eo)
    7790{
     
    89102    RemoveOffset();
    90103  }
    91  
     104  if (prcTodo & findStars) {
     105    FindStars();
     106  }
    92107}
    93108
     
    101116  // numero de la diode (0-47) = j*8+l;
    102117  // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
    103   // indice dans mot de 32 bits du premier bit utile = 28-4*l;
     118  // indice dans mot de 32 bits du premier bit utile = 4*l;
    104119   
    105120  for (j=0; j<48; j++) diod[j] = 0;
     
    108123    for (k=0; k<3; k++)
    109124      for (l=0; l<8; l++) {
    110         long word = blk->sst[i][j*3+k];
    111         word = (word >> (28-4*l)) & 0xF;
    112         //printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
     125        int4 word = blk->sst[i][j*3+k];
     126        word = (word >> (4*l)) & 0xF;
     127        // printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
    113128        diod[j*8+l] = (diod[j*8+l] << 4) + word;
    114129      }
     130
     131  //for (j=0; j<48; j++) if (diod[j]>2047) diod[j] -= 4096;
     132  for (j=0; j<48; j++)  diod[j] -= 2048;
     133 
    115134}
    116135
     
    124143 
    125144  for (int j=0; j<nb_per_block*2; j++) {
    126     // suppression des positions non utilisees. 3 et 7 ?
    127     for (int i=0; i<DIODE_UNUSED_1; i++)
    128       diode(j+j0,i) = diodeRaw[j][i];
    129     for (int i=DIODE_UNUSED_1; i<46; i++)
    130       diode(j+j0,i) = diodeRaw[j][ i<DIODE_UNUSED_2-1 ? i+1 : i+2 ];
    131  
     145    // permutation des diodes
     146    for (int i=0; i<46; i++)
     147      diode(j+j0,i) = diodeRaw[j][diodpermut[i]];
     148 
     149    /*
    132150    // calcul d'un fond sur la rangee. Moyenne clippee.
    133151    float m = 0; float sig = 1.e10;
     
    147165    for (int i=0; i<46; i++)
    148166      diode(j+j0,i) -= m;
     167    */
    149168  }
    150169}
     
    164183}
    165184
    166 
     185int SSTHandler::getStarZ(int imesure, int istar) // for last block
     186{
     187  int j0 = starHistLength-(nb_per_block*2);
     188  if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
     189  if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
     190  return stars[imesure+j0][istar].z;
     191}
     192
     193int SSTHandler::getStarF(int imesure, int istar) // for last block
     194{
     195  int j0 = starHistLength-(nb_per_block*2);
     196  if (imesure+j0<0 || imesure>=nb_per_block*2) return -99999;
     197  if (istar < 0 || istar >= stars[imesure+j0].size()) return -99999;
     198  return stars[imesure+j0][istar].m;
     199}
     200
     201
     202void SSTHandler::FindStars()  // sur les 72 derniers echantillons dans diode.
     203{
     204  int js0 = starHistLength-(nb_per_block*2);
     205  int jd0 = diodeHistLength-(nb_per_block*2);
     206  // Decalage vers la gauche de la taille d'un bloc
     207  for (int i=0; i<js0; i++) {
     208    stars[i] = stars[i+(nb_per_block*2)];
     209  }
     210 
     211  // Recherche d'etoiles
     212  for (int i=0; i<(nb_per_block*2); i++) {
     213    stars[js0+i].clear();
     214    for (int idiode=0; idiode<46; idiode++) {
     215      if (diode(jd0+i,idiode) < -seuil) {
     216        if (has2bars) {
     217          for (int j=-2; j>=-5; j--) {
     218            if (diode(jd0+i+j,(idiode+elecOffset)%46) < -seuil) {
     219              star s;
     220              s.z = idiode;
     221              s.m = -diode(jd0+i,idiode);
     222              s.t = i; // $CHECK$ need absolute time...
     223              stars[js0+i].push_back(s);
     224              break;
     225            } else if (idiode<45 && diode(jd0+i+j,(idiode+1+elecOffset)%46) > seuil) {
     226              star s;
     227              s.z = idiode+.5;
     228              s.m = -diode(jd0+i,idiode);
     229              s.t = i; // $CHECK$ need absolute time...
     230              stars[js0+i].push_back(s);
     231              break;
     232            }
     233          }
     234        } else {
     235          if (diode(jd0+i,idiode) > diode(jd0+i-1,idiode)) {
     236            star s;
     237            s.z = idiode;
     238            s.m = -diode(jd0+i-1,idiode);
     239            s.t = i; // $CHECK$ need absolute time...
     240            stars[js0+i].push_back(s);
     241          }
     242        }
     243      }
     244    }
     245  }
     246
     247
     248}
  • trunk/Poubelle/archTOI.old/ssthandler.h

    r315 r342  
    2626         
    2727  void NeedProcess(int prcMask);
    28   void Has2Bars(bool, int elecOffset=0); // elecOffset : which wired together
    2928  void ProcessBlock(block_type_sst*);
     29
     30  static void Has2Bars(bool, int elecOffset=0); // elecOffset : which wired together
    3031 
    3132  int  getRawSignal(int imesure, int idiode); // for last block
    3233  int  getSignal(int imesure, int idiode);    // for last block, imesure<0 -> history
     34  int  getStarZ(int imesure, int istar);      // for last block, imesure<0 -> history
     35  int  getStarF(int imesure, int istar);      // for last block, imesure<0 -> history
    3336  long getLastBlkNum() {return lastBlkNum;}
    3437
     
    3942  int   prcTodo;
    4043  int   starHistLength;
    41   bool  has2bars;
    42   int   elecOffset;
    4344  long  lastBlkNum;
     45  int   seuil;
     46 
     47  static bool  has2bars;
     48  static int   elecOffset;
    4449 
    4550  inline int& diode(int iSamp, int iDiod) {return diodeT[iSamp*nb_photo_diodes+iDiod];}
     
    5762  void RemoveOffset(); // diodeRaw -> diode, avec decalage, 1 echantillon.
    5863  void FindStars(); // sur les 72 derniers echantillons dans diode.
     64 
     65  static int  diodpermut[46]; // diodpermut[i] = channel de la diode i
    5966};
    6067
  • trunk/Poubelle/archTOI.old/test.cc

    r315 r342  
    55
    66#include "archeopsfile.h"
     7#include "archtoi.h"
    78#include "toisvr.h"
    89
     
    1112int main()
    1213{       
     14
     15    ArchTOI toi("test.toi");
     16    toi.run("test.data");
     17    return(0);
     18   
    1319        TOISvr svr;
    1420        //svr.SetFile("h99_04_29-15h36m22");
    15         svr.SetFile("/home/manip/mnt/planck/aubourg/h99_06_08-11h49m15");
     21        //svr.SetFile("Stock:ARCHEOPS:DATA:arch_24:arch-99_06_08:h99_06_08-11h49m15");
     22        svr.SetFile("Stock:ARCHEOPS:DATA:arch_26:arch-99_06_28:h99_06_28-11h23m41");
     23        //svr.SetFile("/home/manip/mnt/planck/aubourg/h99_06_08-11h49m15");
     24        //svr.SetDirectory("Stock:ARCHEOPS:DATA:arch_24:arch-99_06_08:");
     25        //svr.SetDirectory("Stock:ARCHEOPS:DATA:arch_24");
    1626        svr.AddInfo(sampleNum);
    1727        svr.AddInfo(internalTime);
     
    2030        svr.AddInfo(longitude, true, true);
    2131        svr.AddInfo(sstSignal,0);
    22         svr.AddInfo(sstSignal,10);
     32        svr.AddInfo(sstStarZ,0);
    2333        svr.AddInfo(boloTens,1);
    2434        svr.AddInfo(boloTens,2);
     35       
     36        SSTHandler::Has2Bars(true,1);
    2537       
    2638        TOIIter iter = svr.DoQuery();
     
    3345            setprecision(4) << iter.getValue(4) << " " <<
    3446                               iter.getValue(5) << " " << iter.getValue(6) << "\n";*/
     47                              // cout << iter.getValue(5) << endl;
     48                               
    3549          cout << iter.getTOI(sampleNum) << " " << iter.getTOI(internalTime) << " " <<
    36             setprecision(12) << iter.getTOI(utc) << " " <<
    37             setprecision(7) << iter.getTOI(longitude) << " " <<
    38             setprecision(4) << iter.getTOI(sstSignal) << " " <<
    39                                iter.getTOI(sstSignal,10) << " " << iter.getTOI(boloTens,1) << "\n";
     50            setprecision(12) << iter.getTOI(utc)       << " " <<
     51            setprecision(7)  << iter.getTOI(longitude) << " " <<
     52            setprecision(4)  << iter.getTOI(sstSignal) << " " <<
     53                                iter.getTOI(sstStarZ)  << " " <<
     54                                iter.getTOI(boloTens,1) << "\n";
    4055          of << iter.getValue(0) << " " << iter.getValue(1) << " " <<
    4156            setprecision(12) << iter.getValue(2) << " " <<
    42             setprecision(7) << iter.getValue(3) << " " <<
    43             setprecision(4) << iter.getValue(4) << " " <<
    44                                iter.getValue(5) << " " << iter.getValue(6) << "\n";
     57            setprecision(7)  << iter.getValue(3) << " " <<
     58            setprecision(4)  << iter.getValue(4) << " " <<
     59                                iter.getValue(5) << " " <<
     60                                iter.getValue(6) << "\n";
    4561        }
    4662       
  • trunk/Poubelle/archTOI.old/toiinterpolator.cc

    r315 r342  
    5858}
    5959
     60bool TOIInterpolator::isNewValue(long sample)
     61{
     62  deque<pair>::iterator i = hist.begin();
     63  while (i!=hist.end()) {
     64    if ((*i).t == sample) return true;
     65    if ((*i).t > sample) return false;
     66    i++;
     67  }
     68  return false;
     69}
     70
     71
    6072long TOIInterpolator::nextSample(long sampleMin)
    6173{
  • trunk/Poubelle/archTOI.old/toiinterpolator.h

    r315 r342  
    33
    44#include <deque>
     5
     6using namespace std;
     7
    58
    69class TOIInterpolator {
     
    1215  double getIValue(long sample);     // can forget before sample
    1316  double getEValue(long sample);     // can forget before sample
     17  bool   isNewValue(long sample);   
    1418  long   nextSample(long sampleMin); // the next true sample available
    1519
  • trunk/Poubelle/archTOI.old/toiiter.cc

    r315 r342  
    22#include "toiinterpolator.h"
    33#include <dirent.h>
     4#include <iostream.h>
    45
    56// Format bloc GPS
     
    1415 fileName = "";
    1516 
     17 files.clear();
     18
     19 isOnBoardRecorder = false;
     20   
     21 imes=0;
     22
    1623 tStart = -9.e99;
    17  tEnd   = -9.e99;
     24 tEnd   = 9.e99;
    1825 
    1926 tBlock0 = -1;
    20  
     27 perEch = -1;
     28 
     29 trigMask = 0;
    2130 rawIter = NULL;
    2231 interp  = NULL;
    2332 lastSample = -1;
    24  maxLookAhead = 1000;
     33 maxLookAhead = 10000;
    2534
    2635}
     
    3039  fileName = x.fileName;
    3140  files = x.files;
    32   curFile = x.curFile;
     41  //  curFile = x.curFile; // $CHECK$ DANGER !!
     42  curFile = files.find(*(x.curFile));
     43  isOnBoardRecorder = x.isOnBoardRecorder;
    3344  imes = x.imes;
    3445  tStart = x.tStart;
    3546  tEnd = x.tEnd;
    3647  tBlock0 = x.tBlock0;
     48  perEch = x.perEch;
    3749  trigMask = x.trigMask;
    3850  infos = x.infos;   
     
    6375}
    6476
     77#ifdef __MWERKS__
     78#define filesep ':'
     79#else
     80#define filesep '/'
     81#endif
     82
    6583void TOIIter::Init() {
    66 
    67   // $CHECK$ a deplacer, pour gerer repertoires...
     84 // On a soit un repertoire, soit un fichier, soit une liste de fichiers....
    6885  if (directory == "") {
    69     file = new ArcheopsFile(fileName);
    70   } else {
     86    if (files.empty()) {   // un seul fichier
     87      file = new ArcheopsFile(fileName);
     88    } else {
     89      curFile = files.begin();
     90      file = new ArcheopsFile((*curFile).c_str());
     91    }
     92  } else { // On a un repertoire a explorer
     93    // On cherche soit les fichiers dans le repertoire donne, soit des fichiers
     94    // dans un sous-repertoire "arch-YY_MM_DD". Les fichiers ont un nom en
     95    // "hYY_MM_DD-hh_mm_ss".
     96    // Pour l'enregistreur de vol, les fichiers ont un nom en ARKxxxxxx.DAT
     97    if (directory[directory.length()-1] != filesep)
     98      directory += filesep;
    7199    DIR* dir = opendir(directory.c_str());
    72100    struct dirent* ent;
    73101    while ((ent = readdir(dir)) != NULL) {
    74       files.insert(ent->d_name);
     102      // si c'est un repertoire, avec un nom de jour, il faut l'explorer...
     103      if (!strncmp(ent->d_name, "arch-", 5)) {
     104        double mjd = ArcheopsFile::decodeMJD(ent->d_name+5) - 2./24.; // ENTIER + .5 en temps local!
     105        if (mjd >= tStart - 1. && mjd <= tEnd) {
     106          string direc2 = directory + ent->d_name + filesep;
     107          DIR* dir2 = opendir(direc2.c_str());
     108          struct dirent* ent2;
     109          while ((ent2 = readdir(dir2)) != NULL) {
     110            if (*ent2->d_name == 'h') {
     111              double mjd2 = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.;
     112              if (mjd2 >= tStart - 1./24. && mjd2 <= tEnd) {
     113                files.insert(direc2 + ent2->d_name);
     114              }
     115            }
     116          }
     117        }
     118      } else {
     119        if (!isOnBoardRecorder && *ent->d_name == 'h') {
     120          double mjd = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; // $CHECK$ UTCOffset
     121          if (mjd >= tStart - 1./24. && mjd <= tEnd) {
     122            files.insert(directory + ent->d_name);
     123          }
     124        } else if (isOnBoardRecorder) {
     125          if (strncmp(ent->d_name, "ARK", 3)) continue;
     126          char * sfx = ent->d_name + strlen(ent->d_name) - 4;
     127          if (strcmp(sfx, ".DAT")) continue;
     128          files.insert(directory + ent->d_name);
     129        }
     130      }
    75131    }
    76132    closedir(dir);
     
    79135  }
    80136
    81   if (!file->lastParam()) file->nextBlock(block_param_mask);
     137  // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
     138  // car on ne peut rien faire sans...
     139  // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
     140  // on en simule un
     141  if (!file->lastParam()) {
     142    if (isOnBoardRecorder) {
     143      extern param_bolo  parametr;
     144      block_type_param block;
     145      block.param = parametr;
     146      valide_block((block_type_modele*)&block, block_param, 0);
     147      file->forceBlock((block_type_modele*)&block);
     148    } else {
     149      file->nextBlock(block_param_mask);
     150    }
     151  }
    82152  if (!file->lastReglage()) file->nextBlock(block_reglage_mask);
    83153 
    84154  // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC.
    85155  // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire
    86   // mieux en prenant le min de tous les delta_T.
    87  
    88   tBlock0 = file->getStartMJD();
    89 
    90   file->pushMark();
    91   if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
    92     // le temps du bloc courant, en secondes
    93     double dt = file->blockNum() * file->perBlock();
    94     tBlock0 = file->getGPSMJD() - dt/86400.;
    95   } else { // pas de bloc GPS...
     156  // mieux en prenant le min de tous les delta_T, a condition d'avoir un
     157  // peu plus de details sur la facon dont le GPS est lu.
     158 
     159  if (tBlock0 < 0) {
    96160    tBlock0 = file->getStartMJD();
    97   }
    98   file->popMark();
     161
     162    file->pushMark();
     163    if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
     164      // le temps du bloc courant, en secondes
     165      double dt = file->blockNum() * file->perBlock();
     166      tBlock0 = file->getGPSMJD() - dt/86400.;
     167    } else { // pas de bloc GPS...
     168      tBlock0 = file->getStartMJD();
     169    }
     170    file->popMark();
     171  }
     172 
     173  if (perEch < 0)
     174    perEch = file->perEchant();
    99175
    100176  bool hasInterp = false;
     
    109185          trigMask |= block_bolo_mask;
    110186          break;
     187        case gpsTime:
    111188        case longitude:
    112189        case latitude:
     190        case altitude:
    113191          trigMask |= block_gps_mask;
    114192          break;
     
    125203          file->needSSTProcessMask(SSTHandler::rmveOffset);
    126204          trigMask |= block_sst_mask;
     205          break;
     206        case sstRaw:
     207          trigMask |= block_sst_mask;
     208          break;
     209        case gyroRaw:
     210          trigMask |= block_gyro_mask;
    127211          break;
    128212        case alphaAxis:
     
    157241    return rawIter->NextFile();
    158242   
    159   if (directory == "") {
     243  if (files.empty()) {
    160244    return false;
    161245  } else {
     
    163247    curFile++;
    164248    if (curFile == files.end()) return false;
     249    cout << "opening file " << (*curFile).c_str() << endl;
    165250    ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str());
    166251    newfile->grabLastBlocs(*file);
     
    242327       return true;
    243328     case boloTens:
     329       if (imes==0 && file->llastBolo()==NULL) return false;
     330       return file->lastBolo() != NULL;
    244331     case boloRaw:
    245332       return file->lastBolo() != NULL;
    246333     case sstSignal:
     334     case sstRaw:
    247335       return file->lastSST() != NULL;
     336     case sstStarZ:
     337     case sstStarF:
     338       return (file->lastSST() != NULL) && (file->getSSTStarZ(index, imes) >= 0);
     339     case gyroRaw:
     340       return (file->lastGyro() != NULL);
     341     case gpsTime:
     342       return file->hasGPSTime();
    248343     case longitude:
    249344     case latitude:
    250        return file->lastGPS() != NULL;
     345       return file->hasGPSPos();
     346     case altitude:
     347       return file->hasGPSAlt();
    251348     case azimut:
    252349     case alphaAxis:
     
    271368       return file->blockNum() * file->nEchBlock() + imes;
    272369     case internalTime:
    273        return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
     370       //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
     371       return (file->blockNum() * file->nEchBlock() + imes) * perEch;
    274372     case utc:
    275373      /* printf("utc: %d %d %g %g %g\n",file->blockNum(),
     
    278376         (file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.,
    279377         tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.); */
    280        return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
     378       //return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
     379       return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.;
    281380     case boloTens:
    282381       return file->getMuVBolo(index, imes);
     
    285384     case sstSignal:
    286385       return file->getSSTSignal(index, imes);
     386     case sstRaw:
     387       return file->getSSTRawSignal(index, imes);
     388     case sstStarZ:
     389       return file->getSSTStarZ(index, imes);
     390     case sstStarF:
     391       return file->getSSTStarF(index, imes);
     392     case gyroRaw:
     393       return file->getGyro(index, imes);
     394     case gpsTime:
     395       return file->getGPSUTC();
    287396     case longitude:
    288        return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)
     397       return file->getGPSLong();
    289398     case latitude:
    290        return file->getGPSLat();  // $CHECK$ TBD gerer interpolation (dans file)
     399       return file->getGPSLat();
     400     case altitude:
     401       return file->getGPSAlt();
    291402     case azimut:
    292403       return file->getAzimut(imes);
     
    301412bool   TOIIter::newValue(int column) {
    302413   if (column < 0 || column >= infos.size()) return false;
     414   if (rawIter) {
     415       return interp[column].isNewValue(lastSample);
     416   }
    303417   TOIKind kind = infos[column].kind;
    304418   switch (kind) {
     
    311425     case boloRaw:
    312426       return file->blockNum() == file->getBoloBlockNum();
     427     case sstRaw:
    313428     case sstSignal:
     429     case sstStarZ:
     430     case sstStarF:
    314431       return file->blockNum() == file->getSSTBlockNum();
     432     case gyroRaw:
     433       return file->blockNum() == file->getGyroBlockNum();
     434     case gpsTime:
     435       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    315436     case longitude:
    316437       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    317438     case latitude:
     439       return file->blockNum() == file->getGPSBlockNum() && imes==0;
     440     case altitude:
    318441       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    319442     case azimut:
     
    334457   return (infos[column].interpolated && !newValue(column));
    335458}
     459
     460bool TOIIter::isTrig(int column) {
     461   if (column < 0 || column >= infos.size()) return false;
     462   return infos[column].triggering;
     463}
     464
    336465 
    337466TOIKind TOIIter::getKind(int column) {
     
    370499 
    371500int TOIIter::getSampleIndex() {
    372    return file->blockNum() * file->nEchBlock() + imes;
     501   if (file) {
     502     return file->blockNum() * file->nEchBlock() + imes;
     503   } else {
     504     return lastSample;
     505   }
    373506}
    374507 
     
    378511  long sample = rawIter->getSampleIndex();
    379512  for (int i=0; i<infos.size(); i++) {
    380     if (rawIter->canGetValue(i) && rawIter->newValue(i))
     513    if (rawIter->canGetValue(i) && rawIter->newValue(i)) {
    381514      interp[i].enterValue(rawIter->getValue(i), sample);
     515    }
    382516  }
    383517  return true;
    384518}
    385519
     520block_type_param* TOIIter::lastParam() {
     521  if (file) return file->lastParam();
     522  else return rawIter->lastParam();
     523}
     524
     525
  • trunk/Poubelle/archTOI.old/toiiter.h

    r315 r342  
    99
    1010enum TOIKind {
    11   sampleNum,  // Numero d'echantillon (timer interne transputer)
     11  sampleNum,  // Numero d''echantillon (timer interne transputer)
    1212  internalTime, // temps transputer depuis debut manip, en secondes.
    1313  utc,        // UTC (en jours, MJD = JD - 2450000). index=0 : premier bloc GPS. 1: + sioux.
    1414  boloTens,   // tension en microVolts, filtree avec filtre carre indexe par bolometre
    1515  boloRaw,    // tension brute, non filtree indexe par bolometre
    16   sstSignal,  // signal brut SST, indice = diode
    17   sstStarZ,   // numero de diode d'une eventuelle etoile,   i=etoile 0..n
    18   sstStarF,   // flux d'une eventuelle etoile,             -1 si moins de i+1 etoiles
     16  boloTemp,   // Kelvins
     17  sstSignal,  // signal brut SST, indice = diode, 0-45
     18  sstRaw,     // signal brut SST, indice = canal, 0-47
     19  sstStarZ,   // numero de diode d''une eventuelle etoile,   i=etoile 0..n
     20  sstStarF,   // flux d''une eventuelle etoile,             <0 si moins de i+1 etoiles
     21  gyroRaw,    // valeur brute du gyro, index = 0,1,2
     22  gpsTime,    // temps fourni par GPS
    1923  longitude,  // position ballon
    2024  latitude,   // position ballon
     25  altitude,   // position ballon
    2126  tsid,       // temps sideral en secondes
    2227  azimut,     // a preciser, reconstruit SST, magneto, autres...
    2328  alphaAxis,  //
    2429  deltaAxis,  //
     30  alphaSst,  //
     31  deltaSst,  //
    2532  alphaBolo,  // sur le ciel, indexe par bolometre
    2633  deltaBolo   // sur le ciel, indexe par bolometre
    27 
    2834};
    2935
     
    4147   bool    extendValue(int column);  // une valeur plus ancienne, etendue ?
    4248   bool    interpValue(int column);  // une valeur interpolee avec valeur future ?
     49   bool    isTrig(int column); 
    4350   TOIKind getKind(int column);
    4451   int     getIndex(int column);     // si plusieurs, exemple, tension bolo 2
     
    4855   
    4956   
    50    int    getBlockSampleIndex();        // numero d'echantillon dans dernier bloc bolo
    51    int    getSampleIndex();             // numero d'echantillon
     57   int    getBlockSampleIndex();        // numero d''echantillon dans dernier bloc bolo
     58   int    getSampleIndex();             // numero d''echantillon
    5259
    5360   block_type_param*         lastParam(); 
     
    6572   block_type_gyro_comprime* lastGyroComp();
    6673   block_type_sst_comprime*  lastSSTComp();
     74   
     75   ArcheopsFile* currentFile() {return file;}
    6776
    6877protected:
     
    7786   set<string> files;  // list of files in the directory...
    7887   set<string>::iterator curFile;
     88   bool  isOnBoardRecorder;
    7989   
    8090   int imes;
     
    8393   
    8494   double tBlock0;  // MJD du bloc numero zero...
     95   double perEch;   // periode d''echantillonage en secondes
    8596   
    8697   struct info {
     
    99110   friend class TOISvr;
    100111   
    101    // Gestion de l'interpolation, par delegation a un autre iterateur
     112   // Gestion de l''interpolation, par delegation a un autre iterateur
    102113   TOIIter* rawIter; // iterateur sans interpolation, qui avance avec retard
    103114                     // en bufferisant les valeurs. S'il existe, on lui delegue
     
    106117   long lastSample;  // last interpolated sample
    107118   long maxLookAhead;
    108    bool fetchAhead(); // avance d'une TOI en nourrissant les interpolateurs
     119   bool fetchAhead(); // avance d''une TOI en nourrissant les interpolateurs
    109120   
    110121   private:
  • trunk/Poubelle/archTOI.old/toisvr.cc

    r310 r342  
    1313  iter.fileName = f;
    1414}
     15
     16void TOISvr::AddFile(string f) {
     17  iter.directory = "";
     18  iter.files.insert(f);
     19}
     20
     21void TOISvr::SetMJD0(double t0) {
     22  iter.tBlock0 = t0;
     23}
     24
     25
     26void TOISvr::OnBoardRecorderFiles(bool x) {
     27  iter.isOnBoardRecorder = x;
     28}
     29
    1530 
    1631void TOISvr::SetTimeInterval(double tStart, double tEnd) {
    17   iter.tStart = tStart;
    18   iter.tEnd = tEnd;
     32  if (tStart>0) iter.tStart = tStart;
     33  if (tEnd>0)   iter.tEnd = tEnd;
    1934}
    2035 
  • trunk/Poubelle/archTOI.old/toisvr.h

    r310 r342  
    1010  void SetDirectory(string);
    1111  void SetFile(string);
     12  void AddFile(string);
     13  void OnBoardRecorderFiles(bool);
     14  void SetMJD0(double);
    1215 
    1316  void SetTimeInterval(double tStart, double tEnd);
Note: See TracChangeset for help on using the changeset viewer.