Changeset 342 in Sophya
- Timestamp:
- Aug 2, 1999, 3:45:52 PM (26 years ago)
- 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 38 38 39 39 SSTHandler sstHandler; 40 GPSParser gpsParser; 40 41 }; 41 42 … … 211 212 else if (!llastBolo) { 212 213 llastBolo = new block_type_bolo; 214 } 215 if (llastBolo) { 213 216 memcpy(llastBolo, lastBolo, sizeof(block_type_bolo)); 214 217 } … … 286 289 fn = x.fn; 287 290 f = fopen(fn.c_str(), "rb"); 291 292 rawMJD = x.rawMJD; 293 startMJD = x.startMJD; 294 utcOffset = x.utcOffset; 288 295 } 289 296 … … 300 307 //curBlock = oldFile.curBlock; 301 308 //peekBlock = oldFile.peekBlock; 302 peekPos = 0;309 if (peekPos>0) peekPos = 0; 303 310 setUTCOffset(oldFile.utcOffset); 304 311 } … … 306 313 307 314 def_nom_block 315 316 def_long_block 308 317 309 318 bool ArcheopsFile::nextBlock() { … … 316 325 317 326 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... 329 359 if (curPos < 0) { 330 360 curPos = 0; return true; 331 361 } 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 } 337 369 return true; 338 370 } … … 346 378 } 347 379 380 bool ArcheopsFile::fixBlock(block_type_modele* blk) { 381 return false; 382 } 383 384 348 385 int ArcheopsFile::blockKind() { 349 386 return curKind; … … 363 400 double p,f1,f2,f3; 364 401 int pp; 402 if (!lastReglage()) return -1; 365 403 pp=lastReglage()->reglage.horloge.periode; 366 404 p=pp/5.; … … 374 412 375 413 int ArcheopsFile::nEchBlock() { // Nb d'echantillons dans un bloc 376 return lastParam()->param.n_per_block*2 .;414 return lastParam()->param.n_per_block*2; 377 415 } 378 416 … … 448 486 } 449 487 488 void 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 450 494 void ArcheopsFile::postProcessBlock() { 451 495 switch (curKind) { … … 454 498 block_type_bolo blk2; 455 499 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock; 500 #if version_num <= 25 456 501 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)); 459 516 } 517 } 518 519 #endif 460 520 valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk)); 461 521 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2)); … … 464 524 } 465 525 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; 466 559 } 467 560 case block_sst : { 468 561 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock); 562 } 563 case block_gps : { 564 blockSet->gpsParser.ProcessBlock((block_type_gps*)&blockSet->curBlock); 469 565 } 470 566 } … … 519 615 #endif 520 616 617 #ifdef SWAP 521 618 void ArcheopsFile::swapEntete(block_type_modele* blk) { 522 #ifdef SWAP523 619 bswap4(&(blk->debut)); 524 620 bswap4(&(blk->code1)); 525 621 bswap4(&(blk->code2)); 526 622 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 627 void ArcheopsFile::swapEntete(block_type_modele* ) { 628 } 528 629 #endif 529 } 530 630 631 #ifdef SWAP 531 632 void ArcheopsFile::swapContent(block_type_modele* blk) { 532 #ifdef SWAP533 633 int typ = type_block(blk); 534 634 … … 550 650 for (int i=0; i<nb_max_bolo; i++) 551 651 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]); 556 656 #endif 557 } 558 657 } 658 659 } 660 } 661 #else 662 void ArcheopsFile::swapContent(block_type_modele* ) { 663 } 664 #endif 665 666 long 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 559 689 560 690 … … 562 692 static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 563 693 694 double 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 564 724 void ArcheopsFile::computeMJD(string const& fname) { 565 // h99_04_29-15h36m22566 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 567 727 char const* p = fname.c_str(); 568 728 char const* p2 = p + fname.length()-1; … … 570 730 if (*p2 == ':' || *p2 == '/') p2++; 571 731 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 } 589 737 startMJD = rawMJD - utcOffset/24.; 590 738 } … … 610 758 611 759 760 int ArcheopsFile::getGyroBlockNum() { 761 if (!lastGyro()) return -1; 762 return numero_block(lastGyro()); 763 } 764 765 612 766 // GPS 613 767 // $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z, … … 621 775 double ArcheopsFile::getGPSUTC() { // en secondes depuis minuit UTC jour courant 622 776 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; 626 783 double t; 627 784 sscanf(p, "%lg", &t); 628 785 int h = int(t/10000); t -= h*10000; 629 786 int m = int(t/100); t -= m*100; 630 return h*3600. + m*60. + t; 787 return h*3600. + m*60. + t;*/ 631 788 } 632 789 633 790 double ArcheopsFile::getGPSMJD() { // modified julian day du dernier bloc GPS, JD - 2450000 634 double t = getGPSUTC()/86400. ;791 double t = getGPSUTC()/86400. - 0.5; 635 792 if (t<0) return t; 636 793 if (t > (startMJD - int(startMJD))) { … … 643 800 double ArcheopsFile::getGPSLat() { // degres, + = NORD 644 801 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; 647 806 char* fence = p+80; 648 p += 7;807 p += 1; 649 808 while (*p != ',' && p<fence) p++; 650 809 if (*p != ',') return -9.e99; … … 658 817 p++; 659 818 if (*p == 'S') t = -t; 660 return t; 661 } 819 return t;*/ 820 } 821 662 822 663 823 double ArcheopsFile::getGPSLong() { // degres, + = EST 664 824 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; 667 829 char* fence = p+80; 668 p += 7;830 p += 1; 669 831 for (int i=0; i<3; i++) { 670 832 while (*p != ',' && p<fence) p++; … … 680 842 p++; 681 843 if (*p == 'W') t = -t; 682 return t; 683 } 684 844 return t;*/ 845 } 846 847 double 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 865 bool ArcheopsFile::hasGPSTime() { 866 if (!lastGPS()) return false; 867 return blockSet->gpsParser.hasGPSTime(); 868 } 869 870 bool ArcheopsFile::hasGPSPos() { 871 if (!lastGPS()) return false; 872 return blockSet->gpsParser.hasPosition(); 873 } 874 875 bool ArcheopsFile::hasGPSAlt() { 876 if (!lastGPS()) return false; 877 return blockSet->gpsParser.hasAltitude(); 878 } 685 879 686 880 687 881 // Bolo 882 #define val_DS(j,i) (blk->data_bolo[j][i]&0x1fffff) 883 688 884 689 885 long ArcheopsFile::getRawBolo(int ibolo, int imesure) { // donnee brute, avec seulement soustraction offset 690 886 int nb_coups,aa; 691 887 block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo(); 888 //cout << "raw " << imesure << " "; 692 889 if (imesure < 0) imesure += nEchBlock(); 693 890 if (!blk) return 0; … … 699 896 700 897 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); 703 902 } 704 903 … … 706 905 707 906 double 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; 710 909 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]))); 712 914 } 713 915 … … 719 921 } 720 922 721 722 923 long ArcheopsFile::getSSTSignal(int idiode, int imesure) { 723 924 return blockSet->sstHandler.getSignal(imesure, idiode); 724 925 } 926 927 long ArcheopsFile::getSSTRawSignal(int idiode, int imesure) { 928 return blockSet->sstHandler.getRawSignal(imesure, idiode); 929 } 930 931 double ArcheopsFile::getSSTStarZ(int istar, int imesure) { 932 return blockSet->sstHandler.getStarZ(imesure, istar); 933 } 934 935 double ArcheopsFile::getSSTStarF(int istar, int imesure) { 936 return blockSet->sstHandler.getStarF(imesure, istar); 937 } 938 939 long 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 725 953 // $CHECK$ TBD 726 954 -
trunk/Poubelle/archTOI.old/archeopsfile.h
r315 r342 16 16 17 17 #include "ssthandler.h" 18 #include "gpsparser.h" 18 19 19 20 enum { … … 33 34 block_gyro_comprime_mask = 1 << block_gyro_comprime, 34 35 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, 36 37 block_cmd_flash_mask = 1 << block_cmd_flash, 37 38 block_data_brute_mask = 1 << block_data_brute, … … 63 64 double getStartMJD(); 64 65 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) 66 67 bool nextBlock(long mask); // go to next block matching mask 68 bool gotValidBlock(); // current block is good 67 69 int blockKind(); // kind of the current bloc, enum in archeops.h 68 70 int blockRawKind(); // kind of the current raw bloc, enum in archeops.h … … 70 72 string blockKdName(); 71 73 string blockRawKdName(); 74 string filename() {return fn;} 72 75 73 76 double perEchant(); // periode d'echantillonage pour le dernier bloc reglage … … 102 105 block_type_sst_comprime* lastSSTComp(); 103 106 107 void forceBlock(block_type_modele* blk); 108 104 109 // Decodage des derniers blocs.. 105 110 … … 109 114 // Ces fonctions travaillent sur le dernier bloc GPS 110 115 int getGPSBlockNum(); 116 bool hasGPSTime(); 117 bool hasGPSPos(); 118 bool hasGPSAlt(); 111 119 double getGPSUTC(); // en secondes depuis minuit UTC 112 120 double getGPSMJD(); // modified julian day du dernier bloc GPS, JD - 2450000 113 121 double getGPSLat(); // degres, + = NORD 114 122 double getGPSLong(); // degres, + = EST 123 double getGPSAlt(); // meters from sea level 115 124 116 125 // Bolo … … 122 131 int getSSTBlockNum(); 123 132 void needSSTProcessMask(int mask); 133 long getSSTRawSignal(int iDiode, int imesure); 124 134 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); 125 140 126 141 double getAzimut(int imesure); … … 130 145 double getAlpha(int imesure); 131 146 double getDelta(int imesure); 147 148 static double decodeMJD(string const& dateString); // sans tenir compte de TU-TLeg 132 149 133 150 protected: … … 143 160 144 161 void computeMJD(string const& fname); 162 163 bool fixBlock(block_type_modele* blk); 164 long searchNextBlock(long pos); 145 165 146 166 int curKind; -
trunk/Poubelle/archTOI.old/compress.h
r315 r342 6 6 /************************************************************************/ 7 7 8 #ifndef int49 #ifdef __alpha10 #define int4 int11 #else12 #define int4 long13 #endif14 #endif15 8 16 9 … … 24 17 /* pour n = 72 en sortie 19 mots = 76 octets */ 25 18 26 void compress_7_1( int4* in,int4*out,int n,int pasin);19 void compress_7_1(unsigned int4* in,unsigned int4*out,int n,int pasin); 27 20 void decompress_7_1(int4* in,int4*out,int n); 28 21 … … 36 29 /* pour n = 72 en sortie 11 mots = 44 octets */ 37 30 38 void compress_4_1( int4* in,int4*out,int n,int pasin);31 void compress_4_1(unsigned int4* in,unsigned int4*out,int n,int pasin); 39 32 void decompress_4_1(int4* in,int4*out,int n); 40 33 … … 49 42 50 43 51 void compress_3_1( int4* in,int4*out,int n,int pasin);44 void compress_3_1(unsigned int4* in,unsigned int4*out,int n,int pasin); 52 45 void decompress_3_1(int4* in,int4*out,int n); 53 46 … … 70 63 71 64 72 void compress_7_2( int4* in,int4*out,int n,int pasin);65 void compress_7_2(unsigned int4* in,unsigned int4*out,int n,int pasin); 73 66 void decompress_7_2(int4* in,int4*out,int n); 74 67 … … 85 78 86 79 87 void compress_4_2( int4* in,int4*out,int n,int pasin);80 void compress_4_2(unsigned int4* in,unsigned int4*out,int n,int pasin); 88 81 void decompress_4_2(int4* in,int4*out,int n); 89 82 … … 96 89 /************************************************************************/ 97 90 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) */ 100 95 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); 104 102 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" 1 3 #include "compress.h" 2 4 … … 8 10 //******************************************************************************************* 9 11 12 #define ecart_mask 0x7 /* masque pour l'ecart */ 13 10 14 void decom_3(int4 val,int4* in,int4*out,int n); 11 15 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 */ 15 17 #define sgbi_ 0x4 /* bit de signe de l'ecart */ 16 18 #define sign_ 0xfffffff8 /* masque de signe de l'ecart */ … … 42 44 { 43 45 R=in[i]; 44 k=R&k mak_;46 k=R&k_mask; 45 47 recup(ec1,29,k); 46 48 recup(ec2,26,k); … … 76 78 void decom_4_paire(int4 val1,int4 val2,int4* in,int4*out,int n); 77 79 78 #undef kmax_ 79 #undef kmak_ 80 #undef emak_ 80 #undef ecart_mask 81 #define ecart_mask 0xf /* masque pour l'ecart */ 81 82 #undef sgbi_ 82 83 #undef sign_ … … 84 85 85 86 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 */ 89 88 #define sgbi_ 0x8 /* bit de signe de l'ecart */ 90 89 #define sign_ 0xfffffff0 /* masque de signe de l'ecart */ … … 117 116 { 118 117 R=in[i]; 119 k=R&k mak_;118 k=R&k_mask; 120 119 recup(ec1,28,k); 121 120 recup(ec2,24,k); … … 164 163 { 165 164 R=in[i]; 166 k=R&k mak_;165 k=R&k_mask; 167 166 recup(ec1,28,k); 168 167 recup(ec2,24,k); … … 194 193 //******************************************************************************************* 195 194 196 197 #undef kmax_198 #undef kmak_199 #undef emak_200 195 #undef sgbi_ 201 196 #undef sign_ 202 197 203 198 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 */ 208 201 #define sgbi_ 0x40 /* bit de signe de l'ecart */ 209 202 #define sign_ 0xffffff80 /* masque de signe de l'ecart */ … … 238 231 { 239 232 R=in[i]; 240 k=R&k mak_;233 k=R&k_mask; 241 234 recup(ec1,25,k); 242 235 recup(ec2,18,k); … … 281 274 { 282 275 R=in[i]; 283 k=R&k mak_;276 k=R&k_mask; 284 277 recup(ec1,25,k); 285 278 recup(ec2,18,k); … … 292 285 val2+=ec4; out[4*i+3]=val2; 293 286 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 7 7 // free parameters = period + phase 8 8 9 #define DIODE_UNUSED_1 310 #define DIODE_UNUSED_2 711 12 9 #include <math.h> 13 10 #include "ssthandler.h" 11 12 // diodpermut[i] = channel de la diode i 13 int 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. 14 20 15 21 SSTHandler::SSTHandler() … … 21 27 lastBlkNum = -1; 22 28 23 Has2Bars(false);29 //Has2Bars(false); 24 30 prcTodo=0; 31 seuil=100; 32 25 33 } 26 34 … … 36 44 37 45 prcTodo = x.prcTodo; 38 has2bars = x.has2bars;39 elecOffset = x.elecOffset;46 // has2bars = x.has2bars; 47 // elecOffset = x.elecOffset; 40 48 lastBlkNum = x.lastBlkNum; 49 seuil = x.seuil; 41 50 } 42 51 … … 53 62 54 63 prcTodo = x.prcTodo; 55 has2bars = x.has2bars;56 elecOffset = x.elecOffset;64 // has2bars = x.has2bars; 65 // elecOffset = x.elecOffset; 57 66 lastBlkNum = x.lastBlkNum; 67 seuil = x.seuil; 58 68 59 69 return *this; … … 74 84 } 75 85 86 bool SSTHandler::has2bars = false; 87 int SSTHandler::elecOffset = 1; 88 76 89 void SSTHandler::Has2Bars(bool has, int eo) 77 90 { … … 89 102 RemoveOffset(); 90 103 } 91 104 if (prcTodo & findStars) { 105 FindStars(); 106 } 92 107 } 93 108 … … 101 116 // numero de la diode (0-47) = j*8+l; 102 117 // 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; 104 119 105 120 for (j=0; j<48; j++) diod[j] = 0; … … 108 123 for (k=0; k<3; k++) 109 124 for (l=0; l<8; l++) { 110 longword = 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); 113 128 diod[j*8+l] = (diod[j*8+l] << 4) + word; 114 129 } 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 115 134 } 116 135 … … 124 143 125 144 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 /* 132 150 // calcul d'un fond sur la rangee. Moyenne clippee. 133 151 float m = 0; float sig = 1.e10; … … 147 165 for (int i=0; i<46; i++) 148 166 diode(j+j0,i) -= m; 167 */ 149 168 } 150 169 } … … 164 183 } 165 184 166 185 int 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 193 int 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 202 void 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 26 26 27 27 void NeedProcess(int prcMask); 28 void Has2Bars(bool, int elecOffset=0); // elecOffset : which wired together29 28 void ProcessBlock(block_type_sst*); 29 30 static void Has2Bars(bool, int elecOffset=0); // elecOffset : which wired together 30 31 31 32 int getRawSignal(int imesure, int idiode); // for last block 32 33 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 33 36 long getLastBlkNum() {return lastBlkNum;} 34 37 … … 39 42 int prcTodo; 40 43 int starHistLength; 41 bool has2bars;42 int elecOffset;43 44 long lastBlkNum; 45 int seuil; 46 47 static bool has2bars; 48 static int elecOffset; 44 49 45 50 inline int& diode(int iSamp, int iDiod) {return diodeT[iSamp*nb_photo_diodes+iDiod];} … … 57 62 void RemoveOffset(); // diodeRaw -> diode, avec decalage, 1 echantillon. 58 63 void FindStars(); // sur les 72 derniers echantillons dans diode. 64 65 static int diodpermut[46]; // diodpermut[i] = channel de la diode i 59 66 }; 60 67 -
trunk/Poubelle/archTOI.old/test.cc
r315 r342 5 5 6 6 #include "archeopsfile.h" 7 #include "archtoi.h" 7 8 #include "toisvr.h" 8 9 … … 11 12 int main() 12 13 { 14 15 ArchTOI toi("test.toi"); 16 toi.run("test.data"); 17 return(0); 18 13 19 TOISvr svr; 14 20 //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"); 16 26 svr.AddInfo(sampleNum); 17 27 svr.AddInfo(internalTime); … … 20 30 svr.AddInfo(longitude, true, true); 21 31 svr.AddInfo(sstSignal,0); 22 svr.AddInfo(sstS ignal,10);32 svr.AddInfo(sstStarZ,0); 23 33 svr.AddInfo(boloTens,1); 24 34 svr.AddInfo(boloTens,2); 35 36 SSTHandler::Has2Bars(true,1); 25 37 26 38 TOIIter iter = svr.DoQuery(); … … 33 45 setprecision(4) << iter.getValue(4) << " " << 34 46 iter.getValue(5) << " " << iter.getValue(6) << "\n";*/ 47 // cout << iter.getValue(5) << endl; 48 35 49 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"; 40 55 of << iter.getValue(0) << " " << iter.getValue(1) << " " << 41 56 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"; 45 61 } 46 62 -
trunk/Poubelle/archTOI.old/toiinterpolator.cc
r315 r342 58 58 } 59 59 60 bool 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 60 72 long TOIInterpolator::nextSample(long sampleMin) 61 73 { -
trunk/Poubelle/archTOI.old/toiinterpolator.h
r315 r342 3 3 4 4 #include <deque> 5 6 using namespace std; 7 5 8 6 9 class TOIInterpolator { … … 12 15 double getIValue(long sample); // can forget before sample 13 16 double getEValue(long sample); // can forget before sample 17 bool isNewValue(long sample); 14 18 long nextSample(long sampleMin); // the next true sample available 15 19 -
trunk/Poubelle/archTOI.old/toiiter.cc
r315 r342 2 2 #include "toiinterpolator.h" 3 3 #include <dirent.h> 4 #include <iostream.h> 4 5 5 6 // Format bloc GPS … … 14 15 fileName = ""; 15 16 17 files.clear(); 18 19 isOnBoardRecorder = false; 20 21 imes=0; 22 16 23 tStart = -9.e99; 17 tEnd = -9.e99;24 tEnd = 9.e99; 18 25 19 26 tBlock0 = -1; 20 27 perEch = -1; 28 29 trigMask = 0; 21 30 rawIter = NULL; 22 31 interp = NULL; 23 32 lastSample = -1; 24 maxLookAhead = 1000 ;33 maxLookAhead = 10000; 25 34 26 35 } … … 30 39 fileName = x.fileName; 31 40 files = x.files; 32 curFile = x.curFile; 41 // curFile = x.curFile; // $CHECK$ DANGER !! 42 curFile = files.find(*(x.curFile)); 43 isOnBoardRecorder = x.isOnBoardRecorder; 33 44 imes = x.imes; 34 45 tStart = x.tStart; 35 46 tEnd = x.tEnd; 36 47 tBlock0 = x.tBlock0; 48 perEch = x.perEch; 37 49 trigMask = x.trigMask; 38 50 infos = x.infos; … … 63 75 } 64 76 77 #ifdef __MWERKS__ 78 #define filesep ':' 79 #else 80 #define filesep '/' 81 #endif 82 65 83 void TOIIter::Init() { 66 67 // $CHECK$ a deplacer, pour gerer repertoires... 84 // On a soit un repertoire, soit un fichier, soit une liste de fichiers.... 68 85 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; 71 99 DIR* dir = opendir(directory.c_str()); 72 100 struct dirent* ent; 73 101 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 } 75 131 } 76 132 closedir(dir); … … 79 135 } 80 136 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 } 82 152 if (!file->lastReglage()) file->nextBlock(block_reglage_mask); 83 153 84 154 // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC. 85 155 // 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) { 96 160 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(); 99 175 100 176 bool hasInterp = false; … … 109 185 trigMask |= block_bolo_mask; 110 186 break; 187 case gpsTime: 111 188 case longitude: 112 189 case latitude: 190 case altitude: 113 191 trigMask |= block_gps_mask; 114 192 break; … … 125 203 file->needSSTProcessMask(SSTHandler::rmveOffset); 126 204 trigMask |= block_sst_mask; 205 break; 206 case sstRaw: 207 trigMask |= block_sst_mask; 208 break; 209 case gyroRaw: 210 trigMask |= block_gyro_mask; 127 211 break; 128 212 case alphaAxis: … … 157 241 return rawIter->NextFile(); 158 242 159 if ( directory == "") {243 if (files.empty()) { 160 244 return false; 161 245 } else { … … 163 247 curFile++; 164 248 if (curFile == files.end()) return false; 249 cout << "opening file " << (*curFile).c_str() << endl; 165 250 ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str()); 166 251 newfile->grabLastBlocs(*file); … … 242 327 return true; 243 328 case boloTens: 329 if (imes==0 && file->llastBolo()==NULL) return false; 330 return file->lastBolo() != NULL; 244 331 case boloRaw: 245 332 return file->lastBolo() != NULL; 246 333 case sstSignal: 334 case sstRaw: 247 335 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(); 248 343 case longitude: 249 344 case latitude: 250 return file->lastGPS() != NULL; 345 return file->hasGPSPos(); 346 case altitude: 347 return file->hasGPSAlt(); 251 348 case azimut: 252 349 case alphaAxis: … … 271 368 return file->blockNum() * file->nEchBlock() + imes; 272 369 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; 274 372 case utc: 275 373 /* printf("utc: %d %d %g %g %g\n",file->blockNum(), … … 278 376 (file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400., 279 377 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.; 281 380 case boloTens: 282 381 return file->getMuVBolo(index, imes); … … 285 384 case sstSignal: 286 385 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(); 287 396 case longitude: 288 return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)397 return file->getGPSLong(); 289 398 case latitude: 290 return file->getGPSLat(); // $CHECK$ TBD gerer interpolation (dans file) 399 return file->getGPSLat(); 400 case altitude: 401 return file->getGPSAlt(); 291 402 case azimut: 292 403 return file->getAzimut(imes); … … 301 412 bool TOIIter::newValue(int column) { 302 413 if (column < 0 || column >= infos.size()) return false; 414 if (rawIter) { 415 return interp[column].isNewValue(lastSample); 416 } 303 417 TOIKind kind = infos[column].kind; 304 418 switch (kind) { … … 311 425 case boloRaw: 312 426 return file->blockNum() == file->getBoloBlockNum(); 427 case sstRaw: 313 428 case sstSignal: 429 case sstStarZ: 430 case sstStarF: 314 431 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; 315 436 case longitude: 316 437 return file->blockNum() == file->getGPSBlockNum() && imes==0; 317 438 case latitude: 439 return file->blockNum() == file->getGPSBlockNum() && imes==0; 440 case altitude: 318 441 return file->blockNum() == file->getGPSBlockNum() && imes==0; 319 442 case azimut: … … 334 457 return (infos[column].interpolated && !newValue(column)); 335 458 } 459 460 bool TOIIter::isTrig(int column) { 461 if (column < 0 || column >= infos.size()) return false; 462 return infos[column].triggering; 463 } 464 336 465 337 466 TOIKind TOIIter::getKind(int column) { … … 370 499 371 500 int 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 } 373 506 } 374 507 … … 378 511 long sample = rawIter->getSampleIndex(); 379 512 for (int i=0; i<infos.size(); i++) { 380 if (rawIter->canGetValue(i) && rawIter->newValue(i)) 513 if (rawIter->canGetValue(i) && rawIter->newValue(i)) { 381 514 interp[i].enterValue(rawIter->getValue(i), sample); 515 } 382 516 } 383 517 return true; 384 518 } 385 519 520 block_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 9 9 10 10 enum TOIKind { 11 sampleNum, // Numero d' echantillon (timer interne transputer)11 sampleNum, // Numero d''echantillon (timer interne transputer) 12 12 internalTime, // temps transputer depuis debut manip, en secondes. 13 13 utc, // UTC (en jours, MJD = JD - 2450000). index=0 : premier bloc GPS. 1: + sioux. 14 14 boloTens, // tension en microVolts, filtree avec filtre carre indexe par bolometre 15 15 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 19 23 longitude, // position ballon 20 24 latitude, // position ballon 25 altitude, // position ballon 21 26 tsid, // temps sideral en secondes 22 27 azimut, // a preciser, reconstruit SST, magneto, autres... 23 28 alphaAxis, // 24 29 deltaAxis, // 30 alphaSst, // 31 deltaSst, // 25 32 alphaBolo, // sur le ciel, indexe par bolometre 26 33 deltaBolo // sur le ciel, indexe par bolometre 27 28 34 }; 29 35 … … 41 47 bool extendValue(int column); // une valeur plus ancienne, etendue ? 42 48 bool interpValue(int column); // une valeur interpolee avec valeur future ? 49 bool isTrig(int column); 43 50 TOIKind getKind(int column); 44 51 int getIndex(int column); // si plusieurs, exemple, tension bolo 2 … … 48 55 49 56 50 int getBlockSampleIndex(); // numero d' echantillon dans dernier bloc bolo51 int getSampleIndex(); // numero d' echantillon57 int getBlockSampleIndex(); // numero d''echantillon dans dernier bloc bolo 58 int getSampleIndex(); // numero d''echantillon 52 59 53 60 block_type_param* lastParam(); … … 65 72 block_type_gyro_comprime* lastGyroComp(); 66 73 block_type_sst_comprime* lastSSTComp(); 74 75 ArcheopsFile* currentFile() {return file;} 67 76 68 77 protected: … … 77 86 set<string> files; // list of files in the directory... 78 87 set<string>::iterator curFile; 88 bool isOnBoardRecorder; 79 89 80 90 int imes; … … 83 93 84 94 double tBlock0; // MJD du bloc numero zero... 95 double perEch; // periode d''echantillonage en secondes 85 96 86 97 struct info { … … 99 110 friend class TOISvr; 100 111 101 // Gestion de l' interpolation, par delegation a un autre iterateur112 // Gestion de l''interpolation, par delegation a un autre iterateur 102 113 TOIIter* rawIter; // iterateur sans interpolation, qui avance avec retard 103 114 // en bufferisant les valeurs. S'il existe, on lui delegue … … 106 117 long lastSample; // last interpolated sample 107 118 long maxLookAhead; 108 bool fetchAhead(); // avance d' une TOI en nourrissant les interpolateurs119 bool fetchAhead(); // avance d''une TOI en nourrissant les interpolateurs 109 120 110 121 private: -
trunk/Poubelle/archTOI.old/toisvr.cc
r310 r342 13 13 iter.fileName = f; 14 14 } 15 16 void TOISvr::AddFile(string f) { 17 iter.directory = ""; 18 iter.files.insert(f); 19 } 20 21 void TOISvr::SetMJD0(double t0) { 22 iter.tBlock0 = t0; 23 } 24 25 26 void TOISvr::OnBoardRecorderFiles(bool x) { 27 iter.isOnBoardRecorder = x; 28 } 29 15 30 16 31 void TOISvr::SetTimeInterval(double tStart, double tEnd) { 17 i ter.tStart = tStart;18 i ter.tEnd = tEnd;32 if (tStart>0) iter.tStart = tStart; 33 if (tEnd>0) iter.tEnd = tEnd; 19 34 } 20 35 -
trunk/Poubelle/archTOI.old/toisvr.h
r310 r342 10 10 void SetDirectory(string); 11 11 void SetFile(string); 12 void AddFile(string); 13 void OnBoardRecorderFiles(bool); 14 void SetMJD0(double); 12 15 13 16 void SetTimeInterval(double tStart, double tEnd);
Note:
See TracChangeset
for help on using the changeset viewer.