Index: /tags/V_240999/Poubelle/archTOI.old/Makefile_nodep
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/Makefile_nodep	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/Makefile_nodep	(revision 439)
@@ -0,0 +1,26 @@
+ifeq ($(HOSTTYPE), alpha)
+  CXX  = cxx
+endif
+ifndef (CFITSIODIR)
+  CFITSIODIR = ../cfitsio
+endif
+CPPFLAGS    =-O -g -I$(CFITSIODIR)
+
+LDLIBS=-L$(CFITSIODIR)/$(HOSTTYPE) -lcfitsio
+
+default: archtoi
+
+clean:
+	rm -f archtoi *.o archdump
+
+
+archtoi: archtoimain.o archtoi.o archeopsfile.o decompress.o toiiter.o toisvr.o archeops.o \
+         ssthandler.o toiinterpolator.o gpsparser.o asigps.o \
+         auxinterpgps.o tsid.o archparam.o dyffttools.o fft_mayer.o \
+         formepulse.o pisteetoile.o sstetoile.o transfelec.o \
+	 gyrohandler.o aa_hadec.o templocator.o plgalcross.o \
+	 arcunit.o
+	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@ -lm 
+archdump: archtoidump.o archeopsfile.o decompress.o archeops.o ssthandler.o
+	$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@ -lm
+
Index: /tags/V_240999/Poubelle/archTOI.old/aa_hadec.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/aa_hadec.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/aa_hadec.c	(revision 439)
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <math.h>
+#include "aa_hadec.h"
+#define GOODATAN2
+#define PI M_PI
+
+static void aaha_aux (double lat, double x, double y, double* p, double* q);
+
+
+/* given latitude (n+, radians), lat, altitude (up+, radians), alt, and
+ * azimuth (angle round to the east from north+, radians),
+ * return hour angle (radians), ha, and declination (radians), dec.
+ */
+void aa_hadec (double lat, double alt, double az, double* ha, double* dec)
+{
+	aaha_aux (lat, az, alt, ha, dec);
+}
+
+/* given latitude (n+, radians), lat, hour angle (radians), ha, and declination
+ * (radians), dec,
+ * return altitude (up+, radians), alt, and
+ * azimuth (angle round to the east from north+, radians),
+ */
+void hadec_aa (double lat, double ha, double dec, double* alt, double* az)
+{
+	aaha_aux (lat, ha, dec, az, alt);
+}
+
+/* the actual formula is the same for both transformation directions so
+ * do it here once for each way.
+ * N.B. all arguments are in radians.
+ */
+static void
+aaha_aux (double lat, double x, double y, double* p, double* q)
+{
+	static double lastlat = -1000.;
+	static double sinlastlat, coslastlat;
+	double sy, cy;
+	double sx, cx;
+#ifndef GOODATAN2
+	double sq, cq;
+	double a;
+	double cp;
+#endif
+
+	/* latitude doesn't change much, so try to reuse the sin and cos evals.
+	 */
+	if (lat != lastlat) {
+	    sinlastlat = sin (lat);
+	    coslastlat = cos (lat);
+	    lastlat = lat;
+	}
+
+	sy = sin (y);
+	cy = cos (y);
+	sx = sin (x);
+	cx = cos (x);
+
+/* define GOODATAN2 if atan2 returns full range -PI through +PI.
+ */
+#ifdef GOODATAN2
+	*q = asin ((sy*sinlastlat) + (cy*coslastlat*cx));
+	*p = atan2 (-cy*sx, -cy*cx*sinlastlat + sy*coslastlat);
+#else
+#define	EPS	(1e-20)
+	sq = (sy*sinlastlat) + (cy*coslastlat*cx);
+	*q = asin (sq);
+	cq = cos (*q);
+	a = coslastlat*cq;
+	if (a > -EPS && a < EPS)
+	    a = a < 0 ? -EPS : EPS; /* avoid / 0 */
+	cp = (sy - (sinlastlat*sq))/a;
+	if (cp >= 1.0)	/* the /a can be slightly > 1 */
+	    *p = 0.0;
+	else if (cp <= -1.0)
+	    *p = PI;
+	else
+	    *p = acos ((sy - (sinlastlat*sq))/a);
+	if (sx>0) *p = 2.0*PI - *p;
+#endif
+}
Index: /tags/V_240999/Poubelle/archTOI.old/aa_hadec.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/aa_hadec.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/aa_hadec.h	(revision 439)
@@ -0,0 +1,4 @@
+void aa_hadec (double lat, double alt, double az, double* ha, double* dec);
+void hadec_aa (double lat, double ha, double dec, double* alt, double* az);
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops.c	(revision 439)
@@ -0,0 +1,1 @@
+#include "archeops_28.c"
Index: /tags/V_240999/Poubelle/archTOI.old/archeops.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops.h	(revision 439)
@@ -0,0 +1,1 @@
+#include "archeops_28.h"
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_24.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_24.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_24.c	(revision 439)
@@ -0,0 +1,655 @@
+//for archediab
+//#include "manip.h"
+//for archTOI
+#include <stdio.h>
+#include "archeops.h"
+
+
+/**********  coefficients  pour  les  mesures  bolo    ********************************/
+/*                         toutes les puissances en pW                                */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin     */
+/*                                                                                    */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                       */
+/*                                                                                    */
+/*	-2-	fuite thermique du bolo   coef 3,4                                    */
+/*                                                                                    */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )          */
+/*                                                                                    */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                   */
+/*                                                                                    */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	      */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier) */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/**************************************************************************************/
+/*                                                                                    */
+/*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
+/*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
+/*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
+/*   pour les cartes modifiees : mettre diviseur=0                                    */
+/*                         et capa = la resistance de chage en Megohm                 */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/*  nom  ,  on/off  ,  0 = MLPA       , N° bolo ,  gain_pa  , capa*1000 , diviseur , coef*10000
+/*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     , 
+/*                     10 = Bediff    ,         ,           , 
+
+/* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo
+/*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc
+
+
+/*debut_param*/
+/*----------------------------------  fenetre :  -----------------------------------*/
+
+param_bolo  parametr={24,24,36,88,18,
+
+{
+{ "v1-bedif1"  , 1,10,1 ,  200, 22000,  200, { 5000   , 123100 , 334200 } },		
+{ "v1-bedif2"  , 1,10,2 ,  200, 22000,  200, { 5000    , 12.31 , 33.42 		} },
+{ "v1-bedif3"  , 1,10,3 ,  200, 22000,  200, { 5000    , 50.0 , 14.0 		} },
+{ "v1-bedif4"  , 1,10,4 ,  200, 22000,  200,  { 5000    , 12.31 , 33.42 	} },
+{ "v1-bedif5"  , 1,10,5 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 	} },
+{ "v1-bedif6"  , 1,10,6 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 	} },
+
+{ "v1-bedif7"  , 1,10,9 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif8"  , 1,10,10, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif9"  , 1,10,11, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif10" , 1,10,12, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42 		 } },
+{ "v1-bedif11" , 1,10,13, 1000, 4700, 1000, { 5000     , 12.31 , 33.42 		 } },
+{ "v1-bedif12" , 1,10,14, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+
+{ "v1-bedif13" , 1,10,17, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif14" , 1,10,18, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42 		 } },
+{ "germanium"  , 3,10,19, 1000, 22000 ,    0,  { 5000      , 12.31 , 33.42 		 } },
+{ "therm_4k"   , 3,10,20, 1000, 1000  ,    0,  { 5000      , 12.31 , 33.42 		 } },
+{ "therm_1.6k" , 3,10,21, 1000, 1000  ,    0,  { 5000      , 12.31 , 33.42 		 } },
+{ "therm_10k"  , 3,10,22, 1000, 1000  ,    0,  { 5000     , 12.31 , 33.42 		 } },
+
+{ "v1-bedif19"  , 2,10,25 , 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif20"  , 2,10,26, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif21"  , 2,10,27, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } },
+{ "v1-bedif22"  , 2,10,28, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42 		 } },
+{ "v1-bedif23"  , 2,10,29, 1000, 4700, 1000,  { 5000     , 12.31 , 33.42 		 } },
+{ "v1-bedif24"  , 2,10,30, 1000, 4700, 1000,  { 5000      , 12.31 , 33.42 		 } }
+
+}
+};
+/*fin_param*/
+
+
+
+/* bolos campagne 1998-1999	*/
+/*
+reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,	.5			,519.6  , 8.286
+v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41  		
+v1-232...N, 1, 0, 3, 100, 4.7, 333,		
+v1-237...E, 1, 0, 4, 100, 4.7, 333,
+
+reg_JamieO, 1, 0, 5, 100, 4.7, 101,
+
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
+V2-205...Q, 1, 0, 8, 100, 4.7, 333,	.518 , 81    , 25.2 
+V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
+
+*/
+/*bolos campagne 1997-1998	*/
+/*
+
+v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42 		
+v1-232...L, 1, 0, 2, 100, 4.7, 333,		
+v1-205...N, 1, 0, 3, 100, 4.7, 333,	.518 , 81    , 25.2	
+v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,	.5			,519.6  , 8.286
+Jamie....O, 1, 0, 5, 100, 4.7, 101,
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
+V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
+V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
+
+*/
+
+
+
+
+
+/*debut_nom_reglage*/
+/* 0->aa*/
+/* 1->bb*/
+/* 2->cc*/
+/* 3->reglage 3  */
+/* 4->reglage 4  */
+/* 5->reglage 5  */
+/* 6->reglage 6  */
+/* 7->reglage 7  */
+/*fin_nom_reglage*/
+
+
+
+
+
+
+
+reglage_bolo  reglage_standard[8]={{
+
+
+/*debut reglage 0 */
+{30,76,9,1},
+{0
+,10
+,1
+,3
+,10
+,2
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{22,100663296}
+,{-100646890,1}
+,{-100646890,1}
+,{22,0}
+,{-100638698,1}
+,{22,253952}
+,{-100646890,1}
+,{22,0}
+,{-100646890,1}
+,{-100646890,1}
+,{22,0}
+,{235388950,221185}
+,{20,0}
+,{20,0}
+,{16406,0}
+,{24598,0}
+,{22,0}
+,{24598,0}
+},{
+{1,22,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{0,0,0,0,0,0,0,0} 
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 1 */
+{30,76,9,1},
+{0
+,10
+,1
+,3
+,10
+,2
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{22,100663296}
+,{-100646890,1}
+,{-100646890,1}
+,{22,0}
+,{-100638698,1}
+,{22,253952}
+,{-100646890,1}
+,{22,0}
+,{-100646890,1}
+,{-100646890,1}
+,{22,0}
+,{235388950,221185}
+,{20,0}
+,{20,0}
+,{16406,0}
+,{24598,0}
+,{22,0}
+,{24598,0}
+},{
+{1,22,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+,{0,20,0,1}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{0,0,0,0,0,0,0,0} 
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 2 */
+{31,76,9,0},
+{0
+,-14
+,-31
+,-63
+,-83
+,-103
+,-122
+,127
+,1
+,97
+,14
+,-32
+,-93
+,-87
+,-72
+,-80
+,-101
+,-112
+,-113
+,-121
+},{
+{22,100663296}
+,{1040629782,204800}
+,{1040834582,221184}
+,{22,0}
+,{-100450282,2}
+,{22,253952}
+,{-100458474,2}
+,{22,0}
+,{-100442090,2}
+,{-100253674,253954}
+,{22,0}
+,{303013910,221184}
+,{20,0}
+,{20,0}
+,{9238,0}
+,{24598,301989888}
+,{22,0}
+,{24598,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{-15,-9,-13,-38}
+,{-83,-109,-90,-68}
+,{-99,-101,-67,-61}
+,{-64,-60,-38,-19}
+,{-28,-57,-77,-75}
+,{-66,-55,-51,-68}
+},{
+{31,76,9,0,0,-35,-4643}
+,{-55,-77,-69,-55,-44,-43,-12336}
+,{-56,-85,-128,99,111,-116,-28030}
+,{105,107,101,101,106,111,31615}
+},{-102,-88,-94,-113,-126,101,73,70} 
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 3 */
+{31,76,9,0},
+{0
+,-14
+,-31
+,-63
+,-83
+,-103
+,-122
+,127
+,1
+,99
+,13
+,96
+,-93
+,-87
+,-72
+,-80
+,-101
+,-112
+,-113
+,-121
+},{
+{22,100663296}
+,{1040629782,204800}
+,{1040834582,221184}
+,{22,0}
+,{-100450282,2}
+,{22,253952}
+,{-100458474,2}
+,{22,0}
+,{-100442090,2}
+,{-100253674,253954}
+,{22,0}
+,{303013910,221184}
+,{20,0}
+,{20,0}
+,{9238,0}
+,{24598,301989888}
+,{22,0}
+,{24598,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{-15,-9,-13,-38}
+,{-83,-109,-90,-68}
+,{-99,-101,-67,-61}
+,{-64,-60,-38,-19}
+,{-28,-57,-77,-75}
+,{-66,-55,-51,-68}
+},{
+{31,76,9,0,0,-35,-4643}
+,{-55,-77,-69,-55,-44,-43,-12336}
+,{-56,-85,-128,99,111,-116,-28030}
+,{105,107,101,101,106,111,31615}
+},{-102,-88,-94,-113,-126,101,73,70} 
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 4 */
+{31,76,9,0},
+{0
+,-14
+,-31
+,-63
+,-83
+,-103
+,-122
+,127
+,1
+,99
+,13
+,112
+,-93
+,-87
+,-72
+,-80
+,-101
+,-112
+,-113
+,-121
+},{
+{22,100663296}
+,{1040629782,204800}
+,{1040834582,221184}
+,{22,0}
+,{-100450282,2}
+,{22,253952}
+,{-100458474,2}
+,{22,0}
+,{-100442090,2}
+,{-100253674,253954}
+,{22,0}
+,{303013910,221184}
+,{20,0}
+,{20,0}
+,{9238,0}
+,{24598,301989888}
+,{22,0}
+,{24598,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{-15,-9,-13,-38}
+,{-83,-109,-90,-68}
+,{-99,-101,-67,-61}
+,{-64,-60,-38,-19}
+,{-28,-57,-77,-75}
+,{-66,-55,-51,-68}
+},{
+{31,76,9,0,0,-35,-4643}
+,{-55,-77,-69,-55,-44,-43,-12336}
+,{-56,-85,-128,99,111,-116,-28030}
+,{105,107,101,101,106,111,31615}
+},{-102,-88,-94,-113,-126,101,73,70} 
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 5 */
+{31,76,9,0},
+{0
+,-14
+,-31
+,-63
+,-83
+,-103
+,-122
+,127
+,1
+,97
+,14
+,-80
+,-93
+,-87
+,-72
+,-80
+,-101
+,-112
+,-113
+,-121
+},{
+{22,100663296}
+,{1040629782,204800}
+,{1040834582,221184}
+,{22,0}
+,{-100450282,2}
+,{22,253952}
+,{-100458474,2}
+,{22,0}
+,{-100442090,2}
+,{-100253674,253954}
+,{22,0}
+,{303013910,221184}
+,{20,0}
+,{20,0}
+,{9238,0}
+,{24598,301989888}
+,{22,0}
+,{24598,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{-15,-9,-13,-38}
+,{-83,-109,-90,-68}
+,{-99,-101,-67,-61}
+,{-64,-60,-38,-19}
+,{-28,-57,-77,-75}
+,{-66,-55,-51,-68}
+},{
+{31,76,9,0,0,-35,-4643}
+,{-55,-77,-69,-55,-44,-43,-12336}
+,{-56,-85,-128,99,111,-116,-28030}
+,{105,107,101,101,106,111,31615}
+},{-102,-88,-94,-113,-126,101,73,70} 
+/*fin_reglage*/
+
+},{0
+
+/*debut reglage 6 */
+/*fin_reglage*/
+
+},{0
+
+/*debut reglage 7 */
+/*fin_reglage*/
+
+} };
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+
+unsigned long	val_long(char x)
+{
+unsigned long a,xl;
+a=x-2;	if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
+
+
+
+int	calcul_somme_block(block_type_modele* blk,int longueur)
+{
+int i,so=0;;
+for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
+/* somme sur tous les mots internes	: on exclus le dbut, les codes et la fin	*/
+return((so^(so>>16))&0xffff);
+}
+
+
+
+
+void  valide_block(block_type_modele* blk,int type,int block_num)
+{
+int somme,longueur;
+def_long_block
+longueur=long_block[type];
+/*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
+/* 		,(unsigned)blk,type,block_num,longueur);*/
+blk->debut		=	debut_block_mesure;
+blk->code2		=	(((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
+
+blk->mot[longueur/4-4]  =	fin_block_mesure;
+somme=calcul_somme_block(blk,longueur);
+blk->code1		=	(((long)longueur)<<16)	|	somme;
+}
+
+
+/* Quand on est sur une machine swappee, on ne cherche pas a verifier */
+/* le checksum, puisqu'on a modifie les blocs, sans swapper par exemple */
+/* les chars des noms de bolometres et des chaines GPS... */
+#ifdef __alpha
+#define SWAP
+#endif
+#if defined(Linux)  || defined(linux)
+#define SWAP
+#endif
+
+int  verifie_block(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+if(blk->debut != debut_block_mesure)					return(block_debut_erreur);
+type=type_block(blk);		if( (type<0) ||(type>=nb_type_blocks) )	return(block_type_inconnu);	
+lg=longueur_block(blk);		if( lg != long_block[type] )		return(block_longueur_erreur);	
+if( blk->mot[(lg/4)-4]  !=	fin_block_mesure)			return(block_fin_erreur);	
+#ifndef SWAP
+som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))		return(block_somme_erreur);
+#endif
+return(block_correct);
+}
+
+
+int  verifie_block_printf(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+def_nom_block
+if(blk->debut != debut_block_mesure)
+	{
+	printf(" erreur dans le code debut de block	 \n");
+	return(block_debut_erreur);
+	}	
+
+type=type_block(blk);
+if( (type<0) || (type>nb_type_blocks) )	
+	{
+	printf(" block de type %d  inconnu\n",type);
+	return(block_type_inconnu);
+	}
+
+lg=longueur_block(blk);
+if( lg!=long_block[type] )	
+	{
+	printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
+			,nom_block[type],long_block[type],lg);
+	return(block_longueur_erreur);
+	}
+
+som=calcul_somme_block(blk,lg);
+if( som!=somme_block(blk) )	
+	{
+	printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
+			,nom_block[type],som,somme_block(blk) );
+	return(block_somme_erreur);
+	}
+	
+if(blk->mot[(lg/4)-4]	!= fin_block_mesure)	
+	{
+	printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
+			,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
+	return(block_fin_erreur);
+	}
+
+return(block_correct);
+}
+
+
+
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_24.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_24.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_24.h	(revision 439)
@@ -0,0 +1,914 @@
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 archeops.h  :	structure de données            	*/
+/*                                                                      */
+/*======================================================================*/
+
+#define		_archeops
+#define		version_num		24
+
+
+/*======================================================================*/
+/*                                                                      */
+/* 			historique des modifications            	*/
+/*                                                                      */
+/*                                                                      */
+/*  VERSION 24:                                                         */
+/*                                                                      */
+/*	- utilise le fichier archeops.c					*/
+/*	- nb_max_bolo=24  avec nb_bolo_util=18				*/
+/*	- change la structure du block dilution				*/
+/*									*/
+/*									*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+
+/*======================================================================*/
+/*  ---------------  parametres generaux de definition   -------------  */
+/*======================================================================*/
+
+#ifndef int4
+#ifdef __alpha
+#define int4 int
+#undef programme
+#else
+#define int4 long
+#endif
+#endif
+
+#ifdef linux
+#undef programme
+#endif
+
+#ifdef	_planck
+#define	_archeops
+#define _trapani
+#define _sans_transputer
+#endif
+
+#ifdef	_archeops
+/*#define _test_diabolo	 relecture des blocks fabriques avec diabolo	*/
+#define _trapani		/*  configuration  prevue pour Trapani	*/
+/*#define _kiruna		  block standard prevu pour kiruna	*/ 
+#endif
+
+
+
+/*======================================================================*/
+/*  --------------	valeurs des parametres dans	-------------   */
+/*  --------------	les différentes configurations	-------------   */
+/*======================================================================*/
+/*									*/
+/*  configuration pour Trapani : 3 bebos  /  12 bolos			*/
+/*									*/
+/*  bebo1 :   voies  1  à  6	-->  bolo  1 a  6			*/
+/*  bebo2 :   voies  9  à  14	-->  bolo  7 à 12			*/
+/*									*/
+/*  bebo6 :								*/
+/*  	voies  41 42 43 44	=  carte simplifiee avec AMP01		*/
+/*  	voies  45 et 46		= chauffage pour regulation		*/    
+/*	on ecrira plus tard le stockage des donnees simplifiees		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+/*	nb_per_block	doit etre divisible par 2						*/
+/*	nb_max_bolo	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+/*	nb_bolo_util	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+
+
+#ifdef	_trapani
+#define nb_max_bolo 		24	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		18	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_kiruna
+#define nb_max_bolo 		36	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		32	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_test_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_sans_transputer
+#define nb_byte_mot		5	/*  nombre d'octets dans un mot d'acquisition planck	*/
+#else
+#define nb_byte_mot		8	/*  nombre d'octets dans un mot d'acquisition archeops	*/
+#endif
+
+#define nb_sync			6	/*  nombre de signaux de synchro			*/
+#define	nb_element_catalog	256	/* nombre d'éléments catalog par reponse enregistreur	*/
+
+
+#ifdef	transmet_data_brute
+#define		taille_maxi_block_archeops	sizeof(block_type_data_brute)
+#else					/* 	le plus gros des différents blocks de télémesure*/
+#define		taille_maxi_block_archeops	sizeof(block_type_bolo)
+#endif
+
+#define		nombre_de_regul		4
+#define		nombre_de_voies		6
+#define 	nb_type_blocks		20	/*  nombre de type de blocks (multiple de 4)	*/
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=======================   télécommande      ==========================*/
+/*======================================================================*/
+
+
+/*   --------------   codes de reconnaissance des paquets de télécommande	--------------   */   
+
+#define		debut_telecommande		0x23456789
+#define		fin_telecommande		0x98765432
+
+/*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops	--------------   */   
+
+#define 	tc_dir_transputer		1
+#define 	tc_dir_reset_epld		3
+
+/*  -------------  codes  des  prefix des  telecommandes traités le transputer	--------------   */
+
+#define		tc_horloge			255	/* (-1)	*/
+#define		tc_cadence1			128
+#define		tc_cadence2			129
+#define		tc_cadence3			130
+#define		tc_regul			251	/* (-5)	*/
+#define		tc_switch_dil			250
+#define		tc_dac_dil			249
+
+/*======================================================================*/
+/*	telecommande reduite  sur 18 bit				*/
+/*======================================================================*/
+
+/*______________________________________________________________________________________________*/
+/*	1er mot	:	code de debut de telecommande reduite					*/
+#define		tc_reduite			248	
+/*______________________________________________________________________________________________*/
+/*	2eme mot:	4bit:	16 codes  de direction  tc2					*/
+enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
+	,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
+	,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution};			/* 11 codes: reste 5 disponibles*/
+
+
+/*______________________________________________________________________________________________*/
+/*	3eme mot:	6bit:									*/
+
+/*	code2=dac-gain-voie  	:	numero de bolo						*/
+
+/*	code2=tc2_horloge	:								*/
+/*		soit un code defini								*/
+/*		soit le code tc3_vitesse+i avec i=0.. nb_type_block				*/
+enum{tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag,tc3_vitesse};
+#define	tc3_suite	tc3_vitesse+nb_type_block
+
+
+/*	code2=tc2_regul	:									*/
+
+
+/*	code2=tc2_auto_bolo	:						*/
+
+
+/*	code2=tc2_auto_dilu	:						*/
+/* 	les valeurs des parametres d'auto_dilu ne depassent pas 128 		*/
+
+
+/*	code2=tc2_dilution	:						*/
+
+
+/*______________________________________________________________________________*/
+/*	4eme mot:	8bit:	valeur a ecrire			*/		
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=========================   télémesure    ============================*/
+/*======================================================================*/
+
+/*   -------   codes de reconnaissance des paquets de télémesure        */   
+
+#define		debut_block_mesure		((int4)0x45627491)
+#define		fin_block_mesure		((int4)0x83260432)
+
+
+
+
+
+/*======================================================================*/
+/*  ------------------------------------------------------------------  */
+/*  ---------  	Les  formats  des  blocks  type   ARCHEOPS   	-------	*/
+/*  ------------------------------------------------------------------  */
+/*======================================================================*/
+
+
+
+/*==============================================================================================*/
+
+/*	Le tableau est lut dans le desordre par le mac en lecture de la carte pci :		*/
+
+/*	Les entiers long sont ecrits tels quels							*/
+/*	Les short sont ecrits permuté 2 a 2 par le tansputer					*/
+/*	Les tables char sont ecrits permuté 4 / 4 par le transputer				*/
+/*	A la lecture dans le mac, tout est bon							*/
+
+
+/*  ---------  	 structures N° 0 :   parametres de mesure des bolometres        -------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct	
+	{
+	char		bolo_nom[32];		/*  le nom de chaque bolometre			*/
+	int4		bolo_code_util;		/*  le code d'utilisation du bolo		*/
+	int4		bolo_bebo;		/*  le type d'acquisition:  0 pour MLPA 10 pour BEBODIFF */
+	int4		bolo_num;		/*  l'adresse hard du bolo			*/
+	int4		bolo_gain;		/*  le gain du preampli				*/
+	int4		bolo_capa;		/*  la valeur capa du modulateur		*/
+	int4 		bolo_diviseur;		/*  le diviseur de la compensation		*/
+	int4	  	coef[7];		/*  les coef pour le calcul de la température	*/
+	}
+	param_un_bolo;
+/* code_util des bolos  */
+enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
+
+	
+typedef struct		/*  		table des parametres de mesure bolometre 		*/
+			/*	cette table ne change pas (en principe) en cours de mesure	*/
+	{
+	int4		numero_version;			/*  numero de version du header archeops.h	*/
+	int4		n_max_bolo;			/*  nombre maxi de bolos  (divisible par 4)	*/
+	int4		n_per_block;			/*  nombre de periodes entieres dans un block	*/
+	int4		n_max_mes_per;			/*  nb de points maxi dans une periode complete	*/
+
+	int4		nb_bolo;			/*  nombre de bolometres effectivement lut	*/
+	param_un_bolo	bolo[nb_max_bolo];
+	}
+	param_bolo;
+	
+	
+	
+	
+/*	
+	long		bolo_code_util[nb_max_bolo];	
+	char		bolo_nom[nb_max_bolo][32];	
+
+	long		bolo_bebo[nb_max_bolo];		
+	long		bolo_num[nb_max_bolo];		
+	long		bolo_gain[nb_max_bolo];		
+
+	long		bolo_capa[nb_max_bolo];		
+	long 		bolo_diviseur[nb_max_bolo];	
+	
+	long	  	coef[nb_max_bolo][7];		
+
+	long		presence_bebo;			
+	}
+	param_bolo;
+*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	param_bolo	param;		/*	les parametres de mesure des bolometres		*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_param;			
+	
+
+
+
+/*  -------------------   structures N° 1 :   journal de bord        ---------------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+#define long_page	10
+typedef struct				  
+	{
+	int4		code2;		/* 	code de la ligne du journal			*/
+					/* 	code idem code2 debut de block : 		*/
+					/*  	contient un code de commande			*/
+					/*	et le numero du block lors de la télécommande	*/
+	char		mot[8];		/* 	contenu de la ligne du  journal			*/
+	}
+	ligne_journal;			
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	ligne_journal	jj[long_page];	/*	block de 10 lignes de journal			*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_journal;			
+	
+
+/*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------	*/
+/*  ------------------------------------------------------------------------------------------	*/
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = param.bolo_gain[bolo]*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+
+/*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]		*/
+#define		gainbrut(aa)	((char)(((aa).mot1&0x1f)))		
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+#define		phase(aa)	((char)(((aa).mot1&0x60)>>5))		
+#define		comm(aa)	((char)(((aa).mot1&0x80)>>7))		
+#define		dac_V(aa)	((int)(((aa).mot1&0xfff00)>>8)	)	
+#define		dac_I(aa)	((int)(((aa).mot1&0xfff00000)>>20))		
+
+#define		voie(aa)	((char)(((aa).mot2&0xff)))		
+#define		dac_T(aa)	((int)(((aa).mot2&0xfff00)>>8))		
+#define		dac_L(aa)	((int)(((aa).mot2&0xfff00000)>>20))		
+
+/*
+#define		bolo_mot1(dacV,dacI,gainbrut,phase,comm)	((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20) 
+#define		bolo_mot2(dacT,dacL,voie)			((voie)&0xff) 	  | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
+*/
+
+#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) 
+#define		bolo_mot2(dacT,dacL,voie)			(((long)(voie))&0xff) 	  | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
+
+
+typedef struct	
+	{
+	int4	mot1;		/*  dac1 = mot[11..0]; dac2=mot1[23..12]	*/
+				/*  gain = mot1[27..24]; phase = mot1[31..28];	*/
+	int4	mot2;		/*  dac3 = mot[11..0]; dac4=mot1[23..12]	*/
+				/*  voie pour reglages auto  = mot2[31..24];	*/
+	}
+	reglage_un_bolo;
+
+
+
+#ifdef programme	/***********   structure normale pour le mac   ****************/
+
+typedef struct	
+	{
+	char	periode;
+	char	nb_mesures;
+	char	temp_mort;
+	char	flag;
+	}
+	horloge;
+
+typedef struct
+	{
+	char	mode;			/*   on_off et deglitch				*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	integ;
+	char 	deriv;
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	}
+	regul_bolo;			/*  longueur 2 entiers long			*/
+
+typedef struct
+	{
+	char	mode;
+	char	gain;
+	char	courant;
+	char	delai;
+	}
+	auto_bolo;			/*  longueur 1 entiers long			*/
+
+typedef struct
+	{
+	char	vanne;
+	char	helium;
+	char	chauffage;
+	char	piles;
+	char	transmission;
+	char	temps_max_vanne;
+	char	xx7;
+	char	xx8;
+	}
+	auto_dilu;			/*  longueur 1 entiers long		*/
+
+
+
+#else		/***********  structure swappée pour le transputer   ****************/
+
+typedef struct	
+	{
+	char	flag;
+	char	temp_mort;
+	char	nb_mesures;
+	char	periode;
+	}
+	horloge;
+	
+
+typedef struct
+	{
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	mode;			/*   on_off et deglitch				*/
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	char 	deriv;
+	char	integ;
+	}
+	regul_bolo;			/*  longueur 2 entiers long		*/
+
+
+typedef struct
+	{
+	char	delai;
+	char	courant;
+	char	gain;
+	char	mode;
+	}
+	auto_bolo;			/*  longueur 1 entiers long		*/
+
+typedef struct
+	{
+	char	piles;
+	char	chauffage;
+	char	helium;			/* periode de mesure		*/
+	char	vanne;		
+	char	xx8;
+	char	xx7;
+	char	temps_max_vanne;
+	char	transmission;
+	}
+	auto_dilu;			/*  longueur 1 entiers long		*/
+
+
+#endif		/***********   fin des structures swappées       ****************/
+
+enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch};
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+enum{vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_pression_piles,vanne_auto_pression_piles_temps};
+enum{trans_rien,trans_normal,trans_rapide,trans_lent};
+
+
+typedef struct							/*  long en mot de 32 bit   	*/
+	{
+	horloge			horloge;			/*			1	*/
+	char			vitesse[nb_type_blocks];	/*			5	*/
+	reglage_un_bolo		bolo[nb_max_bolo]; 		/*	18 * 2	= 	36	*/
+	auto_bolo		autom[nombre_de_voies];		/*	6  * 1		6	*/								
+	regul_bolo		regul[nombre_de_regul];		/*	4  * 2	=	8	*/									
+	auto_dilu		dilu;				/*			2	*/
+	}
+	reglage_bolo;						/*	total 58		*/
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	reglage_bolo	reglage;											
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_reglage;			
+	
+/*  ---------------------   structures N° 3 :    etat de la dilution	-----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+/*	int4		data_dil[50];	 data brutes de la dilution				*/
+	int4		switch_dil;
+	int4		ADC_dil[48];	/*	la lecture des 48 ADC de la carte DIL		*/
+	int4		DAC_dil[4];	/*	les 4 dac de la carte dilution			*/
+	int4		DAC_sst[4];	/*	les 4 dac de la carte sst			*/
+	int4		gyro_dil[3][nb_per_block*2];	/* les gyros a supprimer		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_dilution;			
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  6: chauffage 1	*/
+#define chauffage3		0x00001000	/*  6: chauffage 1	*/
+#define chauffage4		0x00000800	/*  6: chauffage 1	*/
+#define chauffage5		0x00000400	/*  6: chauffage 1	*/
+#define chauffage6		0x00000200	/*  6: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+/*  position des mesures sur les multiplexeurs		*/
+
+enum{
+/* multiplex11..18:*/	mul11_	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,mul28	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a2	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,mul44	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+enum{t_a1,t_a4};	/* en attendant de trouver leurs places	*/
+/* reste libres :  mul  11 - 12 - 21 - 22 - 25 - 28 - 31 - 44 - 57 - 58 - 64	*/
+
+
+
+/*  ---------------------   structures N° 4 :     gps           -------------------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	char		gps[80];	/*      les données GPS (une chaine maxi 80 cara)	*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gps;			
+	
+
+
+/*  ---------------------   structures N° 5 :   tous les bolos 1 periode     	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	short 		bol_per[nb_max_bolo][nb_max_mes_per];		
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_une_periode;			
+
+/*  ----------------   structures N° 6 :  signals de synchro (pour test au sol)	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		synchro[nb_sync][nb_per_block*2];	
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_synchro_sol;			
+
+/*  ---------------------   structures N° 7 : block de données de pointage sol      -----------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		comment[1024];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_pointage_sol;			
+
+
+
+/*  -------------   structures N° 8 :   données brutes des bolometres    ----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque bolo, un vecteur 72 points		*/
+	int4		data_bolo[nb_max_bolo][nb_per_block*2];	
+					/*	data D.S.	(en mots de 32 bits)		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo;			
+
+/*  ---------------------   structures N° 9 :   données des gyroscopes et du magnétometre	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/* chaque gyro: un vecteur tde 72 valeurs		*/
+	int4		gyros[3][nb_per_block*2];
+	int4		magneto[3];	/*	1 bit par echantillonage soit 3*32bit>72	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro;			
+
+/*  ---------------------   structures N° 10 :   données senseur stellaire	  -----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		sst[nb_per_block*2][18];
+					/* chaque mesure: un paquet de 18 mots de 32 bits	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst;			
+
+/*  ---------------------   structures N° 11 :    rien		          -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type11;			
+
+/*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit	 ------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+					/*	pour chaque bolo, un vecteur  19 mots		*/
+	int4		data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo_comprime;			
+
+/*  ---------------------   structures N° 13 :    block_type_gyro_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+	int4		gyro[3][ (nb_per_block/2) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro_comprime;			
+
+/*  ---------------------   structures N° 14 :    block_type_sst_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque diode, un vecteur  11 mots		*/
+	int4		sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst_comprime;			
+
+
+
+/*  ---------------------   structures N° 15 : catalog_flash      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+typedef struct	  			/*	etat de l'enregistreur				*/
+	{
+	int4		nb_total_catalog;
+	int4		memoire_libre;
+	int4		nb_block_erreur;
+	}status_flash;
+
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	int4		commande;	/*	la commande a laquelle ce catalog repond	*/
+	status_flash	status;		/*	etat de l'enregistreur				*/
+	int4		nombre;		/*							*/
+	int4		code[nb_element_catalog];	/* code type et numero			*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_catalog_flash;			
+
+
+/*  ---------------------   structures N° 16 :    cmd_flash		    -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		commande;	/*	type de commande a l'enregistreur flash		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_cmd_flash;			
+
+enum	{flash_catalog_auto,flash_catalog_debut,flash_catalog_fin,flash_catalog_precedent,flash_catalog_suivant
+		,flash_efface_tout1,flash_efface_tout2,flash_efface_tout3
+		,flash_efface_util1,flash_efface_util2,flash_efface_util3};
+
+
+/*  ---------------------   structures N° 17 : block brut de données ctb pour test      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef	transmet_data_brute
+	char		data[nb_per_block*nb_max_mes_per*nb_byte_mot];
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_data_brute;			
+
+/*  ---------------------   structures N° 18 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_18;			
+
+/*  ---------------------   structures N° 19 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_19;			
+
+
+
+/*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		mot[(taille_maxi_block_archeops)/4];
+	int4		fin;		/* code de reconnaissance de fin de block		*/
+	}
+	block_type_modele;			
+
+
+
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+
+enum	{block_param,block_journal,block_reglage,block_dilution,
+	block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
+	block_bolo,block_gyro,block_sst,block_11,
+	block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_catalog_flash,
+	block_cmd_flash,block_data_brute,block_18,block_19};
+
+
+#define	def_nom_block	char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
+					"block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
+					"block_bolo","block_gyro","block_sst","block_11",\
+					"block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_catalog_flash",\
+					"block_cmd_flash","block_data_brute","",""};
+
+
+#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),\
+					sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
+					sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
+					sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_catalog_flash),\
+					sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
+
+
+
+
+
+/*   le code du block contient  8  bit de type							*/
+/*				24 bit pour le numero du block(horloge locale)			*/
+/*				12 bit pour la longueur du block  (en octet)			*/
+/*				16 bit pour la somme de test de la validité du block		*/
+
+/*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier	*/
+
+
+#define longueur_block(_bk)	( (int) ((_bk)->code1>>16) 	& 0xffff )	
+#define somme_block(_bk)	( (int)  (_bk)->code1		& 0xffff )
+
+#define type_block(_bk)		( (int) ((_bk)->code2>>24)	& 0xff )
+#define numero_block(_bk)	( (int)  (_bk)->code2		& 0xffffff )
+
+/* ce define cree le mot de controle de somme des blocks et de les verifier a la reception	*/
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+/* -------------------------------------------------------------------------------------------- */
+/* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops	*/
+/* il faut inclure une seule fois le header archeops.h précéde de :				*/
+/*			 #define utilitaires_de_block_archeops 					*/
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* 	cette fonction calcule le code de somme pour le controle de parité des blocks		*/
+
+int	calcul_somme_block(block_type_modele* blk,int longueur);
+
+
+
+
+
+/* 	cette fonction est a apeller lors de la création d'un block apres l'avoir rempli	*/
+/*	elle permet de creer tous les mots de controle du block					*/
+
+void	valide_block(block_type_modele* blk,int type,int block_num);
+
+
+
+/* 	cette fonction est a apeller pour vérifier la validité d'un block			*/
+/*	elle retourne 0 si le block est correct et sinon, un code d'erreur			*/
+/*	la seconde fonction sort les erreurs a l'ecran						*/
+
+int	verifie_block(block_type_modele* blk);
+int	verifie_block_printf(block_type_modele* blk);
+
+enum	{block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
+		,block_debut_erreur,block_fin_erreur};
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double	val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier long (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned long	val_long(char x);
+
+int	new_val_dac(int a,char  code); 
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_25.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_25.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_25.c	(revision 439)
@@ -0,0 +1,1329 @@
+//for archediab
+//#include "manip.h"
+//for archTOI
+#include <stdio.h>
+#include "archeops.h"
+
+
+
+/**********  coefficients  pour  les  mesures  bolo    ********************************/
+/*                         toutes les puissances en pW                                */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin     */
+/*                                                                                    */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                       */
+/*                                                                                    */
+/*	-2-	fuite thermique du bolo   coef 3,4                                    */
+/*                                                                                    */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )          */
+/*                                                                                    */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                   */
+/*                                                                                    */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	      */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier) */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/**************************************************************************************/
+/*                                                                                    */
+/*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
+/*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
+/*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
+/*   pour les cartes modifiees : mettre diviseur=0                                    */
+/*                         et capa = la resistance de chage en Megohm                 */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/*  nom  ,  on/off  ,  0 = MLPA       , N° bolo ,  gain_pa  , capa*1000 , diviseur , coef*10000 */
+/*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     , 		*/
+/*                     10 = Bediff    ,         ,           , 					*/
+
+/* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo		*/
+/*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc			*/
+
+
+/*debut_param*/
+/*----------------------------------  fenetre :  -----------------------------------*/
+
+param_bolo  parametr={25,24,36,88,18,
+
+{ 
+{ "v1-bedif1"  , 1,10,1 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },		
+{ "v1-bedif2"  , 1,10,2 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif3"  , 1,10,3 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif4"  , 1,10,4 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif5"  , 1,10,5 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif6"  , 1,10,6 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif7"  , 1,10,9 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif8"  , 1,10,10, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif9"  , 1,10,11, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif10" , 1,10,12, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif11" , 1,10,13, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif12" , 1,10,14, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif13"	, 1,10,17, 1000, 100000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif14"	, 1,10,18, 1000, 470000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif15"  	, 1,10,19, 1000, 470000	, 1000,  {  500  ,  58800 ,  12500,0,0,0,0} },
+{ "bedif16"	, 1,10,20, 1000,2200000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif17"	, 1,10,21, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif18"	, 1,10,22, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif19"	, 2,10,25, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif20"	, 2,10,26, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "germanium"	, 3,10,27, 1000, 22000	,    0,  { 3500  ,  17100 , 646500,0,0,0,0} },
+{ "therm_4k"	, 3,10,28, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_1.6k"	, 3,10,29, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_10k"	, 3,10,30, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+
+}
+};
+/*fin_param*/
+
+
+
+/* bolos campagne 1998-1999	*/
+/*
+reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,	.5			,519.6  , 8.286
+v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41  		
+v1-232...N, 1, 0, 3, 100, 4.7, 333,		
+v1-237...E, 1, 0, 4, 100, 4.7, 333,
+
+reg_JamieO, 1, 0, 5, 100, 4.7, 101,
+
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
+V2-205...Q, 1, 0, 8, 100, 4.7, 333,	.518 , 81    , 25.2 
+V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
+
+*/
+/*bolos campagne 1997-1998	*/
+/*
+
+v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42 		
+v1-232...L, 1, 0, 2, 100, 4.7, 333,		
+v1-205...N, 1, 0, 3, 100, 4.7, 333,	.518 , 81    , 25.2	
+v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,	.5			,519.6  , 8.286
+Jamie....O, 1, 0, 5, 100, 4.7, 101,
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
+V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
+V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
+
+*/
+
+
+
+
+
+/*debut_nom_reglage*/
+/* 0->a chaud complet*/
+/* 1->a froid pour V(I)*/
+/* 2->cc*/
+/* 3->a chaud complet*/
+/* 4->chaud avec synchro*/
+/* 5->reglage 5  */
+/* 6->reglage 6  */
+/* 7->reglage 7  */
+/*fin_nom_reglage*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+reglage_bolo  reglage_standard[8]={{
+
+
+/*debut reglage 0 */
+#ifdef programme
+{30,76,9,1},
+{0
+,10
+,1
+,1
+,10
+,1
+,1
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},
+{1
+,1
+,10
+,0
+,0
+,1
+,1
+,10
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 1 */
+#ifdef programme
+{31,76,9,1},
+{0
+,10
+,1
+,1
+,10
+,1
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{2,21,25,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{0,21,23,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{129,3,129,108,3,126,104,88} 
+#else
+{1,9,76,31},
+{1
+,1
+,10
+,0
+,0
+,0
+,1
+,10
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,25,21,2}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,23,21,0}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,129,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 2 */
+#ifdef programme
+{197,191,175,185},
+{0
+,255
+,254
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,83
+,92
+,94
+,98
+,65
+,53
+,53
+,36
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},
+{0
+,254
+,255
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,98
+,94
+,92
+,83
+,36
+,53
+,53
+,65
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 3 */
+#ifdef programme
+{30,76,9,1},
+{0
+,10
+,1
+,1
+,10
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{0,20,0,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{2,20,0,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},
+{1
+,1
+,10
+,0
+,0
+,0
+,1
+,10
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,0,20,0}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,0,20,2}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 4 */
+#ifdef programme
+{30,76,9,1},
+{0
+,10
+,1
+,1
+,10
+,1
+,1
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},
+{1
+,1
+,10
+,0
+,0
+,1
+,1
+,10
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,1
+,0
+,0
+,0
+,0
+},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 5 */
+#ifdef programme
+{197,191,175,185},
+{0
+,255
+,254
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,83
+,92
+,94
+,98
+,65
+,53
+,53
+,36
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},
+{0
+,254
+,255
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,98
+,94
+,92
+,83
+,36
+,53
+,53
+,65
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 6 */
+#ifdef programme
+{197,191,175,185},
+{0
+,255
+,254
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,83
+,92
+,94
+,98
+,65
+,53
+,53
+,36
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},
+{0
+,254
+,255
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,98
+,94
+,92
+,83
+,36
+,53
+,53
+,65
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 7 */
+#ifdef programme
+{197,191,175,185},
+{0
+,255
+,254
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,83
+,92
+,94
+,98
+,65
+,53
+,53
+,36
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},
+{0
+,254
+,255
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,0
+,98
+,94
+,92
+,83
+,36
+,53
+,53
+,65
+},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+} };
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+
+unsigned long	val_long(char x)
+{
+unsigned long a,xl;
+char aa;
+aa=x-2;
+a=aa;
+if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
+
+
+
+int	calcul_somme_block(block_type_modele* blk,int longueur)
+{
+int i,so=0;;
+for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
+/* somme sur tous les mots internes	: on exclus le dbut, les codes et la fin	*/
+return((so^(so>>16))&0xffff);
+}
+
+
+
+
+void  valide_block(block_type_modele* blk,int type,int block_num)
+{
+int somme,longueur;
+def_long_block
+longueur=long_block[type];
+/*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
+/* 		,(unsigned)blk,type,block_num,longueur);*/
+blk->debut		=	debut_block_mesure;
+blk->code2		=	(((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
+
+blk->mot[longueur/4-4]  =	fin_block_mesure;
+somme=calcul_somme_block(blk,longueur);
+blk->code1		=	(((long)longueur)<<16)	|	somme;
+}
+
+
+/* Quand on est sur une machine swappee, on ne cherche pas a verifier */
+/* le checksum, puisqu'on a modifie les blocs, sans swapper par exemple */
+/* les chars des noms de bolometres et des chaines GPS... */
+#ifdef __alpha
+#define SWAP
+#endif
+#if defined(Linux)  || defined(linux)
+#define SWAP
+#endif
+
+
+int  verifie_block(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+if(blk->debut != debut_block_mesure)					return(block_debut_erreur);
+type=type_block(blk);		if( (type<0) ||(type>=nb_type_blocks) )	return(block_type_inconnu);	
+lg=longueur_block(blk);		if( lg != long_block[type] )		return(block_longueur_erreur);	
+if( blk->mot[(lg/4)-4]  !=	fin_block_mesure)			return(block_fin_erreur);	
+#ifndef SWAP
+som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))		return(block_somme_erreur);
+#endif
+return(block_correct);
+}
+
+
+int  verifie_block_printf(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+def_nom_block
+if(blk->debut != debut_block_mesure)
+	{
+	printf(" erreur dans le code debut de block	 \n");
+	return(block_debut_erreur);
+	}	
+
+type=type_block(blk);
+if( (type<0) || (type>nb_type_blocks) )	
+	{
+	printf(" block de type %d  inconnu\n",type);
+	return(block_type_inconnu);
+	}
+
+lg=longueur_block(blk);
+if( lg!=long_block[type] )	
+	{
+	printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
+			,nom_block[type],long_block[type],lg);
+	return(block_longueur_erreur);
+	}
+
+som=calcul_somme_block(blk,lg);
+if( som!=somme_block(blk) )	
+	{
+	printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
+			,nom_block[type],som,somme_block(blk) );
+	return(block_somme_erreur);
+	}
+	
+if(blk->mot[(lg/4)-4]	!= fin_block_mesure)	
+	{
+	printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
+			,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
+	return(block_fin_erreur);
+	}
+
+return(block_correct);
+}
+
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_25.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_25.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_25.h	(revision 439)
@@ -0,0 +1,924 @@
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 archeops.h  :	structure de données            	*/
+/*                                                                      */
+/*======================================================================*/
+
+#define		_archeops
+#define		version_num		25
+
+
+/*======================================================================*/
+/*                                                                      */
+/* 			historique des modifications            	*/
+/*                                                                      */
+/*                                                                      */
+/*  VERSION 24:                                                         */
+/*                                                                      */
+/*	- utilise le fichier archeops.c					*/
+/*	- nb_max_bolo=24  avec nb_bolo_util=18				*/
+/*	- change la structure du block param				*/
+/*	- change la structure du block dilution				*/
+/*									*/
+/*  VERSION 25:                                                         */
+/*                                                                      */
+/*	- la compression marche						*/
+/*	- 4 signaux synchro O.K.					*/
+/*	- change la structure dil : contient les temperatures		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+
+/*======================================================================*/
+/*  ---------------  parametres generaux de definition   -------------  */
+/*======================================================================*/
+
+#ifndef int4
+#ifdef __alpha
+#define int4 int
+#undef programme
+#else
+#define int4 long
+#endif
+#endif
+
+#ifdef linux
+#undef programme
+#endif
+
+#ifdef	_planck
+#define	_archeops
+#define _trapani
+#define _sans_transputer
+#endif
+
+#ifdef	_archeops
+/*#define _test_diabolo	 relecture des blocks fabriques avec diabolo	*/
+#define _trapani		/*  configuration  prevue pour Trapani	*/
+/*#define _kiruna		  block standard prevu pour kiruna	*/ 
+#endif
+
+
+
+/*======================================================================*/
+/*  --------------	valeurs des parametres dans	-------------   */
+/*  --------------	les différentes configurations	-------------   */
+/*======================================================================*/
+/*									*/
+/*  configuration pour Trapani : 3 bebos  /  12 bolos			*/
+/*									*/
+/*  bebo1 :   voies  1  à  6	-->  bolo  1 a  6			*/
+/*  bebo2 :   voies  9  à  14	-->  bolo  7 à 12			*/
+/*									*/
+/*  bebo6 :								*/
+/*  	voies  41 42 43 44	=  carte simplifiee avec AMP01		*/
+/*  	voies  45 et 46		= chauffage pour regulation		*/    
+/*	on ecrira plus tard le stockage des donnees simplifiees		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+/*	nb_per_block	doit etre divisible par 2						*/
+/*	nb_max_bolo	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+/*	nb_bolo_util	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+
+
+#ifdef	_trapani
+#define nb_max_bolo 		24	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		18	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_kiruna
+#define nb_max_bolo 		36	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		32	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_test_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_sans_transputer
+#define nb_byte_mot		5	/*  nombre d'octets dans un mot d'acquisition planck	*/
+#else
+#define nb_byte_mot		8	/*  nombre d'octets dans un mot d'acquisition archeops	*/
+#endif
+
+#define nb_sync			4	/*  nombre de signaux de synchro			*/
+					/*  6 pour diabolo 					*/
+					/* toujours multiple de 4 pour archeops			*/
+#define	nb_element_catalog	256	/* nombre d'éléments catalog par reponse enregistreur	*/
+
+
+#ifdef	transmet_data_brute
+#define		taille_maxi_block_archeops	sizeof(block_type_data_brute)
+#else					/* 	le plus gros des différents blocks de télémesure*/
+#define		taille_maxi_block_archeops	sizeof(block_type_bolo)
+#endif
+
+#define		nombre_de_regul		4
+#define		nombre_de_voies		6
+#define 	nb_type_blocks		20	/*  nombre de type de blocks (multiple de 4)	*/
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=======================   télécommande      ==========================*/
+/*======================================================================*/
+
+
+/*   --------------   codes de reconnaissance des paquets de télécommande	--------------   */   
+
+#define		debut_telecommande		0x23456789
+#define		fin_telecommande		0x98765432
+
+/*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops	--------------   */   
+
+#define 	tc_dir_transputer		1
+#define 	tc_dir_reset_epld		3
+
+/*  -------------  codes  des  prefix des  telecommandes traités le transputer	--------------   */
+
+#define		tc_horloge			255	/* (-1)	*/
+#define		tc_cadence1			128
+#define		tc_cadence2			129
+#define		tc_cadence3			130
+#define		tc_regul			251	/* (-5)	*/
+#define		tc_switch_dil			250
+#define		tc_dac_dil			249
+
+/*======================================================================*/
+/*	telecommande reduite  sur 18 bit				*/
+/*======================================================================*/
+
+/*______________________________________________________________________________________________*/
+/*	1er mot	:	code de debut de telecommande reduite					*/
+#define		tc_reduite			248	
+/*______________________________________________________________________________________________*/
+/*	2eme mot:	4bit:	16 codes  de direction  tc2					*/
+enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
+	,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
+	,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution};	/* 12 codes: reste 4 disponibles*/
+
+
+/*______________________________________________________________________________________________*/
+/*	3eme mot:	6bit:									*/
+
+/*	code2=dac-gain-voie  	:	numero de bolo						*/
+
+/*	code2=tc2_horloge	:								*/
+/*		soit un code defini								*/
+/*		soit le code tc3_vitesse+i avec i=0.. nb_type_block				*/
+enum{tc3_commande,tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag,tc3_vitesse};
+/*#define	tc3_suite	tc3_vitesse+nb_type_block					*/
+
+
+/*	code2=tc2_regul	:									*/
+
+
+/*	code2=tc2_auto_bolo	:						*/
+
+
+/*	code2=tc2_auto_dilu	:						*/
+/* 	les valeurs des parametres d'auto_dilu ne depassent pas 128 		*/
+
+
+/*	code2=tc2_dilution	:						*/
+
+
+/*______________________________________________________________________________*/
+/*	4eme mot:	8bit:	valeur a ecrire			*/		
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=========================   télémesure    ============================*/
+/*======================================================================*/
+
+/*   -------   codes de reconnaissance des paquets de télémesure        */   
+
+#define		debut_block_mesure		((int4)0x45627491)
+#define		fin_block_mesure		((int4)0x83260432)
+
+
+
+
+
+/*======================================================================*/
+/*  ------------------------------------------------------------------  */
+/*  ---------  	Les  formats  des  blocks  type   ARCHEOPS   	-------	*/
+/*  ------------------------------------------------------------------  */
+/*======================================================================*/
+
+
+
+/*==============================================================================================*/
+
+/*	Le tableau est lut dans le desordre par le mac en lecture de la carte pci :		*/
+
+/*	Les entiers long sont ecrits tels quels							*/
+/*	Les short sont ecrits permuté 2 a 2 par le tansputer					*/
+/*	Les tables char sont ecrits permuté 4 / 4 par le transputer				*/
+/*	A la lecture dans le mac, tout est bon							*/
+
+
+/*  ---------  	 structures N° 0 :   parametres de mesure des bolometres        -------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct	
+	{
+	char		bolo_nom[32];		/*  le nom de chaque bolometre			*/
+	int4		bolo_code_util;		/*  le code d'utilisation du bolo		*/
+	int4		bolo_bebo;		/*  le type d'acquisition:  0 pour MLPA 10 pour BEBODIFF */
+	int4		bolo_num;		/*  l'adresse hard du bolo			*/
+	int4		bolo_gain;		/*  le gain du preampli				*/
+	int4		bolo_capa;		/*  la valeur capa du modulateur		*/
+	int4 		bolo_diviseur;		/*  le diviseur de la compensation		*/
+	int4	  	coef[7];		/*  les coef pour le calcul de la température	*/
+	}
+	param_un_bolo;
+/* code_util des bolos  */
+enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
+
+	
+typedef struct		/*  		table des parametres de mesure bolometre 		*/
+			/*	cette table ne change pas (en principe) en cours de mesure	*/
+	{
+	int4		numero_version;			/*  numero de version du header archeops.h	*/
+	int4		n_max_bolo;			/*  nombre maxi de bolos  (divisible par 4)	*/
+	int4		n_per_block;			/*  nombre de periodes entieres dans un block	*/
+	int4		n_max_mes_per;			/*  nb de points maxi dans une periode complete	*/
+
+	int4		nb_bolo;			/*  nombre de bolometres effectivement lut	*/
+	param_un_bolo	bolo[nb_max_bolo];
+	}
+	param_bolo;
+	
+	
+	
+	
+/*	
+	long		bolo_code_util[nb_max_bolo];	
+	char		bolo_nom[nb_max_bolo][32];	
+
+	long		bolo_bebo[nb_max_bolo];		
+	long		bolo_num[nb_max_bolo];		
+	long		bolo_gain[nb_max_bolo];		
+
+	long		bolo_capa[nb_max_bolo];		
+	long 		bolo_diviseur[nb_max_bolo];	
+	
+	long	  	coef[nb_max_bolo][7];		
+
+	long		presence_bebo;			
+	}
+	param_bolo;
+*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	param_bolo	param;		/*	les parametres de mesure des bolometres		*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_param;			
+	
+
+
+
+/*  -------------------   structures N° 1 :   journal de bord        ---------------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+#define long_page	10
+typedef struct				  
+	{
+	int4		code2;		/* 	code de la ligne du journal			*/
+					/* 	code idem code2 debut de block : 		*/
+					/*  	contient un code de commande			*/
+					/*	et le numero du block lors de la télécommande	*/
+	char		mot[8];		/* 	contenu de la ligne du  journal			*/
+	}
+	ligne_journal;			
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	ligne_journal	jj[long_page];	/*	block de 10 lignes de journal			*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_journal;			
+	
+
+/*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------	*/
+/*  ------------------------------------------------------------------------------------------	*/
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = (double)parametr.bolo[bolo].bolo_gain*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+
+/*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]		*/
+#define		gainbrut(aa)	((char)(((aa).mot1&0x1f)))		
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+#define		phase(aa)	((char)(((aa).mot1&0x60)>>5))		
+#define		comm(aa)	((char)(((aa).mot1&0x80)>>7))		
+#define		dac_V(aa)	((int)(((aa).mot1&0xfff00)>>8)	)	
+#define		dac_I(aa)	((int)(((aa).mot1&0xfff00000)>>20))		
+
+#define		voie(aa)	((char)(((aa).mot2&0xff)))		
+#define		dac_T(aa)	((int)(((aa).mot2&0xfff00)>>8))		
+#define		dac_L(aa)	((int)(((aa).mot2&0xfff00000)>>20))		
+
+/*
+#define		bolo_mot1(dacV,dacI,gainbrut,phase,comm)	((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20) 
+#define		bolo_mot2(dacT,dacL,voie)			((voie)&0xff) 	  | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
+*/
+
+#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) 
+#define		bolo_mot2(dacT,dacL,voie)			(((long)(voie))&0xff) 	  | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
+
+
+typedef struct	
+	{
+	int4	mot1;		/*  dac1 = mot[11..0]; dac2=mot1[23..12]	*/
+				/*  gain = mot1[27..24]; phase = mot1[31..28];	*/
+	int4	mot2;		/*  dac3 = mot[11..0]; dac4=mot1[23..12]	*/
+				/*  voie pour reglages auto  = mot2[31..24];	*/
+	}
+	reglage_un_bolo;
+
+
+
+#ifdef programme	/***********   structure normale pour le mac   ****************/
+
+typedef struct	
+	{
+	char	periode;
+	char	nb_mesures;
+	char	temp_mort;
+	char	flag;
+	}
+	horloge;
+
+typedef struct
+	{
+	char	mode;			/*   on_off et deglitch				*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	integ;
+	char 	deriv;
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	}
+	regul_bolo;			/*  longueur 2 entiers long			*/
+
+typedef struct
+	{
+	char	mode;
+	char	gain;
+	char	courant;
+	char	delai;
+	}
+	auto_bolo;			/*  longueur 1 entiers long			*/
+
+typedef struct
+	{
+	char	vanne;
+	char	helium;
+	char	chauffage;
+	char	piles;
+	char	transmission;
+	char	temps_max_vanne;
+	char	xx7;
+	char	xx8;
+	}
+	auto_dilu;			/*  longueur 1 entiers long		*/
+
+
+
+#else		/***********  structure swappée pour le transputer   ****************/
+
+typedef struct	
+	{
+	char	flag;
+	char	temp_mort;
+	char	nb_mesures;
+	char	periode;
+	}
+	horloge;
+	
+
+typedef struct
+	{
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	mode;			/*   on_off et deglitch				*/
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	char 	deriv;
+	char	integ;
+	}
+	regul_bolo;			/*  longueur 2 entiers long		*/
+
+
+typedef struct
+	{
+	char	delai;
+	char	courant;
+	char	gain;
+	char	mode;
+	}
+	auto_bolo;			/*  longueur 1 entiers long		*/
+
+typedef struct
+	{
+	char	piles;
+	char	chauffage;
+	char	helium;			/* periode de mesure		*/
+	char	vanne;		
+	char	xx8;
+	char	xx7;
+	char	temps_max_vanne;
+	char	transmission;
+	}
+	auto_dilu;			/*  longueur 1 entiers long		*/
+
+
+#endif		/***********   fin des structures swappées       ****************/
+
+enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch};
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+enum{vanne_zero,vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_pression_piles,vanne_auto_pression_piles_temps};
+enum{trans_zero,trans_rien,trans_normal,trans_rapide,trans_lent};
+enum{helium_zero,helium_continu,helium_40s,helium_400s};
+
+
+typedef struct							/*  long en mot de 32 bit   	*/
+	{
+	horloge			horloge;			/*			1	*/
+	char			vitesse[nb_type_blocks];	/*			5	*/
+	reglage_un_bolo		bolo[nb_max_bolo]; 		/*	18 * 2	= 	36	*/
+	auto_bolo		autom[nombre_de_voies];		/*	6  * 1		6	*/								
+	regul_bolo		regul[nombre_de_regul];		/*	4  * 2	=	8	*/									
+	auto_dilu		dilu;				/*			2	*/
+	}
+	reglage_bolo;						/*	total 58		*/
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	reglage_bolo	reglage;											
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_reglage;			
+	
+/*  ---------------------   structures N° 3 :    etat de la dilution	-----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		switch_dil;
+	int4		ADC_dil[48];	/*	la lecture des 48 ADC de la carte DIL		*/
+	int4		DAC_dil[4];	/*	les 4 dac de la carte dilution			*/
+	int4		DAC_sst[4];	/*	les 4 dac de la carte sst			*/
+	int4		temperature[4];	/*	valeurs lues sur cartes BEDIFF modifiees	*/
+/*	int4		gyro_dil[3][nb_per_block*2];	les gyros  (block gyros)		*/
+/*	int4		data_dil[50];	 data brutes de la dilution				*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_dilution;			
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  6: chauffage 1	*/
+#define chauffage3		0x00001000	/*  6: chauffage 1	*/
+#define chauffage4		0x00000800	/*  6: chauffage 1	*/
+#define chauffage5		0x00000400	/*  6: chauffage 1	*/
+#define chauffage6		0x00000200	/*  6: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+/*  position des mesures sur les multiplexeurs		*/
+/* J10A  ->  temperatures basses t_b1 t_b2,t_b3 t_b4 36 37 41 35	*/ 
+/* J10B  ->  temperatures basses t_a1 t_a2,t_a3 t_a4 38 11 34 28	*/ 
+/* J1??	 ->  temperatures hautes t_h1 t_h2,t_h3 t_h4	*/ 
+
+enum{
+/* multiplex11..18:*/	t_a2	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,t_a4	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a1	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,mul44	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+/* reste libres :  mul   12 - 21 - 22 - 25 -  31 - 44 - 57 - 58 - 64	*/
+
+
+
+/*  ---------------------   structures N° 4 :     gps           -------------------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	char		gps[80];	/*      les données GPS (une chaine maxi 80 cara)	*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gps;			
+	
+
+
+/*  ---------------------   structures N° 5 :   tous les bolos 1 periode     	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	short 		bol_per[nb_max_bolo][nb_max_mes_per];		
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_une_periode;			
+
+/*  ----------------   structures N° 6 :  signals de synchro (pour test au sol)	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		synchro[nb_per_block*2][nb_sync];	
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_synchro_sol;			
+
+/*  ---------------------   structures N° 7 : block de données de pointage sol      -----------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		comment[1024];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_pointage_sol;			
+
+
+
+/*  -------------   structures N° 8 :   données brutes des bolometres    ----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque bolo, un vecteur 72 points		*/
+	int4		data_bolo[nb_max_bolo][nb_per_block*2];	
+					/*	data D.S.	(en mots de 32 bits)		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo;			
+
+/*  ---------------------   structures N° 9 :   données des gyroscopes et du magnétometre	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/* chaque gyro: un vecteur tde 72 valeurs		*/
+	int4		gyros[3][nb_per_block*2];
+	int4		magneto[3];	/*	1 bit par echantillonage soit 3*32bit>72	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro;			
+
+/*  ---------------------   structures N° 10 :   données senseur stellaire	  -----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		sst[nb_per_block*2][18];
+					/* chaque mesure: un paquet de 18 mots de 32 bits	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst;			
+
+/*  ---------------------   structures N° 11 :    rien		          -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type11;			
+
+/*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit	 ------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+					/*	pour chaque bolo, un vecteur  19 mots		*/
+	unsigned int4	data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo_comprime;			
+
+/*  ---------------------   structures N° 13 :    block_type_gyro_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+	unsigned int4	gyro[3][ (nb_per_block/2) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro_comprime;			
+
+/*  ---------------------   structures N° 14 :    block_type_sst_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque diode, un vecteur  11 mots		*/
+	unsigned int4	sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst_comprime;			
+
+
+
+/*  ---------------------   structures N° 15 : catalog_flash      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+typedef struct	  			/*	etat de l'enregistreur				*/
+	{
+	int4		nb_total_catalog;
+	int4		memoire_libre;
+	int4		nb_block_erreur;
+	}status_flash;
+
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	int4		commande;	/*	la commande a laquelle ce catalog repond	*/
+	status_flash	status;		/*	etat de l'enregistreur				*/
+	int4		nombre;		/*							*/
+	int4		code[nb_element_catalog];	/* code type et numero			*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_catalog_flash;			
+
+
+/*  ---------------------   structures N° 16 :    cmd_flash		    -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		commande;	/*	type de commande a l'enregistreur flash		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_cmd_flash;			
+
+enum	{flash_catalog_auto,flash_catalog_debut,flash_catalog_fin,flash_catalog_precedent,flash_catalog_suivant
+		,flash_efface_tout1,flash_efface_tout2,flash_efface_tout3
+		,flash_efface_util1,flash_efface_util2,flash_efface_util3};
+
+
+/*  ---------------------   structures N° 17 : block brut de données ctb pour test      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef	transmet_data_brute
+	char		data[nb_per_block*nb_max_mes_per*nb_byte_mot];
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_data_brute;			
+
+/*  ---------------------   structures N° 18 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_18;			
+
+/*  ---------------------   structures N° 19 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_19;			
+
+
+
+/*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		mot[(taille_maxi_block_archeops)/4];
+	int4		fin;		/* code de reconnaissance de fin de block		*/
+	}
+	block_type_modele;			
+
+
+
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+
+enum	{block_param,block_journal,block_reglage,block_dilution,
+	block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
+	block_bolo,block_gyro,block_sst,block_11,
+	block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_catalog_flash,
+	block_cmd_flash,block_data_brute,block_18,block_19};
+
+
+#define	def_nom_block	char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
+					"block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
+					"block_bolo","block_gyro","block_sst","block_11",\
+					"block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_catalog_flash",\
+					"block_cmd_flash","block_data_brute","",""};
+
+
+#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),\
+					sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
+					sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
+					sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_catalog_flash),\
+					sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
+
+
+
+
+
+/*   le code du block contient  8  bit de type							*/
+/*				24 bit pour le numero du block(horloge locale)			*/
+/*				12 bit pour la longueur du block  (en octet)			*/
+/*				16 bit pour la somme de test de la validité du block		*/
+
+/*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier	*/
+
+
+#define longueur_block(_bk)	( (int) ((_bk)->code1>>16) 	& 0xffff )	
+#define somme_block(_bk)	( (int)  (_bk)->code1		& 0xffff )
+
+#define type_block(_bk)		( (int) ((_bk)->code2>>24)	& 0xff )
+#define numero_block(_bk)	( (int)  (_bk)->code2		& 0xffffff )
+
+/* ce define cree le mot de controle de somme des blocks et de les verifier a la reception	*/
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+/* -------------------------------------------------------------------------------------------- */
+/* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops	*/
+/* il faut inclure une seule fois le header archeops.h précéde de :				*/
+/*			 #define utilitaires_de_block_archeops 					*/
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* 	cette fonction calcule le code de somme pour le controle de parité des blocks		*/
+
+int	calcul_somme_block(block_type_modele* blk,int longueur);
+
+
+
+
+
+/* 	cette fonction est a apeller lors de la création d'un block apres l'avoir rempli	*/
+/*	elle permet de creer tous les mots de controle du block					*/
+
+void	valide_block(block_type_modele* blk,int type,int block_num);
+
+
+
+/* 	cette fonction est a apeller pour vérifier la validité d'un block			*/
+/*	elle retourne 0 si le block est correct et sinon, un code d'erreur			*/
+/*	la seconde fonction sort les erreurs a l'ecran						*/
+
+int	verifie_block(block_type_modele* blk);
+int	verifie_block_printf(block_type_modele* blk);
+
+enum	{block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
+		,block_debut_erreur,block_fin_erreur};
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double	val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier long (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned long	val_long(char x);
+
+int	new_val_dac(int a,char  code); 
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_26.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_26.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_26.c	(revision 439)
@@ -0,0 +1,1084 @@
+//for archediab
+//#include "manip.h"
+//for archTOI
+#include <stdio.h>
+#include "archeops.h"
+
+
+
+/**********  coefficients  pour  les  mesures  bolo    ********************************/
+/*                         toutes les puissances en pW                                */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin     */
+/*                                                                                    */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                       */
+/*                                                                                    */
+/*	-2-	fuite thermique du bolo   coef 3,4                                    */
+/*                                                                                    */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )          */
+/*                                                                                    */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                   */
+/*                                                                                    */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	      */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier) */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/**************************************************************************************/
+/*                                                                                    */
+/*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
+/*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
+/*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
+/*   pour les cartes modifiees : mettre diviseur=0                                    */
+/*                         et capa = la resistance de chage en Megohm                 */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/*  nom  ,  on/off  ,  0 = MLPA       , N° bolo ,  gain_pa  , capa*1000 , diviseur , coef*10000 */
+/*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     , 		*/
+/*                     10 = Bediff    ,         ,           , 					*/
+
+/* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo		*/
+/*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc			*/
+
+
+/*debut_param*/
+/*----------------------------------  fenetre :  -----------------------------------*/
+
+param_bolo  parametr={26,24,36,88,18,
+
+{ 
+{ 1  , 0,10,1 ,  200, 22000	,  200 },		
+{ 2  , 1,10,2 ,  200, 22000	,  200 },
+{ 3  , 1,10,3 ,  200, 22000	,  200 },
+{ 4  , 0,10,4 ,  200, 22000	,  200 },
+
+{ 5  , 1,10,5 , 1000, 4700	, 1000 },
+{ 6  , 0,10,6 , 1000, 4700	, 1000 },
+{ 7  , 1,10,9 , 1000, 4700	, 1000 },
+{ 8  , 0,10,10, 1000, 4700	, 1000 },
+
+{ 9  , 1,10,11, 1000, 4700	, 1000 },
+{ 10 , 1,10,12, 1000, 4700	, 1000 },
+{ 11 , 1,10,13, 1000, 4700	, 1000 },
+{ 12 , 1,10,14, 1000, 4700	, 1000 },
+
+{ 13	, 1,10,17, 1000, 4700	, 1000 },
+{ 14	, 1,10,18, 1000, 4700	, 1000 },
+{ 15  	, 1,10,19, 1000, 4700	, 1000 },
+{ 16	, 1,10,20, 1000, 4700	, 1000 },
+
+{ 17	, 1,10,21, 500, 22000	,  500 },
+{ 18	, 1,10,22, 500, 22000	,  500 },
+{ 19	, 1,10,25, 500, 22000  	,  500 },
+{ 20	, 1,10,26, 500, 22000  	,  500 },
+
+{ 21	, 3,10,27, 1000, 22000	,    0 },
+{ 22	, 3,10,28, 1000, 1000	,    0 },
+{ 23	, 3,10,29, 1000, 1000	,    0 },
+{ 0	, 3,10,30, 1000, 1000	,    0 },
+
+},
+{ 
+{ "therm_10k"	, {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "v1-bedif1"  , { 5000  , 123100 , 334200,0,0,0,0}  },		
+{ "v1-bedif2"  , { 5000  , 123100 , 334200,0,0,0,0}  },
+{ "v1-bedif3"  , { 5000  , 123100 , 334200,0,0,0,0}  },
+{ "v1-bedif4"  , { 5000  , 123100 , 334200,0,0,0,0}  },
+
+{ "v1-bedif5"  , { 5000  , 123100 , 334200,0,0,0,0}  },
+{ "v1-bedif6"  , { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif7"  , { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif8"  , { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif9"  , { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif10" , { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif11" , { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif12" , { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif13"	, { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif14"	, { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif15"  	, {  500  ,  58800 ,  12500,0,0,0,0} },
+{ "bedif16"	, { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "bedif17"	, { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif18"	, { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif19"	, { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif20"	, { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "germanium"	, { 3500  ,  17100 , 646500,0,0,0,0} },
+{ "therm_4k"	, {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_1.6k"	, {12000  ,1804000 ,  72800,0,0,0,0} },
+
+}
+
+};
+/*fin_param*/
+
+
+
+/* bolos campagne 1998-1999	*/
+/*
+reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,	.5			,519.6  , 8.286
+v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41  		
+v1-232...N, 1, 0, 3, 100, 4.7, 333,		
+v1-237...E, 1, 0, 4, 100, 4.7, 333,
+
+reg_JamieO, 1, 0, 5, 100, 4.7, 101,
+
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
+V2-205...Q, 1, 0, 8, 100, 4.7, 333,	.518 , 81    , 25.2 
+V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
+
+*/
+/*bolos campagne 1997-1998	*/
+/*
+
+v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42 		
+v1-232...L, 1, 0, 2, 100, 4.7, 333,		
+v1-205...N, 1, 0, 3, 100, 4.7, 333,	.518 , 81    , 25.2	
+v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,	.5			,519.6  , 8.286
+Jamie....O, 1, 0, 5, 100, 4.7, 101,
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
+V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
+V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
+
+*/
+
+
+int mode_transmission_telemesure[nb_modes_telemesure][nb_type_blocks]= {
+
+/* enregisteur de bord flash :  plafond standard nominal	*/
+/* 0*/	{ 0,10,15,50, 10,50, 0, 0, 0, 0, 0, 0, 1, 1, 1,2500, 0, 0, 0, 0},
+
+/* 1*/	{ 0,10,10, 1, 10, 3, 0, 0, 0, 0, 0, 0, 1, 1, 4,2500, 0, 0, 0, 0},
+
+/* 2*/	{ 0,10,05,01, 10,06, 0, 0, 0, 0, 0, 0, 1, 1, 2,2500, 0, 0, 0, 0},
+
+/* 3*/	{ 0,10, 1,25, 10, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0},
+
+/* 4*/	{ 0,10,15,50, 10,25, 0, 0, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 5*/	{ 0,10,15,50, 10,25, 0, 0, 0, 0, 1, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 6*/	{ 0,10,15,50, 10,50, 0, 0, 0, 1, 0, 0, 1, 0, 2,2500, 0, 0, 0, 0},
+
+/* 7*/	{ 0,10,15,50,100,50,1, 1, 0, 0, 0, 0, 1, 1, 1,2500, 0, 0, 0, 0},
+
+/* 8*/	{ 0,10,15,50,100,50,1, 1, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 9*/	{ 0,10, 1, 1,100, 1,0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0}
+
+ };
+
+
+
+int mode_transmission_flash[nb_modes_flash][nb_type_blocks]= {
+
+
+/* enregisteur de bord flash : nominal	*/
+/* 0*/	{ 0,50,15,25, 10,25, 0, 0, 0, 1, 0, 0, 1, 0, 1,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash : minimum	*/
+/* 1*/	{ 0,50,50,50,50,100, 0, 0, 0, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash :  rien	*/
+/* 2*/	{ 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0} };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*debut_nom_reglage*/
+/* 0->a chaud complet*/
+/* 1->a froid pour V(I)*/
+/* 2->cc*/
+/* 3->a chaud complet*/
+/* 4->chaud avec synchro*/
+/* 5->reglage 5  */
+/* 6->reglage 6  */
+/* 7->reglage 7  */
+/*fin_nom_reglage*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+reglage_bolo  reglage_standard[8]={{
+
+
+/*debut reglage 0 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 1 */
+#ifdef programme
+{31,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{2,21,25,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{0,21,23,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{129,3,129,108,3,126,104,88} 
+#else
+{1,9,76,31},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,25,21,2}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,23,21,0}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,129,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 2 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 3 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{0,20,0,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{2,20,0,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,0,20,0}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,0,20,2}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 4 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 5 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 6 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 7 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+} };
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+
+unsigned int4	val_long(char x)
+{
+unsigned int4 a,xl;
+char aa;
+aa=x-2;
+a=aa;
+if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
+
+
+
+int	calcul_somme_block(block_type_modele* blk,int longueur)
+{
+int i,so=0;;
+for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
+/* somme sur tous les mots internes	: on exclus le dbut, les codes et la fin	*/
+return((so^(so>>16))&0xffff);
+}
+
+
+
+
+void  valide_block(block_type_modele* blk,int type,int block_num)
+{
+int somme,longueur;
+def_long_block
+longueur=long_block[type];
+/*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
+/* 		,(unsigned)blk,type,block_num,longueur);*/
+blk->debut		=	debut_block_mesure;
+blk->code2		=	(((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
+
+blk->mot[longueur/4-4]  =	fin_block_mesure;
+somme=calcul_somme_block(blk,longueur);
+blk->code1		=	(((long)longueur)<<16)	|	somme;
+}
+
+/* Quand on est sur une machine swappee, on ne cherche pas a verifier */
+/* le checksum, puisqu'on a modifie les blocs, sans swapper par exemple */
+/* les chars des noms de bolometres et des chaines GPS... */
+#ifdef __alpha
+#define SWAP
+#endif
+#if defined(Linux)  || defined(linux)
+#define SWAP
+#endif
+
+
+
+int  verifie_block(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+if(blk->debut != debut_block_mesure)					return(block_debut_erreur);
+type=type_block(blk);		if( (type<0) ||(type>=nb_type_blocks) )	return(block_type_inconnu);	
+lg=longueur_block(blk);		if( lg != long_block[type] )		return(block_longueur_erreur);	
+if( blk->mot[(lg/4)-4]  !=	fin_block_mesure)			return(block_fin_erreur);	
+#ifndef SWAP
+som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))		return(block_somme_erreur);
+#endif
+return(block_correct);
+}
+
+
+int  verifie_block_printf(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+def_nom_block
+if(blk->debut != debut_block_mesure)
+	{
+	printf(" erreur dans le code debut de block	 \n");
+	return(block_debut_erreur);
+	}	
+
+type=type_block(blk);
+if( (type<0) || (type>nb_type_blocks) )	
+	{
+	printf(" block de type %d  inconnu\n",type);
+	return(block_type_inconnu);
+	}
+
+lg=longueur_block(blk);
+if( lg!=long_block[type] )	
+	{
+	printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
+			,nom_block[type],long_block[type],lg);
+	return(block_longueur_erreur);
+	}
+
+som=calcul_somme_block(blk,lg);
+if( som!=somme_block(blk) )	
+	{
+	printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
+			,nom_block[type],som,somme_block(blk) );
+	return(block_somme_erreur);
+	}
+	
+if(blk->mot[(lg/4)-4]	!= fin_block_mesure)	
+	{
+	printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
+			,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
+	return(block_fin_erreur);
+	}
+
+return(block_correct);
+}
+
+
+
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_26.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_26.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_26.h	(revision 439)
@@ -0,0 +1,967 @@
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 archeops.h  :	structure de données            	*/
+/*                                                                      */
+/*======================================================================*/
+
+#define		_archeops
+#define		version_num		26
+
+
+/*======================================================================*/
+/*                                                                      */
+/* 			historique des modifications            	*/
+/*                                                                      */
+/*                                                                      */
+/*  VERSION 24:                                                         */
+/*                                                                      */
+/*	- utilise le fichier archeops.c					*/
+/*	- nb_max_bolo=24  avec nb_bolo_util=18				*/
+/*	- change la structure du block param				*/
+/*	- change la structure du block dilution				*/
+/*									*/
+/*  VERSION 25:                                                         */
+/*                                                                      */
+/*	- la compression marche						*/
+/*	- 4 signaux synchro O.K.					*/
+/*	- change la structure dil : contient les temperatures		*/
+/*									*/
+/*  VERSION 26:                                                         */
+/*                                                                      */
+/*	- int4 pour compatibilité toutes machines			*/
+/*									*/
+/*======================================================================*/
+
+
+/*======================================================================*/
+/*  ---------------  parametres generaux de definition   -------------  */
+/*======================================================================*/
+
+
+#ifndef int4
+#ifdef __alpha
+#define int4 int
+#undef programme
+#else
+#define int4 long
+#endif
+#endif
+
+#ifdef linux
+#undef programme
+#endif
+
+#ifdef	_planck
+#define	_archeops
+#define _trapani
+#define _sans_transputer
+#endif
+
+#ifdef	_archeops
+/*#define _test_diabolo	 relecture des blocks fabriques avec diabolo	*/
+#define _trapani		/*  configuration  prevue pour Trapani	*/
+/*#define _kiruna		  block standard prevu pour kiruna	*/ 
+#endif
+
+
+
+/*======================================================================*/
+/*  --------------	valeurs des parametres dans	-------------   */
+/*  --------------	les différentes configurations	-------------   */
+/*======================================================================*/
+/*									*/
+/*  configuration pour Trapani : 3 bebos  /  12 bolos			*/
+/*									*/
+/*  bebo1 :   voies  1  à  6	-->  bolo  1 a  6			*/
+/*  bebo2 :   voies  9  à  14	-->  bolo  7 à 12			*/
+/*									*/
+/*  bebo6 :								*/
+/*  	voies  41 42 43 44	=  carte simplifiee avec AMP01		*/
+/*  	voies  45 et 46		= chauffage pour regulation		*/    
+/*	on ecrira plus tard le stockage des donnees simplifiees		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+/*	nb_per_block	doit etre divisible par 2						*/
+/*	nb_max_bolo	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+/*	nb_bolo_util	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+
+
+#ifdef	_trapani
+#define nb_max_bolo 		24	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		18	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_kiruna
+#define nb_max_bolo 		36	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		32	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_test_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_sans_transputer
+#define nb_byte_mot		5	/*  nombre d'octets dans un mot d'acquisition planck	*/
+#else
+#define nb_byte_mot		8	/*  nombre d'octets dans un mot d'acquisition archeops	*/
+#endif
+
+#define	nb_max_nom_bolo		24	/*  nombre maxi de noms et coef bolo dans la table	*/
+
+#define nb_sync			4	/*  nombre de signaux de synchro			*/
+					/*  6 pour diabolo 					*/
+					/* toujours multiple de 4 pour archeops			*/
+#define	nb_element_catalog	256	/* nombre d'éléments catalog par reponse enregistreur	*/
+
+
+#ifdef	transmet_data_brute
+#define		taille_maxi_block_archeops	sizeof(block_type_data_brute)
+#else					/* 	le plus gros des différents blocks de télémesure*/
+#define		taille_maxi_block_archeops	sizeof(block_type_bolo)
+#endif
+
+#define		nombre_de_regul		4
+#define		nombre_de_voies		6
+#define 	nb_type_blocks		20	/*  nombre de type de blocks (multiple de 4)	*/
+#define		nb_modes_telemesure	10
+#define		nb_modes_flash		 3
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=======================   télécommande      ==========================*/
+/*======================================================================*/
+
+
+/*   --------------   codes de reconnaissance des paquets de télécommande	--------------   */   
+
+#define		debut_telecommande		0x23456789
+#define		fin_telecommande		0x98765432
+
+/*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops	--------------   */   
+
+#define 	tc_dir_transputer		1
+#define 	tc_dir_reset_epld		3
+
+/*  -------------  codes  des  prefix des  telecommandes traités le transputer	--------------   */
+
+#define		tc_horloge			255	/* (-1)	*/
+#define		tc_cadence1			128
+#define		tc_cadence2			129
+#define		tc_cadence3			130
+#define		tc_regul			251	/* (-5)	*/
+#define		tc_switch_dil			250
+#define		tc_dac_dil			249
+
+/*======================================================================*/
+/*	telecommande reduite  sur 18 bit				*/
+/*======================================================================*/
+
+/*______________________________________________________________________________________________*/
+/*	1er mot	:	code de debut de telecommande reduite					*/
+#define		tc_reduite			248	
+/*______________________________________________________________________________________________*/
+/*	2eme mot:	4bit:	16 codes  de direction  tc2					*/
+enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
+	,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
+	,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution};	/* 12 codes: reste 4 disponibles*/
+
+
+/*______________________________________________________________________________________________*/
+/*	3eme mot:	6bit:									*/
+
+/*	code2=dac-gain-voie  	:	numero de bolo						*/
+
+/*	code2=tc2_horloge	:								*/
+/*		soit un code defini								*/
+/*		soit le code tc3_vitesse+i avec i=0.. nb_type_block				*/
+enum{tc3_commande,tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag,tc3_vitesse};
+/*#define	tc3_suite	tc3_vitesse+nb_type_block					*/
+
+
+/*	code2=tc2_regul	:									*/
+
+
+/*	code2=tc2_auto_bolo	:						*/
+
+
+/*	code2=tc2_auto_dilu	:						*/
+/* 	les valeurs des parametres d'auto_dilu ne depassent pas 128 		*/
+
+
+/*	code2=tc2_dilution	:						*/
+
+
+/*______________________________________________________________________________*/
+/*	4eme mot:	8bit:	valeur a ecrire			*/		
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=========================   télémesure    ============================*/
+/*======================================================================*/
+
+/*   -------   codes de reconnaissance des paquets de télémesure        */   
+
+#define		debut_block_mesure		0x45627491	
+#define		fin_block_mesure		0x83260432	
+
+
+
+
+
+/*======================================================================*/
+/*  ------------------------------------------------------------------  */
+/*  ---------  	Les  formats  des  blocks  type   ARCHEOPS   	-------	*/
+/*  ------------------------------------------------------------------  */
+/*======================================================================*/
+
+
+
+/*==============================================================================================*/
+
+/*	Le tableau est lut dans le desordre par le mac en lecture de la carte pci :		*/
+
+/*	Les entiers long sont ecrits tels quels							*/
+/*	Les short sont ecrits permuté 2 a 2 par le tansputer					*/
+/*	Les tables char sont ecrits permuté 4 / 4 par le transputer				*/
+/*	A la lecture dans le mac, tout est bon							*/
+
+
+/*  ---------  	 structures N° 0 :   parametres de mesure des bolometres        -------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct	
+	{
+	int4		numero_nom_coef;	/*  le numero pour retrouver le nom et les coef	*/
+	int4		bolo_code_util;		/*  le code d'utilisation du bolo		*/
+	int4		bolo_bebo;		/*  l'acquisition:  0 pour MLPA 10 pour BEBODIFF*/
+	int4		bolo_num;		/*  l'adresse hard du bolo			*/
+	int4		bolo_gain;		/*  le gain du preampli				*/
+	int4		bolo_capa;		/*  la valeur capa du modulateur		*/
+	int4 		bolo_diviseur;		/*  le diviseur de la compensation		*/
+	}
+	param_un_bolo;
+	
+	
+typedef struct	
+	{
+	char		bolo_nom[32];		/*  le nom de chaque bolometre			*/
+	int4	  	coef[7];		/*  les coef pour le calcul de la température	*/
+	}
+	nom_et_coef_bolo;
+	
+	
+	
+/* code_util des bolos  */
+enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
+
+	
+typedef struct		/*  		table des parametres de mesure bolometre 		*/
+			/*	cette table ne change pas (en principe) en cours de mesure	*/
+	{
+	int4		numero_version;			/*  numero de version du header archeops.h	*/
+	int4		n_max_bolo;			/*  nombre maxi de bolos  (divisible par 4)	*/
+	int4		n_per_block;			/*  nombre de periodes entieres dans un block	*/
+	int4		n_max_mes_per;			/*  nb de points maxi dans une periode complete	*/
+
+	int4		nb_bolo;			/*  nombre de bolometres effectivement lut	*/
+	param_un_bolo	bolo[nb_max_bolo];
+	nom_et_coef_bolo nom_coef[nb_max_nom_bolo];	/*  nombre de nom et coef bolo			*/
+	}
+	param_bolo;
+	
+	
+	
+	
+/*	
+	int4		bolo_code_util[nb_max_bolo];	
+	char		bolo_nom[nb_max_bolo][32];	
+
+	int4		bolo_bebo[nb_max_bolo];		
+	int4		bolo_num[nb_max_bolo];		
+	int4		bolo_gain[nb_max_bolo];		
+
+	int4		bolo_capa[nb_max_bolo];		
+	int4 		bolo_diviseur[nb_max_bolo];	
+	
+	int4	  	coef[nb_max_bolo][7];		
+
+	int4		presence_bebo;			
+	}
+	param_bolo;
+*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	param_bolo	param;		/*	les parametres de mesure des bolometres		*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_param;			
+	
+
+
+
+/*  -------------------   structures N° 1 :   journal de bord        ---------------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+#define long_page	10
+typedef struct				  
+	{
+	int4		code2;		/* 	code de la ligne du journal			*/
+					/* 	code idem code2 debut de block : 		*/
+					/*  	contient un code de commande			*/
+					/*	et le numero du block lors de la télécommande	*/
+	char		mot[8];		/* 	contenu de la ligne du  journal			*/
+	}
+	ligne_journal;			
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	ligne_journal	jj[long_page];	/*	block de 10 lignes de journal			*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_journal;			
+	
+
+/*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------	*/
+/*  ------------------------------------------------------------------------------------------	*/
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = (double)parametr.bolo[bolo].bolo_gain*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+
+/*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]		*/
+#define		gainbrut(aa)	((char)(((aa).mot1&0x1f)))		
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+#define		phase(aa)	((char)(((aa).mot1&0x60)>>5))		
+#define		comm(aa)	((char)(((aa).mot1&0x80)>>7))		
+#define		dac_V(aa)	((int)(((aa).mot1&0xfff00)>>8)	)	
+#define		dac_I(aa)	((int)(((aa).mot1&0xfff00000)>>20))		
+
+#define		voie(aa)	((char)(((aa).mot2&0xff)))		
+#define		dac_T(aa)	((int)(((aa).mot2&0xfff00)>>8))		
+#define		dac_L(aa)	((int)(((aa).mot2&0xfff00000)>>20))		
+
+/*
+#define		bolo_mot1(dacV,dacI,gainbrut,phase,comm)	((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20) 
+#define		bolo_mot2(dacT,dacL,voie)			((voie)&0xff) 	  | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
+*/
+
+#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) 
+#define		bolo_mot2(dacT,dacL,voie)			(((long)(voie))&0xff) 	  | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
+
+
+typedef struct	
+	{
+	int4	mot1;		/*  dac1 = mot[11..0]; dac2=mot1[23..12]	*/
+				/*  gain = mot1[27..24]; phase = mot1[31..28];	*/
+	int4	mot2;		/*  dac3 = mot[11..0]; dac4=mot1[23..12]	*/
+				/*  voie pour reglages auto  = mot2[31..24];	*/
+	}
+	reglage_un_bolo;
+
+
+
+#ifdef programme	/***********   structure normale pour le mac   ****************/
+
+typedef struct	
+	{
+	char	periode;
+	char	nb_mesures;
+	char	temp_mort;
+	char	flag;
+	}
+	horloge;
+
+typedef struct
+	{
+	char	mode;			/*   on_off et deglitch				*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	integ;
+	char 	deriv;
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	}
+	regul_bolo;			/*  longueur 2 entiers int4			*/
+
+typedef struct
+	{
+	char	mode;
+	char	gain;
+	char	courant;
+	char	delai;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4			*/
+
+typedef struct
+	{
+	char	vanne;
+	char	helium;
+	char	chauffage;
+	char	piles;
+	char	transmission;
+	char	temps_max_vanne;
+	char	xx7;
+	char	xx8;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+
+#else		/***********  structure swappée pour le transputer   ****************/
+
+typedef struct	
+	{
+	char	flag;
+	char	temp_mort;
+	char	nb_mesures;
+	char	periode;
+	}
+	horloge;
+	
+
+typedef struct
+	{
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	mode;			/*   on_off et deglitch				*/
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	char 	deriv;
+	char	integ;
+	}
+	regul_bolo;			/*  longueur 2 entiers int4		*/
+
+
+typedef struct
+	{
+	char	delai;
+	char	courant;
+	char	gain;
+	char	mode;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4		*/
+
+typedef struct
+	{
+	char	piles;
+	char	chauffage;
+	char	helium;			/* periode de mesure		*/
+	char	vanne;		
+	char	xx8;
+	char	xx7;
+	char	temps_max_vanne;
+	char	transmission;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+#endif		/***********   fin des structures swappées       ****************/
+
+enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch};
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+enum{vanne_zero,vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_P_T};
+/*enum{trans_zero,trans_rien,trans_normal,trans_rapide,trans_lent};*/
+enum{helium_zero,helium_continu,helium_40s,helium_400s};
+
+
+typedef struct							/*  int4 en mot de 32 bit   	*/
+	{
+	horloge			horloge;			/*			1	*/
+	reglage_un_bolo		bolo[nb_max_bolo]; 		/*	18 * 2	= 	36	*/
+	auto_bolo		autom[nombre_de_voies];		/*	6  * 1		6	*/								
+	regul_bolo		regul[nombre_de_regul];		/*	4  * 2	=	8	*/									
+	auto_dilu		dilu;				/*			2	*/
+	}
+	reglage_bolo;						/*	total 58		*/
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	reglage_bolo	reglage;											
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_reglage;			
+	
+/*  ---------------------   structures N° 3 :    etat de la dilution	-----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		switch_dil;
+	int4		ADC_dil[48];	/*	la lecture des 48 ADC de la carte DIL		*/
+	int4		DAC_dil[4];	/*	les 4 dac de la carte dilution			*/
+	int4		DAC_sst[4];	/*	les 4 dac de la carte sst			*/
+	int4		temperature[4];	/*	valeurs lues sur cartes BEDIFF modifiees	*/
+/*	int4		gyro_dil[3][nb_per_block*2];	les gyros  (block gyros)		*/
+/*	int4		data_dil[50];	 data brutes de la dilution				*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_dilution;			
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  6: chauffage 1	*/
+#define chauffage3		0x00001000	/*  6: chauffage 1	*/
+#define chauffage4		0x00000800	/*  6: chauffage 1	*/
+#define chauffage5		0x00000400	/*  6: chauffage 1	*/
+#define chauffage6		0x00000200	/*  6: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+/*  position des mesures sur les multiplexeurs		*/
+/* J10A  ->  temperatures basses t_b1 t_b2,t_b3 t_b4 36 37 41 35	*/ 
+/* J10B  ->  temperatures basses t_a1 t_a2,t_a3 t_a4 38 11 34 28	*/ 
+/* J1??	 ->  temperatures hautes t_h1 t_h2,t_h3 t_h4	*/ 
+
+enum{
+/* multiplex11..18:*/	t_a2	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,t_a4	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a1	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,mul44	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+/* reste libres :  mul   12 - 21 - 22 - 25 -  31 - 44 - 57 - 58 - 64	*/
+
+#define  val_multiplex(qq)	(0.0003052*(double)((qq)-0x8000))	
+#define  val_temperature(qq)	((val_multiplex(qq)<0.2)?-99:((1146.3/(val_multiplex(qq)-0.1)) - 245.13))
+
+
+/*  ---------------------   structures N° 4 :     gps           -------------------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	char		gps[80];	/*      les données GPS (une chaine maxi 80 cara)	*/
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gps;			
+	
+
+
+/*  ---------------------   structures N° 5 :   tous les bolos 1 periode     	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	short 		bol_per[nb_max_bolo][nb_max_mes_per];		
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_une_periode;			
+
+/*  ----------------   structures N° 6 :  signals de synchro (pour test au sol)	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		synchro[nb_per_block*2][nb_sync];	
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_synchro_sol;			
+
+/*  ---------------------   structures N° 7 : block de données de pointage sol      -----------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		comment[1024];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_pointage_sol;			
+
+
+
+/*  -------------   structures N° 8 :   données brutes des bolometres    ----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque bolo, un vecteur 72 points		*/
+	int4		data_bolo[nb_max_bolo][nb_per_block*2];	
+					/*	data D.S.	(en mots de 32 bits)		*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo;			
+
+/*  ---------------------   structures N° 9 :   données des gyroscopes et du magnétometre	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/* chaque gyro: un vecteur tde 72 valeurs		*/
+	int4		gyro[3][nb_per_block*2];
+	int4		magneto[3];	/*	1 bit par echantillonage soit 3*32bit>72	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro;			
+
+/*  ---------------------   structures N° 10 :   données senseur stellaire	  -----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		sst[nb_per_block*2][18];
+					/* chaque mesure: un paquet de 18 mots de 32 bits	*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst;			
+
+/*  ---------------------   structures N° 11 :    rien		          -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type11;			
+
+/*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit	 ------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+					/*	pour chaque bolo, un vecteur  19 mots		*/
+	unsigned int4	data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo_comprime;			
+
+/*  ---------------------   structures N° 13 :    block_type_gyro_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+	unsigned int4	gyro[3][ (nb_per_block/2) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro_comprime;			
+
+/*  ---------------------   structures N° 14 :    block_type_sst_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque diode, un vecteur  11 mots		*/
+	unsigned int4	sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst_comprime;			
+
+
+/*  ---------------------   structures N° 15 : block_type_status_flash -------*/
+/*  ----------------------------------------------------------------	*/
+
+/*
+** Quelque soit la commande, l'enregistreur renvoie toujours le meme type
+de bloc comprenant la commande, un mot d'erreur eventuel et le status.
+
+** L'enregistreur ne prend jamais l'initiative d'envoyer un bloc de status
+(sauf dans le cas ci-dessous).
+
+** Au reset, le controleur est un peu lent a demarrer (quelques secondes).
+Pour que tu puisse savoir quand il est pret, je propose de t'envoyer un 
+bloc de type "block_type_status_flash" des que je suis pret (comme si tu
+avais envoye un bloc "block_type_cmd_flash" avec la commande
+"FLASH_STATUS_REQUEST"
+
+*/
+
+typedef struct {/* etat de l'enregistreur */
+  int4 nb_total_blocks ;
+  int4 memoire_libre ;
+  int4 nb_block_erreur ;
+} status_flash;
+
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* la commande a laquelle ce bloc repond	*/
+  int4 erreur ;   /* Si la commande a induit une erreur */
+  status_flash status ; /* etat de l'enregistreur */
+  unsigned int4 fin ; /* code de reconnaissance de fin de block	*/
+} block_type_status_flash ;
+
+/*  ---------------------   structures N° 16 :    block_type_cmd_flash    ---------*/
+/*  ------------------------------------------------------------------	*/
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* type de commande a l'enregistreur flash */
+
+  int4	fin;      /* code de reconnaissance de fin de block */
+} block_type_cmd_flash;			
+
+/* Commands from Transputer to Recorder */
+enum {
+  FLASH_STATUS_REQUEST,
+  FLASH_EFFACE_TOUT1, FLASH_EFFACE_TOUT2, FLASH_EFFACE_TOUT3,
+  FLASH_EFFACE_UTIL1, FLASH_EFFACE_UTIL2, FLASH_EFFACE_UTIL3
+} ;
+
+/* Errors from Recorder to Transputer.
+   Pending question: what to do in case of FLASH_ERASE_END_ERROR ?
+*/
+
+enum {
+  FLASH_STATUS_OK,      /* Pas d'erreur */
+  FLASH_BAD_SEQUENCE,   /* Mauvaise sequence d'effacement */
+  FLASH_ERASE_START,    /* Debut d'effacement */
+  FLASH_ERASE_END_OK,   /* Fin d'effacement OK */
+  FLASH_ERASE_END_ERROR /* Erreur pendant l'effacement */
+} ;
+
+
+/*  ---------------------   structures N° 17 : block brut de données ctb pour test      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef	transmet_data_brute
+	char		data[nb_per_block*nb_max_mes_per*nb_byte_mot];
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_data_brute;			
+
+/*  ---------------------   structures N° 18 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_18;			
+
+/*  ---------------------   structures N° 19 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_19;			
+
+
+
+/*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		mot[(taille_maxi_block_archeops)/4];
+	int4		fin;		/* code de reconnaissance de fin de block		*/
+	}
+	block_type_modele;			
+
+
+
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+
+enum	{block_param,block_journal,block_reglage,block_dilution,
+	block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
+	block_bolo,block_gyro,block_sst,block_11,
+	block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_status_flash,
+	block_cmd_flash,block_data_brute,block_18,block_19};
+
+
+#define	def_nom_block	char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
+					"block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
+					"block_bolo","block_gyro","block_sst","block_11",\
+					"block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_status_flash",\
+					"block_cmd_flash","block_data_brute","",""};
+
+
+#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),\
+					sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
+					sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
+					sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_status_flash),\
+					sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
+
+
+
+
+
+/*   le code du block contient  8  bit de type							*/
+/*				24 bit pour le numero du block(horloge locale)			*/
+/*				12 bit pour la longueur du block  (en octet)			*/
+/*				16 bit pour la somme de test de la validité du block		*/
+
+/*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier	*/
+
+
+#define longueur_block(_bk)	( (int) ((_bk)->code1>>16) 	& 0xffff )	
+#define somme_block(_bk)	( (int)  (_bk)->code1		& 0xffff )
+
+#define type_block(_bk)		( (int) ((_bk)->code2>>24)	& 0xff )
+#define numero_block(_bk)	( (int)  (_bk)->code2		& 0xffffff )
+
+/* ce define cree le mot de controle de somme des blocks et de les verifier a la reception	*/
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+/* -------------------------------------------------------------------------------------------- */
+/* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops	*/
+/* il faut inclure une seule fois le header archeops.h précéde de :				*/
+/*			 #define utilitaires_de_block_archeops 					*/
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* 	cette fonction calcule le code de somme pour le controle de parité des blocks		*/
+
+int	calcul_somme_block(block_type_modele* blk,int longueur);
+
+
+
+
+
+/* 	cette fonction est a apeller lors de la création d'un block apres l'avoir rempli	*/
+/*	elle permet de creer tous les mots de controle du block					*/
+
+void	valide_block(block_type_modele* blk,int type,int block_num);
+
+
+
+/* 	cette fonction est a apeller pour vérifier la validité d'un block			*/
+/*	elle retourne 0 si le block est correct et sinon, un code d'erreur			*/
+/*	la seconde fonction sort les erreurs a l'ecran						*/
+
+int	verifie_block(block_type_modele* blk);
+int	verifie_block_printf(block_type_modele* blk);
+
+enum	{block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
+		,block_debut_erreur,block_fin_erreur};
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double	val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier int4 (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned int4	val_long(char x);
+
+int	new_val_dac(int a,char  code); 
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_27.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_27.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_27.c	(revision 439)
@@ -0,0 +1,1108 @@
+//for archediab
+//#include "manip.h"
+//for archTOI
+#include <stdio.h>
+#include "archeops.h"
+
+
+
+/**********  coefficients  pour  les  mesures  bolo    ********************************/
+/*                         toutes les puissances en pW                                */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin     */
+/*                                                                                    */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                       */
+/*                                                                                    */
+/*	-2-	fuite thermique du bolo   coef 3,4                                    */
+/*                                                                                    */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )          */
+/*                                                                                    */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                   */
+/*                                                                                    */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	      */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier) */
+/*   										      */
+/* Pour les thermometres 1 à 4 (germanium et carbone Allan-Bradley) 		      */
+/* les coefficients sont utilisés differemment, ills permettent de convertir	      */
+/* R vers T								              */
+/*   llR= log(log(R)-c(0))  						              */
+/*    T	= exp(c(1) + c(2)* llR + c(3)* llR* llR + c(4)* llR* llR* llR +               */
+/*            c(5)* llR* llR* llR* llR)                                               */
+/*										      */
+/**************************************************************************************/
+
+
+/**************************************************************************************/
+/*                                                                                    */
+/*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
+/*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
+/*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
+/*   pour les cartes modifiees : mettre diviseur=0                                    */
+/*                         et capa = la resistance de chage en Megohm                 */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/*  numero_nom,  on/off  ,  0 = MLPA       , N° bolo , gain_pa  , capa*1000 , diviseur , coef*10000 */
+/*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     , 		*/
+/*                     10 = Bediff    ,         ,           , 					*/
+
+/* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo		*/
+/*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc			*/
+
+
+/*debut_param*/
+/*----------------------------------  fenetre :  -----------------------------------*/
+
+param_bolo  parametr={27,24,36,88,18,
+
+{ 
+{  0 	, 2,10,1 ,  200, 22000	,  200 },	
+{ 10 	, 1,10,2 ,  200, 22000	,  200 },
+{  8 	, 1,10,3 ,  200, 22000	,  200 },
+{  0 	, 2,10,4 ,  200, 22000	,  200 },
+
+{  2 	, 1,10,5 , 1000, 4700	, 1000 },
+{  0 	, 2,10,6 , 1000, 4700	, 1000 },
+{  4 	, 1,10,9 , 1000, 4700	, 1000 },
+{  0 	, 2,10,10, 1000, 4700	, 1000 },
+
+{ 10 	, 1,10,11, 1000, 4700	, 1000 },
+{  7	, 1,10,12, 1000, 4700	, 1000 },
+{  0 	, 1,10,13, 1000, 4700	, 1000 },
+{ 17 	, 1,10,14, 1000, 4700	, 1000 },
+
+{  3	, 1,10,17, 1000, 4700	, 1000 },
+{  1	, 1,10,18, 1000, 4700	, 1000 },
+{  5  	, 1,10,19, 1000, 4700	, 1000 },
+{  0	, 1,10,20, 1000, 4700	, 1000 },
+
+{ 13	, 1,10,21,  500, 22000	,  500 },
+{ 14	, 1,10,22,  500, 22000	,  500 },
+{ 15	, 1,10,25,  500, 22000  ,  500 },
+{ 16	, 1,10,26,  500, 22000  ,  500 },
+
+{ 21	, 3,10,27, 1000, 22000	,    0 },
+{ 22	, 3,10,28, 1000, 1000	,    0 },
+{ 23	, 3,10,29, 1000, 1000	,    0 },
+{ 19	, 3,10,30, 1000, 1000	,    0 },
+
+},
+{ 
+{ "Niente"    , { 5000  ,  0 , 0,   0,0,0,0} },			
+{ "ch1-bolo1"  , { 5000  ,  600000 , 140000,  80000, 25000, 0, 0}  },		
+{ "ch1-bolo2"  , { 5000  ,  600000 , 140000,  60000, 25000, 0, 0}  },
+{ "ch1-bolo3"  , { 5000  ,  600000 , 140000,  65000, 25000, 0, 0}  },
+{ "ch2-bolo4"  , { 5000  ,  600000 , 140000,  90000, 25000, 0, 0}  },
+
+{ "ch2-bolo5"  , { 5000  ,  600000 , 140000, 100000, 25000, 0, 0}  },	
+{ "ch2-bolo6"  , { 5000  ,  600000 , 140000, 110000, 25000, 0, 0}  },
+{ "Dum100mK1"  , { 5000  ,  588000 , 125000,  0,0,0,0} },
+{ "Dum100mK2"  , { 5000  ,  588000 , 125000,  0,0,0,0} },
+
+{ "Dum100mK3"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		
+{ "Dum100mK4"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		
+{ "Lou100mK1"  , { 5000  , 5680000 , 560000,  0,0,0,0} },
+{ "Lou100mK2"  , { 5000  , 5680000 , 560000,  0,0,0,0} },
+
+{ "Lou1.6K5"   , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "Lou1.6K6"   , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "Lou10K7"    , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "Lou10K8"    , { 5000  ,  0 , 0,   0,0,0,0} }, 
+
+{ "R10MOhm"    , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "bedif18"	, { 5000  , 123100 , 334200,  0,0,0,0} },
+{ "v1-bedif19"	, { 5000  , 123100 , 334200,  0,0,0,0} },
+{ "therm_10k"	, { 45000 ,  28907 , 16028 , -1327 , 1472 , 872, 0} },		
+
+{ "germanium"	, {     0 ,  30719 ,  -910 ,-16389 , 2927 ,   0, 0} },	  
+{ "therm_4k"	, { 45000 ,  28907 , 16028 , -1327 , 1472 , 872, 0} },
+{ "therm_1.6k"	, { 45000 ,  28907 , 16028 , -1327 , 1472 , 872, 0} },
+
+}
+
+};
+/*fin_param*/
+
+/* Definition Mai-Juin 1999
+{ 
+{ "v1-bedif1"  , 1,10,1 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },		
+{ "v1-bedif2"  , 1,10,2 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif3"  , 1,10,3 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif4"  , 1,10,4 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif5"  , 1,10,5 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif6"  , 1,10,6 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif7"  , 1,10,9 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif8"  , 1,10,10, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif9"  , 1,10,11, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif10" , 1,10,12, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif11" , 1,10,13, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif12" , 1,10,14, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif13"	, 1,10,17, 1000, 100000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif14"	, 1,10,18, 1000, 470000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif15"  	, 1,10,19, 1000, 470000	, 1000,  {  500  ,  58800 ,  12500,0,0,0,0} },
+{ "bedif16"	, 1,10,20, 1000,2200000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif17"	, 1,10,21, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif18"	, 1,10,22, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif19"	, 2,10,25, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif20"	, 2,10,26, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "germanium"	, 3,10,27, 1000, 22000	,    0,  { 3500  ,  17100 , 646500,0,0,0,0} },
+{ "therm_4k"	, 3,10,28, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_1.6k"	, 3,10,29, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_10k"	, 3,10,30, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+
+}*/
+
+/* bolos campagne 1998-1999	*/
+/*
+reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,	.5			,519.6  , 8.286
+v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41  		
+v1-232...N, 1, 0, 3, 100, 4.7, 333,		
+v1-237...E, 1, 0, 4, 100, 4.7, 333,
+
+reg_JamieO, 1, 0, 5, 100, 4.7, 101,
+
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
+V2-205...Q, 1, 0, 8, 100, 4.7, 333,	.518 , 81    , 25.2 
+V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
+
+*/
+/*bolos campagne 1997-1998	*/
+/*
+
+v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42 		
+v1-232...L, 1, 0, 2, 100, 4.7, 333,		
+v1-205...N, 1, 0, 3, 100, 4.7, 333,	.518 , 81    , 25.2	
+v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,	.5			,519.6  , 8.286
+Jamie....O, 1, 0, 5, 100, 4.7, 101,
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
+V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
+V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
+
+*/
+
+
+int mode_transmission_telemesure[nb_modes_telemesure][nb_type_blocks]= {
+
+/* enregisteur de bord flash :  plafond standard nominal	*/
+/* 0*/	{ 0,10,15,50, 10,50, 0, 0, 0, 0, 0, 0, 1, 1, 1,2500, 0, 0, 0, 0},
+
+/* 1*/	{ 0,10,10, 1, 10, 3, 0, 0, 0, 0, 0, 0, 1, 1, 4,2500, 0, 0, 0, 0},
+
+/* 2*/	{ 0,10,05,01, 10,06, 0, 0, 0, 0, 0, 0, 1, 1, 2,2500, 0, 0, 0, 0},
+
+/* 3*/	{ 0,10, 1,25, 10, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0},
+
+/* 4*/	{ 0,10,15,50, 10,25, 0, 0, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 5*/	{ 0,10,15,50, 10,25, 0, 0, 0, 0, 1, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 6*/	{ 0,10,15,50, 10,50, 0, 0, 0, 1, 0, 0, 1, 0, 2,2500, 0, 0, 0, 0},
+
+/* 7*/	{ 0,10,15,50,100,50,1, 1, 0, 0, 0, 0, 1, 1, 1,2500, 0, 0, 0, 0},
+
+/* 8*/	{ 0,10,15,50,100,50,1, 1, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 9*/	{ 0,10, 1, 1,100, 1,0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0}
+
+ };
+
+
+
+int mode_transmission_flash[nb_modes_flash][nb_type_blocks]= {
+
+
+/* enregisteur de bord flash : nominal	*/
+/* 0*/	{ 0,50,15,25, 10,25, 0, 0, 0, 1, 0, 0, 1, 0, 1,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash : minimum	*/
+/* 1*/	{ 0,50,50,50,50,100, 0, 0, 0, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash :  rien	*/
+/* 2*/	{ 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0} };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*debut_nom_reglage*/
+/* 0->a chaud complet*/
+/* 1->a froid pour V(I)*/
+/* 2->cc*/
+/* 3->a chaud complet*/
+/* 4->chaud avec synchro*/
+/* 5->reglage 5  */
+/* 6->reglage 6  */
+/* 7->reglage 7  */
+/*fin_nom_reglage*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+reglage_bolo  reglage_standard[8]={{
+
+
+/*debut reglage 0 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 1 */
+#ifdef programme
+{31,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{2,21,25,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{0,21,23,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{129,3,129,108,3,126,104,88} 
+#else
+{1,9,76,31},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{2127959573,221185}
+,{21,0}
+,{2127892757,245761}
+,{20,0}
+,{2127991317,245761}
+,{2127996181,253953}
+,{20,0}
+,{2128584725,204801}
+,{2127780885,19457}
+,{2127795221,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{12822,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,25,21,2}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,23,21,0}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,129,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 2 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 3 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{0,20,0,1}
+,{0,20,0,4}
+,{0,20,0,4}
+,{2,20,0,3}
+,{0,20,0,4}
+,{0,20,0,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1149239274,229380}
+,{-1149239275,294916}
+,{20,0}
+,{20,221185}
+,{21,0}
+,{20,245761}
+,{20,0}
+,{20,245761}
+,{276,253953}
+,{20,0}
+,{20,204801}
+,{20,19457}
+,{20,1}
+,{10486037,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100660714,0}
+,{25622,0}
+},{
+{1,0,20,0}
+,{4,0,20,0}
+,{4,0,20,0}
+,{3,0,20,2}
+,{4,0,20,0}
+,{4,0,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 4 */
+#ifdef programme
+{30,76,9,1},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{0,0,128,1}
+,{0,0,128,4}
+,{0,0,128,4}
+,{0,0,128,3}
+,{0,0,128,4}
+,{0,0,128,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{1,3,129,108,3,126,104,88} 
+#else
+{1,9,76,30},{
+{20,0}
+,{-1148225771,229380}
+,{-1148367339,294916}
+,{20,0}
+,{21,221185}
+,{21,0}
+,{21,245761}
+,{20,0}
+,{21,245761}
+,{277,253953}
+,{20,0}
+,{21,204801}
+,{21,19457}
+,{21,1}
+,{11501589,8708}
+,{20,0}
+,{-100647916,0}
+,{1015828,0}
+,{20,0}
+,{20,0}
+,{1024022,0}
+,{25622,0}
+,{-100395499,0}
+,{25622,0}
+},{
+{1,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+,{3,128,0,0}
+,{4,128,0,0}
+,{4,128,0,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,1,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 5 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 6 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 7 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+} };
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+
+unsigned int4	val_long(char x)
+{
+unsigned int4 a,xl;
+char aa;
+aa=x-2;
+a=aa;
+if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
+
+
+
+int	calcul_somme_block(block_type_modele* blk,int longueur)
+{
+int i,so=0;;
+for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
+/* somme sur tous les mots internes	: on exclus le dbut, les codes et la fin	*/
+return((so^(so>>16))&0xffff);
+}
+
+
+
+
+void  valide_block(block_type_modele* blk,int type,int block_num)
+{
+int somme,longueur;
+def_long_block
+longueur=long_block[type];
+/*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
+/* 		,(unsigned)blk,type,block_num,longueur);*/
+blk->debut		=	debut_block_mesure;
+blk->code2		=	(((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
+
+blk->mot[longueur/4-4]  =	fin_block_mesure;
+somme=calcul_somme_block(blk,longueur);
+blk->code1		=	(((long)longueur)<<16)	|	somme;
+}
+
+
+
+
+int  verifie_block(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+if(blk->debut != debut_block_mesure)					return(block_debut_erreur);
+type=type_block(blk);		if( (type<0) ||(type>=nb_type_blocks) )	return(block_type_inconnu);	
+lg=longueur_block(blk);		if( lg != long_block[type] )		return(block_longueur_erreur);	
+if( blk->mot[(lg/4)-4]  !=	fin_block_mesure)			return(block_fin_erreur);	
+som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))		return(block_somme_erreur);
+return(block_correct);
+}
+
+
+int  verifie_block_printf(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+def_nom_block
+if(blk->debut != debut_block_mesure)
+	{
+	printf(" erreur dans le code debut de block	 \n");
+	return(block_debut_erreur);
+	}	
+
+type=type_block(blk);
+if( (type<0) || (type>nb_type_blocks) )	
+	{
+	printf(" block de type %d  inconnu\n",type);
+	return(block_type_inconnu);
+	}
+
+lg=longueur_block(blk);
+if( lg!=long_block[type] )	
+	{
+	printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
+			,nom_block[type],long_block[type],lg);
+	return(block_longueur_erreur);
+	}
+
+som=calcul_somme_block(blk,lg);
+if( som!=somme_block(blk) )	
+	{
+	printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
+			,nom_block[type],som,somme_block(blk) );
+	return(block_somme_erreur);
+	}
+	
+if(blk->mot[(lg/4)-4]	!= fin_block_mesure)	
+	{
+	printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
+			,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
+	return(block_fin_erreur);
+	}
+
+return(block_correct);
+}
+
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_27.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_27.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_27.h	(revision 439)
@@ -0,0 +1,1006 @@
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 archeops.h  :	structure de données            	*/
+/*                                                                      */
+/*======================================================================*/
+
+#define		_archeops
+#define		version_num		27
+
+#if version_num>=27
+#define ECC_TOTAL 255
+#define ECC_DATA 239       /* Nb de bytes de data encodes */
+#define ECC_SIZE (ECC_TOTAL-ECC_DATA) /* Nb de bytes encodeurs */
+#define SIZE_HEAD sizeof(int4)*3  /* 3 mots d'entete de blocs */
+#endif
+/*======================================================================*/
+/*                                                                      */
+/* 			historique des modifications            	*/
+/*                                                                      */
+/*                                                                      */
+/*  VERSION 24:                                                         */
+/*                                                                      */
+/*	- utilise le fichier archeops.c					*/
+/*	- nb_max_bolo=24  avec nb_bolo_util=18				*/
+/*	- change la structure du block param				*/
+/*	- change la structure du block dilution				*/
+/*									*/
+/*  VERSION 25:                                                         */
+/*                                                                      */
+/*	- la compression marche						*/
+/*	- 4 signaux synchro O.K.					*/
+/*	- change la structure dil : contient les temperatures		*/
+/*									*/
+/*  VERSION 26:                                                         */
+/*                                                                      */
+/*	- int4 pour compatibilité toutes machines			*/
+/*								        */
+/*  VERSION 27:                                                         */
+/*	- ajout dans chaque block-type d'une structure "ecc" dont la    */
+/*	taille est adaptee a la taille du bloc: 		        */
+/*		on ajoute 16 bytes servant a la correction d'erreur     */
+/*		pour chaque paquet de 241 bytes	de donnees.	        */
+/*	les bytes d'ECC sont calcules avant envoi sur la ligne	        */
+/*	telemesure.					                */
+/*	Ils peuvent servir a l'arrivee pour verifier et corriger quand  */
+/*	c'est possible les donnees. On peut corriger au maximu 7 bytes  */
+/*	erronnes.						        */
+/*								        */
+/*======================================================================*/
+
+
+/*======================================================================*/
+/*  ---------------  parametres generaux de definition   -------------  */
+/*======================================================================*/
+#ifndef int4
+#ifdef __alpha
+#define int4 int
+#undef programme
+#else
+#define int4 long
+#endif
+#endif
+
+#ifdef linux
+#undef programme
+#endif
+
+
+#ifdef	_planck
+#define	_archeops
+#define _trapani
+#define _sans_transputer
+#endif
+
+#ifdef	_archeops
+/*#define _test_diabolo	 relecture des blocks fabriques avec diabolo	*/
+#define _trapani		/*  configuration  prevue pour Trapani	*/
+/*#define _kiruna		  block standard prevu pour kiruna	*/ 
+#endif
+
+
+
+/*======================================================================*/
+/*  --------------	valeurs des parametres dans	-------------   */
+/*  --------------	les différentes configurations	-------------   */
+/*======================================================================*/
+/*									*/
+/*  configuration pour Trapani : 3 bebos  /  12 bolos			*/
+/*									*/
+/*  bebo1 :   voies  1  à  6	-->  bolo  1 a  6			*/
+/*  bebo2 :   voies  9  à  14	-->  bolo  7 à 12			*/
+/*									*/
+/*  bebo6 :								*/
+/*  	voies  41 42 43 44	=  carte simplifiee avec AMP01		*/
+/*  	voies  45 et 46		= chauffage pour regulation		*/    
+/*	on ecrira plus tard le stockage des donnees simplifiees		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+/*	nb_per_block	doit etre divisible par 2						*/
+/*	nb_max_bolo	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+/*	nb_bolo_util	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+
+
+#ifdef	_trapani
+#define nb_max_bolo 		24	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		18	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_kiruna
+#define nb_max_bolo 		36	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		32	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_test_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_sans_transputer
+#define nb_byte_mot		5	/*  nombre d'octets dans un mot d'acquisition planck	*/
+#else
+#define nb_byte_mot		8	/*  nombre d'octets dans un mot d'acquisition archeops	*/
+#endif
+
+#define	nb_max_nom_bolo		24	/*  nombre maxi de noms et coef bolo dans la table	*/
+
+#define nb_sync			4	/*  nombre de signaux de synchro			*/
+					/*  6 pour diabolo 					*/
+					/* toujours multiple de 4 pour archeops			*/
+#define	nb_element_catalog	256	/* nombre d'éléments catalog par reponse enregistreur	*/
+
+
+#ifdef	transmet_data_brute
+#define		taille_maxi_block_archeops	sizeof(block_type_data_brute)
+#else					/* 	le plus gros des différents blocks de télémesure*/
+#define		taille_maxi_block_archeops	sizeof(block_type_bolo)
+#endif
+
+#define		nombre_de_regul		4
+#define		nombre_de_voies		6
+#define 	nb_type_blocks		20	/*  nombre de type de blocks (multiple de 4)	*/
+#define		nb_modes_telemesure	10
+#define		nb_modes_flash		 3
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=======================   télécommande      ==========================*/
+/*======================================================================*/
+
+
+/*   --------------   codes de reconnaissance des paquets de télécommande	--------------   */   
+
+#define		debut_telecommande		0x23456789
+#define		fin_telecommande		0x98765432
+
+/*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops	--------------   */   
+
+#define 	tc_dir_transputer		1
+#define 	tc_dir_reset_epld		3
+
+/*  -------------  codes  des  prefix des  telecommandes traités le transputer	--------------   */
+
+#define		tc_horloge			255	/* (-1)	*/
+#define		tc_cadence1			128
+#define		tc_cadence2			129
+#define		tc_cadence3			130
+#define		tc_regul			251	/* (-5)	*/
+#define		tc_switch_dil			250
+#define		tc_dac_dil			249
+
+/*======================================================================*/
+/*	telecommande reduite  sur 18 bit				*/
+/*======================================================================*/
+
+/*______________________________________________________________________________________________*/
+/*	1er mot	:	code de debut de telecommande reduite					*/
+#define		tc_reduite			248	
+/*______________________________________________________________________________________________*/
+/*	2eme mot:	4bit:	16 codes  de direction  tc2					*/
+enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
+	,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
+	,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution};	/* 12 codes: reste 4 disponibles*/
+
+
+/*______________________________________________________________________________________________*/
+/*	3eme mot:	6bit:									*/
+
+/*	code2=dac-gain-voie  	:	numero de bolo						*/
+
+/*	code2=tc2_horloge	:								*/
+/*		soit un code defini								*/
+/*		soit le code tc3_vitesse+i avec i=0.. nb_type_block				*/
+enum{tc3_commande,tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag,tc3_vitesse};
+/*#define	tc3_suite	tc3_vitesse+nb_type_block					*/
+
+
+/*	code2=tc2_regul	:									*/
+
+
+/*	code2=tc2_auto_bolo	:						*/
+
+
+/*	code2=tc2_auto_dilu	:						*/
+/* 	les valeurs des parametres d'auto_dilu ne depassent pas 128 		*/
+
+
+/*	code2=tc2_dilution	:						*/
+
+
+/*______________________________________________________________________________*/
+/*	4eme mot:	8bit:	valeur a ecrire			*/		
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=========================   télémesure    ============================*/
+/*======================================================================*/
+
+/*   -------   codes de reconnaissance des paquets de télémesure        */   
+
+#define		debut_block_mesure		0x45627491	
+#define		fin_block_mesure		0x83260432	
+
+
+
+
+
+/*======================================================================*/
+/*  ------------------------------------------------------------------  */
+/*  ---------  	Les  formats  des  blocks  type   ARCHEOPS   	-------	*/
+/*  ------------------------------------------------------------------  */
+/*======================================================================*/
+
+
+
+/*==============================================================================================*/
+
+/*	Le tableau est lut dans le desordre par le mac en lecture de la carte pci :		*/
+
+/*	Les entiers long sont ecrits tels quels							*/
+/*	Les short sont ecrits permuté 2 a 2 par le tansputer					*/
+/*	Les tables char sont ecrits permuté 4 / 4 par le transputer				*/
+/*	A la lecture dans le mac, tout est bon							*/
+
+
+/*  ---------  	 structures N° 0 :   parametres de mesure des bolometres        -------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct	
+	{
+	int4		numero_nom_coef;	/*  le numero pour retrouver le nom et les coef	*/
+	int4		bolo_code_util;		/*  le code d'utilisation du bolo		*/
+	int4		bolo_bebo;		/*  l'acquisition:  0 pour MLPA 10 pour BEBODIFF*/
+	int4		bolo_num;		/*  l'adresse hard du bolo			*/
+	int4		bolo_gain;		/*  le gain du preampli				*/
+	int4		bolo_capa;		/*  la valeur capa du modulateur		*/
+	int4 		bolo_diviseur;		/*  le diviseur de la compensation		*/
+	}
+	param_un_bolo;
+	
+	
+typedef struct	
+	{
+	char		bolo_nom[32];		/*  le nom de chaque bolometre			*/
+	int4	  	coef[7];		/*  les coef pour le calcul de la température	*/
+	}
+	nom_et_coef_bolo;
+	
+	
+	
+/* code_util des bolos  */
+enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
+
+	
+typedef struct		/*  		table des parametres de mesure bolometre 		*/
+			/*	cette table ne change pas (en principe) en cours de mesure	*/
+	{
+	int4		numero_version;			/*  numero de version du header archeops.h	*/
+	int4		n_max_bolo;			/*  nombre maxi de bolos  (divisible par 4)	*/
+	int4		n_per_block;			/*  nombre de periodes entieres dans un block	*/
+	int4		n_max_mes_per;			/*  nb de points maxi dans une periode complete	*/
+
+	int4		nb_bolo;			/*  nombre de bolometres effectivement lut	*/
+	param_un_bolo	bolo[nb_max_bolo];
+	nom_et_coef_bolo nom_coef[nb_max_nom_bolo];	/*  nombre de nom et coef bolo			*/
+	}
+	param_bolo;
+	
+	
+	
+	
+/*	
+	int4		bolo_code_util[nb_max_bolo];	
+	char		bolo_nom[nb_max_bolo][32];	
+
+	int4		bolo_bebo[nb_max_bolo];		
+	int4		bolo_num[nb_max_bolo];		
+	int4		bolo_gain[nb_max_bolo];		
+
+	int4		bolo_capa[nb_max_bolo];		
+	int4 		bolo_diviseur[nb_max_bolo];	
+	
+	int4	  	coef[nb_max_bolo][7];		
+
+	int4		presence_bebo;			
+	}
+	param_bolo;
+*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	param_bolo	param;		/*	les parametres de mesure des bolometres		*/
+	unsigned char ecc[((((sizeof( param_bolo)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_param;			
+	
+
+
+
+/*  -------------------   structures N° 1 :   journal de bord        ---------------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+#define long_page	10
+typedef struct				  
+	{
+	int4		code2;		/* 	code de la ligne du journal			*/
+					/* 	code idem code2 debut de block : 		*/
+					/*  	contient un code de commande			*/
+					/*	et le numero du block lors de la télécommande	*/
+	char		mot[8];		/* 	contenu de la ligne du  journal			*/
+	}
+	ligne_journal;			
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	ligne_journal	jj[long_page];	/*	block de 10 lignes de journal			*/
+	unsigned char ecc[((((sizeof(ligne_journal)*long_page+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_journal;			
+	
+
+/*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------	*/
+/*  ------------------------------------------------------------------------------------------	*/
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = (double)parametr.bolo[bolo].bolo_gain*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+
+/*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]		*/
+#define		gainbrut(aa)	((char)(((aa).mot1&0x1f)))		
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+#define		phase(aa)	((char)(((aa).mot1&0x60)>>5))		
+#define		comm(aa)	((char)(((aa).mot1&0x80)>>7))		
+#define		dac_V(aa)	((int)(((aa).mot1&0xfff00)>>8)	)	
+#define		dac_I(aa)	((int)(((aa).mot1&0xfff00000)>>20))		
+
+#define		voie(aa)	((char)(((aa).mot2&0xff)))		
+#define		dac_T(aa)	((int)(((aa).mot2&0xfff00)>>8))		
+#define		dac_L(aa)	((int)(((aa).mot2&0xfff00000)>>20))		
+
+/*
+#define		bolo_mot1(dacV,dacI,gainbrut,phase,comm)	((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20) 
+#define		bolo_mot2(dacT,dacL,voie)			((voie)&0xff) 	  | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
+*/
+
+#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) 
+#define		bolo_mot2(dacT,dacL,voie)			(((long)(voie))&0xff) 	  | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
+
+
+typedef struct	
+	{
+	int4	mot1;		/*  dac1 = mot[11..0]; dac2=mot1[23..12]	*/
+				/*  gain = mot1[27..24]; phase = mot1[31..28];	*/
+	int4	mot2;		/*  dac3 = mot[11..0]; dac4=mot1[23..12]	*/
+				/*  voie pour reglages auto  = mot2[31..24];	*/
+	}
+	reglage_un_bolo;
+
+
+
+#ifdef programme	/***********   structure normale pour le mac   ****************/
+
+typedef struct	
+	{
+	char	periode;
+	char	nb_mesures;
+	char	temp_mort;
+	char	flag;
+	}
+	horloge;
+
+typedef struct
+	{
+	char	mode;			/*   on_off et deglitch				*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	integ;
+	char 	deriv;
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	}
+	regul_bolo;			/*  longueur 2 entiers int4			*/
+
+typedef struct
+	{
+	char	mode;
+	char	gain;
+	char	courant;
+	char	delai;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4			*/
+
+typedef struct
+	{
+	char	vanne;
+	char	helium;
+	char	chauffage;
+	char	piles;
+	char	transmission;
+	char	temps_max_vanne;
+	char	xx7;
+	char	xx8;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+
+#else		/***********  structure swappée pour le transputer   ****************/
+
+typedef struct	
+	{
+	char	flag;
+	char	temp_mort;
+	char	nb_mesures;
+	char	periode;
+	}
+	horloge;
+	
+
+typedef struct
+	{
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	mode;			/*   on_off et deglitch				*/
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	char 	deriv;
+	char	integ;
+	}
+	regul_bolo;			/*  longueur 2 entiers int4		*/
+
+
+typedef struct
+	{
+	char	delai;
+	char	courant;
+	char	gain;
+	char	mode;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4		*/
+
+typedef struct
+	{
+	char	piles;
+	char	chauffage;
+	char	helium;			/* periode de mesure		*/
+	char	vanne;		
+	char	xx8;
+	char	xx7;
+	char	temps_max_vanne;
+	char	transmission;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+#endif		/***********   fin des structures swappées       ****************/
+
+enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch};
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+enum{vanne_zero,vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_P_T};
+/*enum{trans_zero,trans_rien,trans_normal,trans_rapide,trans_lent};*/
+enum{helium_zero,helium_continu,helium_40s,helium_400s};
+
+
+typedef struct							/*  int4 en mot de 32 bit   	*/
+	{
+	horloge			horloge;			/*			1	*/
+	reglage_un_bolo		bolo[nb_max_bolo]; 		/*	18 * 2	= 	36	*/
+	auto_bolo		autom[nombre_de_voies];		/*	6  * 1		6	*/								
+	regul_bolo		regul[nombre_de_regul];		/*	4  * 2	=	8	*/									
+	auto_dilu		dilu;				/*			2	*/
+	}
+	reglage_bolo;						/*	total 58		*/
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	reglage_bolo	reglage;											
+	unsigned char ecc[((((sizeof(reglage_bolo)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_reglage;			
+	
+/*  ---------------------   structures N° 3 :    etat de la dilution	-----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		switch_dil;
+	int4		ADC_dil[48];	/*	la lecture des 48 ADC de la carte DIL		*/
+	int4		DAC_dil[4];	/*	les 4 dac de la carte dilution			*/
+	int4		DAC_sst[4];	/*	les 4 dac de la carte sst			*/
+	int4		temperature[4];	/*	valeurs lues sur cartes BEDIFF modifiees	*/
+/*	int4		gyro_dil[3][nb_per_block*2];	les gyros  (block gyros)		*/
+/*	int4		data_dil[50];	 data brutes de la dilution				*/
+	unsigned char ecc[((((sizeof(int4)*64+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_dilution;			
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  6: chauffage 1	*/
+#define chauffage3		0x00001000	/*  6: chauffage 1	*/
+#define chauffage4		0x00000800	/*  6: chauffage 1	*/
+#define chauffage5		0x00000400	/*  6: chauffage 1	*/
+#define chauffage6		0x00000200	/*  6: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+/*  position des mesures sur les multiplexeurs		*/
+/* J10A  ->  temperatures basses t_b1 t_b2,t_b3 t_b4 36 37 41 35	*/ 
+/* J10B  ->  temperatures basses t_a1 t_a2,t_a3 t_a4 38 11 34 28	*/ 
+/* J1??	 ->  temperatures hautes t_h1 t_h2,t_h3 t_h4	*/ 
+
+enum{
+/* multiplex11..18:*/	t_a2	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,t_a4	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a1	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,mul44	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+/* reste libres :  mul   12 - 21 - 22 - 25 -  31 - 44 - 57 - 58 - 64	*/
+
+#define  val_multiplex(qq)	(0.0003052*(double)((qq)-0x8000))	
+#define  val_temperature(qq)	((val_multiplex(qq)<0.2)?-99:((1146.3/(val_multiplex(qq)-0.1)) - 245.13))
+
+
+/*  ---------------------   structures N° 4 :     gps           -------------------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+#define GPS_DATA 80
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	char		gps[GPS_DATA];	/*      les données GPS (une chaine maxi 80 cara)	*/
+	unsigned char ecc[((((GPS_DATA+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gps;			
+	
+
+
+/*  ---------------------   structures N° 5 :   tous les bolos 1 periode     	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	short 		bol_per[nb_max_bolo][nb_max_mes_per];		
+	unsigned char ecc[((((sizeof(short)*nb_max_bolo*nb_max_mes_per+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_une_periode;			
+
+/*  ----------------   structures N° 6 :  signals de synchro (pour test au sol)	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		synchro[nb_per_block*2][nb_sync];	
+	unsigned char ecc[((((nb_per_block*nb_sync*2+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_synchro_sol;			
+
+/*  ---------------------   structures N° 7 : block de données de pointage sol      -----------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		comment[1024];
+	unsigned char ecc[((((1024+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_pointage_sol;			
+
+
+
+/*  -------------   structures N° 8 :   données brutes des bolometres    ----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque bolo, un vecteur 72 points		*/
+	int4		data_bolo[nb_max_bolo][nb_per_block*2];	
+					/*	data D.S.	(en mots de 32 bits)		*/
+	unsigned char ecc[((((sizeof(int4)*nb_max_bolo*nb_per_block*2+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo;			
+
+/*  ---------------------   structures N° 9 :   données des gyroscopes et du magnétometre	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/* chaque gyro: un vecteur tde 72 valeurs		*/
+	int4		gyro[3][nb_per_block*2];
+	int4		magneto[3];	/*	1 bit par echantillonage soit 3*32bit>72	*/
+	unsigned char ecc[((((sizeof(int4)*3*nb_per_block*2*3+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro;			
+
+/*  ---------------------   structures N° 10 :   données senseur stellaire	  -----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		sst[nb_per_block*2][18];
+					/* chaque mesure: un paquet de 18 mots de 32 bits	*/
+	unsigned char ecc[((((sizeof(int4)*nb_per_block*2*18+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst;			
+
+/*  ---------------------   structures N° 11 :    rien		          -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type11;			
+
+/*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit	 ------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+					/*	pour chaque bolo, un vecteur  19 mots		*/
+	unsigned int4	data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
+	unsigned char ecc[((((sizeof(int4)*nb_bolo_util*((nb_per_block/2) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo_comprime;			
+
+/*  ---------------------   structures N° 13 :    block_type_gyro_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+	unsigned int4	gyro[3][ (nb_per_block/2) +1 ];
+	unsigned char ecc[((((sizeof(int4)*3*((nb_per_block/2) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro_comprime;			
+
+/*  ---------------------   structures N° 14 :    block_type_sst_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque diode, un vecteur  11 mots		*/
+	unsigned int4	sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
+	unsigned char ecc[((((sizeof(int4)*nb_photo_diodes*((nb_per_block*2/7) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst_comprime;			
+
+
+/*  ---------------------   structures N° 15 : block_type_status_flash -------*/
+/*  ----------------------------------------------------------------	*/
+
+/*
+** Quelque soit la commande, l'enregistreur renvoie toujours le meme type
+de bloc comprenant la commande, un mot d'erreur eventuel et le status.
+
+** L'enregistreur ne prend jamais l'initiative d'envoyer un bloc de status
+(sauf dans le cas ci-dessous).
+
+** Au reset, le controleur est un peu lent a demarrer (quelques secondes).
+Pour que tu puisse savoir quand il est pret, je propose de t'envoyer un 
+bloc de type "block_type_status_flash" des que je suis pret (comme si tu
+avais envoye un bloc "block_type_cmd_flash" avec la commande
+"FLASH_STATUS_REQUEST"
+
+*/
+
+typedef struct {/* etat de l'enregistreur */
+  int4 nb_total_blocks ;
+  int4 memoire_libre ;
+  int4 nb_block_erreur ;
+} status_flash;
+
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* la commande a laquelle ce bloc repond	*/
+  int4 erreur ;   /* Si la commande a induit une erreur */
+  status_flash status ; /* etat de l'enregistreur */
+  unsigned char ecc[((((sizeof(int4)*2 + sizeof(status_flash)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+  
+  unsigned int4 fin ; /* code de reconnaissance de fin de block	*/
+} block_type_status_flash ;
+
+/*  ---------------------   structures N° 16 :    block_type_cmd_flash    ---------*/
+/*  ------------------------------------------------------------------	*/
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* type de commande a l'enregistreur flash */
+  unsigned char ecc[((((sizeof(int4)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+
+  int4	fin;      /* code de reconnaissance de fin de block */
+} block_type_cmd_flash;			
+
+/* Commands from Transputer to Recorder */
+enum {
+  FLASH_STATUS_REQUEST,
+  FLASH_EFFACE_TOUT1, FLASH_EFFACE_TOUT2, FLASH_EFFACE_TOUT3,
+  FLASH_EFFACE_UTIL1, FLASH_EFFACE_UTIL2, FLASH_EFFACE_UTIL3
+} ;
+
+/* Errors from Recorder to Transputer.
+   Pending question: what to do in case of FLASH_ERASE_END_ERROR ?
+*/
+
+enum {
+  FLASH_STATUS_OK,      /* Pas d'erreur */
+  FLASH_BAD_SEQUENCE,   /* Mauvaise sequence d'effacement */
+  FLASH_ERASE_START,    /* Debut d'effacement */
+  FLASH_ERASE_END_OK,   /* Fin d'effacement OK */
+  FLASH_ERASE_END_ERROR /* Erreur pendant l'effacement */
+} ;
+
+
+/*  ---------------------   structures N° 17 : block brut de données ctb pour test      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef	transmet_data_brute
+	char		data[nb_per_block*nb_max_mes_per*nb_byte_mot];
+	unsigned char ecc[((((nb_per_block*nb_max_mes_per*nb_byte_mot+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#else
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_data_brute;			
+
+/*  ---------------------   structures N° 18 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_18;			
+
+/*  ---------------------   structures N° 19 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_19;			
+
+
+
+/*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		mot[(taille_maxi_block_archeops)/4];
+	unsigned char ecc[((((sizeof(int4)*(taille_maxi_block_archeops/4)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+	int4		fin;		/* code de reconnaissance de fin de block		*/
+	}
+	block_type_modele;			
+
+
+
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+
+enum	{block_param,block_journal,block_reglage,block_dilution,
+	block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
+	block_bolo,block_gyro,block_sst,block_11,
+	block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_status_flash,
+	block_cmd_flash,block_data_brute,block_18,block_19};
+
+
+#define	def_nom_block	char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
+					"block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
+					"block_bolo","block_gyro","block_sst","block_11",\
+					"block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_status_flash",\
+					"block_cmd_flash","block_data_brute","",""};
+
+
+#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),\
+					sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
+					sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
+					sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_status_flash),\
+					sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
+
+
+
+
+
+/*   le code du block contient  8  bit de type							*/
+/*				24 bit pour le numero du block(horloge locale)			*/
+/*				12 bit pour la longueur du block  (en octet)			*/
+/*				16 bit pour la somme de test de la validité du block		*/
+
+/*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier	*/
+
+
+#define longueur_block(_bk)	( (int) ((_bk)->code1>>16) 	& 0xffff )	
+#define somme_block(_bk)	( (int)  (_bk)->code1		& 0xffff )
+
+#define type_block(_bk)		( (int) ((_bk)->code2>>24)	& 0xff )
+#define numero_block(_bk)	( (int)  (_bk)->code2		& 0xffffff )
+
+/* ce define cree le mot de controle de somme des blocks et de les verifier a la reception	*/
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+/* -------------------------------------------------------------------------------------------- */
+/* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops	*/
+/* il faut inclure une seule fois le header archeops.h précéde de :				*/
+/*			 #define utilitaires_de_block_archeops 					*/
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* 	cette fonction calcule le code de somme pour le controle de parité des blocks		*/
+
+int	calcul_somme_block(block_type_modele* blk,int longueur);
+
+
+
+
+
+/* 	cette fonction est a apeller lors de la création d'un block apres l'avoir rempli	*/
+/*	elle permet de creer tous les mots de controle du block					*/
+
+void	valide_block(block_type_modele* blk,int type,int block_num);
+
+
+
+/* 	cette fonction est a apeller pour vérifier la validité d'un block			*/
+/*	elle retourne 0 si le block est correct et sinon, un code d'erreur			*/
+/*	la seconde fonction sort les erreurs a l'ecran						*/
+
+int	verifie_block(block_type_modele* blk);
+int	verifie_block_printf(block_type_modele* blk);
+
+enum	{block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
+		,block_debut_erreur,block_fin_erreur};
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double	val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier int4 (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned int4	val_long(char x);
+
+int	new_val_dac(int a,char  code); 
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_28.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_28.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_28.c	(revision 439)
@@ -0,0 +1,1109 @@
+//for archediab
+//#include "manip.h"
+//for archTOI
+#include <stdio.h>
+#include "archeops.h"
+#include "arcunit.h"
+
+/* sauve vol trapani 2eme config de vol   */
+
+/**********  coefficients  pour  les  mesures  bolo    **********************************/
+/*                         toutes les puissances en pW                                  */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin               */
+/*                                                                                      */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                             */
+/*                                                                                      */
+/*	-2-	fuite thermique du bolo   coef 3,4                                              */
+/*                                                                                      */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )                */
+/*                                                                                      */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                             */
+/*                                                                                      */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	                    */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier)                   */
+/*   										                                            */
+/* Pour les thermometres 1 à 4 (germanium et carbone Allan-Bradley) 		            */
+/* les coefficients sont utilisés differemment, ils permettent de convertir	            */
+/* R vers T		( c(6) est un offset sur la mesure de R par rapport  aux mesures 4 fils)*/
+/*   llR= log(log(R - c(6))-c(0))  						                                */
+/*    T	= exp(c(1) + c(2)* llR + c(3)* llR* llR + c(4)* llR* llR* llR +                 */
+/*            c(5)* llR* llR* llR* llR)                                                 */
+/*										                                                */
+/*	version vol Trapani									                                */
+/*	on corrige le biais de temperature coef2=1.1 old,  coef3=old/1.1^coef4	            */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/****************************************************************************************/
+
+
+/**************************************************************************************/
+/*                                                                                    */
+/*   pour les MLPA      :  gain = 100   diviseur = 101  ou  330                       */
+/*   pour les bebodiff  :  gain = diviseur = 100Kohm / R preampli                     */
+/*   pour les bebodiff  :  la capa est corrigee d'un facteur 0.868                    */
+/*   pour les cartes modifiees : mettre diviseur=0                                    */
+/*                         et capa = la resistance de chage en Megohm                 */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/*  numero_nom,  on/off  ,  0 = MLPA       , N° bolo , gain_pa  , capa*1000 , diviseur , coef*10000 */
+/*       ,  0 ou 1  ,  2..8 = BEBO    ,  hard   ,           ,  4700     ,  333     , 		*/
+/*                     10 = Bediff    ,         ,           , 					*/
+
+/* pour les bediff (code 10)  le n° de bolo est  N° de bebo*8  +  numero dans la bebo		*/
+/*  soit :  1 2 3 4 5 6  ..  9 10 11 12 13 14 .. 17 18 19 20 21 22 .. etc			*/
+
+
+/*debut_param*/
+/*----------------------------------  fenetre :  -----------------------------------*/
+
+/* ------------------------ configuration de vol 5 juillet 99-----------------------------*/
+param_bolo  parametr={28,24,36,88,18,
+
+{ 
+{ 11 	, 2,10, 1 , 200, 22000	,  200 },	/*	1	*/
+{  9	, 1,10, 2 , 200, 22000	,  200 },
+{  8 	, 1,10, 3 , 200, 22000	,  200 },
+{ 14 	, 2,10, 4 , 200, 22000	,  200 },
+
+{  5	, 1,10, 5 ,1000,  4700	, 1000 },	/*	5	*/
+{  0 	, 2,10, 6 ,1000,  4700	, 1000 },
+{ 10	, 1,10, 9 ,1000,  4700	, 1000 },
+{  0 	, 2,10,10, 1000,  4700	, 1000 },
+
+{  2 	, 1,10,11, 1000,  4700	, 1000 },	/*	9	*/
+{  4	, 1,10,12, 1000,  4700	, 1000 },
+{  7 	, 2,10,13, 1000,  4700	, 1000 },
+{  1 	, 1,10,14, 1000,  4700	, 1000 },
+
+{ 13	, 1,10,17, 1000,  4700	, 1000 },	/*	13	*/
+{  3	, 1,10,18, 1000,  4700	, 1000 },
+{ 12    	, 1,10,19, 1000,  4700	, 1000 },
+{  6	, 1,10,20, 1000,  4700	, 1000 },
+
+{ 15	, 1,10,21,  200, 22000	,  200 },	/*	17	*/
+{ 16	, 1,10,22,  200, 22000	,  200 },
+{ 17	, 1,10,25,  500, 22000  ,  500 },
+{ 18	, 2,10,26,  500, 22000  ,  500 },
+
+{ 20	, 3,10,27, 1000, 22000	,    0 },	/*	21	*/
+{ 21	, 3,10,28, 1000,  1000	,    0 },
+{ 22	, 3,10,29, 1000,  1000	,    0 },
+{ 23	, 3,10,30, 1000,  1000	,    0 },
+
+},
+{ 
+{ "Niente   "    , { 5000  ,  0 , 0,   0,0,0,0} },			/*	0	*/
+{ "ch1-bolo1"  , { 5000  ,  600000 , 154000,  63039, 25000, 0, 0}  },		/*	1	*/	
+{ "ch1-bolo2"  , { 5000  ,  600000 , 154000,  47279, 25000, 0, 0}  },
+{ "ch1-bolo3"  , { 5000  ,  600000 , 154000,  51219, 25000, 0, 0}  },
+{ "ch2-bolo4"  , { 5000  ,  600000 , 154000,  70919, 25000, 0, 0}  },
+{ "ch2-bolo5"  , { 5000  ,  600000 , 154000,  78799, 25000, 0, 0}  },	
+{ "ch3-bolo6"  , { 5000  ,  600000 , 154000,  86678, 25000, 0, 0}  },
+
+{ "Dum100mK1"  , { 5000  ,  588000 , 125000,  0,0,0,0} },			        /*	7	*/
+{ "Dum100mK2"  , { 5000  ,  588000 , 125000,  0,0,0,0} },
+/*{ "Dum100mK3"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		*/
+{ "Dum100mK4"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		            /* 9 */
+/*{ "Dum100mK5"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		*/
+{ "Dum100mK6"  , { 5000  , 1361800 , 125000,  0,0,0,0} },		
+
+{ "Lou100mK1"  , { 5000  , 5680000 , 560000,  0,0,0,0} },                   /* 11 */
+{ "Lou100mK2"  , { 5000  , 5680000 , 560000,  0,0,0,0} },
+{ "Lou100mK3"  , { 5000  , 5680000 , 560000,  0,0,0,0} },
+{ "Lou100mK4"  , { 5000  , 5680000 , 560000,  0,0,0,0} },
+
+{ "Lou1.6K5 "  , { 5000  ,  0 , 0,   0,0,0,0} },        					/*	15	*/
+{ "Lou1.6K6 "  , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "Lou10K7  "  , { 5000  ,  0 , 0,   0,0,0,0} },  
+{ "Lou10K8  "  , { 5000  ,  0 , 0,   0,0,0,0} }, 
+
+{ "R10MOhm  "  , { 5000  ,  0 , 0,   0,0,0,0} },  							/*	19	*/
+
+/* La germanium doit toujours etre en premier par rapport aux autres thermos absolus */
+{ "germanium"  , {     0 ,  30719 ,   -910 , -16389 , 2927 ,   0,      0} }, /*	20	*/
+{ "therm_4k"   , { 45000 ,  28907 , -16028 ,  -1327 , 1472 , 872,  52500} },
+{ "therm_1.6k" , { 45000 ,  28907 , -16028 ,  -1327 , 1472 , 872, 566700} },
+{ "therm_10k"  , { 45000 ,  28907 , -16028 ,  -1327 , 1472 , 872, 138100} },
+
+}
+
+};
+/*fin_param*/
+
+/* Definition Mai-Juin 1999
+{ 
+{ "v1-bedif1"  , 1,10,1 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },		
+{ "v1-bedif2"  , 1,10,2 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif3"  , 1,10,3 ,  200, 22000	,  200,  {  500  , 136180 ,   9010,0,0,0,0} },
+{ "v1-bedif4"  , 1,10,4 ,  200, 22000	,  200,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif5"  , 1,10,5 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif6"  , 1,10,6 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif7"  , 1,10,9 , 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif8"  , 1,10,10, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif9"  , 1,10,11, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif10" , 1,10,12, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif11" , 1,10,13, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif12" , 1,10,14, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif13"	, 1,10,17, 1000, 100000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif14"	, 1,10,18, 1000, 470000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif15"  	, 1,10,19, 1000, 470000	, 1000,  {  500  ,  58800 ,  12500,0,0,0,0} },
+{ "bedif16"	, 1,10,20, 1000,2200000	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif17"	, 1,10,21, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "bedif18"	, 1,10,22, 1000, 4700	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+
+{ "v1-bedif19"	, 2,10,25, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "v1-bedif20"	, 2,10,26, 1000, 4700  	, 1000,  { 5000  , 123100 , 334200,0,0,0,0} },
+{ "germanium"	, 3,10,27, 1000, 22000	,    0,  { 3500  ,  17100 , 646500,0,0,0,0} },
+{ "therm_4k"	, 3,10,28, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_1.6k"	, 3,10,29, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+{ "therm_10k"	, 3,10,30, 1000, 1000	,    0,  {12000  ,1804000 ,  72800,0,0,0,0} },
+
+}*/
+
+/* bolos campagne 1998-1999	*/
+/*
+reg_NbSi.J, 1, 0, 1, 100, 4.7, 333,	.5			,519.6  , 8.286
+v1-231...L, 1, 0, 2, 100, 4.7, 333, .5   , 1.7   , 32.41 , 0.333 , 10  , 20.30  ,  11.41  		
+v1-232...N, 1, 0, 3, 100, 4.7, 333,		
+v1-237...E, 1, 0, 4, 100, 4.7, 333,
+
+reg_JamieO, 1, 0, 5, 100, 4.7, 101,
+
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-230...B, 1, 0, 7, 100, 4.7, 333, .5   , 8.26  , 26.61 , 5.10  ,  7  , 9.354   ,  1.026
+V2-205...Q, 1, 0, 8, 100, 4.7, 333,	.518 , 81    , 25.2 
+V2-208...P, 1, 0, 9, 100, 4.7, 333, .5   , 12.31 , 33.42 , 0.627 , 6.5 , 8.113   ,  2.958
+
+*/
+/*bolos campagne 1997-1998	*/
+/*
+
+v1-208...J, 1, 0, 1, 100, 4.7, 333, .5   , 12.31 , 33.42 		
+v1-232...L, 1, 0, 2, 100, 4.7, 333,		
+v1-205...N, 1, 0, 3, 100, 4.7, 333,	.518 , 81    , 25.2	
+v1-NbSi..E, 1, 0, 4, 100, 4.7, 333,	.5			,519.6  , 8.286
+Jamie....O, 1, 0, 5, 100, 4.7, 101,
+V2-NbSi..H, 1, 0, 6, 100, 4.7, 101, .5   ,433.8  , 9.25
+V2-224...B, 1, 0, 7, 100, 4.7, 333, .5   ,3.43   , 26.6
+V2-230...Q, 1, 0, 8, 100, 4.7, 333, .5   , 8.26  , 26.61
+V2-231...P, 1, 0, 9, 100, 4.7, 333, .5   , 1.7   , 32.41
+
+*/
+
+
+int mode_transmission_telemesure[nb_modes_telemesure][nb_type_blocks]= {
+
+/* enregisteur de bord flash :  plafond standard nominal	*/
+/* 0*/	{ 0,10,15,50, 10,50, 0, 0, 0, 1, 0, 0, 1, 0, 1,2500, 0, 0, 0, 0},
+
+/* 1*/	{ 0,10,10, 1, 10, 3, 0, 0, 0, 1, 0, 0, 1, 0, 4,2500, 0, 0, 0, 0},
+
+/* 2*/	{ 0,10,05,01, 10,06, 0, 0, 0, 1, 0, 0, 1, 0, 2,2500, 0, 0, 0, 0},
+
+/* 3*/	{ 0,10, 1,25, 10, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0},
+
+/* 4*/	{ 0,10,15,50, 10,25, 0, 0, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 5*/	{ 0,10,15,50, 10,25, 0, 0, 0, 0, 1, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 6*/	{ 0,10,15,50, 10,50, 0, 0, 0, 1, 0, 0, 1, 0, 2,2500, 0, 0, 0, 0},
+
+/* 7*/	{ 0,10,15,50,100,50, 1, 1, 0, 1, 0, 0, 1, 0, 1,2500, 0, 0, 0, 0},
+
+/* 8*/	{ 0,10,15,50,100,50, 1, 1, 1, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0},
+
+/* 9*/	{ 0,10, 1, 1,100, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,2500, 0, 0, 0, 0}
+
+ };
+
+
+
+int mode_transmission_flash[nb_modes_flash][nb_type_blocks]= {
+
+
+/* enregisteur de bord flash : nominal	*/
+/* 0*/	{ 0,50,15,25, 10,25, 0, 0, 0, 1, 0, 0, 1, 0, 1,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash : minimum	*/
+/* 1*/	{ 0,50,50,50,50,100, 0, 0, 0, 0, 0, 0, 0, 0, 0,2500, 0, 0, 0, 0} ,
+
+/* enregisteur de bord flash :  rien	*/
+/* 2*/	{ 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0} };
+
+
+
+
+/*debut_nom_reglage*/
+/* 0->1 - demarrage par defaut - Nominal*/
+/* 1->2 - idem*/
+/* 2->3 - faible courant*/
+/* 3->4 - fort courant*/
+/* 4->5 - non fffdéfini*/
+/* 5->6 - non défini*/
+/* 6->7 - non défini*/
+/* 7->8 - non défini*/
+/*fin_nom_reglage*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+reglage_bolo  reglage_standard[8]={{
+
+
+/*debut reglage 0 */
+#ifdef programme
+{32,76,8,1},{
+{20,0}
+,{1311522837,256000}
+,{1048576021,256004}
+,{20,0}
+,{1048576021,256001}
+,{20,0}
+,{262144021,128003}
+,{20,0}
+,{262144021,128001}
+,{262144021,128001}
+,{20,0}
+,{1048576021,256257}
+,{1048576021,256003}
+,{262144021,128001}
+,{262144789,128001}
+,{262144021,128001}
+,{100663317,256002}
+,{100716053,155650}
+,{1048576277,256003}
+,{20,0}
+,{1024021,0}
+,{262165,0}
+,{65557,0}
+,{1024020,0}
+},{
+{1,21,16,4}
+,{1,21,13,4}
+,{1,21,20,4}
+,{1,21,20,4}
+,{0,21,0,4}
+,{0,21,0,4}
+},{
+{3,1,21,24,21,24,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{6,1,9,34,30,0,65326}
+},{5,3,129,108,0,126,104,88} 
+#else
+{1,8,76,32},{
+{20,0}
+,{1311522837,256000}
+,{1048576021,256004}
+,{20,0}
+,{1048576021,256001}
+,{20,0}
+,{262144021,128003}
+,{20,0}
+,{262144021,128001}
+,{262144021,128001}
+,{20,0}
+,{1048576021,256257}
+,{1048576021,256003}
+,{262144021,128001}
+,{262144789,128001}
+,{262144021,128001}
+,{100663317,256002}
+,{100716053,155650}
+,{1048576277,256003}
+,{20,0}
+,{1024021,0}
+,{262165,0}
+,{65557,0}
+,{1024020,0}
+},{
+{4,16,21,1}
+,{4,13,21,1}
+,{4,20,21,1}
+,{4,20,21,1}
+,{4,0,21,0}
+,{4,0,21,0}
+},{
+{24,21,1,3,0,24,21}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{34,9,1,6,65326,0,30}
+},{108,129,3,5,88,104,126,0} 
+#endif
+/*fin_reglage*/
+
+
+},{
+
+/*debut reglage 1 */
+#ifdef programme
+{32,76,8,1},{
+{20,0}
+,{1311522837,256000}
+,{1048576021,256004}
+,{20,0}
+,{1048576021,256001}
+,{20,0}
+,{262144021,128003}
+,{20,0}
+,{262144021,128001}
+,{262144021,128001}
+,{20,0}
+,{1048576021,256257}
+,{1048576021,256003}
+,{262144021,128001}
+,{262144789,128001}
+,{262144021,128001}
+,{100663317,256002}
+,{100716053,155650}
+,{1048576277,256003}
+,{20,0}
+,{1024021,0}
+,{262165,0}
+,{65557,0}
+,{1024020,0}
+},{
+{1,21,16,4}
+,{1,21,13,4}
+,{1,21,20,4}
+,{1,21,20,4}
+,{0,21,0,4}
+,{0,21,0,4}
+},{
+{3,1,21,24,21,24,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{6,1,9,34,30,0,65326}
+},{5,3,129,108,0,126,104,88} 
+#else
+{1,8,76,32},{
+{20,0}
+,{1311522837,256000}
+,{1048576021,256004}
+,{20,0}
+,{1048576021,256001}
+,{20,0}
+,{262144021,128003}
+,{20,0}
+,{262144021,128001}
+,{262144021,128001}
+,{20,0}
+,{1048576021,256257}
+,{1048576021,256003}
+,{262144021,128001}
+,{262144789,128001}
+,{262144021,128001}
+,{100663317,256002}
+,{100716053,155650}
+,{1048576277,256003}
+,{20,0}
+,{1024021,0}
+,{262165,0}
+,{65557,0}
+,{1024020,0}
+},{
+{4,16,21,1}
+,{4,13,21,1}
+,{4,20,21,1}
+,{4,20,21,1}
+,{4,0,21,0}
+,{4,0,21,0}
+},{
+{24,21,1,3,0,24,21}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{34,9,1,6,65326,0,30}
+},{108,129,3,5,88,104,126,0} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 2 */
+#ifdef programme
+{32,76,8,1},{
+{20,0}
+,{100721941,256000}
+,{1048607509,256004}
+,{20,0}
+,{1048586773,256003}
+,{20,0}
+,{50335509,128001}
+,{20,0}
+,{50331669,128001}
+,{50336789,128001}
+,{20,0}
+,{1048622101,256259}
+,{1048635413,256003}
+,{50331669,128001}
+,{50352661,128001}
+,{50337813,128001}
+,{100665109,256002}
+,{100664597,155650}
+,{1048600341,256003}
+,{20,0}
+,{1024021,0}
+,{65557,0}
+,{65557,0}
+,{262165,0}
+},{
+{1,21,11,4}
+,{1,21,13,4}
+,{1,21,20,4}
+,{1,21,20,4}
+,{0,20,0,1}
+,{0,20,0,1}
+},{
+{3,1,21,24,21,24,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{6,17,0,34,30,0,65386}
+},{5,3,129,108,0,126,104,88} 
+#else
+{1,8,76,32},{
+{20,0}
+,{100721941,256000}
+,{1048607509,256004}
+,{20,0}
+,{1048586773,256003}
+,{20,0}
+,{50335509,128001}
+,{20,0}
+,{50331669,128001}
+,{50336789,128001}
+,{20,0}
+,{1048622101,256259}
+,{1048635413,256003}
+,{50331669,128001}
+,{50352661,128001}
+,{50337813,128001}
+,{100665109,256002}
+,{100664597,155650}
+,{1048600341,256003}
+,{20,0}
+,{1024021,0}
+,{65557,0}
+,{65557,0}
+,{262165,0}
+},{
+{4,11,21,1}
+,{4,13,21,1}
+,{4,20,21,1}
+,{4,20,21,1}
+,{1,0,20,0}
+,{1,0,20,0}
+},{
+{24,21,1,3,0,24,21}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{34,0,17,6,65386,0,30}
+},{108,129,3,5,88,104,126,0} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 3 */
+#ifdef programme
+{32,76,8,1},{
+{20,0}
+,{100721941,256000}
+,{1048607509,256004}
+,{20,0}
+,{1048586773,256003}
+,{20,0}
+,{524291861,128001}
+,{20,0}
+,{524288021,128001}
+,{524293141,128001}
+,{20,0}
+,{1048622101,256259}
+,{1048635413,256003}
+,{524288021,128001}
+,{524309013,128001}
+,{524294165,128001}
+,{100665109,256002}
+,{100664597,155650}
+,{1048600341,256003}
+,{20,0}
+,{1024021,0}
+,{65557,0}
+,{65557,0}
+,{65557,0}
+},{
+{1,21,18,4}
+,{1,21,13,4}
+,{1,21,20,4}
+,{1,21,20,4}
+,{0,20,0,1}
+,{0,20,0,1}
+},{
+{3,1,21,24,21,24,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{6,17,0,34,30,0,65386}
+},{5,3,129,108,0,126,104,88} 
+#else
+{1,8,76,32},{
+{20,0}
+,{100721941,256000}
+,{1048607509,256004}
+,{20,0}
+,{1048586773,256003}
+,{20,0}
+,{524291861,128001}
+,{20,0}
+,{524288021,128001}
+,{524293141,128001}
+,{20,0}
+,{1048622101,256259}
+,{1048635413,256003}
+,{524288021,128001}
+,{524309013,128001}
+,{524294165,128001}
+,{100665109,256002}
+,{100664597,155650}
+,{1048600341,256003}
+,{20,0}
+,{1024021,0}
+,{65557,0}
+,{65557,0}
+,{65557,0}
+},{
+{4,18,21,1}
+,{4,13,21,1}
+,{4,20,21,1}
+,{4,20,21,1}
+,{1,0,20,0}
+,{1,0,20,0}
+},{
+{24,21,1,3,0,24,21}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{34,0,17,6,65386,0,30}
+},{108,129,3,5,88,104,126,0} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 4 */
+#ifdef programme
+{39,62,9,1},{
+{20,0}
+,{-100659180,229382}
+,{-100659436,294918}
+,{20,0}
+,{-100663276,221189}
+,{-100663276,5}
+,{-100659436,245762}
+,{-100663276,5}
+,{-100658154,245761}
+,{-100658156,253954}
+,{20,0}
+,{-100663276,204805}
+,{-100663276,16389}
+,{-100656874,1}
+,{-100656874,16385}
+,{-100663276,3}
+,{-100506347,6}
+,{-100509675,6}
+,{-100372972,6}
+,{2097174,0}
+,{1024022,0}
+,{16406,0}
+,{4117,0}
+,{262164,0}
+},{
+{2,22,24,1}
+,{1,20,24,4}
+,{0,20,24,4}
+,{0,20,24,3}
+,{0,20,24,4}
+,{0,20,24,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{2,3,129,108,2,126,104,88} 
+#else
+{1,9,62,39},{
+{20,0}
+,{-100659180,229382}
+,{-100659436,294918}
+,{20,0}
+,{-100663276,221189}
+,{-100663276,5}
+,{-100659436,245762}
+,{-100663276,5}
+,{-100658154,245761}
+,{-100658156,253954}
+,{20,0}
+,{-100663276,204805}
+,{-100663276,16389}
+,{-100656874,1}
+,{-100656874,16385}
+,{-100663276,3}
+,{-100506347,6}
+,{-100509675,6}
+,{-100372972,6}
+,{2097174,0}
+,{1024022,0}
+,{16406,0}
+,{4117,0}
+,{262164,0}
+},{
+{1,24,22,2}
+,{4,24,20,1}
+,{4,24,20,0}
+,{3,24,20,0}
+,{4,24,20,0}
+,{4,24,20,0}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,2,88,104,126,2} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 5 */
+#ifdef programme
+{39,68,9,1},{
+{20,0}
+,{1048982293,229382}
+,{1049128469,253958}
+,{20,0}
+,{1048966677,245765}
+,{20,0}
+,{262157846,245762}
+,{1048919829,5}
+,{262156054,245761}
+,{262154006,253954}
+,{20,0}
+,{1049123349,229381}
+,{1049157141,237573}
+,{262154262,1}
+,{262158614,16385}
+,{262149654,3}
+,{262750740,237572}
+,{262606612,122884}
+,{-1174095083,139270}
+,{20,0}
+,{16406,0}
+,{16406,0}
+,{4117,0}
+,{262164,0}
+},{
+{1,22,16,1}
+,{1,22,16,4}
+,{1,22,16,4}
+,{1,20,16,3}
+,{1,21,20,4}
+,{1,21,20,4}
+},{
+{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+,{0,1,9,1,0,0,0}
+},{2,3,129,108,3,126,104,88} 
+#else
+{1,9,68,39},{
+{20,0}
+,{1048982293,229382}
+,{1049128469,253958}
+,{20,0}
+,{1048966677,245765}
+,{20,0}
+,{262157846,245762}
+,{1048919829,5}
+,{262156054,245761}
+,{262154006,253954}
+,{20,0}
+,{1049123349,229381}
+,{1049157141,237573}
+,{262154262,1}
+,{262158614,16385}
+,{262149654,3}
+,{262750740,237572}
+,{262606612,122884}
+,{-1174095083,139270}
+,{20,0}
+,{16406,0}
+,{16406,0}
+,{4117,0}
+,{262164,0}
+},{
+{1,16,22,1}
+,{4,16,22,1}
+,{4,16,22,1}
+,{3,16,20,1}
+,{4,20,21,1}
+,{4,20,21,1}
+},{
+{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+,{1,9,1,0,0,0,0}
+},{108,129,3,2,88,104,126,3} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 6 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+},{
+
+/*debut reglage 7 */
+#ifdef programme
+{197,191,175,185},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{106,98,93,71}
+,{66,74,87,66}
+,{48,46,38,33}
+,{40,41,33,26}
+,{25,29,40,57}
+,{63,62,71,80}
+},{
+{83,79,75,75,92,112,31100}
+,{125,126,117,113,107,94,20315}
+,{108,116,122,124,117,120,32117}
+,{110,99,94,98,107,93,17217}
+},{88,82,94,108,111,126,104,88} 
+#else
+{185,175,191,197},{
+{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+,{0,0}
+},{
+{71,93,98,106}
+,{66,87,74,66}
+,{33,38,46,48}
+,{26,33,41,40}
+,{57,40,29,25}
+,{80,71,62,63}
+},{
+{75,75,79,83,31100,112,92}
+,{113,117,126,125,20315,94,107}
+,{124,122,116,108,32117,120,117}
+,{98,94,99,110,17217,93,107}
+},{108,94,82,88,88,104,126,111} 
+#endif
+/*fin_reglage*/
+
+} };
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/*
+unsigned int4	val_long(char x)
+{
+unsigned long a,xl;
+char aa;
+aa=x-2;
+a=aa;
+if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
+*/
+
+
+int	calcul_somme_block(block_type_modele* blk,int longueur)
+{
+int i,so=0;;
+for(i=0;i<(longueur/4-4);i++)  so^=(int)blk->mot[i];
+/* somme sur tous les mots internes	: on exclus le dbut, les codes et la fin	*/
+return((so^(so>>16))&0xffff);
+}
+
+
+
+
+void  valide_block(block_type_modele* blk,int type,int block_num)
+{
+int somme,longueur;
+def_long_block
+longueur=long_block[type];
+/*printf("valide block adresse %x  type %d  numblock %d  longueur=%d \n" */
+/* 		,(unsigned)blk,type,block_num,longueur);*/
+blk->debut		=	debut_block_mesure;
+somme=0;blk->code1		=	(((long)longueur)<<16)	|	somme;
+blk->code2		=	(((long)block_num) & 0xffffff ) | ( (((long)type)<<24)&0xff000000 );
+
+blk->mot[longueur/4-4]  =	fin_block_mesure;
+
+#if defined(_ECC_LIB_H_)
+{
+int place_ecc;
+place_ecc=(longueur-4-ECC_SIZE-SIZE_HEAD-((longueur-4-SIZE_HEAD)/ECC_TOTAL)*ECC_SIZE)/4;
+SetEcc( blk, (unsigned char *) &(blk->mot[place_ecc] ) ) ;
+}
+#endif
+
+somme=calcul_somme_block(blk,longueur);
+blk->code1		=	(((long)longueur)<<16)	|	somme;
+/* l'ecc est faux car on a change la somme: mettre la somme a zero avant de tester ecc  */
+}
+
+/* Quand on est sur une machine swappee, on ne cherche pas a verifier */
+/* le checksum, puisqu'on a modifie les blocs, sans swapper par exemple */
+/* les chars des noms de bolometres et des chaines GPS... */
+#ifdef __alpha
+#define SWAP
+#endif
+#if defined(Linux)  || defined(linux)
+#define SWAP
+#endif
+
+
+
+int  verifie_block(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+if(blk->debut != debut_block_mesure)					return(block_debut_erreur);
+type=type_block(blk);		if( (type<0) ||(type>=nb_type_blocks) )	return(block_type_inconnu);	
+lg=longueur_block(blk);		if( lg != long_block[type] )		return(block_longueur_erreur);	
+if( blk->mot[(lg/4)-4]  !=	fin_block_mesure)			return(block_fin_erreur);	
+#ifndef SWAP
+som=calcul_somme_block(blk,lg); if( som!= somme_block(blk))		return(block_somme_erreur);
+#endif
+return(block_correct);
+}
+
+
+int  verifie_block_printf(block_type_modele* blk)
+{
+int type,lg,som;
+def_long_block
+def_nom_block
+if(blk->debut != debut_block_mesure)
+	{
+	printf(" erreur dans le code debut de block	 \n");
+	return(block_debut_erreur);
+	}	
+
+type=type_block(blk);
+if( (type<0) || (type>nb_type_blocks) )	
+	{
+	printf(" block de type %d  inconnu\n",type);
+	return(block_type_inconnu);
+	}
+
+lg=longueur_block(blk);
+if( lg!=long_block[type] )	
+	{
+	printf(" block type %s  erreur de longueur (nominal=%d , dans le block=%d \n"
+			,nom_block[type],long_block[type],lg);
+	return(block_longueur_erreur);
+	}
+
+som=calcul_somme_block(blk,lg);
+if( som!=somme_block(blk) )	
+	{
+	printf(" block type %s   :  erreur de somme (calculee=%d , dans le block=%d \n"
+			,nom_block[type],som,somme_block(blk) );
+	return(block_somme_erreur);
+	}
+	
+if(blk->mot[(lg/4)-4]	!= fin_block_mesure)	
+	{
+	printf(" block type %s  erreur de code fin de block : trouve %x au lieu de %x \n"
+			,nom_block[type],(int)blk->mot[(lg/4)-4],fin_block_mesure);
+	return(block_fin_erreur);
+	}
+
+return(block_correct);
+}
+
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeops_28.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeops_28.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeops_28.h	(revision 439)
@@ -0,0 +1,1065 @@
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 archeops.h  :	structure de données            	*/
+/*                                                                      */
+/*======================================================================*/
+
+#define		_archeops
+#define		version_num		28
+
+/*  defini ici que si l'on n'a pas inclu ecclib.h qui contient les memes definitions */
+#ifndef _ECC_LIB_H_
+#define ECC_TOTAL 255
+#define ECC_DATA 239       /* Nb de bytes de data encodes */
+#define ECC_SIZE (ECC_TOTAL-ECC_DATA) /* Nb de bytes encodeurs */
+#define SIZE_HEAD sizeof(int4)*3  /* 3 mots d'entete de blocs */
+#endif
+
+/*======================================================================*/
+/*                                                                      */
+/* 			historique des modifications            	*/
+/*                                                                      */
+/*                                                                      */
+/*  VERSION 24:                                                         */
+/*                                                                      */
+/*	- utilise le fichier archeops.c					*/
+/*	- nb_max_bolo=24  avec nb_bolo_util=18				*/
+/*	- change la structure du block param				*/
+/*	- change la structure du block dilution				*/
+/*									*/
+/*  VERSION 25:                                                         */
+/*                                                                      */
+/*	- la compression marche						*/
+/*	- 4 signaux synchro O.K.					*/
+/*	- change la structure dil : contient les temperatures		*/
+/*									*/
+/*  VERSION 26:                                                         */
+/*                                                                      */
+/*	- int4 pour compatibilité toutes machines			*/
+/*								        */
+/*  VERSION 27:                                                         */
+/*	- ajout dans chaque block-type d'une structure "ecc" dont la    */
+/*	taille est adaptee a la taille du bloc: 		        */
+/*		on ajoute 16 bytes servant a la correction d'erreur     */
+/*		pour chaque paquet de 241 bytes	de donnees.	        */
+/*	les bytes d'ECC sont calcules avant envoi sur la ligne	        */
+/*	telemesure.					                */
+/*	Ils peuvent servir a l'arrivee pour verifier et corriger quand  */
+/*	c'est possible les donnees. On peut corriger au maximu 7 bytes  */
+/*	erronnes.						        */
+/*								        */
+/*  VERSION 28:                                                         */
+/*	- corrigée la taille du block gyroscope avec ecc		*/
+/*	- compatible avec la generation de l'ecc dans le transputer     */
+/*	- mais sans ecc: trops long a calculer			        */
+
+/*======================================================================*/
+
+
+/*======================================================================*/
+/*  ---------------  parametres generaux de definition   -------------  */
+/*======================================================================*/
+#ifndef int4
+#ifdef __alpha
+#define int4 int
+#undef programme
+#else
+#define int4 long
+#endif
+#endif
+
+#ifdef linux
+#undef programme
+#endif
+
+
+#ifdef	_planck
+#define	_archeops
+#define _trapani
+#define _sans_transputer
+#endif
+
+#ifdef	_archeops
+/*#define _test_diabolo	 relecture des blocks fabriques avec diabolo	*/
+#define _trapani		/*  configuration  prevue pour Trapani	*/
+/*#define _kiruna		  block standard prevu pour kiruna	*/ 
+#endif
+
+
+
+/*======================================================================*/
+/*  --------------	valeurs des parametres dans	-------------   */
+/*  --------------	les différentes configurations	-------------   */
+/*======================================================================*/
+/*									*/
+/*  configuration pour Trapani : 3 bebos  /  12 bolos			*/
+/*									*/
+/*  bebo1 :   voies  1  à  6	-->  bolo  1 a  6			*/
+/*  bebo2 :   voies  9  à  14	-->  bolo  7 à 12			*/
+/*									*/
+/*  bebo6 :								*/
+/*  	voies  41 42 43 44	=  carte simplifiee avec AMP01		*/
+/*  	voies  45 et 46		= chauffage pour regulation		*/    
+/*	on ecrira plus tard le stockage des donnees simplifiees		*/
+/*									*/
+/*									*/
+/*======================================================================*/
+
+/*	nb_per_block	doit etre divisible par 2						*/
+/*	nb_max_bolo	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+/*	nb_bolo_util	doit etre divisible par 2 pour archeops   (impair pour diabolo ?? )	*/
+
+
+#ifdef	_trapani
+#define nb_max_bolo 		24	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		18	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_kiruna
+#define nb_max_bolo 		36	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		32	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		36	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		88	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		46	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+#ifdef	_test_diabolo
+#define nb_max_bolo 		9	/*  nombre maxi de bolos 				*/
+#define nb_bolo_util 		9	/*  nombre de bolos réellement transmis			*/
+#define	nb_per_block		20	/*  nombre de periodes entieres dans un block		*/
+#define	nb_max_mes_per		128	/*  nb de points maxi dans une periode complete		*/
+#define	nb_photo_diodes		0	/*  nb de canaux de mesure du senseur stellaire		*/
+#endif
+
+
+#ifdef	_sans_transputer
+#define nb_byte_mot		5	/*  nombre d'octets dans un mot d'acquisition planck	*/
+#else
+#define nb_byte_mot		8	/*  nombre d'octets dans un mot d'acquisition archeops	*/
+#endif
+
+#define	nb_max_nom_bolo		24	/*  nombre maxi de noms et coef bolo dans la table	*/
+
+#define nb_sync			4	/*  nombre de signaux de synchro			*/
+					/*  6 pour diabolo 					*/
+					/* toujours multiple de 4 pour archeops			*/
+#define	nb_element_catalog	256	/* nombre d'éléments catalog par reponse enregistreur	*/
+
+
+#ifdef	transmet_data_brute
+#define		taille_maxi_block_archeops	sizeof(block_type_data_brute)
+#else					/* 	le plus gros des différents blocks de télémesure*/
+#define		taille_maxi_block_archeops	sizeof(block_type_bolo)
+#endif
+
+#define		nombre_de_regul		4
+#define		nombre_de_voies		6
+#define 	nb_type_blocks		20	/*  nombre de type de blocks (multiple de 4)	*/
+#define		nb_modes_telemesure	10
+#define		nb_modes_flash		 3
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=======================   télécommande      ==========================*/
+/*======================================================================*/
+
+
+/*   --------------   codes de reconnaissance des paquets de télécommande	--------------   */   
+
+#define		debut_telecommande		0x23456789
+#define		fin_telecommande		0x98765432
+
+/*   ------------ codes de direction des commandes envoyées a l'EPLD Archeops	--------------   */   
+
+#define 	tc_dir_transputer		1
+#define 	tc_dir_reset_epld		3
+#define 	tc_dir_reset_trp		4
+
+/*  -------------  codes  des  prefix des  telecommandes traités le transputer	--------------   */
+
+#define		tc_horloge			255	/* (-1)	*/
+#define		tc_cadence1			128
+#define		tc_cadence2			129
+#define		tc_cadence3			130
+#define		tc_regul			251	/* (-5)	*/
+#define		tc_switch_dil			250
+#define		tc_dac_dil			249
+
+/*======================================================================*/
+/*	telecommande reduite  sur 18 bit				*/
+/*======================================================================*/
+
+/*______________________________________________________________________________________________*/
+/*	1er mot	:	code de debut de telecommande reduite					*/
+#define		tc_reduite			248	
+/*______________________________________________________________________________________________*/
+/*	2eme mot:	4bit:	16 codes  de direction  tc2					*/
+enum{tc2_reset_epld,tc2_bolo_dacV,tc2_bolo_dacI,tc2_bolo_dacT
+	,tc2_bolo_dacL,tc2_bolo_gain,tc2_bolo_voie,tc2_horloge
+	,tc2_regul,tc2_auto_bolo,tc2_auto_dilu,tc2_dilution
+	,tc2_raz_fet,tc2_reset};	/* 13 codes: reste 3 disponibles*/
+
+
+/*______________________________________________________________________________________________*/
+/*	3eme mot:	6bit:									*/
+
+/*	code2=dac-gain-voie  	:	numero de bolo						*/
+
+/*	code2=tc2_horloge	:								*/
+/*		soit un code defini								*/
+enum{tc3_commande,tc3_periode,tc3_nb_mesures,tc3_temp_mort,tc3_flag};
+
+
+/*	code2=tc2_regul	:									*/
+
+
+/*	code2=tc2_auto_bolo	:						*/
+
+
+/*	code2=tc2_auto_dilu	:						*/
+/* 	les valeurs des parametres d'auto_dilu ne depassent pas 128 		*/
+
+
+/*	code2=tc2_dilution	:	commandes setbit,clrbit 						*/
+enum{tc3_clr_bit_dil,tc3_set_bit_dil,tc3_fet_raz};
+
+/*	code2=tc2_reset	:	commandes setbit,clrbit 						*/
+#define	tc3_reset	13
+#define	tc4_reset	73
+
+/*______________________________________________________________________________*/
+/*	4eme mot:	8bit:	valeur a ecrire			*/		
+
+
+/*======================================================================*/
+/*  -------     codes  de  controle  pour  la  transmission    -----    */
+/*=========================   télémesure    ============================*/
+/*======================================================================*/
+
+/*   -------   codes de reconnaissance des paquets de télémesure        */   
+
+#define		debut_block_mesure		0x45627491	
+#define		fin_block_mesure		0x83260432	
+
+
+
+
+
+/*======================================================================*/
+/*  ------------------------------------------------------------------  */
+/*  ---------  	Les  formats  des  blocks  type   ARCHEOPS   	-------	*/
+/*  ------------------------------------------------------------------  */
+/*======================================================================*/
+
+
+
+/*==============================================================================================*/
+
+/*	Le tableau est lut dans le desordre par le mac en lecture de la carte pci :		*/
+
+/*	Les entiers long sont ecrits tels quels							*/
+/*	Les short sont ecrits permuté 2 a 2 par le tansputer					*/
+/*	Les tables char sont ecrits permuté 4 / 4 par le transputer				*/
+/*	A la lecture dans le mac, tout est bon							*/
+
+
+/*  ---------  	 structures N° 0 :   parametres de mesure des bolometres        -------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct	
+	{
+	int4		numero_nom_coef;	/*  le numero pour retrouver le nom et les coef	*/
+	int4		bolo_code_util;		/*  le code d'utilisation du bolo		*/
+	int4		bolo_bebo;		/*  l'acquisition:  0 pour MLPA 10 pour BEBODIFF*/
+	int4		bolo_num;		/*  l'adresse hard du bolo			*/
+	int4		bolo_gain;		/*  le gain du preampli				*/
+	int4		bolo_capa;		/*  la valeur capa du modulateur		*/
+	int4 		bolo_diviseur;		/*  le diviseur de la compensation		*/
+	}
+	param_un_bolo;
+	
+	
+typedef struct	
+	{
+	char		bolo_nom[32];		/*  le nom de chaque bolometre			*/
+	int4	  	coef[7];		/*  les coef pour le calcul de la température	*/
+	}
+	nom_et_coef_bolo;
+	
+	
+	
+/* code_util des bolos  */
+enum{bolo_hors_service,bolo_normal_transmis,bolo_normal_non_transmis,bolo_thermo_simplifie};
+
+	
+typedef struct		/*  		table des parametres de mesure bolometre 		*/
+			/*	cette table ne change pas (en principe) en cours de mesure	*/
+	{
+	int4		numero_version;			/*  numero de version du header archeops.h	*/
+	int4		n_max_bolo;			/*  nombre maxi de bolos  (divisible par 4)	*/
+	int4		n_per_block;			/*  nombre de periodes entieres dans un block	*/
+	int4		n_max_mes_per;			/*  nb de points maxi dans une periode complete	*/
+
+	int4		nb_bolo;			/*  nombre de bolometres effectivement lut	*/
+	param_un_bolo	bolo[nb_max_bolo];
+	nom_et_coef_bolo nom_coef[nb_max_nom_bolo];	/*  nombre de nom et coef bolo			*/
+	}
+	param_bolo;
+	
+	
+	
+	
+/*	
+	int4		bolo_code_util[nb_max_bolo];	
+	char		bolo_nom[nb_max_bolo][32];	
+
+	int4		bolo_bebo[nb_max_bolo];		
+	int4		bolo_num[nb_max_bolo];		
+	int4		bolo_gain[nb_max_bolo];		
+
+	int4		bolo_capa[nb_max_bolo];		
+	int4 		bolo_diviseur[nb_max_bolo];	
+	
+	int4	  	coef[nb_max_bolo][7];		
+
+	int4		presence_bebo;			
+	}
+	param_bolo;
+*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	param_bolo	param;		/*	les parametres de mesure des bolometres		*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof( param_bolo)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_param;			
+	
+
+
+
+/*  -------------------   structures N° 1 :   journal de bord        ---------------------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+#define long_page	10
+typedef struct				  
+	{
+	int4		code2;		/* 	code de la ligne du journal			*/
+					/* 	code idem code2 debut de block : 		*/
+					/*  	contient un code de commande			*/
+					/*	et le numero du block lors de la télécommande	*/
+	char		mot[8];		/* 	contenu de la ligne du  journal			*/
+	}
+	ligne_journal;			
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	ligne_journal	jj[long_page];	/*	block de 10 lignes de journal			*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(ligne_journal)*long_page+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_journal;			
+	
+
+/*  ---------   structures N° 2 :  reglage_bolo , regul etc..   --------	*/
+/*  ------------------------------------------------------------------------------------------	*/
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = (double)parametr.bolo[bolo].bolo_gain*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+
+/*  les definitions suivantes s'appliquent a une variable de type    reglage.bolo[bol]		*/
+#define		gainbrut(aa)	((char)(((aa).mot1&0x1f)))		
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+#define		phase(aa)	((char)(((aa).mot1&0x60)>>5))		
+#define		comm(aa)	((char)(((aa).mot1&0x80)>>7))		
+#define		dac_V(aa)	((int)(((aa).mot1&0xfff00)>>8)	)	
+#define		dac_I(aa)	((int)(((aa).mot1&0xfff00000)>>20))		
+
+#define		voie(aa)	((char)(((aa).mot2&0xff)))		
+#define		dac_T(aa)	((int)(((aa).mot2&0xfff00)>>8))		
+#define		dac_L(aa)	((int)(((aa).mot2&0xfff00000)>>20))		
+
+/*
+#define		bolo_mot1(dacV,dacI,gainbrut,phase,comm)	((gainbrut)&0x1f) | (((phase)&3)<<5) | (((comm)&1)<<7) | (((dacV)&0xfff)<<8) | (((dacI)&0xfff)<<20) 
+#define		bolo_mot2(dacT,dacL,voie)			((voie)&0xff) 	  | (((dacT)&0xfff)<<8) | (((dacL)&0xfff)<<20)
+*/
+
+#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) 
+#define		bolo_mot2(dacT,dacL,voie)			(((long)(voie))&0xff) 	  | ((((long)(dacT))&0xfff)<<8) | ((((long)(dacL))&0xfff)<<20)
+
+
+typedef struct	
+	{
+	int4	mot1;		/*  dac1 = mot[11..0]; dac2=mot1[23..12]	*/
+				/*  gain = mot1[27..24]; phase = mot1[31..28];	*/
+	int4	mot2;		/*  dac3 = mot[11..0]; dac4=mot1[23..12]	*/
+				/*  voie pour reglages auto  = mot2[31..24];	*/
+	}
+	reglage_un_bolo;
+
+
+
+#ifdef programme	/***********   structure normale pour le mac   ****************/
+
+typedef struct	
+	{
+	char	periode;
+	char	nb_mesures;
+	char	temp_mort;
+	char	flag;
+	}
+	horloge;
+
+typedef struct
+	{
+	char	mode;			/*   on_off et deglitch				*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	integ;
+	char 	deriv;
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	}
+	regul_bolo;			/*  longueur 2 entiers int4			*/
+
+typedef struct
+	{
+	char	mode;
+	char	gain;
+	char	courant;
+	char	delai;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4			*/
+
+typedef struct
+	{
+	char	vanne;
+	char	helium;
+	char	chauffage;
+	char	piles;
+	char	transmission;
+	char	temps_max_vanne;
+	char	xx7;
+	char	xx8;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+
+#else		/***********  structure swappée pour le transputer   ****************/
+
+typedef struct	
+	{
+	char	flag;
+	char	temp_mort;
+	char	nb_mesures;
+	char	periode;
+	}
+	horloge;
+	
+
+typedef struct
+	{
+	char	prop;			/*   zero dans prop -> chauffage=0;		*/
+	char	voie_chauf;		/*   la voie de sortie chauffage		*/
+	char	num_bolo;		/*   numero du bolo utilisé,	*/
+	char	mode;			/*   on_off et deglitch				*/
+	short	chauffage;		/* 	valeur effective du chauffage		*/	
+	char 	deriv;
+	char	integ;
+	}
+	regul_bolo;			/*  longueur 2 entiers int4		*/
+
+
+typedef struct
+	{
+	char	delai;
+	char	courant;
+	char	gain;
+	char	mode;
+	}
+	auto_bolo;			/*  longueur 1 entiers int4		*/
+
+typedef struct
+	{
+	char	piles;
+	char	chauffage;
+	char	helium;			/* periode de mesure		*/
+	char	vanne;		
+	char	xx8;
+	char	xx7;
+	char	temps_max_vanne;
+	char	transmission;
+	}
+	auto_dilu;			/*  longueur 1 entiers int4		*/
+
+
+#endif		/***********   fin des structures swappées       ****************/
+
+enum{regul_stop,regul_chauffage_null,regul_sans_deglitch,regul_avec_deglitch,stop_moteur,moteur_direct_p,moteur_regul_p,moteur_direct_m,moteur_regul_m};
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+enum{vanne_zero,vanne_rien,vanne_ferme,vanne_ouvre,vanne_auto_pression,vanne_auto_P_T};
+/*enum{trans_zero,trans_rien,trans_normal,trans_rapide,trans_lent};*/
+enum{helium_zero,helium_continu,helium_40s,helium_400s};
+
+
+typedef struct							/*  int4 en mot de 32 bit   	*/
+	{
+	horloge			horloge;			/*			1	*/
+	reglage_un_bolo		bolo[nb_max_bolo]; 		/*	18 * 2	= 	36	*/
+	auto_bolo		autom[nombre_de_voies];		/*	6  * 1		6	*/								
+	regul_bolo		regul[nombre_de_regul];		/*	4  * 2	=	8	*/									
+	auto_dilu		dilu;				/*			2	*/
+	}
+	reglage_bolo;						/*	total 58		*/
+
+
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	reglage_bolo	reglage;											
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(reglage_bolo)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_reglage;			
+	
+/*  ---------------------   structures N° 3 :    etat de la dilution	-----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		switch_dil;
+	int4		ADC_dil[48];	/*	la lecture des 48 ADC de la carte DIL		*/
+	int4		DAC_dil[4];	/*	les 4 dac de la carte dilution			*/
+	int4		DAC_sst[4];	/*	les 4 dac de la carte sst			*/
+	int4		temperature[4];	/*	valeurs lues sur cartes BEDIFF modifiees	*/
+/*	int4		gyro_dil[3][nb_per_block*2];	les gyros  (block gyros)		*/
+/*	int4		data_dil[50];	 data brutes de la dilution				*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*64+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_dilution;			
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  5: chauffage 1	*/
+#define chauffage3		0x00001000	/*  4: chauffage 1	*/
+#define chauffage4		0x00000800	/*  3: chauffage 1	*/
+#define chauffage5		0x00000400	/*  2: chauffage 1	*/
+#define chauffage6		0x00000200	/*  1: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+enum{nbit_chauffage7,nbit_chauffage6,nbit_chauffage5,nbit_chauffage4,nbit_chauffage3
+	,nbit_chauffage2,nbit_chauffage1,nbit_vanne_EVB,nbit_vanne_EVO
+	,nbit_vanne_EVV,nbit_vanne_EVF,nbit_switch_pile_par_15,nbit_switch_pile_par_5,nbit_switch_helium};
+
+/*  position des mesures sur les multiplexeurs		*/
+/* J10A  ->  temperatures basses t_b1 t_b2,t_b3 t_b4 36 37 41 35	*/ 
+/* J10B  ->  temperatures basses t_a1 t_a2,t_a3 t_a4 38 11 34 28	*/ 
+/* J1??	 ->  temperatures hautes t_h1 t_h2,t_h3 t_h4	*/ 
+
+enum{
+/* multiplex11..18:*/	t_a2	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,t_a4	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a1	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,t_pile	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+/* reste libres :  mul   12 - 21 - 22 - 25 -  31 - 44 - 57 - 58 - 64	*/
+/* T_A1 EST AUSSI LE DRIVER DU MOTEUR DE PIVOT   */
+
+#define  val_multiplex(qq)	(0.0003052*(double)((qq)-0x8000))	
+#define  val_temperature(qq)	((val_multiplex(qq)<0.2)?-99:((1146.3/(val_multiplex(qq)-0.1)) - 245.13))
+
+
+/*  ---------------------   structures N° 4 :     gps           -------------------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+
+#define GPS_DATA 80
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+
+	char		gps[GPS_DATA];	/*      les données GPS (une chaine maxi 80 cara)	*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((GPS_DATA+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gps;			
+	
+
+
+/*  ---------------------   structures N° 5 :   tous les bolos 1 periode     	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	
+	short 		bol_per[nb_max_bolo][nb_max_mes_per];		
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(short)*nb_max_bolo*nb_max_mes_per+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_une_periode;			
+
+/*  ----------------   structures N° 6 :  signals de synchro (pour test au sol)	---------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		synchro[nb_per_block*2][nb_sync];	
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((nb_per_block*nb_sync*2+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_synchro_sol;			
+
+/*  ---------------------   structures N° 7 : block de données de pointage sol      -----------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	char		comment[1024];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((1024+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_pointage_sol;			
+
+
+
+/*  -------------   structures N° 8 :   données brutes des bolometres    ----------------------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque bolo, un vecteur 72 points		*/
+	int4		data_bolo[nb_max_bolo][nb_per_block*2];	
+					/*	data D.S.	(en mots de 32 bits)		*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*nb_max_bolo*nb_per_block*2+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo;			
+
+/*  ---------------------   structures N° 9 :   données des gyroscopes 	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/* chaque gyro: un vecteur tde 72 valeurs		*/
+	int4		gyro[3][nb_per_block*2];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*3*nb_per_block*2+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro;			
+
+/*  ---------------------   structures N° 10 :   données senseur stellaire	  -----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		sst[nb_per_block*2][18];
+					/* chaque mesure: un paquet de 18 mots de 32 bits	*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*nb_per_block*2*18+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst;			
+
+/*  ---------------------   structures N° 11 :    rien		          -----------		*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type11;			
+
+/*  ---------------------   structures N° 12 :  data bolo apres compression sur 7 bit	 ------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+					/*	pour chaque bolo, un vecteur  19 mots		*/
+	unsigned int4	data_bolo[nb_bolo_util][ (nb_per_block/2) +1 ];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*nb_bolo_util*((nb_per_block/2) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_bolo_comprime;			
+
+/*  ---------------------   structures N° 13 :    block_type_gyro_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*  	nombre de mots = nb valeurs/4 +1		*/
+	unsigned int4	gyro[3][ (nb_per_block/2) +1 ];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*3*((nb_per_block/2) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_gyro_comprime;			
+
+/*  ---------------------   structures N° 14 :    block_type_sst_comprime	-----------	*/
+/*  -----------------------------------------------------------------------------------------	*/
+typedef struct				  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+					/*	pour chaque diode, un vecteur  11 mots		*/
+	unsigned int4	sst[nb_photo_diodes] [(nb_per_block*2/7) +1 ];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*nb_photo_diodes*((nb_per_block*2/7) +1)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_sst_comprime;			
+
+
+/*  ---------------------   structures N° 15 : block_type_status_flash -------*/
+/*  ----------------------------------------------------------------	*/
+
+/*
+** Quelque soit la commande, l'enregistreur renvoie toujours le meme type
+de bloc comprenant la commande, un mot d'erreur eventuel et le status.
+
+** L'enregistreur ne prend jamais l'initiative d'envoyer un bloc de status
+(sauf dans le cas ci-dessous).
+
+** Au reset, le controleur est un peu lent a demarrer (quelques secondes).
+Pour que tu puisse savoir quand il est pret, je propose de t'envoyer un 
+bloc de type "block_type_status_flash" des que je suis pret (comme si tu
+avais envoye un bloc "block_type_cmd_flash" avec la commande
+"FLASH_STATUS_REQUEST"
+
+*/
+
+typedef struct {/* etat de l'enregistreur */
+  int4 nb_total_blocks ;
+  int4 memoire_libre ;
+  int4 nb_block_erreur ;
+} status_flash;
+
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* la commande a laquelle ce bloc repond	*/
+  int4 erreur ;   /* Si la commande a induit une erreur */
+  status_flash status ; /* etat de l'enregistreur */
+#ifdef _ECC_LIB_H_
+  unsigned char ecc[((((sizeof(int4)*2 + sizeof(status_flash)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+  
+  unsigned int4 fin ; /* code de reconnaissance de fin de block	*/
+} block_type_status_flash ;
+
+/*  ---------------------   structures N° 16 :    block_type_cmd_flash    ---------*/
+/*  ------------------------------------------------------------------	*/
+typedef struct {
+  unsigned int4 debut ;
+  unsigned int4 code1 ;
+  unsigned int4 code2 ;
+
+  int4	commande; /* type de commande a l'enregistreur flash */
+#ifdef _ECC_LIB_H_
+  unsigned char ecc[((((sizeof(int4)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+
+  int4	fin;      /* code de reconnaissance de fin de block */
+} block_type_cmd_flash;			
+
+/* Commands from Transputer to Recorder */
+enum {
+  FLASH_STATUS_REQUEST,
+  FLASH_EFFACE_TOUT1, FLASH_EFFACE_TOUT2, FLASH_EFFACE_TOUT3,
+  FLASH_EFFACE_UTIL1, FLASH_EFFACE_UTIL2, FLASH_EFFACE_UTIL3
+} ;
+
+/* Errors from Recorder to Transputer.
+   Pending question: what to do in case of FLASH_ERASE_END_ERROR ?
+*/
+
+enum {
+  FLASH_STATUS_OK,      /* Pas d'erreur */
+  FLASH_BAD_SEQUENCE,   /* Mauvaise sequence d'effacement */
+  FLASH_ERASE_START,    /* Debut d'effacement */
+  FLASH_ERASE_END_OK,   /* Fin d'effacement OK */
+  FLASH_ERASE_END_ERROR /* Erreur pendant l'effacement */
+} ;
+
+
+/*  ---------------------   structures N° 17 : block brut de données ctb pour test      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef	transmet_data_brute
+	char		data[nb_per_block*nb_max_mes_per*nb_byte_mot];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((nb_per_block*nb_max_mes_per*nb_byte_mot+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+#else
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_data_brute;			
+
+/*  ---------------------   structures N° 18 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_18;			
+
+/*  ---------------------   structures N° 19 : block  vide pour l'instant	      -------	*/
+/*  -------------------------------------------------------------------------------------------	*/
+typedef struct	  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* 	code de reconnaissance de fin de block		*/
+	}
+	block_type_19;			
+
+
+
+/*  ---------   block  modele  (plus gros que tous les autres pour reservation memoire)   ----  */
+/*  -----------------------------------------------------------------------------------------	*/
+
+typedef struct				/*	La structure de transfert transputer vers mac	*/  
+	{
+	int4		debut;		/*	code de reconnaissance de debut de block	*/
+	int4		code1;		/*	code1 du block					*/
+	int4		code2;		/*	code2 du block					*/
+	int4		mot[(taille_maxi_block_archeops)/4];
+#ifdef _ECC_LIB_H_
+	unsigned char ecc[((((sizeof(int4)*(taille_maxi_block_archeops/4)+SIZE_HEAD)/ECC_DATA)+1)*ECC_SIZE)] ;
+#endif
+	int4		fin;		/* code de reconnaissance de fin de block		*/
+	}
+	block_type_modele;			
+
+
+
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  --------------  définitions permettant de travailler sur les blocks Archeops   -----------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+
+enum	{block_param,block_journal,block_reglage,block_dilution,
+	block_gps,block_une_periode,block_synchro_sol,block_pointage_sol,
+	block_bolo,block_gyro,block_sst,block_11,
+	block_bolo_comprime,block_gyro_comprime,block_sst_comprime,block_status_flash,
+	block_cmd_flash,block_data_brute,block_18,block_19};
+
+
+#define	def_nom_block	char nom_block[nb_type_blocks][32]={"block_param","block_journal","block_reglage","block_dilution",\
+					"block_gps","block_une_periode","block_synchro_sol","block_pointage_sol",\
+					"block_bolo","block_gyro","block_sst","block_11",\
+					"block_bolo_comprime","block_gyro_comprime","block_sst_comprime","block_status_flash",\
+					"block_cmd_flash","block_data_brute","",""};
+
+
+#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),\
+					sizeof(block_type_gps),sizeof(block_type_une_periode),sizeof(block_type_synchro_sol),sizeof(block_type_pointage_sol),\
+					sizeof(block_type_bolo),sizeof(block_type_gyro),sizeof(block_type_sst),sizeof(block_type11),\
+					sizeof(block_type_bolo_comprime),sizeof(block_type_gyro_comprime),sizeof(block_type_sst_comprime),sizeof(block_type_status_flash),\
+					sizeof(block_type_cmd_flash),sizeof(block_type_data_brute),sizeof(block_type_18),sizeof(block_type_19)};
+
+
+
+
+
+/*   le code du block contient  8  bit de type							*/
+/*				24 bit pour le numero du block(horloge locale)			*/
+/*				12 bit pour la longueur du block  (en octet)			*/
+/*				16 bit pour la somme de test de la validité du block		*/
+
+/*  les define suivants doivent etre utilisés pour tester le type des blocks et les verifier	*/
+
+
+#define longueur_block(_bk)	( (int) ((_bk)->code1>>16) 	& 0xffff )	
+#define somme_block(_bk)	( (int)  (_bk)->code1		& 0xffff )
+
+#define type_block(_bk)		( (int) ((_bk)->code2>>24)	& 0xff )
+#define numero_block(_bk)	( (int)  (_bk)->code2		& 0xffffff )
+
+/* ce define cree le mot de controle de somme des blocks et de les verifier a la reception	*/
+
+
+/*==============================================================================================*/
+/*==============================================================================================*/
+/*  -----------------  fonctions utilitaires de gestion des blocks Archeops   ----------------  */
+/*==============================================================================================*/
+/*==============================================================================================*/
+
+
+/* -------------------------------------------------------------------------------------------- */
+/* les fonctions suivantes sont des utilitaires permettant la gestion des blocks archeops	*/
+/* il faut inclure une seule fois le header archeops.h précéde de :				*/
+/*			 #define utilitaires_de_block_archeops 					*/
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+/* 	cette fonction calcule le code de somme pour le controle de parité des blocks		*/
+
+int	calcul_somme_block(block_type_modele* blk,int longueur);
+
+
+
+
+
+/* 	cette fonction est a apeller lors de la création d'un block apres l'avoir rempli	*/
+/*	elle permet de creer tous les mots de controle du block					*/
+
+void	valide_block(block_type_modele* blk,int type,int block_num);
+
+
+
+/* 	cette fonction est a apeller pour vérifier la validité d'un block			*/
+/*	elle retourne 0 si le block est correct et sinon, un code d'erreur			*/
+/*	la seconde fonction sort les erreurs a l'ecran						*/
+
+int	verifie_block(block_type_modele* blk);
+int	verifie_block_printf(block_type_modele* blk);
+
+enum	{block_correct,block_type_inconnu,block_longueur_erreur,block_somme_erreur
+		,block_debut_erreur,block_fin_erreur};
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double	val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier int4 (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned int4	val_long(char x);
+
+int	new_val_dac(int a,char  code); 
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/archeopsfile.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeopsfile.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeopsfile.cc	(revision 439)
@@ -0,0 +1,1116 @@
+// archeopsfile.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#define utilitaires_de_block_archeops
+#include "archeopsfile.h"
+#include "gyrohandler.h"
+
+extern "C" {
+#include "compress.h"
+#include "arcunit.h"
+}
+#include <iostream.h>
+
+// BlockSet is the current "state" of the file reader automate.
+// It contains the last blocks of each kind, the current block and
+// the look-ahead block.
+
+class BlockSet {
+public:
+  BlockSet();
+  BlockSet(BlockSet const&);
+  ~BlockSet();
+  void setBloc(block_type_modele const& blk);
+  void setRawBloc(block_type_modele const& blk);
+
+  block_type_param*         lastParam;
+  block_type_journal*       lastJournal;
+  block_type_reglage*       lastReglage;
+  block_type_dilution*      lastDilution;
+  block_type_gps*           lastGPS;
+  block_type_une_periode*   lastUnePeriode;
+  block_type_synchro_sol*   lastSynchroSol;
+  block_type_pointage_sol*  lastPointageSol;
+  block_type_bolo*          lastBolo;   // can be uncompressed bolo_comp
+  block_type_bolo*          llastBolo;   
+  block_type_gyro*          lastGyro;
+  block_type_sst*           lastSST;
+  block_type_bolo_comprime* lastBoloComp;   // can be uncompressed bolo_comp
+  block_type_gyro_comprime* lastGyroComp;
+  block_type_sst_comprime*  lastSSTComp;
+    
+  block_type_modele         curBlock;
+  block_type_modele         peekBlock;
+  
+  SSTHandler   sstHandler;
+  GyroHandler  gyroHandler;
+  GPSParser    gpsParser;
+};
+
+BlockSet::BlockSet() {
+  lastParam      = NULL;
+  lastJournal    = NULL;
+  lastReglage    = NULL;
+  lastDilution   = NULL;
+  lastGPS        = NULL;
+  lastUnePeriode = NULL;
+  lastSynchroSol = NULL;
+  lastPointageSol= NULL;
+  lastBolo       = NULL;   
+  llastBolo      = NULL;   
+  lastGyro       = NULL;
+  lastSST        = NULL;
+  lastBoloComp   = NULL;   
+  lastGyroComp   = NULL;
+  lastSSTComp    = NULL;
+  
+  memset(&curBlock,0,sizeof(block_type_modele));
+  memset(&peekBlock,0,sizeof(block_type_modele));
+}
+
+BlockSet::~BlockSet() {
+  delete lastParam;
+  delete lastJournal;
+  delete lastReglage;
+  delete lastDilution;
+  delete lastGPS;
+  delete lastUnePeriode;
+  delete lastSynchroSol;
+  delete lastPointageSol;
+  delete lastBolo;   
+  delete llastBolo;   
+  delete lastGyro;
+  delete lastSST;
+  delete lastBoloComp;   
+  delete lastGyroComp;
+  delete lastSSTComp;
+}
+
+BlockSet::BlockSet(BlockSet const& x) 
+: sstHandler(x.sstHandler), gyroHandler(x.gyroHandler)
+{
+  lastParam      = NULL;
+  lastJournal    = NULL;
+  lastReglage    = NULL;
+  lastDilution   = NULL;
+  lastGPS        = NULL;
+  lastUnePeriode = NULL;
+  lastSynchroSol = NULL;
+  lastPointageSol= NULL;
+  lastBolo       = NULL;   
+  llastBolo      = NULL;   
+  lastGyro       = NULL;
+  lastSST        = NULL;
+  lastBoloComp   = NULL;   
+  lastGyroComp   = NULL;
+  lastSSTComp    = NULL;
+  
+  if (x.lastParam) {
+    lastParam = new block_type_param;
+    *lastParam = *x.lastParam;
+  }
+  if (x.lastJournal) {
+    lastJournal = new block_type_journal;
+    *lastJournal = *x.lastJournal;
+  }
+  if (x.lastReglage) {
+    lastReglage = new block_type_reglage;
+    *lastReglage = *x.lastReglage;
+  }
+  if (x.lastDilution) {
+    lastDilution = new block_type_dilution;
+    *lastDilution = *x.lastDilution;
+  }
+  if (x.lastGPS) {
+    lastGPS = new block_type_gps;
+    *lastGPS = *x.lastGPS;
+  }
+  if (x.lastUnePeriode) {
+    lastUnePeriode = new block_type_une_periode;
+    *lastUnePeriode = *x.lastUnePeriode;
+  }
+  if (x.lastSynchroSol) {
+    lastSynchroSol = new block_type_synchro_sol;
+    *lastSynchroSol = *x.lastSynchroSol;
+  }
+  if (x.lastPointageSol) {
+    lastPointageSol = new block_type_pointage_sol;
+    *lastPointageSol = *x.lastPointageSol;
+  }
+  if (x.lastBolo) {
+    lastBolo = new block_type_bolo;
+    *lastBolo = *x.lastBolo;
+  }
+  if (x.llastBolo) {
+    llastBolo = new block_type_bolo;
+    *llastBolo = *x.llastBolo;
+  }
+  if (x.lastGyro) {
+    lastGyro = new block_type_gyro;
+    *lastGyro = *x.lastGyro;
+  }
+  if (x.lastSST) {
+    lastSST = new block_type_sst;
+    *lastSST = *x.lastSST;
+  }
+  if (x.lastBoloComp) {
+    lastBoloComp = new block_type_bolo_comprime;
+    *lastBoloComp = *x.lastBoloComp;
+  }
+  if (x.lastGyroComp) {
+    lastGyroComp = new block_type_gyro_comprime;
+    *lastGyroComp = *x.lastGyroComp;
+  }
+  if (x.lastSSTComp) {
+    lastSSTComp = new block_type_sst_comprime;
+    *lastSSTComp = *x.lastSSTComp;
+  }
+  
+  memcpy(&curBlock,&x.curBlock,sizeof(block_type_modele));
+  memcpy(&peekBlock,&x.peekBlock,sizeof(block_type_modele));
+
+}
+
+void BlockSet::setBloc(block_type_modele const& blk)
+{
+  int kind = type_block(&blk);
+  switch (kind) {
+    case block_param:
+      if (!lastParam) lastParam = new block_type_param;
+      memcpy(lastParam, &blk, sizeof(block_type_param));
+      // Les fichiers fournis contiennent des valeurs debiles...
+      if (lastParam->param.n_max_bolo < 0)
+        lastParam->param.n_max_bolo = nb_max_bolo;
+      if (lastParam->param.n_per_block < 0)
+        lastParam->param.n_per_block = nb_per_block;
+      if (lastParam->param.n_max_mes_per < 0)
+        lastParam->param.n_max_mes_per = nb_max_mes_per;
+      break;
+    case block_journal:
+      if (!lastJournal) lastJournal = new block_type_journal;
+      memcpy(lastJournal, &blk, sizeof(block_type_journal));
+      break;
+    case block_reglage:
+      if (!lastReglage) lastReglage = new block_type_reglage;
+      memcpy(lastReglage, &blk, sizeof(block_type_reglage));
+      break;
+    case block_dilution:
+      if (!lastDilution) lastDilution = new block_type_dilution;
+      memcpy(lastDilution, &blk, sizeof(block_type_dilution));
+      break;
+    case block_gps:
+      if (!lastGPS) lastGPS = new block_type_gps;
+      memcpy(lastGPS, &blk, sizeof(block_type_gps));
+      break;
+    case block_une_periode:
+      if (!lastUnePeriode) lastUnePeriode = new block_type_une_periode;
+      memcpy(lastUnePeriode, &blk, sizeof(block_type_une_periode));
+      break;
+    case block_synchro_sol:
+      if (!lastSynchroSol) lastSynchroSol = new block_type_synchro_sol;
+      memcpy(lastSynchroSol, &blk, sizeof(block_type_synchro_sol));
+      break;
+    case block_pointage_sol:
+      if (!lastPointageSol) lastPointageSol = new block_type_pointage_sol;
+      memcpy(lastPointageSol, &blk, sizeof(block_type_pointage_sol));
+      break;
+    case block_bolo:
+      if (!lastBolo) lastBolo = new block_type_bolo;
+      else if (!llastBolo) {
+        llastBolo = new block_type_bolo;
+      }
+      if (llastBolo) {
+        memcpy(llastBolo, lastBolo, sizeof(block_type_bolo));
+      }
+      memcpy(lastBolo, &blk, sizeof(block_type_bolo));
+      break;
+    case block_gyro:
+      if (!lastGyro) lastGyro = new block_type_gyro;
+      memcpy(lastGyro, &blk, sizeof(block_type_gyro));
+      break;
+    case block_sst:
+      if (!lastSST) lastSST = new block_type_sst;
+      memcpy(lastSST, &blk, sizeof(block_type_sst));
+      break;
+  }
+}
+
+void BlockSet::setRawBloc(block_type_modele const& blk)
+{
+  int kind = type_block(&blk);
+  switch (kind) {
+    case block_bolo_comprime:
+      if (!lastBoloComp) lastBoloComp = new block_type_bolo_comprime;
+      memcpy(lastBoloComp, &blk, sizeof(block_type_bolo_comprime));
+      break;
+    case block_gyro_comprime:
+      if (!lastGyroComp) lastGyroComp = new block_type_gyro_comprime;
+      memcpy(lastGyroComp, &blk, sizeof(block_type_gyro_comprime));
+      break;
+    case block_sst_comprime:
+      if (!lastSSTComp) lastSSTComp = new block_type_sst_comprime;
+      memcpy(lastSSTComp, &blk, sizeof(block_type_sst_comprime));
+      break;
+  }
+}
+
+ArcheopsFile::ArcheopsFile(string const& fname) {
+  f = fopen(fname.c_str(), "rb");
+  setvbuf(f, NULL, _IOFBF, 1024L*1024L);
+
+  fn = fname;
+  if (!f) throw ArchExc("file not found");
+  fseek(f,0,SEEK_END);
+  fLen = ftell(f);
+  curPos = -1;
+  peekPos = -1;
+  curKind = -1;
+  curRawKind = -1;
+  blockSet = new BlockSet;
+  utcOffset=2;
+  computeMJD(fname);
+}
+
+ArcheopsFile::ArcheopsFile(ArcheopsFile const& x) {
+  blockSet = x.blockSet ? new BlockSet(*x.blockSet) : NULL;
+  fposStack = x.fposStack;
+  
+  stack<BlockSet*> tmp;
+  ArcheopsFile& y = (ArcheopsFile&) x;
+  while (!y.blockStack.empty()) {
+    tmp.push(y.blockStack.top());
+    y.blockStack.pop();
+  }
+  while (!tmp.empty()) {
+    y.blockStack.push(tmp.top());
+    blockStack.push(new BlockSet(*tmp.top()));
+    tmp.pop();
+  }
+
+  //curBlock   = x.curBlock;
+  curKind    = x.curKind;
+  curRawKind = x.curRawKind;
+  curPos     = x.curPos;
+  peekPos    = x.peekPos;
+  fLen       = x.fLen;
+  fn         = x.fn;
+  f = fopen(fn.c_str(), "rb");
+  setvbuf(f, NULL, _IOFBF, 1024L*1024L);
+
+  rawMJD     = x.rawMJD;
+  startMJD   = x.startMJD;
+  utcOffset  = x.utcOffset;
+}
+
+ArcheopsFile::~ArcheopsFile() {
+  if (f) fclose(f);
+  delete blockSet;
+  while (!blockStack.empty())
+    { delete blockStack.top(); blockStack.pop();}
+}
+
+void ArcheopsFile::grabLastBlocs(ArcheopsFile const& oldFile) {
+  delete blockSet;
+  blockSet = new BlockSet(*oldFile.blockSet);
+  //curBlock = oldFile.curBlock;
+  //peekBlock = oldFile.peekBlock;
+  if (peekPos>0) peekPos = 0;
+  setUTCOffset(oldFile.utcOffset);
+}
+
+
+def_nom_block
+
+def_long_block
+
+bool ArcheopsFile::nextBlock() {
+  // si pas de peek, alors en lire un pour commencer...
+  if (peekPos<0) {
+    peekPos=0; if (!nextBlock()) return false;
+  }
+  block_type_modele* curBlock=currentBlock();
+  block_type_modele* peekBlock=aheadBlock();
+  
+  memcpy(curBlock, peekBlock, sizeof(block_type_modele));
+  curPos = peekPos;
+  
+  while (true) {
+    if (peekPos+12 > fLen) return false;  // fin de fichier
+    fseek(f,peekPos,SEEK_SET);            // aller en peekPos
+    size_t read = fread(peekBlock,1,sizeof(block_type_modele),f);
+    swapEntete(peekBlock);
+    if (read < longueur_block(peekBlock) || 
+        type_block(peekBlock) < 0 || type_block(peekBlock) > 19 ||
+        longueur_block(peekBlock) != long_block[type_block(peekBlock)]) {
+      cout << "invalid block, bad type or length" << endl;
+      memset(peekBlock, 0, sizeof(block_type_modele)); // don't keep trash...
+      peekPos = searchNextBlock(peekPos);
+      if (peekPos<0) return false;
+      continue;
+    }
+    swapContent(peekBlock);
+    if (verifie_block(peekBlock) != block_correct) {
+      cout << "invalid block " << numero_block(peekBlock);
+      if (!fixBlock(peekBlock)) {
+        cout << " -- skipped" << endl;
+        peekPos += longueur_block(peekBlock);  // la longueur doit etre ok...
+        continue;
+      } else {
+        cout << " -- fixed" << endl;
+        break;
+      }
+    }
+    break; // tout semble bon pour ce bloc...
+  }
+  
+  peekPos += longueur_block(peekBlock); // on suppose que longueur OK...
+  if (curPos < 0) {
+    curPos = 0; return true;
+  }
+  if (curBlock->debut != 0) {
+    curRawKind = curKind = type_block(curBlock);
+    postProcessBlock();
+    saveCurBlock();
+  } else {
+    curRawKind = curKind = -1;
+  }
+  return true;
+}
+
+bool ArcheopsFile::nextBlock(long mask) {
+  if (!mask) return false;
+  while (1) {
+    if (!nextBlock()) return false;
+    if (( 1 << curRawKind) & mask) return true;
+  }
+}
+
+bool ArcheopsFile::fixBlock(block_type_modele* ) {
+  return false;
+}
+
+
+int  ArcheopsFile::blockKind() {
+  return curKind;
+}
+
+int  ArcheopsFile::blockRawKind() {
+  return curRawKind;
+}
+
+int  ArcheopsFile::blockNum() {
+  return numero_block(currentBlock());
+}
+
+#define	 bitmot			24		// nb de bit horloge dans un mot ADC
+
+double ArcheopsFile::perEchant() { // periode d'echantillonage pour le dernier bloc reglage
+  double p,f1,f2,f3;
+  int pp;
+  if (!lastReglage()) return -1;
+  pp=lastReglage()->reglage.horloge.periode;
+  p=pp/5.;
+  f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(lastReglage()->reglage.horloge.nb_mesures);
+  return 0.5/f3;					//  2 fois la frequence de modulation
+}
+
+double ArcheopsFile::perBlock() {  // duree (en secondes) correspondant a un bloc bolo
+  return perEchant() * (double)lastParam()->param.n_per_block*2.;
+}
+
+int ArcheopsFile::nEchBlock() {  // Nb d'echantillons dans un bloc
+  return lastParam()->param.n_per_block*2;
+}
+
+string  ArcheopsFile::blockKdName() {
+  return nom_block[curKind];
+}
+
+string  ArcheopsFile::blockRawKdName() {
+  return nom_block[curRawKind];
+}
+
+
+block_type_modele*  ArcheopsFile::currentBlock() {
+  //if (curPos<0) return NULL;
+  return &blockSet->curBlock;
+}
+
+block_type_modele*  ArcheopsFile::aheadBlock() {
+  //if (peekPos<0) return NULL;
+  return &blockSet->peekBlock;
+}
+
+bool ArcheopsFile::sameBlockNumAhead() {
+  if (curPos<0) return false;
+  return (numero_block(&blockSet->curBlock) == numero_block(&blockSet->peekBlock));
+}
+
+
+block_type_param* ArcheopsFile::lastParam() {
+  return blockSet->lastParam;
+}
+block_type_journal* ArcheopsFile::lastJournal() {
+  return blockSet->lastJournal;
+}
+block_type_reglage* ArcheopsFile::lastReglage() {
+  return blockSet->lastReglage;
+}
+block_type_dilution* ArcheopsFile::lastDilution() {
+  return blockSet->lastDilution;
+}
+block_type_gps* ArcheopsFile::lastGPS() {
+  return blockSet->lastGPS;
+}
+block_type_une_periode* ArcheopsFile::lastUnePeriode() {
+  return blockSet->lastUnePeriode;
+}
+block_type_synchro_sol* ArcheopsFile::lastSynchroSol() {
+  return blockSet->lastSynchroSol;
+}
+block_type_pointage_sol* ArcheopsFile::lastPointageSol() {
+  return blockSet->lastPointageSol;
+}
+block_type_bolo* ArcheopsFile::lastBolo() {
+  return blockSet->lastBolo;
+} 
+block_type_bolo* ArcheopsFile::llastBolo() {
+  return blockSet->llastBolo;
+} 
+block_type_gyro* ArcheopsFile::lastGyro() {
+  return blockSet->lastGyro;
+}
+block_type_sst* ArcheopsFile::lastSST() {
+  return blockSet->lastSST;
+}
+block_type_bolo_comprime* ArcheopsFile::lastBoloComp() {
+  return blockSet->lastBoloComp;
+} 
+block_type_gyro_comprime* ArcheopsFile::lastGyroComp() {
+  return blockSet->lastGyroComp;
+}
+block_type_sst_comprime* ArcheopsFile::lastSSTComp() {
+  return blockSet->lastSSTComp;
+}
+
+void ArcheopsFile::forceBlock(block_type_modele* blk) {
+  blockSet->setBloc(*blk);
+}
+
+#define place_paquet(i,j)	 ((i/8) * 24  + j*8 + (i%8) )
+
+void ArcheopsFile::postProcessBlock() {
+  switch (curKind) {
+     case block_bolo_comprime: {
+       blockSet->setRawBloc(blockSet->curBlock);
+       block_type_bolo blk2;
+       block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock;
+       #if version_num <= 25
+       for(int j=0;j<nb_bolo_util;j++)	
+	   {
+		   decompress_7_2((int4*)blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
+	   }
+	   #else
+	   block_type_param* param = lastParam();
+	   if (!param) return;
+	   int jc=0;for(int j=0;j<nb_max_bolo;j++)	 // jc = bolo_comprime  //   j=bolo normal
+	   {
+		if( (param->param.bolo[j].bolo_code_util==bolo_normal_transmis) &&  (jc<nb_bolo_util)  )
+			{
+			decompress_7_2((int4 *)blk->data_bolo[jc],blk2.data_bolo[j],nb_per_block*2);
+			jc++;
+			}
+		else {
+		  memset(blk2.data_bolo[j], 0, nb_per_block*2*sizeof(int4));
+		}
+		}
+
+	   #endif
+       valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));	
+       memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
+       curKind = block_bolo;
+       break;
+     }
+     case block_sst_comprime: {  
+       blockSet->setRawBloc(blockSet->curBlock);
+       if (!blockSet->sstHandler.NeedBlocks()) break; // inutile de decompresser
+       block_type_sst blk2;
+       block_type_sst_comprime* blk = (block_type_sst_comprime*) &blockSet->curBlock;
+       for (int j=0; j<18; j++)
+         for (int i=0; i<nb_per_block*2; i++)
+           blk2.sst[i][j] = 0;
+
+       int jc=0;
+       for( int j=0;j<48;j++) {
+         if ((j!=0) && (j!=4)) 
+         {
+           unsigned int4 sst_vrai[nb_per_block*2];
+           decompress_4_1((int4*)blk->sst[jc],(int4*)sst_vrai,nb_per_block*2);
+           for (int k=0;k<nb_per_block*2;k++) {
+             unsigned int4 a,b0,b1,b2;
+             b2 = sst_vrai[k] & 0xf;
+             b1 = (sst_vrai[k] >> 4) & 0xf;
+             b0 = (sst_vrai[k] >> 8) & 0xf;
+	         a=place_paquet(j,0);
+	         blk2.sst[k][a/8] |= (b0 << (a%8)*4);
+	         a=place_paquet(j,1);
+	         blk2.sst[k][a/8] |= (b1 << (a%8)*4);
+	         a=place_paquet(j,2);
+	         blk2.sst[k][a/8] |= (b2 << (a%8)*4);
+           }
+           jc++;
+         }
+       }       
+       valide_block((block_type_modele*)&blk2,block_sst,numero_block(blk));	
+       memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
+       curKind = block_sst;
+       //       cout << "process " << numero_block(&blockSet->curBlock) << "\n";
+       blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
+       break;
+     }
+     case block_sst : {
+       //       cout << "process " << numero_block(&blockSet->curBlock) << "\n";
+       blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
+     }
+     case block_gyro : {
+       blockSet->gyroHandler.ProcessBlock((block_type_gyro*)&blockSet->curBlock);
+     }
+     case block_gps : {
+       blockSet->gpsParser.ProcessBlock((block_type_gps*)&blockSet->curBlock);
+     }
+  }
+}
+
+void ArcheopsFile::saveCurBlock() {
+  blockSet->setBloc(blockSet->curBlock);
+}
+
+void ArcheopsFile::pushMark() {    // push current file position, and "last" blocks
+  fposStack.push(curPos);
+  fposStack.push(peekPos);
+  blockStack.push(new BlockSet(*blockSet));
+}
+
+void ArcheopsFile::popMark() {    // pops last file position and "last" blocks
+  if (! blockStack.empty()) {
+    delete blockSet;
+    blockSet = blockStack.top();
+    blockStack.pop();
+    peekPos = fposStack.top();
+    fposStack.pop();
+    curPos = fposStack.top();
+    fposStack.pop();
+  }
+}
+
+typedef unsigned int4 uint_4;
+typedef unsigned short uint_2;
+
+static inline void bswap4(void* p)
+{
+  uint_4 tmp = *(uint_4*)p;
+  *(uint_4*)p = ((tmp >> 24) & 0x000000FF) | 
+                ((tmp >> 8)  & 0x0000FF00) |
+                ((tmp & 0x0000FF00) << 8)  |
+                ((tmp & 0x000000FF) << 24);
+}
+
+static inline void bswap2(void* p)
+{
+  uint_2 tmp = *(uint_2*)p;
+  *(uint_2*)p = ((tmp >> 8) & 0x00FF) | 
+                ((tmp & 0x00FF) << 8);
+}
+
+#ifdef __DECCXX
+#define SWAP
+#endif
+#if defined(Linux)  || defined(linux)
+#define SWAP
+#endif
+
+#ifdef SWAP
+void ArcheopsFile::swapEntete(block_type_modele* blk) {
+  bswap4(&(blk->debut));
+  bswap4(&(blk->code1));
+  bswap4(&(blk->code2));
+  long lg = longueur_block(blk);
+  if (lg < taille_maxi_block_archeops)
+    bswap4(((char*)blk) + lg - 4);
+}
+#else
+void ArcheopsFile::swapEntete(block_type_modele* ) {
+}
+#endif
+
+#ifdef SWAP
+void ArcheopsFile::swapContent(block_type_modele* blk) {
+  int typ = type_block(blk);
+
+  if (typ == block_gps) return; // char only, no swap
+  if (typ == block_une_periode) { // une_periode, des shorts
+    block_type_une_periode* b = (block_type_une_periode*) blk;
+    for (int i=0; i<nb_max_bolo; i++)
+      for (int j=0; j<nb_max_mes_per; j++)
+	bswap2(&b->bol_per[i][j]);
+    return;
+  }
+
+  for (int i=0; i<longueur_block(blk)/4-4; i++)
+    bswap4(blk->mot + i);
+  // On deswappe ce qui ne devait pas etre swappe...
+  switch (typ) {
+  case block_param: {
+    block_type_param* b = (block_type_param*) blk;
+    for (int i=0; i<nb_max_bolo; i++)
+      for (int j=0; j<8; j++)
+#if version_num<=25
+        bswap4(&b->param.bolo[i].bolo_nom[4*j]);
+#else
+	bswap4(&b->param.nom_coef[i].bolo_nom[4*j]);
+#endif
+  }
+  
+  }
+}
+#else
+void ArcheopsFile::swapContent(block_type_modele* ) {
+}
+#endif
+
+long ArcheopsFile::searchNextBlock(long pos) {
+  static char* buffer = 0;
+  static int4  debswp = debut_block_mesure;
+  static int4  longmax = taille_maxi_block_archeops*20; 
+  if (!buffer) {
+    buffer = new char[longmax];
+#ifdef SWAP
+    bswap4(&debswp);
+#endif
+  }
+  size_t read = longmax;
+  while (read == longmax) {
+    fseek(f,pos,SEEK_SET);
+    read = fread(buffer,1,longmax,f);
+    //if (read<taille_maxi_block_archeops*2) return -1; 
+    // EA 150999 changed i+=4 to i++ -> unaligned, but can lose bytes in flight recorder
+#ifndef __DECCXX
+#define __unaligned 
+#endif
+     for (size_t i=4; i<read; i++) {
+      if (*(__unaligned int4*)(buffer+i) == debswp) {
+	cout << "trying to skip " << i << " bytes to pos="<<pos+i << endl;
+	return pos+i;
+      }
+    }
+    pos += read;
+  }
+  cout << "cannot find block start" << endl;
+  return -1;
+}
+
+
+
+
+static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+
+double ArcheopsFile::decodeMJD(string const& dateString) {
+  //99_04_29-15h36m22  ou  99_05_10
+  short y,m,d,hh,mm,ss;
+  char const* p = dateString.c_str();
+  char const* p2 = dateString.c_str() + dateString.length();
+  y  = atoi(p); p+=3; if (p>p2) return -1;
+  m  = atoi(p); p+=3; if (p>p2) return -1;
+  d  = atoi(p); p+=3;
+  if (p<p2) {
+  hh = atoi(p); p+=3; if (p>p2) return -1;
+  mm = atoi(p); p+=3; if (p>p2) return -1;
+  ss = atoi(p);
+  } else {
+    hh=mm=ss=0;
+  }
+
+  if (y<50) y += 100;
+  // 1. depuis 0/1/97 minuit
+  double mjd = (int) (365.25 * (y-97));
+  for (int i=0; i<m-1; i++)
+    mjd += mlen[i];
+  if (y%4 == 0 && m > 2) mjd++;
+  mjd += d;
+  mjd += hh/24. + mm/24./60. + ss/24./60./60;
+  
+  mjd += 448.5; // 0/1/97 minuit
+
+  return mjd;
+}
+
+void ArcheopsFile::computeMJD(string const& fname) {
+  //telemetrie : h99_04_29-15h36m22
+  //enregistreur : ARKxxxxxx.dat, et MJD = samedi 17 juillet, 21h -> 1377.4
+  char const* p = fname.c_str();
+  char const* p2 = p  + fname.length()-1;
+  while (*p2 != ':' && *p2 != '/' && p2 != p) p2--;
+  if (*p2 == ':' || *p2 == '/') p2++;
+  if (*p2 == 'h') p2++;
+  if (!strncmp(p2, "ARK",3) || !strncmp(p2,"ark",3)) {
+    rawMJD = 1377.4;
+  } else {
+    rawMJD = decodeMJD(p2);
+  }
+  startMJD = rawMJD - utcOffset/24.;
+}
+
+void ArcheopsFile::setUTCOffset(int UTCOffset) {
+  utcOffset = UTCOffset;
+  startMJD = rawMJD - utcOffset/24.;
+}
+
+double ArcheopsFile::getStartMJD() {
+  return startMJD;
+}
+
+int ArcheopsFile::getBoloBlockNum() {
+  if (!lastBolo()) return -1;
+  return numero_block(lastBolo());
+}
+
+int ArcheopsFile::getBoloCompBlockNum() {
+  if (!lastBolo()) return -1;
+  return numero_block(lastBoloComp());
+}
+
+int ArcheopsFile::getReglageBlockNum() {
+  if (!lastReglage()) return -1;
+  return numero_block(lastReglage());
+}
+
+int ArcheopsFile::getDilutionBlockNum() {
+  if (!lastDilution()) return -1;
+  return numero_block(lastDilution());
+}
+
+
+int ArcheopsFile::getSSTBlockNum() {
+  if (!lastSST()) return -1;
+  return numero_block(lastSST());
+}
+
+int ArcheopsFile::getSSTCompBlockNum() {
+  if (!lastSST()) return -1;
+  return numero_block(lastSSTComp());
+}
+
+
+
+int ArcheopsFile::getGyroBlockNum() {
+  if (!lastGyro()) return -1;
+  return numero_block(lastGyro());
+}
+
+
+// GPS
+// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
+
+
+int ArcheopsFile::getGPSBlockNum() {
+  if (!lastGPS()) return -1;
+  return numero_block(lastGPS());
+}
+
+double ArcheopsFile::getGPSUTC() {  // en secondes depuis minuit UTC jour courant
+  if (!lastGPS()) return -9.e99;
+  return blockSet->gpsParser.getUTC();
+}
+
+double ArcheopsFile::getGPSMJD() {  // modified julian day du dernier bloc GPS, JD - 2450000
+  double t = getGPSUTC()/86400. - 0.5;
+  if (t<0) return t;
+  if (t > (startMJD - int(startMJD))) {
+    return int(startMJD) + t;
+  } else {
+    return int(startMJD) + 1. + t;
+  }
+}
+
+double ArcheopsFile::getGPSLat() {  // degres, +  = NORD
+  if (!lastGPS()) return -9.e99;
+  return blockSet->gpsParser.getLatitude();
+}
+
+
+double ArcheopsFile::getGPSLong() { // degres, +  = EST
+  if (!lastGPS()) return -9.e99;
+  return blockSet->gpsParser.getLongitude();
+}
+
+double ArcheopsFile::getGPSAlt() { // meters from sea level
+  if (!lastGPS()) return -9.e99;
+  return blockSet->gpsParser.getAltitude();
+}
+
+bool ArcheopsFile::hasGPSTime() { 
+  if (!lastGPS()) return false;
+ // return blockSet->gpsParser.hasGPSTime();
+  return blockSet->gpsParser.hasTime();
+}
+
+bool ArcheopsFile::hasGPSPos() { 
+  if (!lastGPS()) return false;
+  return blockSet->gpsParser.hasPosition();
+}
+
+bool ArcheopsFile::hasGPSAlt() { 
+  if (!lastGPS()) return false;
+  return blockSet->gpsParser.hasAltitude();
+}
+
+
+// Bolo
+#define  val_DS(j,i)  (blk->data_bolo[j][i]&0x1fffff)
+
+
+double ArcheopsFile::getBoloRawMuV(int ibolo, int imesure) {    // microvolts bruts
+  block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
+  if (imesure < 0) imesure += nEchBlock();
+  block_type_reglage* reglage = lastReglage();
+  block_type_param*   param = lastParam();
+  if (!blk) return 0;
+  if (!reglage) return 0;
+  if (!param) return 0;
+
+  int s = imesure % 2 ? 1 : -1;
+    
+  return s*bolo_muV(&param->param, &reglage->reglage, val_DS(ibolo,imesure), ibolo);
+}
+
+double ArcheopsFile::getBoloRawMuVCN(int ibolo, int imesure) {    
+  // Si pas bloc comprime -> 1 bit
+  int lastbit = 1;
+  if (!(lastBoloComp() == NULL) &&
+      (numero_block(lastBoloComp()) != numero_block(lastBolo()))) {
+    unsigned int4* data = lastBoloComp()->data_bolo[ibolo];
+    // Les deux premieres valeurs sont codees directement...
+    if (imesure>=2) {
+      int iExp = (imesure-2)/4 + 1;
+      int expo = data[iExp] & 0xf;
+      lastbit = 1 << expo;
+    }
+  }
+  block_type_reglage* reglage = lastReglage();
+  block_type_param*   param = lastParam();
+  if (!reglage) return 0;
+  if (!param) return 0;
+  double noise = (
+    bolo_muV(&param->param, &reglage->reglage, lastbit, ibolo) -
+    bolo_muV(&param->param, &reglage->reglage, 0, ibolo)) /2.;
+
+  return noise; 
+}
+
+
+
+def_gains 
+
+double ArcheopsFile::getBoloMuV(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
+  double y = (getBoloRawMuV(ibolo, imesure-1) + getBoloRawMuV(ibolo, imesure))/2.;
+  return y;
+}
+
+double ArcheopsFile::getBoloMuV2(int ibolo, int imesure) { // microvolts, filtre 
+  // On commence par trouver la valeur d'offset, en fittant une droite sur les soustractions
+  if (!lastBolo() || !llastBolo()) return 0;
+  //block_type_reglage* reglage = lastReglage();
+  //block_type_param*   param = lastParam();
+  //if (!reglage) return 0;
+  //if (!param) return 0;
+  double sumx=0, sumy=0, sumxy=0, sumx2=0;
+  int n=20;
+  int s = imesure % 2 ? 1 : -1;
+  for (int i=1; i<=n; i++) {
+    double x = -i;
+    double y = s*(getBoloRawMuV(ibolo, imesure-i+1) - getBoloRawMuV(ibolo, imesure-i))/2;
+    s = -s;
+    sumx += x;
+    sumy += y;
+    sumxy += x*y;
+    sumx2 += x*x;
+  }
+  double a = (sumxy/n - (sumx/n)*(sumy/n)) / (sumx2/n - (sumx/n)*(sumx/n));
+  double b = (sumy/n) - a*(sumx/n);
+  s = imesure % 2 ? 1 : -1;
+  double y = getBoloRawMuV(ibolo, imesure);
+  y = y-s*b;
+  return y;
+}
+
+/*
+double ArcheopsFile::getBoloMuV2(int ibolo, int imesure) { // microvolts, filtre 
+  // On commence par trouver la valeur d'offset, en fittant une droite sur les soustractions
+  if (!lastBolo() || !llastBolo()) return 0;
+  double sumx=0, sumy=0, sumxy=0, sumx2=0;
+  int n=20;
+  int s = (imesure-n) % 2 ? 1 : -1;
+  static double* data = NULL;
+  if (!data) data = new double[n+1];
+  for (int i=0; i<=n; i++) {
+    data[i] = getBoloRawMuV(ibolo, imesure-n+i);
+  }
+  for (int i=0; i<=n; i++) {
+    
+  }
+  for (int i=1; i<=n; i++) {
+    double x = -i;
+    double y = s*(getBoloRawMuV(ibolo, imesure-i+1) - getBoloRawMuV(ibolo, imesure-i))/2;
+    s = -s;
+    sumx += x;
+    sumy += y;
+    sumxy += x*y;
+    sumx2 += x*x;
+  }
+  double a = (sumxy/n - (sumx/n)*(sumy/n)) / (sumx2/n - (sumx/n)*(sumx/n));
+  double b = (sumy/n) - a*(sumx/n);
+  s = imesure % 2 ? 1 : -1;
+  double y = getBoloRawMuV(ibolo, imesure);
+  y = y-s*b;
+  return y;
+}
+*/
+
+
+double ArcheopsFile::getGainAmpli(int ibolo) {
+     return gain_ampli(lastReglage()->reglage.bolo[ibolo]);
+}
+
+
+double ArcheopsFile::getDACV(int ibolo) {
+  block_type_reglage* reglage = lastReglage();
+  block_type_param*   param = lastParam();
+  if (!reglage) return 0;
+  if (!param) return 0;
+  return DAC_muV(&param->param, &reglage->reglage, ibolo);
+}
+
+double ArcheopsFile::getDACI(int ibolo) {
+  block_type_reglage* reglage = lastReglage();
+  block_type_param*   param = lastParam();
+  if (!reglage) return 0;
+  if (!param) return 0;
+  return DAC_muA(&param->param, &reglage->reglage, ibolo);
+}
+
+double ArcheopsFile::getBoloMuV2T(int ibolo, int imesure) {
+  return getDACV(ibolo) - getBoloMuV2(ibolo, imesure) ;
+}
+
+double ArcheopsFile::getBoloRes(int ibolo, int imesure) {
+  double i = getDACI(ibolo); // microAmps
+  double v = getBoloMuV2T(ibolo, imesure); // microVolts
+  double r = v/i; // Ohms
+  return r;
+}
+
+double ArcheopsFile::getBoloTemp(int ibolo, int imesure) {
+  double r = getBoloRes(ibolo, imesure);
+  block_type_reglage* reglage = lastReglage();
+  block_type_param*   param = lastParam();
+  if (!reglage) return 0;
+  if (!param) return 0;
+  return bolo_temp(&param->param, &reglage->reglage, r, ibolo);
+}
+
+
+// Dilution
+
+int4 ArcheopsFile::getADCDil(int iADC) {
+  block_type_dilution* blk = lastDilution();
+  if (!blk) return 0;
+  if (iADC < 0 || iADC > 47) return 0;
+  return blk->ADC_dil[iADC];
+}
+
+int4 ArcheopsFile::getSwitchDil() {
+  block_type_dilution* blk = lastDilution();
+  if (!blk) return 0;
+  return blk->switch_dil;
+}
+
+
+// SST, gyros...
+
+void ArcheopsFile::needSSTProcessMask(int mask) {
+  blockSet->sstHandler.NeedProcess(mask);
+}
+
+long ArcheopsFile::getSSTSignal(int idiode, int imesure) {
+  return blockSet->sstHandler.getSignal(imesure, idiode);
+}
+
+long ArcheopsFile::getSSTRawSignal(int idiode, int imesure) {
+  return blockSet->sstHandler.getRawSignal(imesure, idiode);
+}
+
+double ArcheopsFile::getSSTSignalCN(int idiode, int imesure) {
+  return getSSTRawSignalCN(SSTHandler::getDiodPermut(idiode),imesure);
+}
+
+double ArcheopsFile::getSSTRawSignalCN(int ichannel, int imesure) {
+  // Si pas bloc comprime -> 0
+  if (lastSSTComp() == NULL) return 0;
+  if (numero_block(lastSSTComp()) != numero_block(lastSST())) return 0;
+  
+  // Attention, on ne transmet pas les canaux 0 et 4....
+  if (ichannel == 0 || ichannel == 4) return 0;
+  int i = ichannel - 1;
+  if (i >= 4) i--;
+  unsigned int4* data = lastSSTComp()->sst[i];
+  // Les deux premieres valeurs sont codees directement...
+  if (imesure<2) return 0;
+  int iExp = (imesure-2)/7 + 1;
+  int expo = data[iExp] & 0xf;
+  int noise = 1 << expo;
+  return noise/2.;
+}
+
+
+
+double ArcheopsFile::getSSTStarZ(int istar, int imesure) {
+  return blockSet->sstHandler.getStarZ(imesure+getSSTBlockNum()*nb_per_block*2, istar);
+}
+
+double ArcheopsFile::getSSTStarF(int istar, int imesure) {
+  return blockSet->sstHandler.getStarF(imesure+getSSTBlockNum()*nb_per_block*2, istar);
+}
+
+double ArcheopsFile::getSSTStarT(int istar, int imesure) {
+  return blockSet->sstHandler.getStarTime(imesure+getSSTBlockNum()*nb_per_block*2, istar);
+}
+
+int ArcheopsFile::getNumbStar(int imesure) {
+  return blockSet->sstHandler.getNumbStar(imesure+getSSTBlockNum()*nb_per_block*2);
+}
+
+long ArcheopsFile::getGyroRaw(int igyro, int imesure) {   
+  return blockSet->gyroHandler.getRawSignal(imesure, igyro);
+}
+
+double ArcheopsFile::getGyroTens(int igyro, int imesure) {   
+  return blockSet->gyroHandler.getSignal(imesure, igyro);
+}
+
+double ArcheopsFile::getGyroSpeed(int igyro, int imesure) {   
+  return blockSet->gyroHandler.getSpeed(imesure, igyro);
+}
+
+
+
+
+
+// $CHECK$ TBD
+
+
+double ArcheopsFile::getAzimut(int /*imesure*/) {return 0;}
+double ArcheopsFile::getPendDirect(int /*imesure*/) {return 0;}
+double ArcheopsFile::getPendOrth(int /*imesure*/) {return 0;}
+double ArcheopsFile::getAlphaAxis(int /*imesure*/) {return 0;}
+double ArcheopsFile::getDeltaAxis(int /*imesure*/) {return 0;}
Index: /tags/V_240999/Poubelle/archTOI.old/archeopsfile.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archeopsfile.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archeopsfile.h	(revision 439)
@@ -0,0 +1,205 @@
+// archeopsfile.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef ARCHEOPSFILE_H
+#define ARCHEOPSFILE_H
+
+#include <stdio.h>
+#include <string>
+#include <stack>
+
+
+#ifndef nb_max_bolo
+#define _archeops		//  Acquisition Archeops (avec transputer) 
+#define programme
+extern "C" {
+#include "archeops.h"
+}
+#endif
+
+#include "ssthandler.h"
+#include "gpsparser.h"
+
+enum {
+  block_param_mask = 1 << block_param,
+  block_journal_mask = 1 << block_journal,
+  block_reglage_mask = 1 << block_reglage,
+  block_dilution_mask = 1 << block_dilution,
+  block_gps_mask = 1 << block_gps,
+  block_une_periode_mask = 1 << block_une_periode,
+  block_synchro_sol_mask = 1 << block_synchro_sol,
+  block_pointage_sol_mask = 1 << block_pointage_sol,
+  block_bolo_nc_mask = 1 << block_bolo,
+  block_gyro_nc_mask = 1 << block_gyro,
+  block_sst_nc_mask = 1 << block_sst,
+  block_11_mask = 1 << block_11,
+  block_bolo_comprime_mask = 1 << block_bolo_comprime,
+  block_gyro_comprime_mask = 1 << block_gyro_comprime,
+  block_sst_comprime_mask = 1 << block_sst_comprime,
+ // block_catalog_flash_mask = 1 << block_catalog_flash,
+  block_cmd_flash_mask = 1 << block_cmd_flash,
+  block_data_brute_mask = 1 << block_data_brute,
+  block_18_mask = 1 << block_18,
+  block_19_mask = 1 << block_19,
+
+  block_bolo_mask = block_bolo_nc_mask | block_bolo_comprime_mask,
+  block_gyro_mask = block_gyro_nc_mask | block_gyro_comprime_mask,
+  block_sst_mask = block_sst_nc_mask | block_sst_comprime_mask
+};
+
+class BlockSet;
+
+class ArchExc {
+public:
+  ArchExc(string s) : msg(s) {}
+  string Msg() {return msg;}
+protected:
+  string msg;
+};
+
+class ArcheopsFile {
+public:
+  ArcheopsFile(string const& fname);  // starting before first block
+  ArcheopsFile(ArcheopsFile const&);
+  virtual ~ArcheopsFile();
+  
+  void setUTCOffset(int UTCOffset=2); // StartMJD : decodage a partir du nom du bloc...
+  double getStartMJD();
+  
+  bool nextBlock();   // go to next block, true if block exists (ie not EOF)
+  bool nextBlock(long mask); // go to next block matching mask
+  bool gotValidBlock(); // current block is good
+  int  blockKind();   // kind of the current bloc, enum in archeops.h
+  int  blockRawKind();   // kind of the current raw bloc, enum in archeops.h
+  int  blockNum();   // number (timestamp) of the current bloc
+  string blockKdName();
+  string blockRawKdName();
+  string filename() {return fn;}
+  
+  double perEchant(); // periode d'echantillonage pour le dernier bloc reglage
+  double perBlock();  // duree (en secondes) correspondant a un bloc bolo
+                      // utilise infos dernier bloc param et dernier bloc reglage.
+  int nEchBlock(); // Nb d'echantillons dans un bloc bolo
+  
+  
+  void pushMark();    // push current file position, and "last" blocks
+  void popMark();     // pops last file position and "last" blocks
+    
+  void grabLastBlocs(ArcheopsFile const& oldFile);
+  
+  block_type_modele*  aheadBlock();   // internal buffer
+  block_type_modele*  currentBlock(); // internal buffer
+  bool sameBlockNumAhead();
+  
+  block_type_param*         lastParam();  // saved blocks, including current
+  block_type_journal*       lastJournal();
+  block_type_reglage*       lastReglage();
+  block_type_dilution*      lastDilution();
+  block_type_gps*           lastGPS();
+  block_type_une_periode*   lastUnePeriode();
+  block_type_synchro_sol*   lastSynchroSol();
+  block_type_pointage_sol*  lastPointageSol();
+  block_type_bolo*          lastBolo();   // can be uncompressed bolo_comp
+  block_type_bolo*          llastBolo();   
+  block_type_gyro*          lastGyro();
+  block_type_sst*           lastSST();
+  block_type_bolo_comprime* lastBoloComp();   
+  block_type_gyro_comprime* lastGyroComp();
+  block_type_sst_comprime*  lastSSTComp();
+  
+  void forceBlock(block_type_modele* blk);
+  
+  // Decodage des derniers blocs..
+  
+  // GPS
+  // On travaille en MJD = JD - 2450000.0, = 9 octobre 1995 midi UTC
+  // 1er juillet 1999 minuit UTC = JD 2451360.5,   MJD 1360.5 
+  // Ces fonctions travaillent sur le dernier bloc GPS 
+  int getGPSBlockNum();
+  bool   hasGPSTime();
+  bool   hasGPSPos();
+  bool   hasGPSAlt();
+  double getGPSUTC();  // en secondes depuis minuit UTC
+  double getGPSMJD();  // modified julian day du dernier bloc GPS, JD - 2450000
+  double getGPSLat();  // degres, +  = NORD
+  double getGPSLong(); // degres, +  = EST
+  double getGPSAlt();  // meters from sea level
+    
+  // Bolo
+  int getReglageBlockNum();
+  int getBoloBlockNum();
+  int getBoloCompBlockNum();
+  double getBoloRawMuV(int ibolo, int imesure);   // donnee brute en microvolts et signe change.
+  double getBoloRawMuVCN(int ibolo, int imesure);  // bruit de compression, en microVolts
+  double getBoloMuV(int ibolo, int imesure); // microvolts, filtre avec filtre carre
+  double getBoloMuV2(int ibolo, int imesure); // microvolts, filtre +sioux
+  double getGainAmpli(int ibolo);
+  double getDACV(int ibolo); // offset en microvolt
+  double getDACI(int ibolo); // courant en microAmps
+  double getBoloMuV2T(int ibolo, int imesure); // avec soustraction dacV
+  double getBoloRes(int ibolo, int imesure); // Ohms
+  double getBoloTemp(int ibolo, int imesure); // K
+  
+  // Dilution
+  int getDilutionBlockNum();
+  int4 getADCDil(int iADC);
+  int4 getSwitchDil();
+  
+  // SST, gyros, etc
+  int getSSTBlockNum();
+  int getSSTCompBlockNum();
+  void needSSTProcessMask(int mask);
+  long getSSTRawSignal(int iDiode, int imesure);
+  long getSSTSignal(int iDiode, int imesure);
+  double getSSTRawSignalCN(int iDiode, int imesure);
+  double getSSTSignalCN(int iDiode, int imesure);
+  double getSSTStarZ(int iStar, int imesure);
+  double getSSTStarF(int iStar, int imesure);
+  double getSSTStarT(int iStar, int imesure);
+  int getNumbStar(int imesure);
+  
+  int getGyroBlockNum();
+  long getGyroRaw(int iGyro, int imesure);
+  double getGyroTens(int iGyro, int imesure);
+  double getGyroSpeed(int iGyro, int imesure);
+  
+  double getAzimut(int imesure);
+  double getPendDirect(int imesure);
+  double getPendOrth(int imesure);
+  
+  double getAlphaAxis(int imesure);
+  double getDeltaAxis(int imesure);
+  
+  static double decodeMJD(string const& dateString); // sans tenir compte de TU-TLeg
+    
+protected:
+  BlockSet*                 blockSet;
+  stack<BlockSet*>          blockStack;
+  stack<size_t>             fposStack;
+  
+  void saveCurBlock();
+  void postProcessBlock();
+
+  void swapEntete(block_type_modele* blk);
+  void swapContent(block_type_modele* blk);
+  
+  void computeMJD(string const& fname);
+  
+  bool fixBlock(block_type_modele* blk);
+  long searchNextBlock(long pos);
+    
+  int                       curKind;
+  int                       curRawKind;
+  long                      curPos;
+  long                      peekPos;
+  size_t                    fLen;
+  FILE* f;
+  string fn;
+  
+  double rawMJD;   // decodage a partir du nom de fichier, sans application d'offset heure locale
+  double startMJD; // MJD du debut du fichier.
+  double utcOffset;
+private:
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/archparam.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archparam.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archparam.cc	(revision 439)
@@ -0,0 +1,39 @@
+// archparam.cc    parametres generaux...
+// Eric Aubourg         CEA/DAPNIA/SPP   septembre 1999
+
+#include "archparam.h"
+#include <iostream.h>
+
+ArchParam archParam;
+
+// constructeurs avec parametres par defaut adaptes au vol
+// TRAPANI 99
+
+ArchParam::AcqParam::AcqParam() 
+: tBlock0   (1376.8358818),
+  perEch    (0.005836818076),
+  utcOrigin (1376.5)
+{}
+
+ArchParam::GeomParam::GeomParam() 
+{}
+
+ArchParam::SSTParam::SSTParam() 
+:  soustPente   (true),
+   analFine     (false)
+{}
+
+
+void ArchParam::Dump()
+{
+  cout << "***Archeops parameters\n";
+  cout << " **ACQ\n";
+  cout << "   tBlock0      " << acq.tBlock0    << "\n";
+  cout << "   perEch       " << acq.perEch     << "\n";
+  cout << "   utcOrigin    " << acq.utcOrigin  << "\n";
+  cout << " **GEOM\n";
+  cout << " **SST\n";
+  cout << "   soustPente   " << sst.soustPente << "\n";
+  cout << "   analFine     " << sst.analFine   << "\n";
+  cout << "***END" << endl;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/archparam.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archparam.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archparam.h	(revision 439)
@@ -0,0 +1,35 @@
+// archparam.h    parametres generaux...
+// Eric Aubourg         CEA/DAPNIA/SPP   septembre 1999
+
+#ifndef ARCHPARAM_H
+#define ARCHPARAM_H
+
+struct ArchParam {
+  struct AcqParam {
+    double tBlock0;  // MJD du bloc numero zero...
+    double perEch;   // periode d''echantillonage en secondes 
+    double utcOrigin;
+    AcqParam(); 
+  };
+  
+  struct GeomParam {
+    GeomParam(); 
+  };
+  
+  struct SSTParam {
+    bool soustPente;  // Decide que l'on soustrait une pente constante a la piste en cours
+    bool analFine;
+    SSTParam();  
+  };
+
+
+  AcqParam  acq;
+  GeomParam geo;
+  SSTParam  sst;
+  
+  void Dump();
+};
+
+extern ArchParam archParam;
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/archtoi.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archtoi.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archtoi.cc	(revision 439)
@@ -0,0 +1,339 @@
+// archtoi.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#include <string>
+#include <iostream.h>
+#include <fstream.h>
+#include <iomanip.h>
+
+#include "archeopsfile.h"
+#include "toisvr.h"
+#include "archtoi.h"
+#include "archparam.h"
+#include "archvers.h"
+
+using namespace std; 
+
+#ifdef __MWERKS__
+#include "Events.h"
+#include "LowMem.h"
+#include "sioux.h"
+static int macSleepTicks = 0;
+static int macRunTicks = 10;
+static void yield()
+{
+    EventRecord theEvent;
+    static long int macLastTicks;
+    long int ticks = LMGetTicks();
+    if (ticks - macLastTicks >= macRunTicks) {
+      if (WaitNextEvent(everyEvent, &theEvent,macSleepTicks,0))
+        SIOUXHandleOneEvent(&theEvent);
+      macLastTicks = LMGetTicks();
+    }
+}
+#endif
+
+
+ArchTOI::ArchTOI(istream& str)
+{
+  init();
+  svr.readReq(str);
+}
+
+
+ArchTOI::ArchTOI(string const& filename)
+{
+  init();
+  ifstream str(filename.c_str());
+  svr.readReq(str);
+}
+
+void ArchTOI::init()
+{
+  format = ascii_fmt;
+  undef  = "#";
+  undefV = -99999;
+  allBolos = false;
+  fptr = NULL;
+  ostr = NULL;
+  requestVersion = "";
+  svr.registerReqHandler(this);
+}
+
+
+bool ArchTOI::processTOIReq(string line, string toiname, TOIKind /*kind*/, int index, 
+                            bool interp, bool repet, bool flag, bool /*notrig*/)
+{
+  headertoi.push_back(line);
+  if (index>=0) {
+    char idx[10]; 
+    sprintf(idx,"_%d",index);
+    toiname += idx;
+  }
+  if (flag) {
+    toinames.push_back("flg_"+toiname);
+  }
+  toinames.push_back(toiname);
+  toiflags.push_back(flg((flag?hasflag:0)+((!repet&&!interp)?useNA:0)));
+  return true;
+} 
+
+bool ArchTOI::processOption(string key, string arg)
+{
+  string line=key; if (arg != "") line = line + " " + arg;
+  headeropt.push_back(line);
+  if (arg.length()>0 && arg[0] == ' ') {
+    arg = arg.substr(arg.find_first_not_of(' '));
+  }
+  if (key == "#ASCII") {
+    format = ascii_fmt;
+  } else if (key == "#FITS") {
+    format = fits_fmt;
+  } else if (key == "#UNDEF") {
+    undef=arg;
+    if (undef[0] >= '0' && undef[0] <= '9')
+      undefV = atoi(undef.c_str());
+  } else if (key == "#ALLBOLOS") {
+    allBolos=true;
+  } else if (key == "#REQVERSION") {
+    if (requestVersion != "") {
+      cerr << "Error. Duplicate #REQVERSION option" << endl;
+      exit(-1);
+    }
+    requestVersion = arg;
+  } else if (key == "#COMMENT") {
+    comments.push_back(arg);
+  } else {
+    return false;
+  }
+  
+  return true;
+}
+
+
+void ArchTOI::run(string const& outfilename)
+{
+  if (format == ascii_fmt) {
+    openFile   = &openFile_A;
+    outHeader  = &outHeader_A;
+    outValue   = &outValue_A;
+    endLine    = &endLine_A;
+    closeFile  = &closeFile_A;
+  } else { // fits_fmt 
+    openFile   = &openFile_F;
+    outHeader  = &outHeader_F;
+    outValue   = &outValue_F;
+    endLine    = &endLine_F;
+    closeFile  = &closeFile_F;
+  }
+  
+  cout << "starting query" << endl;
+  TOIIter iter = svr.doQuery();
+  (this->*openFile)(outfilename);
+  (this->*outHeader)(iter);
+  
+  cout << "processing" << endl;
+  while (iter.Next()) {
+    int nn = iter.getSampleIndex() / iter.getUnderSampling(); // Only for tick mark...
+    #ifdef __MWERKS__
+    yield();
+    #endif
+     if (nn%200 == 0) {
+       cout << "."; cout.flush();
+     }
+     if (nn%(200*80) == 0) cout << endl;
+    // Si rien de dispo parmi les triggering, alors on passe au suivant
+    bool hasValue = false;
+    for (int i=0; i<toiflags.size(); i++) {
+       if (!iter.isTrig(i)) continue;
+       if (iter.canGetValue(i)) {hasValue=true; break;}
+    }
+    if (!hasValue) continue;
+    int icol=0;
+    for (int i=0; i<toiflags.size(); i++) {
+      double value = iter.getValue(i);
+      bool   ok    = iter.canGetValue(i);
+      bool   isnew = iter.newValue(i);
+      flg    flag  = toiflags[i];
+      if (flag & hasflag) {
+        (this->*outValue)(icol,  (ok && isnew ? 1 : 0));
+        icol++;
+      }
+      if (((flag & useNA)!=0 && !isnew) || !ok) 
+        (this->*outValue)(icol,  0, true);
+      else
+        (this->*outValue)(icol, value);
+      icol++;
+    }
+    (this->*endLine)();
+  }
+  (this->*closeFile)();
+  cout << "\nDone." << endl;
+}
+
+
+void ArchTOI::openFile_A(string const& filename) {
+  ostr = new ofstream(filename.c_str());
+}
+
+void ArchTOI::outHeader_A(TOIIter& iter) {
+  if (!ostr) return;
+  for (list<string>::iterator i = headertoi.begin(); i != headertoi.end(); i++)
+    *ostr << (*i) << '\n';
+  for (list<string>::iterator i = headeropt.begin(); i != headeropt.end(); i++)
+    *ostr << (*i) << '\n';;
+  block_type_param* blk = iter.lastParam();
+  if (blk) {
+    int nb = blk->param.n_max_bolo;
+    for (int i=0; i<nb; i++) {
+#if version_num > 25
+      if (allBolos) {
+        *ostr << "$BOLO " << i << " " 
+            << blk->param.nom_coef[blk->param.bolo[i].numero_nom_coef].bolo_nom << " " 
+            << blk->param.bolo[i].bolo_code_util << '\n';
+      } else if (blk->param.bolo[i].bolo_code_util != bolo_hors_service &&
+                 blk->param.bolo[i].bolo_code_util != bolo_normal_non_transmis) {
+        *ostr << "$BOLO " << i << " " 
+            << blk->param.nom_coef[blk->param.bolo[i].numero_nom_coef].bolo_nom << "\n";
+      }
+#else
+      *ostr << "$BOLO " << i << " " << 
+        blk->param.bolo[i].bolo_nom << '\n';
+#endif
+    }
+  }
+  *ostr << "#END" << endl;
+}
+
+void ArchTOI::outValue_A(int icolumn, double value, bool notdef) {
+  if (!ostr) return;
+  if (icolumn > 0) *ostr << '\t';
+  if (notdef) {
+     *ostr << undef ;
+  } else {
+     *ostr << setprecision(11) << value ;
+  }
+}
+
+void ArchTOI::endLine_A() {
+  if (!ostr) return;
+  *ostr << '\n';
+}
+
+void ArchTOI::closeFile_A() {
+  delete ostr;
+  ostr = NULL;
+}
+
+
+void ArchTOI::openFile_F(string const& filename) {
+  fitsStatus=0;
+  remove(filename.c_str());
+  if (fits_create_file(&fptr, filename.c_str(), &fitsStatus)) {
+    fits_report_error(stderr, fitsStatus);
+    exit(-1);
+  }
+}
+
+void ArchTOI::outHeader_F(TOIIter& iter) {  
+  int ncols=toinames.size();
+  
+  char** colnames = new (char*[ncols]);
+  char** coltypes = new (char*[ncols]);
+  char** colunits = new (char*[ncols]);
+  int j=0;
+  for (list<string>::iterator i = toinames.begin(); i != toinames.end(); i++,j++) {
+    colnames[j] = const_cast<char*>((*i).c_str()); // should work for most STL implementations... Check...
+    coltypes[j] = "1D";
+    colunits[j] = " ";
+  }
+  
+  fits_create_tbl(fptr, BINARY_TBL, 0, ncols, colnames, coltypes, colunits, NULL, &fitsStatus);
+  fits_write_date(fptr, &fitsStatus);
+
+  delete[] colunits;
+  delete[] coltypes;
+  delete[] colnames;
+
+  j=1;
+  // Rappel dans le header des requetes...
+  int ntoireq = headertoi.size();
+  fits_write_key(fptr, TINT, "TOIREQ", &ntoireq, NULL, &fitsStatus);
+  for (list<string>::iterator i = headertoi.begin(); i != headertoi.end(); i++,j++) {
+    char line[80];
+    strcpy(line, (*i).c_str());
+    char* pline = line;
+    fits_write_keys_str(fptr, "TOIREQ", j, 1, &pline, (char**) NULL, &fitsStatus);
+  }
+  j=1;
+  int noptreq = headeropt.size();
+  fits_write_key(fptr, TINT, "OPTREQ", &noptreq, NULL, &fitsStatus);
+  for (list<string>::iterator i = headeropt.begin(); i != headeropt.end(); i++,j++) {
+    char line[80];
+    strcpy(line, (*i).c_str());
+    char* pline = line;
+    fits_write_keys_str(fptr, "OPTREQ", j, 1, &pline, (char**) NULL, &fitsStatus);
+  }
+
+  // Noms des bolos
+  block_type_param* blk = iter.lastParam();
+  if (blk) {
+    int nb = blk->param.n_max_bolo;
+    j=0;
+    for (int i=0; i<nb; i++) {
+#if version_num > 25
+      if (allBolos || 
+           (blk->param.bolo[i].bolo_code_util != bolo_hors_service &&
+            blk->param.bolo[i].bolo_code_util != bolo_normal_non_transmis)) {
+        //j++;
+        char line[80];
+        strcpy(line, blk->param.nom_coef[blk->param.bolo[i].numero_nom_coef].bolo_nom);
+        char* pline = line;
+        fits_write_keys_str(fptr, "BOLO", i, 1, &pline, (char**) NULL, &fitsStatus);
+      }
+#else
+        //j++;
+        char line[80];
+        strcpy(line, blk->param.bolo[i].bolo_nom);
+        char* pline = line;
+        fits_write_keys_str(fptr, "BOLO", i, 1, &pline, (char**) NULL, &fitsStatus);
+#endif
+    }
+    //fits_write_key(fptr, TINT, "BOLO", &j, NULL, &fitsStatus);
+  }
+  fits_write_key_str(fptr, "TOIVERS", ARCHTOI_VERS, "Archtoi version",&fitsStatus);
+  fits_write_key_str(fptr, "TOITAG", ARCHTOI_TAG, "Archtoi cvs tag",&fitsStatus);
+  if (requestVersion != "")
+    fits_write_key_str(fptr, "REQVERS", (char*) requestVersion.c_str(), 
+                       "Request options version",&fitsStatus);
+  fits_write_comment(fptr, "Generated with archtoi " ARCHTOI_VERS, &fitsStatus);
+  char line[80];
+  sprintf(line, "using archeops.h %d", version_num);
+  fits_write_comment(fptr, line, &fitsStatus);
+  for (list<string>::iterator i = comments.begin(); i!=comments.end(); i++)
+    fits_write_comment(fptr, (char*)((*i).c_str()), &fitsStatus);
+  
+  fitsLine = 1;
+}
+
+void ArchTOI::outValue_F(int icolumn, double value, bool notdef) {
+  if (notdef && undef != "#") {
+    notdef = false;
+    value = undefV;
+  }
+  if (notdef) {
+    fits_write_col_null(fptr, icolumn+1, fitsLine, 1, 1, &fitsStatus); 
+  } else {
+    fits_write_col_dbl(fptr, icolumn+1, fitsLine, 1, 1, &value, &fitsStatus);
+  }
+}
+
+void ArchTOI::endLine_F() {
+  fitsLine++;
+}
+
+void ArchTOI::closeFile_F() {
+  fits_close_file(fptr, &fitsStatus);
+  fits_report_error(stderr, fitsStatus);  /* print out any error messages */
+}
Index: /tags/V_240999/Poubelle/archTOI.old/archtoi.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archtoi.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archtoi.h	(revision 439)
@@ -0,0 +1,70 @@
+// archtoi.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef ARCHTOI_H
+#define ARCHTOI_H
+
+#include <iostream.h>
+#include <string>
+#include <list>
+#include <vector>
+#include "toisvr.h"
+#include "fitsio.h"
+
+using namespace std; 
+
+class ArchTOI : public RequestHandler {
+public:
+  ArchTOI(istream& str);
+  ArchTOI(string const& filename);
+
+  void run(string const& outfilename);
+  
+  enum fmt {ascii_fmt, fits_fmt};
+  enum flg {hasflag = 1,
+            useNA   = 2};
+            
+  virtual bool processTOIReq(string line, string toiname, TOIKind toi, int index, 
+                             bool interp, bool repet, bool flag, bool notrig);
+  virtual bool processOption(string keyw, string args);
+  
+protected:
+  void init();
+  TOISvr svr;
+  list<string> headertoi;
+  list<string> headeropt;
+  list<string> toinames;
+  vector<flg>  toiflags;
+  fmt format;
+  string undef;
+  double undefV;
+  bool allBolos; // tous les bolos dans le header. Sinon seulement bolos transmis.
+  
+  void (ArchTOI::*openFile)(string const& filename);
+  void (ArchTOI::*outHeader)(TOIIter& iter);
+  void (ArchTOI::*outValue)(int icolumn, double value, bool notdef=false);
+  void (ArchTOI::*endLine)();
+  void (ArchTOI::*closeFile)();
+  
+  void openFile_A(string const& filename);
+  void outHeader_A(TOIIter& iter);
+  void outValue_A(int icolumn, double value, bool notdef=false);
+  void endLine_A();
+  void closeFile_A();
+
+  void openFile_F(string const& filename);
+  void outHeader_F(TOIIter& iter);
+  void outValue_F(int icolumn, double value, bool notdef=false);
+  void endLine_F();
+  void closeFile_F();
+  
+  fitsfile* fptr;
+  int fitsStatus;
+  int fitsLine;
+  ostream* ostr;
+  
+  string requestVersion;
+  list<string> comments;
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/archtoidump.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archtoidump.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archtoidump.cc	(revision 439)
@@ -0,0 +1,32 @@
+// archtoidump.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#include <iostream.h>
+#include <fstream.h>
+#include <iomanip.h>
+
+#include "archeopsfile.h"
+#include "archtoi.h"
+#include "toisvr.h"
+
+#ifdef __MWERKS__
+#include <console.h>
+#endif
+
+using namespace std;  //introduces namespace std
+
+int main(int argc, char** argv)
+{	
+#ifdef __MWERKS__
+    argc = ccommand(&argv);
+#endif
+    if (argc != 2) {
+      cerr << "usage: archtoidump file" << endl;
+      return(-1);
+    }
+    ArcheopsFile file(argv[1]);
+    while (file.nextBlock()) {
+      cout << file.blockKdName() << "\n";
+    }
+ }
+
Index: /tags/V_240999/Poubelle/archTOI.old/archtoimain.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archtoimain.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archtoimain.cc	(revision 439)
@@ -0,0 +1,38 @@
+// archtoimain.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#include <iostream.h>
+#include <fstream.h>
+#include <iomanip.h>
+
+#include "archeopsfile.h"
+#include "archtoi.h"
+#include "toisvr.h"
+
+//#include <profiler.h>
+
+#ifdef __MWERKS__
+#include <console.h>
+#endif
+
+using namespace std;  //introduces namespace std
+
+int main(int argc, char** argv)
+{	
+#ifdef __MWERKS__
+    argc = ccommand(&argv);
+#endif
+    if (argc != 3) {
+      cerr << "usage: archtoi reqfile datafile" << endl;
+      return(-1);
+    }
+    
+//   ProfilerInit(collectDetailed, bestTimeBase, 10000, 200);
+
+    
+    ArchTOI toi(argv[1]);
+    toi.run(argv[2]);
+    
+//    ProfilerDump("\pprofiler.data");
+    return(0);
+}
Index: /tags/V_240999/Poubelle/archTOI.old/archvers.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/archvers.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/archvers.h	(revision 439)
@@ -0,0 +1,7 @@
+#ifndef ARCHVERS_H
+#define ARCHVERS_H
+
+#define ARCHTOI_VERS "1.1"
+#define ARCHTOI_TAG  "V_240999"
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/arcunit.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/arcunit.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/arcunit.c	(revision 439)
@@ -0,0 +1,248 @@
+
+#include "manip.h"      
+#include "archeops.h"
+#include "arcunit.h"
+
+/**************************************************************************************/
+/*                                                                                    */
+/*          programme  contenant les conversions en mesure physique                   */
+/*                                                                                    */
+/*                                                                                    */
+/*                                                                                    */
+/**************************************************************************************/
+
+
+/* ----------------   block  dilution     ---------------------------------------------  */
+
+
+int	voyant_EVO(block_type_dilution*	blk)	{return((blk->switch_dil&switch_EVO)?0:1);}
+int	voyant_EVF(block_type_dilution*	blk)	{return((blk->switch_dil&switch_EVF)?0:1);}
+int	commande_EVO(block_type_dilution*	blk)	{return((blk->switch_dil&vanne_EVO)?0:1);}
+int	commande_EVF(block_type_dilution*	blk)	{return((blk->switch_dil&vanne_EVF)?0:1);}
+int	commande_EVB(block_type_dilution*	blk)	{return((blk->switch_dil&vanne_EVB)?0:1);}
+int	commande_EVV(block_type_dilution*	blk)	{return((blk->switch_dil&vanne_EVV)?0:1);}
+
+
+// les pressions et debits metres des injections de la dilution
+double pression_entree_3He(block_type_dilution*	blk)	
+		{return(40. *	val_multiplex(blk->ADC_dil[ p_R3])  -1.6);}	//	200 bars pour 5V et 1.6 bar d'offset
+
+double debit_3He(block_type_dilution*	blk)	
+		{return(2. 	* 	val_multiplex(blk->ADC_dil[ d_3He]) );}		//  10 MICRO MOLES  pour  5V
+
+double pression_sortie_3He(block_type_dilution*	blk)	
+		{return(20. 	*	val_multiplex(blk->ADC_dil[ p_C3]) );}		//	100 bars pour 5V
+	
+double pression_entree_4He(block_type_dilution*	blk)	
+		{return(40. 	*	val_multiplex(blk->ADC_dil[ p_R4])) ;}		//	200 bars pour 5V
+
+double debit_4He(block_type_dilution*	blk)	
+		{return(8. 	* 	val_multiplex(blk->ADC_dil[ d_4He]))	 ;}	//  40 MICRO MOLES  pour  5V
+//	,4. 	* 	val_multiplex(blk->ADC_dil[ d_4He])		//  20 MICRO MOLES  pour  5V
+
+double pression_sortie_4He(block_type_dilution*	blk)	
+		{return(20. 	*	val_multiplex(blk->ADC_dil[ p_C4]) );}		//	100 bars pour 5V
+	
+
+
+double pression_air_vanne(block_type_dilution*	blk)	
+		{return(20.*val_multiplex(blk->ADC_dil[ p_air]));}
+		
+double pression_pompe_charbon(block_type_dilution*	blk)	
+		{return(20.*val_multiplex(blk->ADC_dil[ p_charb]));}
+		
+
+double pression_membranne(block_type_dilution*	blk)	
+		{return(0.2*val_multiplex(blk->ADC_dil[ p_memb]));}
+		
+		
+double pression_externe(block_type_dilution*	blk)	
+		{return(0.2*val_multiplex(blk->ADC_dil[ p_haut]));}
+
+			
+		
+double tension_pile_10T(block_type_dilution*	blk)	
+		{return(2.03*val_multiplex(blk->ADC_dil[ p_10T]));}
+				
+double tension_pile_p18D(block_type_dilution*	blk)	
+		{return(3.90*val_multiplex(blk->ADC_dil[ p_p18D]));}
+				
+double tension_pile_m18D(block_type_dilution*	blk)	
+		{return(3.90*val_multiplex(blk->ADC_dil[ p_m18D]));}
+				
+double tension_pile_10B(block_type_dilution*	blk)	
+		{return(2.03*val_multiplex(blk->ADC_dil[ p_10B]));}
+				
+double tension_pile_p18B(block_type_dilution*	blk)	
+		{return(3.90*val_multiplex(blk->ADC_dil[ p_p18B]));}
+				
+double tension_pile_m18B(block_type_dilution*	blk)	
+		{return(3.90*val_multiplex(blk->ADC_dil[ p_m18B]));}
+				
+double tension_pile_Ch(block_type_dilution*	blk)	
+		{return(3.8*val_multiplex(blk->ADC_dil[ p_Ch]));}
+
+
+				
+int switch_pile_5(block_type_dilution*	blk)	
+		{return((blk->switch_dil&switch_pile_par_5)?1:0);}
+int switch_pile_15(block_type_dilution*	blk)	
+		{return((blk->switch_dil&switch_pile_par_15)?1:0);}
+
+
+double	temperature_caisson_haut1(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_h2]));}
+		
+double	temperature_caisson_haut2(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_h4]));}
+		
+double	temperature_caisson_bas1(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_b1]));}
+		
+double	temperature_caisson_bas2(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_b2]));}
+		
+double	temperature_caisson_tube_helium(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_b3]));}
+		
+double	temperature_caisson_piles(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_pile]));}
+		
+double	temperature_caisson_driver_moteur(block_type_dilution*	blk)
+		{return(val_temperature(blk->ADC_dil[ t_a1]));}
+		
+double	pression_helium_bain(block_type_dilution*	blk)
+		{return( 0.2*val_multiplex(blk->ADC_dil[ RP_He]));}
+		
+double	pression_pirani(block_type_dilution*	blk)
+		{return(val_multiplex(blk->ADC_dil[ pirani]));}
+
+
+
+
+
+/**********  coefficients  pour  les  mesures  bolo    **********************************/
+/*                         toutes les puissances en pW                                  */
+/*	-1-	loi de reponse thermique des bolos  avec R en ohms et T en Kelvin               */
+/*                                                                                      */
+/* 	T =  coef2  *   (   ln (  R / coef1) **  ( -1 / coef0 )                             */
+/*                                                                                      */
+/*	-2-	fuite thermique du bolo   coef 3,4                                              */
+/*                                                                                      */
+/*	Ptot =  coef3  *  ( (10*Tb) ** coef4    -    (10*Tcryo)  **  coef4 )                */
+/*                                                                                      */
+/*	-3-	calcul empirique de Pciel et de  tau	  coef  5,6                             */
+/*                                                                                      */
+/*	Pciel	=	coef5	- Pelec		coef5= I * Ai (tables xavier) 	                    */
+/*	tau	=	- ln ( 1 +  Pciel / coef6 )	coef6= I * Bi (tables xavier)                   */
+/*   										                                            */
+/* Pour les thermometres 1 à 4 (germanium et carbone Allan-Bradley) 		            */
+/* les coefficients sont utilisés differemment, ils permettent de convertir	            */
+/* R vers T		( c(6) est un offset sur la mesure de R par rapport  aux mesures 4 fils)*/
+/*   llR= log(log(R - c(6))-c(0))  						                                */
+/*    T	= exp(c(1) + c(2)* llR + c(3)* llR* llR + c(4)* llR* llR* llR +                 */
+/*            c(5)* llR* llR* llR* llR)                                                 */
+/*										                                                */
+/*	version vol Trapani									                                */
+/*	on corrige le biais de temperature coef2=1.1 old,  coef3=old/1.1^coef4	            */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/*										                                                */
+/****************************************************************************************/
+
+
+
+
+/* ------------------------------------   corps  des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+
+
+double		DAC_muV		(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int indice_bolo)
+{
+double div,car;
+car= (double)dac_V(reglage_pt->bolo[indice_bolo])  ;
+div=(double)param_pt->bolo[indice_bolo].bolo_diviseur;
+if(div) return (car *2441. /  div );					
+else	return(0);
+}
+
+
+
+double		DAC_muA		(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int indice_bolo)
+{
+double capa,tri;
+tri= (double)dac_I(reglage_pt->bolo[indice_bolo])  ;
+capa=((param_pt->bolo[indice_bolo].bolo_bebo==10)?0.000868 * (double)param_pt->bolo[indice_bolo].bolo_capa:0.001 * (double)param_pt->bolo[indice_bolo].bolo_capa);
+		/* capa en pF	*/
+return (tri * capa / (4096. * 22. * 20.) );					
+}
+
+
+double		bolo_muV	(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int valbrut,int indice_bolo)										
+{
+double x;
+int nb_coups;
+int aa;
+def_gains
+
+nb_coups= reglage_pt->horloge.nb_mesures/2 - reglage_pt->horloge.temp_mort;
+
+aa = (nb_coups<<14) + (nb_coups*190) ;
+x=((double)((valbrut-aa)<<1))/(double)nb_coups;
+x=	bol_micro_volt(x,(double)param_pt->bolo[indice_bolo].bolo_gain*gain_ampli(reglage_pt->bolo[indice_bolo]));
+return(x);
+}
+
+
+
+
+#define	c(i)		(1e-4*(double)param_pt->nom_coef[param_pt->bolo[indice_bolo].numero_nom_coef].coef[i])	
+
+double		bolo_temp	(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, double R,int indice_bolo)
+{
+double a,T;
+a=1;	if( (R>0) && (c(1) >0.01) )		a= log ( R / c(1) );
+T=0;	if( (a>0) && (c(0)>0.01) )		T= c(2) * pow( a , -1 / c(0) );
+return(T);
+}
+
+#undef c
+
+
+
+
+/* -------------------------------------------------------------  */
+
+
+unsigned int4	val_long(char x)
+{
+unsigned long a,xl;
+char aa;
+aa=x-2;
+a=aa;
+if(x<3)  xl=x;	else	xl=((a&1) + 2)<<(a>>1);
+return(xl);
+}
+
+
+double	val_double(char x)
+{
+unsigned long a,xl;
+if(x<0) x=-x;	a=x;	if(!a)  xl=0;	else	xl=((a&1) + 2)<<(a>>1);
+if(x>0)	return(1e-4*(double)xl);	else	return(-1e-4*(double)xl);
+}
+
+int	new_val_dac(int a,char  code)
+{
+if(code&0x80)	a=(code&0x7f) <<5 ;
+else	{
+	if(code&0x40)	a+=code&0x3f;	
+	else		a-=code&0x3f;	
+	}
+return(a);
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/arcunit.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/arcunit.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/arcunit.h	(revision 439)
@@ -0,0 +1,142 @@
+#define ARCUNIT_H
+
+
+/*======================================================================*/
+/*                                                                      */
+/* 		 arcunit.h  :	conversion en mesure physique               	*/
+/*                                                                      */
+/*======================================================================*/
+
+
+
+/* ----------------------------   prototypes des fonctions	 ------------------------------ */
+/* -------------------------------------------------------------------------------------------- */
+
+
+double		bolo_muV	(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int valbrut,int indice_bolo);											
+double		bolo_temp	(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, double R,int indice_bolo);
+
+double		DAC_muV		(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int indice_bolo);
+double		DAC_muA		(param_bolo*	param_pt,	reglage_bolo*	reglage_pt, int indice_bolo);
+
+int	voyant_EVO(block_type_dilution*	blk);
+int	voyant_EVF(block_type_dilution*	blk);
+int	commande_EVO(block_type_dilution*	blk);
+int	commande_EVF(block_type_dilution*	blk);
+int	commande_EVB(block_type_dilution*	blk);
+int	commande_EVV(block_type_dilution*	blk);
+
+
+double pression_entree_3He(block_type_dilution*	blk);	
+double debit_3He(block_type_dilution*	blk)	;
+double pression_sortie_3He(block_type_dilution*	blk)	;
+double pression_entree_4He(block_type_dilution*	blk)	;
+double debit_4He(block_type_dilution*	blk)	;
+double pression_sortie_4He(block_type_dilution*	blk)	;
+double pression_air_vanne(block_type_dilution*	blk)	;
+double pression_pompe_charbon(block_type_dilution*	blk);	
+double pression_membranne(block_type_dilution*	blk)	;
+double pression_externe(block_type_dilution*	blk)	;
+double tension_pile_10T(block_type_dilution*	blk)	;
+double tension_pile_p18D(block_type_dilution*	blk)	;
+double tension_pile_m18D(block_type_dilution*	blk)	;
+double tension_pile_10B(block_type_dilution*	blk)	;
+double tension_pile_p18B(block_type_dilution*	blk)	;
+double tension_pile_m18B(block_type_dilution*	blk)	;
+double tension_pile_Ch(block_type_dilution*	blk)	;
+int switch_pile_5(block_type_dilution*	blk)	;
+int switch_pile_15(block_type_dilution*	blk)	;
+double	temperature_caisson_haut1(block_type_dilution*	blk)	;
+double	temperature_caisson_haut2(block_type_dilution*	blk)	;
+double	temperature_caisson_bas1(block_type_dilution*	blk)	;
+double	temperature_caisson_bas2(block_type_dilution*	blk)	;
+double	temperature_caisson_tube_helium(block_type_dilution*	blk)	;
+double	temperature_caisson_piles(block_type_dilution*	blk)	;
+double	temperature_caisson_driver_moteur(block_type_dilution*	blk)	;
+double	pression_helium_bain(block_type_dilution*	blk)	;
+double	pression_pirani(block_type_dilution*	blk)	;
+
+
+
+
+/* 	cette fonction transforme un char (sur 8 bit) en double avec une echelle logarythmique	*/
+/*	elle est en particulier utilisée pour calculer les coef de la regul			*/
+
+double		val_double(char x);
+
+/* 	cette fonction transforme un char (sur 8 bit) en entier int4 (echelle logarythmique)	*/
+/*	elle est en particulier utilisée pour fixer le courant sur les bolometres		*/
+
+unsigned 	int4	val_long(char x);
+
+int			new_val_dac(int a,char  code); 
+
+
+
+/* ----------------------------   define utilise pour les calculs	 ------------------------------ */
+
+
+#define	bol_micro_volt(val,gain)	((1e7*(double)val)/(65536.*gain))
+/*  avec  gain = (double)parametr.bolo[bolo].bolo_gain*gain_ampli(reglage.bolo[bolo])				*/
+		
+
+/* gains 0 .. 15 pour MLPA  ///   gain 16..19  pour BEBO   ///   gain 20..22  pour BEDIF	*/		
+#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};
+		/*			gain bediff    10->9.3    40->37.77     200->189.74		*/
+
+#define		gain_ampli(aa)	gains_reels[gainbrut(aa)]		
+
+
+
+#define bit_piles_5V	1
+#define bit_piles_15V	2
+#define bit_piles_auto	4
+
+
+/*      signification des bit lus dans switch_dil	*/
+#define	switch_EVF		0x00000080	/*	contact fin de course vanne fermee	*/
+#define	switch_EVO		0x00000040	/*	contact fin de course vanne ouverte	*/
+
+/* les bit suivants sont envoyés par telecommande et relus dans switch_dil	*/
+#define	switch_helium		0x00200000	/*  13: commande sond niveau helium	*/
+#define switch_pile_par_5	0x00100000	/*  12: mise en parallele des piles pour le 5V	*/
+#define switch_pile_par_15	0x00080000	/*  11: mise en parallele des piles pour le 15V	*/
+#define vanne_EVB		0x00008000	/*  7: commande vanne brooks	*/
+#define vanne_EVO		0x00010000	/*  8: commande vanne EVO	*/
+#define vanne_EVV		0x00020000	/*  9: commande vanne EVV	*/
+#define vanne_EVF		0x00040000	/*  10: commande vanne EVF	*/
+#define chauffage1		0x00004000	/*  6: chauffage 1	*/
+#define chauffage2		0x00002000	/*  5: chauffage 1	*/
+#define chauffage3		0x00001000	/*  4: chauffage 1	*/
+#define chauffage4		0x00000800	/*  3: chauffage 1	*/
+#define chauffage5		0x00000400	/*  2: chauffage 1	*/
+#define chauffage6		0x00000200	/*  1: chauffage 1	*/
+#define chauffage7		0x00000100	/*  0: chauffage 7	*/
+
+#ifndef ARCUNIT_H
+enum{nbit_chauffage7,nbit_chauffage6,nbit_chauffage5,nbit_chauffage4,nbit_chauffage3
+	,nbit_chauffage2,nbit_chauffage1,nbit_vanne_EVB,nbit_vanne_EVO
+	,nbit_vanne_EVV,nbit_vanne_EVF,nbit_switch_pile_par_15,nbit_switch_pile_par_5,nbit_switch_helium};
+
+/*  position des mesures sur les multiplexeurs		*/
+/* J10A  ->  temperatures basses t_b1 t_b2,t_b3 t_b4 36 37 41 35	*/ 
+/* J10B  ->  temperatures basses t_a1 t_a2,t_a3 t_a4 38 11 34 28	*/ 
+/* J1??	 ->  temperatures hautes t_h1 t_h2,t_h3 t_h4	*/ 
+
+enum{
+/* multiplex11..18:*/	t_a2	,mul12_	,p_haut	,p_memb	,t_h1	,t_h4	,t_h3	,t_h2	
+/* multiplex21..28:*/,	mul21_	,mul22	,p_charb,p_R4	,mul25_	,p_C3	,p_R3	,t_a4	
+/* multiplex31..38:*/,	mul31_	,p_C4	,p_air	,t_a3	,t_b4	,t_b1	,t_b2	,t_a1	
+/* multiplex41..48:*/,	t_b3	,d_4He	,RP_He	,t_pile	,d_3He	,j_he3	,j_he7	,j_he4	
+/* multiplex51..58:*/,	j_he5	,j_he1	,j_he8	,j_he2	,j_he6	,pirani	,mul57	,mul58	
+/* multiplex61..68:*/,	p_m18B	,p_10B	,p_m18D	,mul64	,p_p18B	,p_10T	,p_Ch	,p_p18D		
+	};
+/* reste libres :  mul   12 - 21 - 22 - 25 -  31 - 44 - 57 - 58 - 64	*/
+/* T_A1 EST AUSSI LE DRIVER DU MOTEUR DE PIVOT   */
+
+#endif
+
+#define  val_multiplex(qq)	(0.0003052*(double)((qq)-0x8000))	
+#define  val_temperature(qq)	((val_multiplex(qq)<0.2)?-99:((1146.3/(val_multiplex(qq)-0.1)) - 245.13))
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/asigps.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/asigps.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/asigps.cc	(revision 439)
@@ -0,0 +1,57 @@
+// asigps.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+
+#include "asigps.h"
+#include <fstream.h>
+
+ASIGPS::ASIGPS(string const& filename) {
+  readFile(filename);
+}
+
+void ASIGPS::readFile(string const& filename) {
+  ifstream f(filename.c_str());
+  double omjd=0;
+  while (f) {
+    char line[500];
+    f.getline(line,500);
+    if (!f) break;
+    char*p = line;
+    double mjd, lat, lon, alt;
+    if (*p != '3' && *p != '2') continue;
+    p++;
+    if (*p != 'D' && *p != 'd') continue;
+    p+=3;
+    if (strncmp(p,"99/jul/1",8)) continue;
+    p+=8;
+    if (*p == '7') mjd = 1376.5;
+    else if (*p == '8') mjd = 1377.5;
+    else continue;
+    p++;p++;
+    int h,m,s;
+    sscanf(p,"%2d:%2d:%2d",&h,&m,&s);
+    mjd += (h+m/60.+s/3600.)/24.;
+    p += 9;
+    if (*p == 'N') s = 1;
+    else if (*p == 'S') s = -1;
+    else continue;
+    p++;
+    int d,fm;
+    sscanf(p,"%2d.%2d,%3d",&d,&m,&fm);
+    lat = s*(d + m/60. + fm/60000.);
+    p+=10;
+    if (*p == 'E') s = 1;
+    else if (*p == 'W') s = -1;
+    else continue;
+    p++;
+    sscanf(p,"%3d.%2d,%3d",&d,&m,&fm);
+    lon = s*(d + m/60. + fm/60000.);
+    p+=11;
+    sscanf(p,"%5d",&d);
+    alt = d;
+    p+=5;
+    if (*p != 'm') continue;
+    if (mjd < omjd) continue;
+    omjd = mjd;
+    AddValue(mjd, lat, lon, alt);
+  }
+}
Index: /tags/V_240999/Poubelle/archTOI.old/asigps.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/asigps.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/asigps.h	(revision 439)
@@ -0,0 +1,23 @@
+// asigps.h
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+
+#ifndef ASIGPS_H
+#define ASIGPS_H
+
+#include "auxinterpgps.h"
+#include <string>
+
+class ASIGPS : public AuxInterpGPS {
+public:
+  ASIGPS() {}
+  ASIGPS(string const& filename);
+  
+  void readFile(string const& filename);
+  
+  virtual AuxGPS* clone() {return new ASIGPS(*this);}
+
+protected:
+
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/auxgps.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/auxgps.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/auxgps.h	(revision 439)
@@ -0,0 +1,17 @@
+// auxgps.h
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+
+#ifndef AUXGPS_H
+#define AUXGPS_H
+
+class AuxGPS {
+public:
+  virtual ~AuxGPS() {}
+
+  virtual int getLocation(double mjd, double& lat, double& lon, double& alt)=0;
+  virtual AuxGPS* clone()=0;
+
+
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.cc	(revision 439)
@@ -0,0 +1,72 @@
+// auxinterpgps.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+
+#include "auxinterpgps.h"
+#include "fitsio.h"
+#include "archvers.h"
+
+AuxInterpGPS::AuxInterpGPS() {
+  ilastok = false;
+}
+
+void AuxInterpGPS::AddValue(double mjd, double lat, double lon, double alt) {
+  elems.insert(elem(mjd, lat, lon, alt));
+  ilastok = false;
+}
+
+void AuxInterpGPS::FindElem(double mjd) {
+  ilast = elems.upper_bound(elem(mjd,0,0,0));
+  ilastok = (ilast != elems.end() && ilast != elems.begin());
+}
+
+
+int AuxInterpGPS::getLocation(double mjd, double& lat, double& lon, double& alt) {
+  if (!ilastok ||
+      (mjd > (*ilast).mjd)) {
+    FindElem(mjd);
+  } else {
+    set<elem>::const_iterator i = ilast; i--;
+    if (mjd <= (*i).mjd) FindElem(mjd);
+  }
+  
+  
+
+  if (!ilastok) return -1;
+  double lastmjd = (*ilast).mjd;
+  if (mjd > lastmjd) return -1;
+  if (ilast == elems.begin()) return -1;
+  set<elem>::const_iterator i = ilast; i--;
+  double prevmjd = (*i).mjd;
+  if (mjd < prevmjd) return -1;
+  
+  double x = (mjd - prevmjd) / (lastmjd - prevmjd);
+  
+  lat = (*i).lat*(1-x) + (*ilast).lat*x;
+  lon = (*i).lon*(1-x) + (*ilast).lon*x;
+  alt = (*i).alt*(1-x) + (*ilast).alt*x;
+  
+  return 0;
+}
+
+void AuxInterpGPS::FitsDump(string const& filename) {
+  int fitsStatus=0;
+  fitsfile* fptr;
+  remove(filename.c_str());
+  fits_create_file(&fptr, filename.c_str(), &fitsStatus);
+  char* colnames[4] = {"MJD","LATITUDE","LONGITUDE","ALTITUDE"};
+  char* coltypes[4] = {"1D","1D","1D","1D"};
+  char* colunits[4] = {" ", " " , " ", " "};
+  fits_create_tbl(fptr, BINARY_TBL, 0, 4, colnames, coltypes, colunits, NULL, &fitsStatus);
+  fits_write_date(fptr, &fitsStatus);
+  fits_write_comment(fptr, "Generated with archtoi " ARCHTOI_VERS, &fitsStatus);
+  int fitsLine = 1;
+  for (set<elem>::iterator i = elems.begin(); i != elems.end(); i++,fitsLine++) {
+    fits_write_col_dbl(fptr, 1, fitsLine, 1, 1, (double*) &(*i).mjd, &fitsStatus);
+    fits_write_col_dbl(fptr, 2, fitsLine, 1, 1, (double*) &(*i).lat, &fitsStatus);
+    fits_write_col_dbl(fptr, 3, fitsLine, 1, 1, (double*) &(*i).lon, &fitsStatus);
+    fits_write_col_dbl(fptr, 4, fitsLine, 1, 1, (double*) &(*i).alt, &fitsStatus);
+  }
+
+  fits_close_file(fptr, &fitsStatus);
+  fits_report_error(stderr, fitsStatus);  /* print out any error messages */
+}
Index: /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/auxinterpgps.h	(revision 439)
@@ -0,0 +1,42 @@
+// auxinterpgps.h
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+
+#ifndef AUXINTERPGPS_H
+#define AUXINTERPGPS_H
+
+#include "auxgps.h"
+#include <set>
+#include <string>
+
+using namespace std;
+
+class AuxInterpGPS : public AuxGPS {
+public:
+  AuxInterpGPS();
+  virtual int getLocation(double mjd, double& lat, double& lon, double& alt);
+  
+  void FitsDump(string const& filename);
+  virtual AuxGPS* clone() {return new AuxInterpGPS(*this);}
+
+protected:
+  virtual void AddValue(double mjd, double lat, double lon, double alt);
+  virtual void FindElem(double mjd);
+
+  struct elem {
+     elem() {}
+     elem(double m, double la, double lo, double a)
+      : mjd(m), lat(la), lon(lo), alt(a) {}
+     double mjd;
+     double lat;
+     double lon;
+     double alt;
+     bool operator == (elem const& x) const {return mjd == x.mjd;}
+     bool operator < (elem const& x) const {return mjd < x.mjd;}
+  };
+  
+  set<elem> elems;
+  set<elem>::const_iterator ilast;
+  bool ilastok;
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/compress.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/compress.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/compress.c	(revision 439)
@@ -0,0 +1,429 @@
+#include "manip.h"
+#include "compress.h"
+
+
+/*******************************************************************************************/
+/****************   			 					************/
+/****************   			 		compress_3		************/
+/****************   			 					************/
+/*******************************************************************************************/
+
+static int filtre[16]={0xfffffff,0xffffffe,0xffffffc,0xffffff8,
+		0xffffff0,0xfffffe0,0xfffffc0,0xfffff80,
+		0xfffff00,0xffffe00,0xffffc00,0xffff800,
+		0xffff000,0xfffe000,0xfffc000,0xfff8000};
+int test[16]=  {0x00000000,0x00000001,0x00000002,0x00000004,
+		0x00000008,0x00000010,0x00000020,0x00000040,
+		0x00000080,0x00000100,0x00000200,0x00000400,
+		0x00000800,0x00001000,0x00002000,0x00004000};
+
+
+void  com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin);
+
+#define	data_mask	0xffff	/* masque pour les données en entree	*/
+#define	ecart_(i,n,val)		(( (in[(i*9+n)*pasin]&data_mask) | ecart_bit )-val);
+
+#define	ecart_mask		0x7	/*	masque pour l'ecart		*/		
+
+
+
+/*  compress un tableau in de n*9 points disposé avec un pas pasin	*/
+/*  les data compressées sont ecrites dans le tableau out de n points	*/
+/*  la valeur val est la valeur de reference du point origine		*/
+
+
+/*  comprime	9*n points  : 1er point dans 1er mot			*/
+/*			      tous les ecarts dans les n mots suivants	*/ 
+/*	9*n	==>	n+1	    pour  72 points :   9 mots		*/
+
+void compress_3_1(unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val;
+val=in[0]; out[0]=val;
+com_3(val,in,out+1,n/9,pasin);
+}
+
+
+
+
+void  com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1;
+unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7,ec8,ec9;
+int i,k,k1;unsigned long q;
+
+
+for(i=0;i<n;i++)
+	{
+	k=0;q=3;	/* 3 bit = 7 = +-3	*/
+
+	ec1=ecart_(i,0,val);
+	shif(ec1,k,q);
+	val1=new_val(val,ec1,k);
+	
+	k1=k;
+	ec2=ecart_(i,1,val1);
+	shif(ec2,k,q);
+	
+	if(k>k1)	{k1=k;val1=new_val(val,ec1,k);}
+	val1=new_val(val1,ec2,k);
+
+	ec3=ecart_(i,2,val1);
+	shif(ec3,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
+	val1=new_val(val1,ec3,k);
+
+	ec4=ecart_(i,3,val1);
+	shif(ec4,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k))&data_mask;}
+	val1=new_val(val1,ec4,k);
+
+	ec5=ecart_(i,4,val1);
+	shif(ec5,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k) 
+				+ arrondi(ec4,k))&data_mask;}
+	val1=new_val(val1,ec5,k);
+	
+	ec6=ecart_(i,5,val1);
+	shif(ec6,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
+					+ arrondi(ec4,k) + arrondi(ec5,k))&data_mask;}
+	val1=new_val(val1,ec6,k);
+	
+	ec7=ecart_(i,6,val1);
+	shif(ec7,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) 
+				+ arrondi(ec3,k) + arrondi(ec4,k) + arrondi(ec5,k) + arrondi(ec6,k))&data_mask;}
+	val1=new_val(val1,ec7,k);
+	
+	ec8=ecart_(i,7,val1);
+	shif(ec8,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
+					 + arrondi(ec4,k) + arrondi(ec5,k) + arrondi(ec6,k) + arrondi(ec7,k))&data_mask;}
+	val1=new_val(val1,ec8,k);
+	
+	ec9=ecart_(i,8,val1);
+	shif(ec9,k,q);
+	
+/*printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);	*/
+
+	ec1 =  arrondi(ec1,k) >> k;
+	ec2 =  arrondi(ec2,k) >> k;
+	ec3 =  arrondi(ec3,k) >> k;
+	ec4 =  arrondi(ec4,k) >> k;
+	ec5 =  arrondi(ec5,k) >> k;
+	ec6 =  arrondi(ec6,k) >> k;
+	ec7 =  arrondi(ec7,k) >> k;
+	ec8 =  arrondi(ec8,k) >> k;
+	ec9 =  arrondi(ec9,k) >> k;
+
+	out[i]= ((ec1&ecart_mask)<<29) | ((ec2&ecart_mask)<<26) | ((ec3&ecart_mask)<<23) 
+		| ((ec4&ecart_mask)<<20) | ((ec5&ecart_mask)<<17) | ((ec6&ecart_mask)<<14)
+		| ((ec7&ecart_mask)<<11)  | ((ec8&ecart_mask)<<8) | ((ec9&ecart_mask)<<5) | k ;
+
+
+/*	if(i<30)  printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
+
+	val=(val + ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 + ec8 + ec9 ) << k )) & data_mask;
+	}
+}
+
+
+
+/*******************************************************************************************/
+/****************   			 											*****************/
+/****************   			 		compress_4							*****************/
+/****************   			 											*****************/
+/*******************************************************************************************/
+
+void  com_4(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin);
+void  com_4_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin);
+
+
+#undef	ecart_mask		
+#define	ecart_mask	0xf		/*	masque pour l'ecart		*/		
+
+#undef	data_mask
+#define	data_mask	0xffff	/* masque pour les données en entree	*/
+#undef	ecart_
+#define	ecart_(i,n,val)		(( (in[(i*7+n)*pasin]&data_mask) | ecart_bit )-val);
+
+
+/*  compress un tableau in de n*7 points disposé avec un pas pasin	*/
+/*  les data compressées sont ecrites dans le tableau out de n points*/
+/*  la valeur val est la valeur de reference du point origine*/
+
+
+/*  comprime	7*n + 2  points  (de 16 bit chacun)  					*/
+/*	1er et 2 eme point dans 1er mot, les ecarts dans les n mots suivants*/ 
+/*	7*n + 2	==>	n+1	     ==>   pour  72 points :   11 mots  			*/
+
+void compress_4_1(unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1,val2;
+val1=in[0];val2=in[1];
+*out=( (val1<<16) & 0xffff0000 )	|	( ( val2 ) & 0xffff ) ;
+
+com_4(val2,in+2,out+1,n/7,pasin);
+}
+
+
+
+void  com_4(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1;
+unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
+int i,k,k1;unsigned long q;
+
+
+for(i=0;i<n;i++)
+	{
+	k=0;q=7;	/* 4 bit = 15 = +-7	*/
+
+	ec1=ecart_(i,0,val);
+	shif(ec1,k,q);
+	val1=new_val(val,ec1,k);
+	
+	k1=k;
+	ec2=ecart_(i,1,val1);
+	shif(ec2,k,q);
+	
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k))&data_mask;}
+	val1=new_val(val1,ec2,k);
+
+	ec3=ecart_(i,2,val1);
+	shif(ec3,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
+	val1=new_val(val1,ec3,k);
+
+	ec4=ecart_(i,3,val1);
+	shif(ec4,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k))&data_mask;}
+	val1=new_val(val1,ec4,k);
+
+	ec5=ecart_(i,4,val1);
+	shif(ec5,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k) + arrondi(ec4,k))&data_mask;}
+	val1=new_val(val1,ec5,k);
+	
+	ec6=ecart_(i,5,val1);
+	shif(ec6,k,q);
+
+	if(k>k1)	{k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
+					 + arrondi(ec4,k) + arrondi(ec5,k))&data_mask;}
+	val1=new_val(val1,ec6,k);
+	
+	ec7=ecart_(i,6,val1);
+	shif(ec7,k,q);
+	
+/*printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
+
+	ec1 =  arrondi(ec1,k) >> k;
+	ec2 =  arrondi(ec2,k) >> k;
+	ec3 =  arrondi(ec3,k) >> k;
+	ec4 =  arrondi(ec4,k) >> k;
+	ec5 =  arrondi(ec5,k) >> k;
+	ec6 =  arrondi(ec6,k) >> k;
+	ec7 =  arrondi(ec7,k) >> k;
+
+	out[i]= ((ec1&ecart_mask)<<28) | ((ec2&ecart_mask)<<24) | ((ec3&ecart_mask)<<20) 
+				| ((ec4&ecart_mask)<<16) | ((ec5&ecart_mask)<<12) | ((ec6&ecart_mask)<<8) | ((ec7&ecart_mask)<<4) | k ;
+
+
+/*	if(i<30)  printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
+
+	val=(val+ ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 ) << k ))&data_mask;
+	}
+}
+
+/********************************************************************************************/
+
+/*  compresse en 4 bit mais par paire (pour data provenant de la detection synchrone)		*/
+
+/*     21 bit maleur maximum			*/
+/*  comprime	7*n+2 points  : 1er et 2eme point dans 1er et 2eme mot, suite dans n mots	*/
+/*		différences entre valeures paires  et entre valeures impaires uniquement			*/ 
+/*	7*n+2	==>	n+2			==>  pour 72 points :		12 mots								*/
+
+#undef	data_mask
+#define	data_mask	0x1fffff	/* masque pour les données en entree 21 bit	*/
+#undef	ecart_
+#define	ecart_(i,n,val)		(( (in[(i*7+n)*pasin]&data_mask) | ecart_bit )-val);
+
+void compress_4_2(unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1,val2;
+val1=in[0]&data_mask;		val2=in[1]&data_mask;
+out[0]=val1;	out[1]=val2;
+com_4_paire(val1,val2,in+2,out+2,n/7,pasin);
+}
+
+
+void  com_4_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1p,val2p;
+unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
+int i,k,k1;unsigned long q;
+
+
+for(i=0;i<n;i++)
+	{
+	k=0;q=7;	/* 4 bit = 15 = +-7	*/
+
+	ec1=ecart_(i,0,val1);
+	shif(ec1,k,q);
+	
+	ec2=ecart_(i,1,val2);
+	shif(ec2,k,q);
+	
+	k1=k;
+	val1p=new_val(val1,ec1,k);
+
+
+	ec3=ecart_(i,2,val1p);
+	shif(ec3,k,q);
+
+	val2p=new_val(val2,ec2,k);
+
+	ec4=ecart_(i,3,val2p);
+	shif(ec4,k,q);
+
+	if(k>k1)	{k1=k;val1p=new_val(val1,ec1,k);val2p=new_val(val2,ec2,k);}
+	
+	val1p=new_val(val1p,ec3,k);		
+
+	ec5=ecart_(i,4,val1p);
+	shif(ec5,k,q);
+
+	if(k>k1)	{	k1=k;
+				val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
+				val2p=(val2 + arrondi(ec2,k))&data_mask;
+				}
+	val2p=new_val(val2p,ec4,k);		
+	
+	ec6=ecart_(i,5,val2p);
+	shif(ec6,k,q);
+
+	if(k>k1)	{	k1=k;
+				val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
+				val2p=(val2 + arrondi(ec2,k) + arrondi(ec4,k))&data_mask;
+				}
+	val1p=new_val(val1p,ec5,k);		
+	
+	ec7=ecart_(i,6,val1p);
+	shif(ec7,k,q);
+	
+/*printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
+
+	ec1 =  arrondi(ec1,k) >> k;
+	ec2 =  arrondi(ec2,k) >> k;
+	ec3 =  arrondi(ec3,k) >> k;
+	ec4 =  arrondi(ec4,k) >> k;
+	ec5 =  arrondi(ec5,k) >> k;
+	ec6 =  arrondi(ec6,k) >> k;
+	ec7 =  arrondi(ec7,k) >> k;
+
+	out[i]= ((ec1&ecart_mask)<<28) | ((ec2&ecart_mask)<<24) | ((ec3&ecart_mask)<<20) 
+				| ((ec4&ecart_mask)<<16) | ((ec5&ecart_mask)<<12) | ((ec6&ecart_mask)<<8) | ((ec7&ecart_mask)<<4) | k ;
+
+
+/*	if(i<30)  printf("i=%d  k=%d  ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
+
+	val1p = (val1 + ( (ec1 + ec3 + ec5 + ec7 ) << k ))&data_mask;
+	val1= (val2 + ( (ec2 + ec4	+ ec6 ) << k ))&data_mask;
+	val2 = val1p;
+	}
+}
+
+
+
+
+
+/*******************************************************************************************/
+/****************   			 											*****************/
+/****************   			 		compress_7							*****************/
+/****************   			 											*****************/
+/*******************************************************************************************/
+
+/*******************************************************************************************/
+
+/*  compresse en 7 bit mais par paire (pour data provenant de la detection synchrone      */
+
+/* ne prend que les 21 bit de poid faible dans le mot en entree			*/
+/*  comprime	4*n points  : 1er et 2eme point dans 1er mot (16 bit chacun),  suite dans n mots		*/
+/*		différences entre valeures paires  et entre valeures impaires uniquement			*/ 
+/*	4*n	==>	n+1	*/
+
+
+
+void  compress_7_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin);
+
+#undef	data_mask
+#define	data_mask	0x1fffff	/* masque pour les données en entree 21 bit	*/
+#undef	ecart_mask		
+#define	ecart_mask		0x7f		/*	masque pour l'ecart 7 bits		*/		
+
+#undef	 ecart_
+#define	ecart_(i,n,val)		(( (in[(i*4+n)*pasin]&data_mask) | ecart_bit )-val);
+
+
+void compress_7_2(unsigned long* in,unsigned long*out,int n,int pasin)
+{
+unsigned long val1,val2;
+val1=in[0]&0x1fffe0;val2=in[pasin]&0x1fffe0;
+*out=( (val1<<11) & 0xffff0000 )	|	( (val2 >> 5) & 0xffff ) ;
+
+/*printf("in[0]=%x  val1=%x        in[1]=%x   val2=%x  \n",in[0],val1,in[1],val2);
+printf("in[2]=%x    in[3]=%x   \n",in[2],in[3]);*/
+compress_7_paire(val1,val2,in,out+1,n/4,pasin);
+}
+
+
+void  compress_7_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
+{
+
+unsigned long val1p,val2p;
+unsigned long ec1,ec2,ec3,ec4;
+int i,k;unsigned long q;
+
+
+for(i=0;i<n;i++)
+	{
+	k=0;q=63;		/* 7 bit ->  127  ->   +-63	*/
+
+	ec1=ecart_(i,0,val1);	shif(ec1,k,q);	
+	
+	ec2=ecart_(i,1,val2);	shif(ec2,k,q);
+	val1p =new_val(val1,ec1,k);
+
+	ec3=ecart_(i,2,val1p);	shif(ec3,k,q);
+	val2p=new_val(val2,ec2,k);
+
+	ec4=ecart_(i,3,val2p);	shif(ec4,k,q);
+	
+	ec1 =  arrondi(ec1,k) >> k;
+	ec2 =  arrondi(ec2,k) >> k;
+	ec3 =  arrondi(ec3,k) >> k;
+	ec4 =  arrondi(ec4,k) >> k;
+
+	out[i]= ((ec1&ecart_mask)<<25) | ((ec2&ecart_mask)<<18) | ((ec3&ecart_mask)<<11) | ((ec4&ecart_mask)<<4) | k ;
+
+	/*if(i<5)  printf("i=%d  k=%d  ec= %x %x %x %x  out=%x \n",i,k,ec1,ec2,ec3,ec4,out[i]);	*/
+
+	val1=(val1+ ( (ec1 + ec3 ) << k ))&data_mask;
+	val2=(val2+ ( (ec2 + ec4 ) << k ))&data_mask;
+	}
+}
+
+
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/compress.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/compress.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/compress.h	(revision 439)
@@ -0,0 +1,105 @@
+
+/************************************************************************/
+/*******   							*********/
+/*******   	compresseur de données rangées en ligne		*********/
+/*******  			 				*********/
+/************************************************************************/
+
+
+
+
+/*  	comprime une suite de n valeures  (dans des mots de 32 bit)	*/
+/*  		valeures  codées sur 22 bit maximum			*/
+/*	resultat de la compression codé sur 7 bit + exposant		*/
+/*	n doit etre multiple de  4					*/
+/*	le fichier resultat a pour longueur   n/4 + 1 mot de 32 bit	*/
+/*		4 * n  octets   ==>	n + 4 octets			*/
+/*	pour 	n = 72	  en sortie	19 mots = 76 octets		*/
+
+void compress_7_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
+void decompress_7_1(int4* in,int4*out,int n);
+
+
+/*  	comprime une suite de n valeures  (dans des mots de 32 bit)	*/
+/*  		valeures  codées sur 16 bit maximum			*/
+/*	resultat de la compression codé sur 4 bit + exposant		*/
+/*	n doit etre  ( multiple de  7 )  + 2				*/
+/*	le fichier resultat a pour longueur   (n-2)/7 + 1 mot de 32 bit	*/
+/*		4 * n  octets   ==>	4 * (n-2) / 7 + 4  octets	*/
+/*	pour 	n = 72	  en sortie	11 mots = 44 octets		*/
+
+void compress_4_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
+void decompress_4_1(int4* in,int4*out,int n);
+
+
+/*  	comprime une suite de n valeures  (dans des mots de 32 bit)	*/
+/*  		valeures  codées sur 16 bit maximum			*/
+/*	resultat de la compression codé sur 3 bit + exposant		*/
+/*	n doit etre  ( multiple de  9 )					*/
+/*	le fichier resultat a pour longueur   n/9 + 1 mot de 32 bit	*/
+/*		4 * n  octets   ==>	4 * n / 9 + 4  octets		*/
+/*	pour 	n = 72	  en sortie	9 mots = 36 octets		*/
+
+
+void compress_3_1(unsigned int4* in,unsigned int4*out,int n,int pasin);
+void decompress_3_1(int4* in,int4*out,int n);
+
+/************************************************************************/
+/***********   							*********/
+/***********   compresseur de données rangées par paires	*********/
+/***********		(data bolo par exemple)			*********/
+/***********   			 				*********/
+/************************************************************************/
+
+
+
+/*  	comprime une suite de n valeures  (dans des mots de 32 bit)	*/
+/*  		valeures  codées sur 21 bit maximum			*/
+/*	resultat de la compression codé sur 7 bit + exposant		*/
+/*	n doit etre multiple de  4					*/
+/*	le fichier resultat a pour longueur   n/4 + 1 mot de 32 bit	*/
+/*		4 * n  octets   ==>	n + 4 octets			*/
+/*	pour 	n = 72	  en sortie	19 mots = 76 octets		*/
+
+
+void compress_7_2(unsigned int4* in,unsigned int4*out,int n,int pasin);
+void decompress_7_2(int4* in,int4*out,int n);
+
+
+
+/*  	comprime une suite de n valeures  (dans des mots de 32 bit)	*/
+/*  		valeures  codées sur 32 bit maximum			*/
+/*	resultat de la compression codé sur 4 bit + exposant		*/
+/*	n doit etre  ( multiple de  7 )  + 2				*/
+/*	le fichier resultat a pour longueur   (n-2)/7 + 2 mot de 32 bit	*/
+/*		4 * n  octets   ==>	4 * (n-2) / 7 + 8  octets	*/
+/*	pour 	n = 72	  en sortie	12 mots = 48 octets		*/
+
+
+
+void compress_4_2(unsigned int4* in,unsigned int4*out,int n,int pasin);
+void decompress_4_2(int4* in,int4*out,int n);
+
+
+																						
+/************************************************************************/
+/***********   							*********/
+/***********   	definitions communes pour les compresseurs	*********/
+/***********   			 				*********/
+/************************************************************************/
+
+/*	tous les nombres sont des entiers unsigned long pour compress				*/
+/*Les valeures de la table d'entree sont consideres comme toujours positives et sur 21 bits	*/
+/*  les valeurs de reference pour le calcul des ecarts sont augmentees de ecart_bit=0x10000000	*/
+/*	LES ECARTS SONT DES ENTIERS POSITIFS (ecart_bit +  valeur courante - valeur precedente) */
+
+/*  pour tous les compresseurs	*/
+#define kmax_	15		/*  valeur maximum de l'exposant	*/
+#define	ecart_bit	0x10000000
+#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;}
+#define	arrondi(ec,k)	((ec &  filtre[k]) +( (ec & test[k]) <<1 ) ) /* resultat sur 28 bit  */	
+#define new_val(val,ec,k)	((val + arrondi(ec,k))&data_mask);
+
+/* pour les decompresseurs	*/
+#define	recup(ec,sss,k) {ec=((R>>sss)&ecart_mask);if(ec & sgbi_ ) ec|= sign_ ; ec<<=k;}
+
Index: /tags/V_240999/Poubelle/archTOI.old/decompress.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/decompress.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/decompress.c	(revision 439)
@@ -0,0 +1,292 @@
+//#include <manip.h>
+#include "archeops.h"
+#include "compress.h"
+
+
+//*******************************************************************************************
+//****************   			 											*****************
+//****************   			 		decompress_3							*****************
+//****************   			 											*****************
+//*******************************************************************************************
+
+#define	ecart_mask		0x7	/*	masque pour l'ecart		*/		
+
+void  decom_3(int4 val,int4* in,int4*out,int n);
+
+#define	k_mask	0xf		/*	masque pour l'exposant		*/
+#define	sgbi_	0x4		/*	bit de signe de l'ecart		*/
+#define	sign_	0xfffffff8	/*	masque de signe de l'ecart	*/
+
+//  compress un tableau in de n*9 points disposé avec un pas pasin
+//  les data compressées sont ecrites dans le tableau out de n points
+//  la valeur val est la valeur de reference du point origine
+
+/*  comprime	9*n points  : 1er point dans 1er mot, tous les ecarts dans les n mots suivants		*/ 
+/*	9*n	==>	n+1	    pour  72 points :   9 mots			*/
+
+
+void decompress_3_1(int4* in,int4*out,int n)
+{
+int4 val;
+val=	*in;
+decom_3(val,in+1,out,n/9);
+}
+
+
+
+void  decom_3(int4 val,int4* in,int4*out,int n)
+{
+register int4 R;
+int4 ec1,ec2,ec3,ec4,ec5,ec6,ec7,ec8,ec9;
+int i,k;
+
+for(i=0;i<n;i++)
+	{
+	R=in[i];
+	k=R&k_mask;
+	recup(ec1,29,k); 
+	recup(ec2,26,k); 
+	recup(ec3,23,k); 
+	recup(ec4,20,k); 
+	recup(ec5,17,k); 
+	recup(ec6,14,k); 
+	recup(ec7,11,k);
+	recup(ec8,8,k);
+	recup(ec9,5,k);
+	
+	val+=ec1; 	out[i*9]=val;	 
+	val+=ec2;	out[i*9+1]=val;	 
+	val+=ec3;	out[i*9+2]=val;	 
+	val+=ec4;	out[i*9+3]=val;	 
+	val+=ec5;	out[i*9+4]=val;	 
+	val+=ec6;	out[i*9+5]=val;	 
+	val+=ec7;	out[i*9+6]=val;	 
+	val+=ec8;	out[i*9+7]=val;	 
+	val+=ec9;	out[i*9+8]=val;	 
+	}
+}
+
+
+
+//*******************************************************************************************
+//****************   			 											*****************
+//****************   			 		decompress_4							*****************
+//****************   			 											*****************
+//*******************************************************************************************
+
+void  decom_4(int4 val,int4* in,int4*out,int n);
+void  decom_4_paire(int4 val1,int4 val2,int4* in,int4*out,int n);
+
+#undef	ecart_mask		
+#define	ecart_mask	0xf		/*	masque pour l'ecart		*/		
+#undef	sgbi_
+#undef	sign_
+
+
+
+#define	k_mask	0xf		/*	masque pour l'exposant		*/
+#define	sgbi_	0x8		/*	bit de signe de l'ecart		*/
+#define	sign_	0xfffffff0	/*	masque de signe de l'ecart	*/
+
+
+/*  comprime	7*n + 2  points  (de 16 bit chacun)  				*/
+/*	1er et 2 eme point dans 1er mot, les ecarts dans les n mots suivants	*/ 
+/*	7*n + 2	==>	n+1	     ==>   pour  72 points :   11 mots  	*/
+
+
+void decompress_4_1(int4* in,int4*out,int n)
+{
+int4 val1,val2;
+val1=	( (*in & 0xffff0000)>>16 ) & 0x0000ffff;
+val2=	( (*in & 0x0000ffff)     )  & 0x0000ffff;
+out[0]=val1;
+out[1]=val2;
+decom_4(val2,in+1,out+2,n/7);
+}
+
+
+
+void  decom_4(int4 val,int4* in,int4*out,int n)
+{
+register int4 R;
+int4 ec1,ec2,ec3,ec4,ec5,ec6,ec7;
+int i,k;
+
+for(i=0;i<n;i++)
+	{
+	R=in[i];
+	k=R&k_mask;
+	recup(ec1,28,k); 
+	recup(ec2,24,k); 
+	recup(ec3,20,k); 
+	recup(ec4,16,k); 
+	recup(ec5,12,k); 
+	recup(ec6,8,k); 
+	recup(ec7,4,k);
+	
+	val+=ec1; 	out[7*i]=val;	 
+	val+=ec2;	out[7*i+1]=val;	 
+	val+=ec3;	out[7*i+2]=val;	 
+	val+=ec4;	out[7*i+3]=val;	 
+	val+=ec5;	out[7*i+4]=val;	 
+	val+=ec6;	out[7*i+5]=val;	 
+	val+=ec7;	out[7*i+6]=val;	 
+	}
+}
+
+/********************************************************************************************/
+
+/*  compresse en 4 bit mais par paire (pour data provenant de la detection synchrone)		*/
+
+/*     21 bit maleur maximum									*/
+/*  comprime	7*n+2 points  : 1er et 2eme point dans 1er et 2eme mot, suite dans n mots	*/
+/*		différences entre valeures paires  et entre valeures impaires uniquement	*/ 
+/*	7*n+2	==>	n+2		==>  pour 72 points :	12 mots				*/
+
+
+void decompress_4_2(int4* in,int4*out,int n)
+{
+int4 val1,val2;
+val1=in[0];		val2=in[1];
+out[0]=val1;	out[1]=val2;
+decom_4_paire(val1,val2,in+2,out+2,n/7);
+}
+
+
+void  decom_4_paire(int4 val1,int4 val2,int4* in,int4*out,int n)
+{
+register int4 R;
+int4 ec1,ec2,ec3,ec4,ec5,ec6,ec7;
+int i,k;
+
+for(i=0;i<n;i++)
+	{
+	R=in[i];
+	k=R&k_mask;
+	recup(ec1,28,k); 
+	recup(ec2,24,k); 
+	recup(ec3,20,k); 
+	recup(ec4,16,k); 
+	recup(ec5,12,k); 
+	recup(ec6,8,k); 
+	recup(ec7,4,k);
+	
+//	printf("i=%d  k=%d  ec= %d %d %d    \n",i,k,ec1,ec2,ec3);
+
+
+	val1+=ec1; 	out[7*i]=val1;	 
+	val2+=ec2;	out[7*i+1]=val2;	 
+	val1+=ec3;	out[7*i+2]=val1;	 
+	val2+=ec4;	out[7*i+3]=val2;	 
+	val1+=ec5;	out[7*i+4]=val1;	 
+	val2+=ec6;	out[7*i+5]=val2;	 
+	val1+=ec7;	out[7*i+6]=val1;
+	R=val1;val1=val2;val2=R;	 
+	}
+}
+
+
+//*******************************************************************************************
+//****************   			 											*****************
+//****************   			 		compress_7							*****************
+//****************   			 											*****************
+//*******************************************************************************************
+
+#undef	sgbi_
+#undef	sign_
+
+
+#undef	ecart_mask		
+#define	ecart_mask		0x7f		/*	masque pour l'ecart 7 bits		*/		
+#define	sgbi_	0x40		/*	bit de signe de l'ecart		*/
+#define	sign_	0xffffff80	/*	masque de signe de l'ecart	*/
+
+
+/*  comprime	4*n points  : 1er point dans 1er mot, tous les ecarts dans les n mots suivants		*/ 
+/*	4*n	==>	n+1	*/
+
+void  decom_7(int4 val,int4* in,int4*out,int n);
+
+void decompress_7_1(int4* in,int4*out,int n)
+{
+int4 val;
+val=*in;
+*out=val;
+decom_7(val,in+1,out,n/4);
+}
+
+
+
+/*  compress un tableau in de n*4 points disposé avec un pas pasin	*/
+/*  les data compressées sont ecrites dans le tableau out de n points	*/
+/*  la valeur val est la valeur de reference du point origine	*/
+
+void  decom_7(int4 val,int4* in,int4*out,int n)
+{
+register int4 R;
+int4 ec1,ec2,ec3,ec4;
+int i,k;
+
+for(i=0;i<n;i++)
+	{
+	R=in[i];
+	k=R&k_mask;
+	recup(ec1,25,k); 
+	recup(ec2,18,k); 
+	recup(ec3,11,k); 
+	recup(ec4,4,k); 
+	
+	val+=ec1; 	out[4*i]=val;	 
+	val+=ec2;	out[4*i+1]=val;	 
+	val+=ec3;	out[4*i+2]=val;	 
+	val+=ec4;	out[4*i+3]=val;	 
+	}
+}
+
+/********************************************************************************/
+/*  compresse en 7 bit mais par paire (pour data de la detection synchrone	*/
+/* 21 bit maleur maximum							*/
+/*  comprime	4*n points  : 1er et 2eme point dans 1er mot (16 bit chacun),	*/
+/*				 suite dans n mots				*/
+/*	différences entre valeures paires  et entre valeures impaires uniquement*/ 
+/*			4*n	==>	n+1					*/
+/********************************************************************************/
+
+void  decom_7_paire(int4 val1,int4 val2,int4* in,int4*out,int n);
+
+void decompress_7_2(int4* in,int4*out,int n)
+{
+int4 val1,val2;
+val1=	( (*in & 0xffff0000)>>11 ) & 0x001fffe0;
+val2=	( (*in & 0x0000ffff)<<5 )  & 0x001fffe0;
+/*printf("val1=%x  val2=%x  \n",val1,val2);*/
+decom_7_paire(val1,val2,in+1,out,n/4);
+}
+
+
+void  decom_7_paire(int4 val1,int4 val2,int4* in,int4*out,int n)
+{
+register int4 R;
+int4 ec1,ec2,ec3,ec4;
+int i,k;
+
+for(i=0;i<n;i++)
+	{
+	R=in[i];
+	k=R&k_mask;
+	recup(ec1,25,k); 
+	recup(ec2,18,k); 
+	recup(ec3,11,k); 
+	recup(ec4,4,k); 
+	
+	val1+=ec1; 	out[4*i]=val1;	 
+	val2+=ec2;	out[4*i+1]=val2;	 
+	val1+=ec3;	out[4*i+2]=val1;	 
+	val2+=ec4;	out[4*i+3]=val2;	 
+
+/*if(i<5)  printf("in=%x  i=%d  k=%d  ec= %x %x %x %x  \n",R,i,k,ec1,ec2,ec3,ec4);*/	
+
+	}
+}
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/dirent.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/dirent.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/dirent.h	(revision 439)
@@ -0,0 +1,38 @@
+/* $Id: dirent.h,v 1.1.1.1 1999-05-25 08:25:53 ansari Exp $ */
+
+#ifndef _DIRENT_H
+#define _DIRENT_H
+
+#include <stat.h>
+
+typedef unsigned short			ushort_t;
+
+typedef struct {
+	short volrefnum;
+	long dirid;
+	int nextfile;
+} DIR;
+
+struct dirent {
+    ino_t    d_ino;               /* file number of entry */
+    ushort_t d_reclen;            /* length of this record */
+    ushort_t d_namlen;            /* length of string in d_name */
+	char d_name[FILENAME_MAX];
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DIR *opendir(char const *);
+struct dirent *readdir(DIR *);
+int closedir(DIR *);
+void rewinddir(DIR*);
+//long telldir(DIR *);
+//void seekdir(DIR *, long);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/dyffttools.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/dyffttools.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/dyffttools.cc	(revision 439)
@@ -0,0 +1,29 @@
+#include "dyffttools.h"
+
+
+//	Librairie FFTMayer enrobée pour etre utilisable facilement en C++
+// 	Un debut : D. Yvon 07/99
+
+
+// Fonction de fenetrage D. Yvon
+// Cut est la fraction du tableau ou l'on effectue le bizeau pour imposer 
+// par continuite une amplitude zero aux bornes :
+/*
+       ------------------
+      /                  \
+    /                      \
+  /                          \  
+/      Î     cuts       Î      \
+*/
+
+
+
+double DYWindow(double index, double indexMax) {
+	double temp;
+	double Cut=1./16.;
+	if(index<(indexMax/16.)) temp=index/indexMax*16.;
+	else if((indexMax-index)<(indexMax/16.)) temp=(indexMax-index)/indexMax*16.;
+	else temp=1.;
+	return temp;
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/dyffttools.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/dyffttools.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/dyffttools.h	(revision 439)
@@ -0,0 +1,6 @@
+#ifndef DYFFTTOOLS_SEEN
+#define DYFFTTOOLS
+double DYWindow(double index, double indexMax);
+
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/fft_mayer.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/fft_mayer.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/fft_mayer.cc	(revision 439)
@@ -0,0 +1,258 @@
+/*
+** FFT and FHT routines
+**  Copyright 1988, 1993; Ron Mayer
+**  
+**  fht(fz,n);
+**      Does a hartley transform of "n" points in the array "fz".
+**  fft(n,real,imag)
+**      Does a fourier transform of "n" points of the "real" and
+**      "imag" arrays.
+**  ifft(n,real,imag)
+**      Does an inverse fourier transform of "n" points of the "real"
+**      and "imag" arrays.
+**  realfft(n,real)
+**      Does a real-valued fourier transform of "n" points of the
+**      "real" array. The real part of the transform ends
+**      up in the first half of the array and the imaginary part of the
+**      transform ends up in the second half of the array.
+**  realifft(n,real)
+**      The inverse of the realfft() routine above.
+**      
+**      
+** NOTE: This routine uses at least 2 patented algorithms, and may be
+**       under the restrictions of a bunch of different organizations.
+**       Although I wrote it completely myself; it is kind of a derivative
+**       of a routine I once authored and released under the GPL, so it
+**       may fall under the free software foundation's restrictions;
+**       it was worked on as a Stanford Univ project, so they claim
+**       some rights to it; it was further optimized at work here, so
+**       I think this company claims parts of it.  The patents are
+**       held by R. Bracewell (the FHT algorithm) and O. Buneman (the
+**       trig generator), both at Stanford Univ.
+**       If it were up to me, I'd say go do whatever you want with it;
+**       but it would be polite to give credit to the following people
+**       if you use this anywhere:
+**           Euler     - probable inventor of the fourier transform.
+**           Gauss     - probable inventor of the FFT.
+**           Hartley   - probable inventor of the hartley transform.
+**           Buneman   - for a really cool trig generator
+**           Mayer(me) - for authoring this particular version and
+**                       including all the optimizations in one package.
+**       Thanks,
+**       Ron Mayer; mayer@acuson.com
+**
+*/
+
+#include "mayer_fft.h"
+
+#define GOOD_TRIG
+#include "trigtbl.h"
+
+char fht_version[] = "Brcwl-Hrtly-Ron-dbld";
+
+#define SQRT2_2   0.70710678118654752440084436210484
+#define SQRT2   2*0.70710678118654752440084436210484
+
+void fht(REAL *fz,int n)
+{
+ REAL a,b;
+ REAL c1,s1,s2,c2,s3,c3,s4,c4;
+ REAL f0,g0,f1,g1,f2,g2,f3,g3;
+ int i,k,k1,k2,k3,k4,kx;
+ REAL *fi,*fn,*gi;
+ TRIG_VARS;
+
+ for (k1=1,k2=0;k1<n;k1++)
+    {
+     REAL a;
+     for (k=n>>1; (!((k2^=k)&k)); k>>=1);
+     if (k1>k2)
+	{
+	     a=fz[k1];fz[k1]=fz[k2];fz[k2]=a;
+	}
+    }
+ for ( k=0 ; (1<<k)<n ; k++ );
+ k  &= 1;
+ if (k==0)
+    {
+	 for (fi=fz,fn=fz+n;fi<fn;fi+=4)
+	    {
+	     REAL f0,f1,f2,f3;
+	     f1     = fi[0 ]-fi[1 ];
+	     f0     = fi[0 ]+fi[1 ];
+	     f3     = fi[2 ]-fi[3 ];
+	     f2     = fi[2 ]+fi[3 ];
+	     fi[2 ] = (f0-f2);	
+	     fi[0 ] = (f0+f2);
+	     fi[3 ] = (f1-f3);	
+	     fi[1 ] = (f1+f3);
+	    }
+    }
+ else
+    {
+	 for (fi=fz,fn=fz+n,gi=fi+1;fi<fn;fi+=8,gi+=8)
+	    {
+	     REAL s1,c1,s2,c2,s3,c3,s4,c4,g0,f0,f1,g1,f2,g2,f3,g3;
+	     c1     = fi[0 ] - gi[0 ];
+	     s1     = fi[0 ] + gi[0 ];
+	     c2     = fi[2 ] - gi[2 ];
+	     s2     = fi[2 ] + gi[2 ];
+	     c3     = fi[4 ] - gi[4 ];
+	     s3     = fi[4 ] + gi[4 ];
+	     c4     = fi[6 ] - gi[6 ];
+	     s4     = fi[6 ] + gi[6 ];
+	     f1     = (s1 - s2);	
+	     f0     = (s1 + s2);
+	     g1     = (c1 - c2);	
+	     g0     = (c1 + c2);
+	     f3     = (s3 - s4);	
+	     f2     = (s3 + s4);
+	     g3     = SQRT2*c4;		
+	     g2     = SQRT2*c3;
+	     fi[4 ] = f0 - f2;
+	     fi[0 ] = f0 + f2;
+	     fi[6 ] = f1 - f3;
+	     fi[2 ] = f1 + f3;
+	     gi[4 ] = g0 - g2;
+	     gi[0 ] = g0 + g2;
+	     gi[6 ] = g1 - g3;
+	     gi[2 ] = g1 + g3;
+	    }
+    }
+ if (n<16) return;
+
+ do
+    {
+     REAL s1,c1;
+     k  += 2;
+     k1  = 1  << k;
+     k2  = k1 << 1;
+     k4  = k2 << 1;
+     k3  = k2 + k1;
+     kx  = k1 >> 1;
+	 fi  = fz;
+	 gi  = fi + kx;
+	 fn  = fz + n;
+	 do
+	    {
+	     REAL g0,f0,f1,g1,f2,g2,f3,g3;
+	     f1      = fi[0 ] - fi[k1];
+	     f0      = fi[0 ] + fi[k1];
+	     f3      = fi[k2] - fi[k3];
+	     f2      = fi[k2] + fi[k3];
+	     fi[k2]  = f0	  - f2;
+	     fi[0 ]  = f0	  + f2;
+	     fi[k3]  = f1	  - f3;
+	     fi[k1]  = f1	  + f3;
+	     g1      = gi[0 ] - gi[k1];
+	     g0      = gi[0 ] + gi[k1];
+	     g3      = SQRT2  * gi[k3];
+	     g2      = SQRT2  * gi[k2];
+	     gi[k2]  = g0	  - g2;
+	     gi[0 ]  = g0	  + g2;
+	     gi[k3]  = g1	  - g3;
+	     gi[k1]  = g1	  + g3;
+	     gi     += k4;
+	     fi     += k4;
+	    } while (fi<fn);
+     TRIG_INIT(k,c1,s1);
+     for (i=1;i<kx;i++)
+        {
+	 REAL c2,s2;
+         TRIG_NEXT(k,c1,s1);
+         c2 = c1*c1 - s1*s1;
+         s2 = 2*(c1*s1);
+	     fn = fz + n;
+	     fi = fz +i;
+	     gi = fz +k1-i;
+	     do
+		{
+		 REAL a,b,g0,f0,f1,g1,f2,g2,f3,g3;
+		 b       = s2*fi[k1] - c2*gi[k1];
+		 a       = c2*fi[k1] + s2*gi[k1];
+		 f1      = fi[0 ]    - a;
+		 f0      = fi[0 ]    + a;
+		 g1      = gi[0 ]    - b;
+		 g0      = gi[0 ]    + b;
+		 b       = s2*fi[k3] - c2*gi[k3];
+		 a       = c2*fi[k3] + s2*gi[k3];
+		 f3      = fi[k2]    - a;
+		 f2      = fi[k2]    + a;
+		 g3      = gi[k2]    - b;
+		 g2      = gi[k2]    + b;
+		 b       = s1*f2     - c1*g3;
+		 a       = c1*f2     + s1*g3;
+		 fi[k2]  = f0        - a;
+		 fi[0 ]  = f0        + a;
+		 gi[k3]  = g1        - b;
+		 gi[k1]  = g1        + b;
+		 b       = c1*g2     - s1*f3;
+		 a       = s1*g2     + c1*f3;
+		 gi[k2]  = g0        - a;
+		 gi[0 ]  = g0        + a;
+		 fi[k3]  = f1        - b;
+		 fi[k1]  = f1        + b;
+		 gi     += k4;
+		 fi     += k4;
+		} while (fi<fn);
+        }
+     TRIG_RESET(k,c1,s1);
+    } while (k4<n);
+}
+
+
+void ifft(int n, double *real, double *imag)
+{
+ double a,b,c,d;
+ double q,r,s,t;
+ int i,j,k;
+ fht(real,n);
+ fht(imag,n);
+ for (i=1,j=n-1,k=n/2;i<k;i++,j--) {
+  a = real[i]; b = real[j];  q=a+b; r=a-b;
+  c = imag[i]; d = imag[j];  s=c+d; t=c-d;
+  imag[i] = (s+r)*0.5;  imag[j] = (s-r)*0.5;
+  real[i] = (q-t)*0.5;  real[j] = (q+t)*0.5;
+ }
+}
+
+void realfft(int n, double *real)
+{
+ double a,b,c,d;
+ int i,j,k;
+ fht(real,n);
+ for (i=1,j=n-1,k=n/2;i<k;i++,j--) {
+  a = real[i];
+  b = real[j];
+  real[j] = (a-b)*0.5;
+  real[i] = (a+b)*0.5;
+ }
+}
+
+void fft(int n, double *real,double *imag)
+{
+ double a,b,c,d;
+ double q,r,s,t;
+ int i,j,k;
+ for (i=1,j=n-1,k=n/2;i<k;i++,j--) {
+  a = real[i]; b = real[j];  q=a+b; r=a-b;
+  c = imag[i]; d = imag[j];  s=c+d; t=c-d;
+  real[i] = (q+t)*.5; real[j] = (q-t)*.5;
+  imag[i] = (s-r)*.5; imag[j] = (s+r)*.5;
+ }
+ fht(real,n);
+ fht(imag,n);
+}
+
+void realifft(int n,double *real)
+{
+ double a,b,c,d;
+ int i,j,k;
+ for (i=1,j=n-1,k=n/2;i<k;i++,j--) {
+  a = real[i];
+  b = real[j];
+  real[j] = (a-b);
+  real[i] = (a+b);
+ }
+ fht(real,n);
+}
Index: /tags/V_240999/Poubelle/archTOI.old/formepulse.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/formepulse.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/formepulse.cc	(revision 439)
@@ -0,0 +1,207 @@
+#include <iostream.h>
+#include <fstream.h>
+
+
+#include <math.h>
+#include "mayer_fft.h"
+#include "dyffttools.h"
+
+
+#include "transfelec.h"
+#include "formepulse.h"
+
+#include "ssthardware.h"
+
+
+#define LTab (2048)
+#define LSave (128)
+#define Tpas (5.e-4)
+//float PulseOptOrigin=LTab/16.*Tpas;
+float PulseOptOrigin=0.;
+
+//#define DYTestRun
+
+
+
+FormePulse::FormePulse(TransFuncElec TF) {
+
+	Dcomplex j(0.,1.);
+	double Fpas=1./(Tpas*LTab);
+	
+	double *PulseInReel=new double[LTab];
+	double *PulseInImg=new double[LTab];
+	double *PulseOut=new double[LTab];
+
+	Dcomplex* PulseFFT=new Dcomplex[LTab];
+	
+
+	for(long i=0; i<LTab; i++) PulseInReel[i]=pulseOptique(i*Tpas);
+	for(long i=0; i<LTab; i++) PulseInImg[i]=0.;
+	
+/*
+//	On fenetre le signal.
+	for(long i=0; i<LTab; i++) PulseInReel[i]=PulseInReel[i]*DYWindow(i,LTab);
+*/
+
+	ofstream dlout; // sert a sortir les print test
+	
+#ifdef DYTestRun
+		//On ecrit le signal entrant
+		char s[32]="WaveIn.txt";
+		dlout.open(s,ios::out | ios::trunc);
+		if (!dlout.is_open())
+		{	cerr<<"erreur a l'ouverture du fichier de resultats: "<<s<<endl;
+			exit(-1);
+		}
+		dlout<<"temps"<<"\tPartieReelle"<<"\tPartieImag"<<endl;
+		
+		for (long k=0; k<LTab; k++) {
+			dlout<<k*Tpas<<"\t"<<PulseInReel[k]<<"\t"<<PulseInImg[k]<<endl;
+		}
+		dlout.close();
+
+#endif
+
+// C'est la fft!
+	fft(LTab, PulseInReel, PulseInImg);
+
+
+// On Filtre dans l'espace des frequences
+	for (int i=0; i<LTab; i++) {
+		PulseFFT[i]=PulseInReel[i]+PulseInImg[i]*j;
+	//On applique le filtre Iici
+		PulseFFT[i]=TF.TsFunc(2*3.1416*i*Fpas)*PulseFFT[i];
+		PulseInReel[i]=real(PulseFFT[i]);
+		PulseInImg[i]=imag(PulseFFT[i]);
+	}
+	
+#ifdef DYTestRun	
+	// On écrit la FFT	
+		char s1[32]="PulseFFT.txt";
+		dlout.open(s1,ios::out | ios::trunc);
+		if (!dlout.is_open())
+		{	cerr<<"erreur a l'ouverture du fichier de resultats: "<<s1<<endl;
+			exit(-1);
+		}
+		dlout<<"Frequence"<<"\tPartieReelle"<<"\tPartieImag"<<endl;
+		
+		for (long k=0; k<LTab; k++) {
+			dlout<<k*Fpas<<"\t"<<PulseInReel[k]<<"\t"<<PulseInImg[k]<<endl;
+		}
+		dlout.close();
+#endif
+
+// FFT inverse
+	ifft(LTab,PulseInReel,PulseInImg);
+	for (int i=0; i<LTab; i++) {
+		PulseInReel[i]/=LTab;
+		PulseInImg[i]/=LTab;
+	}
+	
+
+// On recherche le maximum d'amplitude
+	double Max=0.;		//En volt
+	int MaxIndex=0;
+	
+	for(int i=0; i<LSave; i++) 
+		if(PulseInReel[i]>Max) {
+			Max=PulseInReel[i];
+			MaxIndex=i;
+		}
+		
+	gainElec=Max/SSTFPulseCourant;
+		//En Volt/ampere	
+		
+// On calcule la LMH
+
+	int HalfMaxInf;
+		for(HalfMaxInf=MaxIndex;HalfMaxInf>0;HalfMaxInf--)
+			if(fabs(PulseInReel[HalfMaxInf])<(Max/2.)) break;
+	int HalfMaxSup;	
+		for(HalfMaxSup=MaxIndex;HalfMaxSup<LTab;HalfMaxSup++)
+			if(fabs(PulseInReel[HalfMaxSup])<(Max/2.)) break;
+	
+	
+	FullwidthHalfMax=(HalfMaxSup-HalfMaxInf)*Tpas;
+		
+// On normalise à un Volt. Et on ecrit en memoire le resultat
+	ShapeArr=new double[LSave];
+	for(int i=0; i<LSave; i++)  ShapeArr[i]=PulseInReel[i]/Max;
+
+#ifdef DYTestRun	
+		//On ecrit le resultat dans un fichier 
+		char s2[32]="Resultatfiltrage.txt";
+		dlout.open(s2,ios::out | ios::trunc);
+		if (!dlout.is_open()){	
+			cerr<<"erreur a l'ouverture du fichier de resultats: "<<s2<<endl;
+			exit(-1);
+		}
+
+		dlout<<"Impulsion courant de: "<<SSTFPulseCourant<<" Ampères"<<endl;
+		dlout<<"Maximum d'amplitude: "<<max<< " Volts"<<endl;
+		dlout<<" gain chaine preampli: "<<gainElec<<endl<<endl;
+		dlout<<"Temps"<<"\tPartie Reelle"<<endl;
+
+		for (int k=0; k<LSave; k++) {
+			dlout<<k*Tpas<<"\t"<<ShapeArr[k]<<endl;
+		}	
+#endif
+
+
+	
+//On tue les tableaux de passage....
+	delete[] PulseInReel;
+	delete[] PulseInImg;
+	delete[] PulseOut;
+	delete[] PulseFFT;
+
+}
+
+FormePulse& FormePulse::operator =(const FormePulse& FPlse) {
+	ShapeArr=new double[LSave];
+	for(int i=0; i<LSave; i++) ShapeArr[i]=FPlse.ShapeArr[i];
+	return *this;
+}
+	
+FormePulse::~FormePulse() {
+	delete[] ShapeArr;
+}
+
+double FormePulse::TMax() {
+	double returnVal=LSave*Tpas;
+	return returnVal;
+}
+
+double FormePulse::PulseShape(double temps) {
+	int ientier=(int)(temps/Tpas);
+	double returnValue;
+	if (ientier<0) returnValue=0.;
+	else if (ientier>=LSave) returnValue= ShapeArr[127];
+	else {
+		double Min=ShapeArr[ientier];
+		double Max=ShapeArr[ientier+1];
+//		double test=temps/Tpas-ientier;
+		returnValue=Min+(Max-Min)*(temps/Tpas-ientier);
+	}
+	return returnValue;
+}
+
+
+double FormePulse::LongPulseOptique() {
+	double returnVal;
+	returnVal=SSTLongPhotDiode/SSTLongFocale*PeriodRotTeles/2/3.1415/sin(SSTTelesElevation);
+	//en secondes
+	return returnVal;
+}
+	
+double FormePulse::pulseOptique(double temps) {
+	double value;
+	if((temps>PulseOptOrigin)&&(temps<=PulseOptOrigin+LongPulseOptique()))  
+		value=SSTFPulseCourant;			 //	Amplitude: 1 nanoampère
+
+	else value=0.;
+//	for(long i=0; i<LTab; i++) value=sin(2*3.1416*temps/5.e-3); //pour test FFT
+	return value;
+}
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/formepulse.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/formepulse.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/formepulse.h	(revision 439)
@@ -0,0 +1,31 @@
+#ifndef FORMEPULSE_SEEN
+#define FORMEPULSE_SEEN
+
+
+#define  SSTFPulseCourant 1.E-9 	
+	// Courant photodiode pour l'impulsion calculée
+	
+class TransFuncElec;
+
+
+class FormePulse {
+public:
+	FormePulse(TransFuncElec);
+	FormePulse& operator =(const FormePulse&);
+	~FormePulse();
+	double PulseShape(double temps); 	// Temps en secondes
+	double FWHM() {return FullwidthHalfMax;} // en secondes
+	double TMax ();
+	double GainElectrique() {  	//Volt/ampère de la chaine electronique
+		return gainElec; }		//Compte tenu de LongPulseOptique();	
+protected:
+	double* ShapeArr;
+	double LongPulseOptique();
+	double pulseOptique(double Temps);  
+		// Genère une impulsion de un ampère pendant LongPulseOptique()
+		// temps en secondes		
+	double gainElec;
+	double FullwidthHalfMax;						
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/gpsparser.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/gpsparser.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/gpsparser.cc	(revision 439)
@@ -0,0 +1,172 @@
+// gpsparser.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#include <string.h>
+#include <stdio.h>
+
+#include "gpsparser.h"
+
+GPSParser::GPSParser() {
+  *gpsString = 0;
+  stringOk = false;
+  gpsutc = 0;
+  gpslat = 0;
+  gpslong = 0;
+  quality = 0;
+  nsat = 0;
+  hdop = 0;
+  alt = 0;
+  gsep = 0;
+}
+
+GPSParser::~GPSParser() {
+}
+
+bool GPSParser::hasTime() {
+  return (stringOk && gpsutc>0);
+}
+
+bool GPSParser::hasGPSTime() {
+  return (stringOk && gpsutc>0 && quality>0 && nsat>=3);
+}
+
+bool GPSParser::hasPosition() {
+  return (stringOk && quality>0 && nsat>=3);
+}
+
+bool GPSParser::hasAltitude() {
+  return (stringOk && quality>0 && nsat>=4);
+}
+
+double GPSParser::getUTC() {
+  if (!stringOk) return -99999;
+  return gpsutc;
+}
+
+double GPSParser::getLatitude() {
+  if (!stringOk) return -99999;
+  if (quality == 0 || nsat<3) return -99999;
+  return gpslat;
+}
+
+double GPSParser::getLongitude() {
+  if (!stringOk) return -99999;
+  if (quality == 0 || nsat<3) return -99999;
+  return gpslong;
+}
+
+double GPSParser::getAltitude() {
+  if (!stringOk) return -99999;
+  if (quality == 0 || nsat<4) return -99999;
+  return alt;
+}
+
+// GPGGA string : 
+// $hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,,
+// $104020,3740.712,N,00400.781,W,0,00,01.0,0003,M,-050,M,,
+
+#include <fstream.h>
+#include <iomanip.h>
+//ofstream gpsdump("gpsdump");
+//ofstream gpsdata("gpsdata");
+//double outc = 0; double jr = 0;
+
+void GPSParser::ProcessBlock(block_type_gps* blk) {
+  strncpy(gpsString, blk->gps, 80);
+  char* p = gpsString;
+//  gpsdump << p ; if (p[strlen(p)-1] != '\n') gpsdump << '\n';
+  char* fence = p+80;
+  stringOk = false;
+  if (*p!='$') return;
+  p++;
+  
+  // UTC
+  if (*p < '0' || *p > '9') return;
+  double t;
+  sscanf(p, "%lg", &t);
+  int h = int(t/10000); t -= h*10000;
+  int m = int(t/100);   t -= m*100;
+  gpsutc = h*3600. + m*60. + t;
+  p += 6;
+  if (*p != ',') return;
+  p++;
+  if (p>=fence) return;
+  
+  // LATITUDE
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%lg", &t);
+  int d = int(t/100); t -= d*100;
+  t = d + t/60;
+  p += 8;
+  if (*p != ',') return; 
+  p++;
+  if (*p == 'S') t = -t;
+  gpslat = t;
+  p++;
+  if (*p != ',') return; 
+  p++;
+  if (p>=fence) return;
+
+  // LONGITUDE
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%lg", &t);
+  d = int(t/100); t -= d*100;
+  t = d + t/60;
+  p += 9;
+  if (*p != ',') return; 
+  p++;
+  if (*p == 'W') t = -t;
+  gpslong = t;
+  p++;
+  if (*p != ',') return; 
+  p++;
+  if (p>=fence) return;
+
+  // QUALITY
+  quality = *p - '0';
+  if (quality < 0 || quality > 9) return;
+  p++;
+  if (*p != ',') return; 
+  p++;
+  if (p>=fence) return;
+  
+  // NSAT
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%d", &nsat);
+  p += 2;
+  if (*p != ',') return; 
+  p++;
+  
+  // HDOP
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%lg", &hdop);
+  while (*p != ',' && p<fence) p++;
+  if (*p != ',') return; 
+  p++;
+  
+  // Altitude
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%lg", &alt);
+  while (*p != ',' && p<fence) p++;
+  if (*p != ',') return; 
+  p++;
+  if (*p != 'M') return; 
+  p++;
+  if (*p != ',') return; 
+  p++;
+
+  // Geoid separation
+  if (*p < '0' || *p > '9') return;
+  sscanf(p, "%lg", &gsep);
+  while (*p != ',' && p<fence) p++;
+  if (*p != ',') return; 
+  p++;
+  if (*p != 'M') return; 
+
+//  if (gpsutc < outc) jr += 86400; 
+//  outc = gpsutc;
+//  gpsdata << setprecision(10) << gpsutc + jr << " " << gpslat << " " << gpslong << " " << quality << " " << nsat << '\n';
+
+  stringOk = true;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/gpsparser.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/gpsparser.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/gpsparser.h	(revision 439)
@@ -0,0 +1,48 @@
+// gpsparser.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef GPSPARSER_H
+#define GPSPARSER_H
+
+#ifndef nb_max_bolo
+#define _archeops		//  Acquisition Archeops (avec transputer) 
+#define programme
+extern "C" {
+#include "archeops.h"
+}
+#endif
+
+class GPSParser {
+public:
+  GPSParser();
+  //GPSParser(GPSParser const&);
+  //GPSParser& operator = (GPSParser const&);
+  virtual ~GPSParser();
+
+  void ProcessBlock(block_type_gps*);
+  
+  bool hasTime();      // Can be internal clock
+  bool hasGPSTime();   // New GPS time
+  bool hasPosition();
+  bool hasAltitude();
+  
+  double getUTC();
+  double getLatitude();
+  double getLongitude();
+  double getAltitude();
+  
+protected:
+
+  char gpsString[100];
+  bool   stringOk;
+  double gpsutc;        //  secondes depuis minuit
+  double gpslat;        //  degres, + = NORD
+  double gpslong;       //  degres, + = EST
+  int    quality;       //  0 = NO FIX, 1 = GPS FIX, 2 = DGPS FIX
+  int    nsat;          //  nombre de satellites utilises
+  double hdop;          //  horizontal dilution of precision
+  double alt;           //  altitude en metres
+  double gsep;          //  separation geoide en metres
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/gyrohandler.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/gyrohandler.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/gyrohandler.cc	(revision 439)
@@ -0,0 +1,42 @@
+// gyrohandler.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   septembre 1999
+
+#include <string.h>
+#include "gyrohandler.h"
+
+
+GyroHandler::GyroHandler() {
+ memset(gyro, 0, 3*nb_per_block*2*sizeof(int4));
+}
+
+  
+GyroHandler::GyroHandler(GyroHandler const& x) {
+  memcpy(gyro, x.gyro, 3*nb_per_block*2*sizeof(int4));
+}
+
+GyroHandler& GyroHandler::operator = (GyroHandler const& x) {
+  memcpy(gyro, x.gyro, 3*nb_per_block*2*sizeof(int4));
+  return *this;
+}
+
+GyroHandler::~GyroHandler() {
+
+}
+
+void GyroHandler::ProcessBlock(block_type_gyro* blk) {
+  memcpy(gyro, blk->gyro, 3*nb_per_block*2*sizeof(int4));
+}
+
+int4  GyroHandler::getRawSignal(int imesure, int igyro) {
+  if (igyro<0 || igyro>=3) return 0;
+  if (imesure<0 || imesure>=nb_per_block*2) return 0;
+  return gyro[igyro][imesure]-32768;
+}
+
+double GyroHandler::getSignal(int imesure, int igyro) {  // V
+  return getRawSignal(imesure, igyro) * 2. / 32768.; // +- 2V dynamique sur 16 bits
+}
+
+double GyroHandler::getSpeed(int imesure, int igyro) {
+  return getSignal(imesure, igyro) * 10;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/gyrohandler.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/gyrohandler.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/gyrohandler.h	(revision 439)
@@ -0,0 +1,35 @@
+// gyrohandler.h
+// Eric Aubourg         CEA/DAPNIA/SPP   septembre 1999
+
+#ifndef GYROHANDLER_H
+#define GYROHANDLER_H
+
+
+#ifndef nb_max_bolo
+#define _archeops		//  Acquisition Archeops (avec transputer) 
+#define programme
+extern "C" {
+#include "archeops.h"
+}
+#endif
+
+class GyroHandler {
+public:
+  GyroHandler();
+  GyroHandler(GyroHandler const&);
+  GyroHandler& operator = (GyroHandler const&);
+  virtual ~GyroHandler();
+
+  void ProcessBlock(block_type_gyro*);
+  int4 getRawSignal(int imesure, int igyro); // for last block
+  double getSignal(int imesure, int igyro);    // for last block, mV
+  double getSpeed(int imesure, int igyro);    // for last block, deg/s
+
+protected:
+  int4  gyro[3][nb_per_block*2];
+};
+
+
+// To be done : handle calibration, through stellar sensor, temperature, etc.
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/manip.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/manip.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/manip.h	(revision 439)
@@ -0,0 +1,2 @@
+#include <stdio.h>
+#include <math.h>
Index: /tags/V_240999/Poubelle/archTOI.old/mayer_fft.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/mayer_fft.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/mayer_fft.h	(revision 439)
@@ -0,0 +1,54 @@
+/*
+** FFT and FHT routines
+**  Copyright 1988, 1993; Ron Mayer
+**  
+**  fht(fz,n);
+**      Does a hartley transform of "n" points in the array "fz".
+**  fft(n,real,imag)
+**      Does a fourier transform of "n" points of the "real" and
+**      "imag" arrays.
+**  ifft(n,real,imag)
+**      Does an inverse fourier transform of "n" points of the "real"
+**      and "imag" arrays.
+**  realfft(n,real)
+**      Does a real-valued fourier transform of "n" points of the
+**      "real" arrays.  The real part of the transform ends
+**      up in the first half of the array and the imaginary part of the
+**      transform ends up in the second half of the array.
+**  realifft(n,real)
+**      The inverse of the realfft() routine above.
+**      
+**      
+** NOTE: This routine uses at least 2 patented algorithms, and may be
+**       under the restrictions of a bunch of different organizations.
+**       Although I wrote it completely myself; it is kind of a derivative
+**       of a routine I once authored and released under the GPL, so it
+**       may fall under the free software foundation's restrictions;
+**       it was worked on as a Stanford Univ project, so they claim
+**       some rights to it; it was further optimized at work here, so
+**       I think this company claims parts of it.  The patents are
+**       held by R. Bracewell (the FHT algorithm) and O. Buneman (the
+**       trig generator), both at Stanford Univ.
+**       If it were up to me, I'd say go do whatever you want with it;
+**       but it would be polite to give credit to the following people
+**       if you use this anywhere:
+**           Euler     - probable inventor of the fourier transform.
+**           Gauss     - probable inventor of the FFT.
+**           Hartley   - probable inventor of the hartley transform.
+**           Buneman   - for a really cool trig generator
+**           Mayer(me) - for authoring this particular version and
+**                       including all the optimizations in one package.
+**       Thanks,
+**       Ron Mayer; mayer@acuson.com
+**
+*/
+
+#ifndef FFTMayer_SEEN
+#define FFTMayer_SEEN
+	void fht( double *fz,int n);
+	void ifft(int n, double *real, double *imag);	
+	void realfft(int n, double *real);
+	void fft(int n, double *real,double *imag);
+	void realifft(int n,double *real);
+	
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/mkd
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/mkd	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/mkd	(revision 439)
@@ -0,0 +1,6 @@
+#!/bin/csh
+
+cp Makefile_nodep Makefile
+foreach f (*.c *.cc)
+  gcc -MM -I../cfitsio $f >> Makefile
+end
Index: /tags/V_240999/Poubelle/archTOI.old/opendir.c
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/opendir.c	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/opendir.c	(revision 439)
@@ -0,0 +1,107 @@
+/* $Id: opendir.c,v 1.1.1.1 1999-05-25 08:25:53 ansari Exp $ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "dirent.h"
+
+#include <Files.h>
+#include <TextUtils.h>
+
+#include "errno.h"
+
+#define FALSE 0
+#define ENOENT          2               /* No such file or directory */
+#define EIO             5               /* I/O error */
+
+
+DIR *opendir(char const * path)
+{
+	CInfoPBRec cipbr;
+	HFileInfo *fpb = (HFileInfo*)&cipbr;
+	DirInfo *dpb = (DirInfo*)&cipbr;
+	DIR *dp;
+	char name[FILENAME_MAX];
+	short err;
+	FSSpec tempspec;
+	
+	strncpy(name, path, sizeof(name)-1);
+	c2pstr(name);
+	
+	err = FSMakeFSSpec(0,0,(unsigned char*)name,&tempspec);
+	
+	fpb->ioNamePtr= (unsigned char*)name;
+	fpb->ioVRefNum= 0;
+	fpb->ioFDirIndex= 0;
+	fpb->ioFVersNum= 0;
+	dpb->ioDrDirID= 0;
+	err= PBGetCatInfo(&cipbr, FALSE);
+	if (err != noErr) {
+		errno = ENOENT;
+		return NULL;
+	}
+	dp = (DIR*)calloc(1, sizeof(DIR));
+	if (dp != NULL) {
+		dp->volrefnum = tempspec.vRefNum;
+		dp->dirid = fpb->ioDirID;
+		dp->nextfile = 1;
+	}
+	return dp;
+}
+
+/*
+ * Close a directory.
+ */
+
+int closedir(DIR *dp)
+{
+	free(dp);
+	return 0;
+}
+
+/*
+ * Read the next directory entry.
+ */
+
+struct dirent *readdir(DIR *dp)
+{
+	CInfoPBRec cipbr;
+	HFileInfo *fpb = (HFileInfo*)&cipbr;
+	DirInfo *dpb = (DirInfo*)&cipbr;
+	short err;
+	static struct dirent dir;
+
+	fpb->ioDirID= dp->dirid;
+	fpb->ioNamePtr= (unsigned char*)dir.d_name;
+	fpb->ioVRefNum= dp->volrefnum;
+	fpb->ioFDirIndex= dp->nextfile++;
+	fpb->ioFVersNum= 0;
+	err= PBGetCatInfo(&cipbr, FALSE);
+	if (err != noErr) {
+		errno = EIO;
+		return NULL;
+	}
+	p2cstr((StringPtr)dir.d_name);
+	dir.d_namlen = strlen(dir.d_name);
+	dir.d_reclen = sizeof(dir);
+	dir.d_ino = 0;
+	return &dir;
+}
+
+void rewinddir(DIR *dp)
+{
+		dp->nextfile = 1;
+}
+
+/*
+long telldir(DIR *dp)
+{
+   return dp->nextfile;
+}
+
+void seekdir(DIR *dp, long location)
+{
+  dp->nextfile = location;
+}
+*/
Index: /tags/V_240999/Poubelle/archTOI.old/pisteetoile.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/pisteetoile.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/pisteetoile.cc	(revision 439)
@@ -0,0 +1,374 @@
+#include "math.h"
+#include <new.h>
+#include "iostream.h"
+#include "archparam.h"
+#include "pisteetoile.h"
+ 
+TransFuncElec PisteEtoile::Trapani;
+FormePulse    PisteEtoile::FPulse(Trapani);
+
+
+
+int SSTnbPasFit= (int) (2*TFExcursion/TPasTFit);
+
+PisteEtoile::PisteEtoile(short NoPhotDiod) {
+	PasTempsEch=0.005836818076;			
+		//BUGG doit changer	!!!!! Doit etre extrait d'un serveur de param d'acquisition
+	NoPhDiod=NoPhotDiod;
+	DiodVivante=true;
+	AmplNorm=0.;
+//	On echantillonne dix fois plus fin pour avoir une bonne estimation de AmplNorm
+//	Eviter les systematiques
+	for(int i=0; i<SSTLongIndexEvt()*10; i++){
+		AmplNorm+=FPulse.PulseShape(i/10.*TPasTFit)*FPulse.PulseShape(i/10.*TPasTFit);
+	}
+	AmplNorm/=10.;
+	indexDebutPiste=0;
+	
+	PhDiodArray=new(nothrow) int[PhDiodTabLong];
+	PhDiodPiste=new(nothrow) double[PhDiodTabLong];
+	Ampl=new(nothrow) double[SSTnbPasFit];
+	X2=new(nothrow) double[SSTnbPasFit];
+	
+	if((X2==0)||(Ampl==0)||(PhDiodPiste==0)||(PhDiodArray==0)) {
+		cerr<<"Erreur a la reservation de memoire dans constructeur pisteetoile"<<endl;
+		exit(-1);
+	}
+}
+
+PisteEtoile& PisteEtoile::operator =(PisteEtoile const & x) {
+	PasTempsEch=x.PasTempsEch;		
+		//BUGG doit changer	!!!!! Doit etre extrait d'un serveur de param d'acquisition
+	NoPhDiod=x.NoPhDiod;
+	DiodVivante=x.DiodVivante;
+	indexDebutPiste=x.indexDebutPiste;
+	DiodVivante=x.DiodVivante;
+	AmplNorm=x.AmplNorm;
+
+	
+	for(int j=0; j<PhDiodTabLong;j++) PhDiodArray[j]=x.PhDiodArray[j];
+	for(int j=0; j<PhDiodTabLong;j++) PhDiodPiste[j]=x.PhDiodPiste[j];
+	
+	LastEtoile=x.LastEtoile;
+	
+	 gachette=x.gachette;
+	 Vrms=x.Vrms;
+	 MaxIndex=x.MaxIndex;			// Index de l'amplitude Max en analyse Trig()
+	 AmplMax=x.AmplMax;
+	 
+	 AmplRes=x.AmplRes;
+	 TIndex=x.TIndex;
+	 X2Min=x.X2Min;
+	 SuccesAFine=x.SuccesAFine;
+	 AmplNorm=x.AmplNorm;
+	 
+	 return *this;
+}
+
+PisteEtoile::PisteEtoile (PisteEtoile const & x) {
+	PasTempsEch=x.PasTempsEch;		
+	NoPhDiod=x.NoPhDiod;
+	DiodVivante=x.DiodVivante;
+	indexDebutPiste=x.indexDebutPiste;
+	DiodVivante=x.DiodVivante;
+	AmplNorm=x.AmplNorm;
+		
+	PhDiodArray=new(nothrow) int[PhDiodTabLong];
+	PhDiodPiste=new(nothrow) double[PhDiodTabLong];
+	Ampl=new(nothrow) double[SSTnbPasFit];
+	X2=new(nothrow) double[SSTnbPasFit];
+	
+	
+	if((X2==0)||(Ampl==0)||(PhDiodPiste==0)||(PhDiodArray==0)) {
+		cerr<<"Erreur a la reservation de memoire dans constructeur pisteetoile"<<endl;
+		exit(-1);
+	}
+	
+	for(int j=0; j<PhDiodTabLong;j++) PhDiodArray[j]=x.PhDiodArray[j];
+	for(int j=0; j<PhDiodTabLong;j++) PhDiodPiste[j]=x.PhDiodPiste[j];
+	
+	LastEtoile=x.LastEtoile;
+	
+	 gachette=x.gachette;
+	 Vrms=x.Vrms;
+	 MaxIndex=x.MaxIndex;			// Index de l'amplitude Max en analyse Trig()
+	 AmplMax=x.AmplMax;
+	 
+	 AmplRes=x.AmplRes;
+	 TIndex=x.TIndex;
+	 X2Min=x.X2Min;
+	 SuccesAFine=x.SuccesAFine;
+	 AmplNorm=x.AmplNorm;
+
+}
+
+
+
+PisteEtoile::~PisteEtoile() {
+	delete[] X2;
+	delete[] Ampl;
+	delete[] PhDiodPiste;
+	delete[] PhDiodArray;
+	
+}
+
+void PisteEtoile::fill(int* pData, int InDebutPiste, int nData) {
+//	if(!isAlive()) return;
+	indexDebutPiste=InDebutPiste;
+	int* PhDiod=PhDiodArray;
+	int* pDataC=pData;
+	for(int k=0;k<nData;k++,pDataC++, PhDiod++) (*PhDiod)=(*pDataC);
+	return;
+}
+
+void PisteEtoile::push(int* pData, int nbdata) {
+	int* PPhDiod=PhDiodArray;
+	int* PPhDiod2=PhDiodArray+nbdata;
+	int* pDataC=pData;
+	
+	for(int i=0; i<PhDiodTabLong-nbdata; i++, PPhDiod++, PPhDiod2++) *PPhDiod=(*PPhDiod2);
+	for(int i=0; i<nbdata; i++, PPhDiod++,pDataC++) *PPhDiod=(*pDataC);
+	indexDebutPiste+=nbdata; 
+	return;
+}
+
+bool PisteEtoile::traque() {
+	if(!isAlive()) return false;		//La diode est-elle morte?
+	
+	bool testEtoile=trig();
+	if(testEtoile) {			
+		//On a declenché sur une Etoile
+		if(archParam.sst.analFine) {
+			demasque();
+// Un second Filtre est possible
+			// if(!(fabs(AmplRes)>SeuilGachette*Vrms)&&SuccesAFine) testEtoile=false;
+			// Test rajouté pour filtrer le bruit en escalier des voies SST
+			// Le fit de forme tasse le bruit et permet un meilleur filtrage.
+		}
+
+// Troisième filtre possible:
+		// On tue les evenements trop larges
+		if (widthHalfMax>(FPulse.FWHM()/PasTempsEch+2.)) testEtoile=false;
+	
+		if(testEtoile) {
+		// On emballe une etoile.
+			LastEtoile.FitForme=SuccesAFine;
+			LastEtoile.X2Calc=X2Min;
+			LastEtoile.InpCurrNoisRMS=Vrms/FPulse.GainElectrique();
+			LastEtoile.TEchan=TIndex;
+			LastEtoile.InpCurrent= AmplRes/FPulse.GainElectrique();
+			LastEtoile.NoDiode=NoPhDiod;
+			LastEtoile.LargMiHauteur=widthHalfMax;
+		}
+	}
+	// On expedie	
+	return testEtoile;
+}
+
+bool PisteEtoile::trig() {	
+	MaxIndex=-1;
+	AmplMax=0.;
+	gachette=false;
+
+// Copie les données brutes sur la piste. Les met en Volt ADC 12 Bits-10 Volts
+	for(int i=0; i<PhDiodTabLong; i++) PhDiodPiste[i]=PhDiodArray[i]*SSTLsbVal;
+
+// Calcule Valeur Moy du prepulse
+	double Moy=0.;
+	for(int i=0; i<Prepulselong; i++) Moy+=PhDiodPiste[i];
+	Moy/=Prepulselong;
+
+// On soustrait la valeur Moy de la piste
+	for (int i=0; i<PhDiodTabLong; i++) PhDiodPiste[i]-=Moy;
+	
+	double pente=0.;
+	if (archParam.sst.soustPente==true) {
+	//	On calcule la pente du prepulse
+		double milprepulse=(Prepulselong-1.)/2.;
+		double SomCarre=0.;
+		for(int i=0; i<Prepulselong; i++) {
+			SomCarre+= (i-milprepulse)*(i-milprepulse);
+			pente+= (i-milprepulse)*PhDiodPiste[i];
+		}
+		pente=pente/SomCarre;
+
+	// On soustrait la pente sur la piste
+		for (int i=0; i<PhDiodTabLong; i++) PhDiodPiste[i]-=(i-milprepulse)*pente;
+	}
+	
+// On calcule le Vrms sur le prepulse
+	Vrms=0.;
+	for (int i=0; i<Prepulselong; i++) Vrms+=PhDiodPiste[i]*PhDiodPiste[i];
+	Vrms=sqrt(Vrms)/Prepulselong;
+	if(Vrms<SSTLsbVal) Vrms=SSTLsbVal;		// Pour eviter les VRMS=0.
+	
+// Declenche-t-on?
+	gachette=false;
+	short iSeuil=0;
+	double* pPiste =PhDiodPiste+Prepulselong-1;
+	
+// On demande deux échantillons à seuilgachette Vrms
+	for (int i=0; i<(PhDiodTabLong-Prepulselong); i++, pPiste++) {
+		if (fabs(*pPiste)>(SeuilGachette*Vrms)) 
+			if (fabs(*(pPiste+1))>SeuilGachette*Vrms) {
+				gachette=true;
+				iSeuil=Prepulselong-1+i;
+				break;
+			}		
+	}
+
+	if (gachette==true) {
+// On trouve le maximum
+		MaxIndex=iSeuil;
+		AmplMax=fabs(PhDiodPiste[iSeuil]);
+		for (int i=iSeuil; i<PhDiodTabLong; i++) {
+			if (fabs(PhDiodPiste[i])>AmplMax) {
+				MaxIndex=i;
+				AmplMax=fabs(PhDiodPiste[i]);
+			}
+		}
+		if ((MaxIndex>=PhDiodTabLong-4)||(MaxIndex<Prepulselong+4)) gachette=false;
+// Cela sera traite a l'iteration suivante
+// Ou ca a du etre traite a l'iteration precedente	
+	}
+	if (gachette==true) {
+// On calcule la largeur a mi hauteur
+		int HalfMaxInf;
+		for(HalfMaxInf=MaxIndex;HalfMaxInf>Prepulselong;HalfMaxInf--)
+			if(fabs(PhDiodPiste[HalfMaxInf])<(AmplMax/2.)) break;
+				int HalfMaxSup;	
+		for(HalfMaxSup=MaxIndex;HalfMaxSup<PhDiodTabLong;HalfMaxSup++)
+			if(fabs(PhDiodPiste[HalfMaxSup])<(AmplMax/2.)) break;
+		widthHalfMax=HalfMaxSup-HalfMaxInf;
+		
+/*
+// On integre sur la larg a mi hauteur
+		integ=0.;
+		if((HalfMaxSup<PhDiodTabLong)&&(HalfMaxInf>Prepulselong))
+			for(int i=HalfMaxInf; i<=HalfMaxSup; i++) integ+=PhDiodPiste[i];
+*/
+
+
+// On fitte une parabole autour du maximum
+		double tmaxfit;
+		if (widthHalfMax>1) {
+			double ymax=PhDiodPiste[MaxIndex];
+			double yplus=PhDiodPiste[MaxIndex+1];
+			double ymoins=PhDiodPiste[MaxIndex-1];
+	// Estimation du temps
+			if(!(ymax==yplus)) {
+				double Y=(yplus-ymax)/(ymax-ymoins);
+				tmaxfit=0.5*(1.+Y)/(1-Y);
+			}
+			else tmaxfit=0.5;
+			
+	// Estimation de l'amplitude
+			double dtplus2=(1.+tmaxfit)*(1.+tmaxfit);
+			double dtmoins2=(1.-tmaxfit)*(1.-tmaxfit);
+			if(dtplus2==dtmoins2) AmplRes=PhDiodPiste[MaxIndex];
+			else AmplRes= (yplus*dtplus2-ymoins*dtmoins2) / (dtplus2-dtmoins2);
+		}
+		
+//	On stocke les resultats
+		TIndex=indexDebutPiste+MaxIndex+tmaxfit;
+		X2Min=0.;
+		SuccesAFine=false;
+	}
+	return gachette;	
+}
+
+void PisteEtoile::demasque() {
+// Maintenant que l'on se doute que il y a une etoile 
+// On veut connaitre son flux et son temps de passage
+// Nécessite d'avoir un ordre d'idee de la vitesse de rotation du ballon.
+
+		// BUGG devra etre extrait des headers acquisition. Ca peut changer!!!!!!
+
+	
+			
+	int IndexDebutEvt=MaxIndex-SSTLargEvtIndex();
+	
+	pFitArray0= PhDiodPiste+IndexDebutEvt; 
+		// Pointeur origine du tableau d'echantillon sur lequel sera calculé le fit
+	double DeltaTemps=0.;
+// Pour chaque decalage en temps, on estime un amplitude et calcule le X2
+	for(int k=0; k<SSTnbPasFit; k++) {
+		DeltaTemps=TFExcursion-k*TPasTFit;
+		pFitArray=pFitArray0;
+		double Som=0.;
+		for(int i=0; i<SSTLongIndexEvt(); i++, pFitArray++)	{
+//			cout<<(*pFitArray)<<'\t'<<FPulse.PulseShape(i*PasTempsEch-DeltaTemps)<<endl;
+			Som=Som+FPulse.PulseShape(i*PasTempsEch-DeltaTemps)*(*pFitArray);
+		}
+		Ampl[k]=Som/AmplNorm;
+		X2[k]=0.;
+		double X2Som=0.; double dum=0.;pFitArray=pFitArray0;
+		for(int i=0; i<SSTLongIndexEvt(); i++, pFitArray++) {
+			dum=(*pFitArray)-Ampl[k]*FPulse.PulseShape(i*PasTempsEch-DeltaTemps); 	// Différence
+			X2Som+=dum*dum;															// Au carré
+		}				
+		X2[k]=X2Som/(SSTLongIndexEvt()*Vrms*Vrms);
+	}
+	
+// On recherche le minimum du X2
+	X2Min=1.e99;
+	int X2MinIndex=-1;
+	for(int k=0; k<SSTnbPasFit; k++) 
+		if (X2[k]<X2Min) {
+			X2Min=X2[k];
+			X2MinIndex=k;
+		}
+
+	if((X2MinIndex>0)&&(X2MinIndex<(SSTnbPasFit-1))) {
+	
+// On fitte une parabole sur les trois X2 qui encadrent le min
+	double Di;	// Index (non entier) du minimum du X2
+		double X=(X2[X2MinIndex+1]-X2Min)/(X2Min-X2[X2MinIndex-1]);		
+		Di=0.5*(X+1)/(X-1);
+
+// On calcule l'amplitude estimee a ce temps
+		double Som1=0.; pFitArray=pFitArray0;
+		DeltaTemps=TFExcursion-(X2MinIndex-Di)*TPasTFit;
+		for(int i=0; i<SSTLongIndexEvt(); i++, pFitArray++) 
+			Som1+=(*pFitArray)*FPulse.PulseShape(i*PasTempsEch-DeltaTemps);
+		AmplRes=Som1/AmplNorm;
+		
+//Le X2 est mimimum pour le n° de pas de fit X2MinIndex+Di 
+
+#ifdef PEtoileDebug
+		double* PulseTrak=new double [SSTLongIndexEvt()];
+#endif
+
+		double X2Som1=0.; double dummy=0.;pFitArray=pFitArray0;
+		for(int i=0;i<SSTLongIndexEvt();i++,pFitArray++) {	
+#ifdef PEtoileDebug
+			PulseTrak[i]=FPulse.PulseShape(i*PasTempsEch-DeltaTemps);
+#endif
+			dummy=(*pFitArray)-AmplRes*FPulse.PulseShape(i*PasTempsEch-DeltaTemps); 	// Différence
+			X2Som1+=dummy*dummy;														// Au carré
+		}
+					
+		X2Min=X2Som1/(SSTLongIndexEvt()*Vrms*Vrms);
+	
+		TIndex=indexDebutPiste+IndexDebutEvt+DeltaTemps/PasTempsEch;
+					//Ouff!!!!
+		SuccesAFine=true;
+	}
+	else {				// Echec, c'est tres bizarre! On doit etre dans le bruit
+		X2Min=0.;		
+	}
+	return;
+} 
+
+int  PisteEtoile::SSTLargEvtIndex() {  		
+// Demi-largeur a 3 sigma de l'impulsion 
+	int dum=(int) (15.e-3/PasTempsEch+1.); 
+	return dum;
+}
+
+int  PisteEtoile::SSTLongIndexEvt() {		
+// Nombre d'echantillon sur lequel est calculé le fit de forme
+	int temp=2*SSTLargEvtIndex()+1;
+	return temp;
+}
+	
Index: /tags/V_240999/Poubelle/archTOI.old/pisteetoile.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/pisteetoile.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/pisteetoile.h	(revision 439)
@@ -0,0 +1,116 @@
+#ifndef PisteEtoileSeen
+#define PisteEtoileSeen
+#include "sstetoile.h"
+#include "transfelec.h"
+#include "formepulse.h"
+
+/*	// D. Yvon, CE Saclay, 08/99
+
+	// Analyse the Photodiode track to find star pulse.
+	// Caracterise the time and amplitude of the star Pulse
+
+	We analyse a set of 32 samples. The 16 first are considered as prepulse sample.
+	On the prepulse: 
+		We compute baseline and substract it. 
+		Then compute slope due to pile up and substract it
+		Then compute Vrms.
+		Look for trigger
+	If triggered :
+		Look for maximum. If max found 20< Max< 28
+		Iterate time fit on pulse area and compute amplitude and X2
+		Find best X2. 
+		Fit parabole arond the minimum of X2 to get the true minimum.
+		Build SSTStar.
+		
+	That's it. Test code tstpisteetoile.cc can be found in tstroutines folder.
+	When  done push the track eigth samples forward and iterate analysis. 
+*/
+
+class FormePulse;
+
+#define PEtoileDebug
+
+
+#define PhDiodTabLong (48)
+#define Prepulselong (32)
+#define Pousslong (8)
+
+
+// 	Parametrisation du Trigger 
+#define SeuilGachette (6.) 				// On déclenche à SeuilGachette sigmas
+#define SSTLsbVal (10./4096)
+
+//	Parametrisation Analyse Fine
+#define TFExcursion (15.e-3)			// Secondes: Excursion du fit autour de MaxIndex
+#define TPasTFit (2.5e-3)				// Secondes:
+			// Secondes:
+
+class PisteEtoile {
+public:
+	PisteEtoile(short NoPhotDiod=0);
+	PisteEtoile (PisteEtoile const & x);
+	~PisteEtoile();
+	PisteEtoile& operator = (PisteEtoile const & x);
+	void fill(int* pData, int inDebutPiste=0, int nData=PhDiodTabLong);
+	void push(int* pData, int nbdata=Pousslong); 
+		//"Pousse" les données dans PhDiodArray de nbdata
+	bool traque() ; 
+		// Traque l'etoile.	
+	bool trig(); 
+		//Trig sur les donnees? Si Oui declenche une analyse complète
+	void demasque();
+		// Met en Oeuvre un fit de forme pour determiner le temps et l'amplitude.
+
+	bool isAlive() 	{	return 	DiodVivante;}
+	void kill()		{	DiodVivante=false;}
+	void restore()	{	DiodVivante=true;}
+	
+	SSTEtoile DonneEtoile() {return LastEtoile;}
+		//Retourne la dernière Etoile détectee
+	inline int SSTLargEvtIndex(); 
+	inline int SSTLongIndexEvt();
+protected:
+	double PasTempsEch; 	//Secondes 
+// Idendificateur, repères et gestion 
+	short NoPhDiod;
+	int indexDebutPiste; 	// A actualiser dans push() et Fill()! BUGG!!!!
+	bool DiodVivante;		// Si false, On ne fait rien 
+	
+// Stocke donnees brutes et traitees
+	int* PhDiodArray;
+	double* PhDiodPiste;
+	
+// Derniere Etoile Vue
+	SSTEtoile LastEtoile;
+	
+// Variables d'analyse
+	bool gachette;
+	double Vrms;
+	short MaxIndex;			// Index de l'amplitude Max en analyse Trig()
+	double AmplMax;
+	int widthHalfMax;
+//	double integ;
+// Variables Resultat d'analyse fine
+	
+	double AmplRes;
+	double TIndex;
+	double X2Min;
+	bool SuccesAFine;
+	
+// Utilitaires de calcul analyse fine
+	double AmplNorm;
+		// Normalisation d'amplitude sur FPulse dans l'ajustement iteratif
+	double *pFitArray0;
+		// Pointeur origine du tableau d'echantillon sur lequel sera calculé le fit
+	double *pFitArray;
+		// Pointeur courant du tableau d'echantillon 
+	double* Ampl; 	//Tableau des amplitudes calculées
+
+	double* X2;		//Tableau des X2 calculés
+	
+	static TransFuncElec Trapani;
+	static FormePulse FPulse;
+	
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/plgalcross.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/plgalcross.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/plgalcross.cc	(revision 439)
@@ -0,0 +1,249 @@
+#include <iostream.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+#ifndef M_2PI
+#define M_2PI (2*M_PI)
+#endif
+
+#include "plgalcross.h"
+
+//////////////////////////////////////////////////////////////////////////
+//                                cmv 24/9/1999
+// Pour calculer les azimuth (E of N) d'intersection d'une direction avec
+// le plan galactique:
+// ---- INPUT:
+// TSid : temps sideral (heures decimales [0,24[)
+// Lat : latitude du lieu (degres decimaux [-90,90])
+// zRot : angle de rotation de l'axe du detecteur avec le zenith
+//        (0 = zenith, degres decimaux [0,180]).
+// alpG,decG : alpha,delta du vecteur perpendiculaire au plan considere
+//             (heures et degres decimaux alpG=[0,24[, decG=[-90,90])
+//     ex: Galactic plane, original IAU definition of galactic
+//         North pole is : (12h 49mn    ,+27d 24'    , 1950)
+//                   soit  (12h 51mn 30s,+27d 07' 42", 2000)
+// ---- OUTPUT:
+// azCr1,2 : azimuths (E of N) d'intersection du plan definit au dessus
+//           avec le cercle balaye par l'axe du detecteur
+//           (degres decimaux [0,360[).
+//           Angle + sens retrograde (N>E>S>W), origine au Nord.
+
+// ---- RETURN VALUE:
+//  -1 : mauvaise valeur en entree, relisez la doc!
+//   0 : OK, une ou deux intersections
+//   1 : pas d'intersection
+//   2 : 1 solution avec azimuth indetermine (sur l'axe +oZ ou -oZ)
+//   4 : une infinite d'intersections pour tous les azimuths
+//       (dans plan horizontal)
+//////////////////////////////////////////////////////////////////////////
+
+int PlGalCross(double TSid,double Lat,double zRot,double alpG,double decG
+              ,double& azCr1,double& azCr2)
+{
+azCr1=0.,azCr2=0.;
+
+if(TSid<0.   || TSid>=24.) return -1;
+if(Lat<-90.  || Lat>90.  ) return -1;
+if(zRot<0.   || zRot>180.) return -1;
+if(alpG<0.   || alpG>=24.) return -1;
+if(decG<-90. || decG>90. ) return -1;
+
+// (ag,hg)=(azimuth,elevation) du vecteur G perpendiculaire au plan
+double aG, hG;
+EquatToHoriz(alpG,decG,TSid,Lat,aG,hG);
+//printf("PlGalCross: tsid=%g lat=%g perp plan: alpha=%g dec=%g\n"
+//      ,TSid,Lat,alpG,decG);
+//printf("            -> elev=%g azi=%g (+180=%g)\n"
+//      ,hG,aG,((aG>180.)?aG-180.:aG+180.));
+
+// on convertit l'angle "zRot" en elevation des coord horizontales
+double hRot = 90.-zRot;
+//printf("PlGalCross: axe rot: elev = %g  dist.zen = %g\n",hRot,zRot);
+
+// on convertit en radian
+hRot /= DEG_IN_RADIAN; aG /= DEG_IN_RADIAN; hG /= DEG_IN_RADIAN;
+
+// Resolution de l'intersection:
+// Dans le repere horizontal, on cherche le lieu des points M
+// du plan considere (OM.G=0) ayant l'elevation hRot.
+// Soient (a,h)=(azimuth,elevation) du point M (vecteur OM)
+// ATTENTION: l'azimuth aM,aG tourne + dans sens retrograde (N>E>S>W)!
+// En coordonnees cartesiennes:
+//     |  cos(h).cos(a) |      |  cos(hG).cos(aG) |
+// OM= | -cos(h).sin(a) |   G= | -cos(hG).sin(aG) |
+//     |  sin(h)        |      |  sin(hG)         |
+// OM.G=0 avec h=hRot et ||OM||=1
+// - Equation du plan : a*x + b*y + c*z = 0
+// - Equation du cercle que decrit l'axe du detecteur sur la sphere celeste:
+//            x^2 + y^2 = R^2  et z=sin(hRot) avec R=cos(hRot)
+// - Equation de la droite d'intersection du plan avec le plan du cercle:
+//            a*x + b*y + c*z = 0 avec z=sin(hRot)=cos(zRot)
+double ch=cos(hRot);
+double z=sin(hRot), chG=cos(hG), shG=sin(hG);
+if(ch*ch<SMALL_ANGLE_2) {
+  // ch=0 : le detecteur ne tourne pas (zRot==0 ou 180),
+  // il est selon l'axe OZ ou -OZ. Une seule solution possible
+  // si le plan passe par le pole cad si hG==0 et l'azimuth
+  // est indetermine.
+  if(shG*shG<SMALL_ANGLE_2) return 2; else return 1;
+} else if(chG*chG<SMALL_ANGLE_2) {
+  // chG==0 : le plan est dans le plan horizontal. Seules intersections
+  // possibles si le detecteur tourne dans le plan horizontal cad si hRot=0.
+  // Dans ce cas une infinite d'intersections pour tous les azimuths.
+  if(z*z<SMALL_ANGLE_2) return 3; else return 1;
+} else {
+  double a=chG*cos(aG), b=-chG*sin(aG), cz=shG*z, R2=ch*ch;
+  //printf("PlGalCross: plan a=%g b=%g c=%g R=%g\n",a,b,shG,ch);
+  //Stabilite numerique: |b|>|a| on resoud pour "x" sinon pour "y"
+  // **** cas 1-/ |b|>|a|  :  droite y = -(a/b)*x-cz/b
+  //      cas 2-/ |b|<=|a| :  droite x = -(b/a)*y-cz/a
+  // **** En remplacant dans l'equation du cercle
+  //      cas 1-/ Ax^2+2Bx+C=0
+  //              A=1+(a/b)^2; B=acz/b^2; C=(cz/b)^2-R^2
+  //      cas 2-/ Ay^2+2By+C=0
+  //              A=1+(b/a)^2; B=bcz/a^2; C=(cz/a)^2-R^2
+  // **** Solutions: det=B^2-AC et sol=(-B +/- sqrt(det))/A
+  //      cas 1-/ x1,x2 ==> y = -(a/b)*x-cz/b ==> y1,y2
+  //      cas 2-/ y1,y2 ==> x = -(b/a)*x-cz/a ==> x1,x2
+  // **** Azimuth: az=atan2(-y/cos(hRot),x/cos(hRot))
+  //               (car sens retrograde cf eq OM=|...|)
+  bool calcx = (fabs(b)>fabs(a))? true: false;
+  double A,B,C;
+  if(calcx) {A=1+a*a/(b*b); B=a*cz/(b*b); C=cz*cz/(b*b)-R2;}
+    else    {A=1+b*b/(a*a); B=b*cz/(a*a); C=cz*cz/(a*a)-R2;}
+  // Resolution
+  double det = B*B-A*C;
+  if(det<0.) return 1;
+  double sol1 = (-B+sqrt(det))/A, sol2 = (-B-sqrt(det))/A;
+  double x1,x2,y1,y2;
+  if(calcx) {x1=sol1; x2=sol2; y1=-a/b*x1-cz/b; y2=-a/b*x2-cz/b;}
+     else   {y1=sol1; y2=sol2; x1=-b/a*y1-cz/a; x2=-b/a*y2-cz/a;}
+  //printf("PlGalCross: int1=(%g,%g,%g) int2=(%g,%g,%g)\n",x1,y1,z,x2,y2,z);
+  // Calcul des azimuths
+  azCr1 = atan2(-y1/ch,x1/ch); azCr2 = atan2(-y2/ch,x2/ch);
+  // on convertit en degres decimaux
+  azCr1 *= DEG_IN_RADIAN; azCr2 *= DEG_IN_RADIAN;
+  if(azCr1<0.) azCr1+=360.; if(azCr1>=360.) azCr1-=360.; if(azCr1<0.) azCr1=0.;
+  if(azCr2<0.) azCr2+=360.; if(azCr2>=360.) azCr2-=360.; if(azCr2<0.) azCr2=0.;
+  //printf("PlGalCross: azCr1 = %g,    azCr2 = %g  (azCr1+azCr2)/2 = %g\n"
+  //,azCr1,azCr2,((azCr1+azCr2>=720.)?(azCr1+azCr2)/2-360.:(azCr1+azCr2)/2));
+  return 0;
+}
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+int EquatToHoriz(double alpha,double delta,double tsid,double latitude
+                 ,double& azimuth,double& elevation)
+// Pour convertir les coordonnees equatoriales en coordonnees horizontales
+// pour une latitude terrestre et un temps sideral donnes.
+// INPUT:
+//   alpha,delta : coord equat en heures [0,24[ et degres [-90,90] decimaux
+//   tsid : temps sideral en heures [0,24[ decimales
+//          (ou angle horaire du point vernal ou ascension droite du zenith)
+//          Pour une direction quelconque on a: tsid = ha+a 
+//          ou "ha" est l'angle horaire et "a" l'ascension droite
+//   latitude : latitude du lieu en degre [-90,90] decimaux
+// OUTPUT: les coordonnees horizontales:
+//   azimuth : azimuth (E of N) degre [0,360[ decimaux
+//             tourne +  sens retrograde (N>E>S>W), origine au Nord,
+//             azimuth "des marins" (serveur BDL, USNO, xephem , skycalc...)
+//   elevation : elevation degre [-90,90] decimaux
+//               (distance zenithale z = 90-elevation)
+// RETURN: 0 si Ok, 1 si probleme
+// TRANSFO: (dans cette formule l'origine des azimuths est au Sud,
+//           azimut "des astronomes" ou  (E of S))
+// sin(azi) cos(elev) = sin(ha) cos(dec)
+// cos(azi) cos(elev) = cos(ha) cos(dec) sin(lat) - sin(dec) cos(lat)
+//          sin(elev) = cos(ha) cos(dec) cos(lat) + sin(dec) sin(lat)
+// avec azi=azimuth (E of S), elev=elevation, lat=latitude,
+//      dec=declinaison, ha=angle horaire=tsid-alpha
+// Puis azi(E of S) = azi(E of N) + Pi
+{
+azimuth = elevation = 0.;
+if(alpha<0.      || alpha>=24   )   return 1;
+if(delta<-90.    || delta>90.   ) return 1;
+if(tsid<0.       || tsid>=24.   ) return 1;
+if(latitude<-90. || latitude>90.) return 1;
+// conversion en radians
+alpha /= HRS_IN_RADIAN; delta    /= DEG_IN_RADIAN;
+tsid  /= HRS_IN_RADIAN; latitude /= DEG_IN_RADIAN;
+
+double cl = cos(latitude),   sl = sin(latitude);
+double ch = cos(tsid-alpha), sh = sin(tsid-alpha);
+double cd = cos(delta),      sd = sin(delta);
+
+// calcul de l'elevation [-90,90]
+elevation = ch*cd*cl+sl*sd;
+if(elevation<-1.) elevation=-1.; if(elevation>1.) elevation=1.;
+elevation = asin(elevation); //entre [-Pi/2,Pi/2]
+
+// calcul de l'azimuth
+double ce = cos(elevation);
+if(fabs(ce)<SMALL_ANGLE) { //elevation=-Pi/2 ou Pi/2
+  azimuth = 0.; //azimuth indifferent
+} else {
+  azimuth = atan2(sh*cd/ce,(ch*cd*sl-sd*cl)/ce); //entre -Pi et +Pi
+  azimuth += M_PI; //azimuth (E of S) -> (E of N)
+}
+
+azimuth *= DEG_IN_RADIAN; elevation *= DEG_IN_RADIAN;
+// Ca ne doit pas arriver sauf pb de precision machine
+if(azimuth<0. || azimuth>=360.) azimuth = 0.;
+if(elevation<-90.) elevation = -90.; if(elevation>90.) elevation = 90.;
+return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+int FindPerpEquat(double a1,double d1,double a2,double d2,double& ap,double& dp)
+// Pour trouver les coordonnees equatoriales du vecteur perpendiculaire
+// a deux autres vecteurs.
+// INPUT:
+//  a1,d1 : alpha,delta de la premiere direction en
+//          (heures decimales et degres decimaux)
+//  a2,d2 : alpha,delta de la deuxieme direction en
+//          (heures decimales et degres decimaux)
+// OUTPUT:
+//  ap,dp : alpha,delta de la direction perpendiculaire
+//          telle que 1,2,p fasse un triedre direct
+//          (heures decimales et degres decimaux)
+// RETURN:
+//  0 = OK, 1 = probleme
+{
+ap = dp = 0.;
+a1 /= HRS_IN_RADIAN; d1 /= DEG_IN_RADIAN;
+a2 /= HRS_IN_RADIAN; d2 /= DEG_IN_RADIAN;
+// coordonnees cartesiennes
+double v1[3],v2[3],vp[3];
+v1[0]=cos(d1)*cos(a1); v1[1]=cos(d1)*sin(a1); v1[2]=sin(d1);
+v2[0]=cos(d2)*cos(a2); v2[1]=cos(d2)*sin(a2); v2[2]=sin(d2);
+vp[0]=v1[1]*v2[2]-v1[2]*v2[1]; vp[1]=v1[2]*v2[0]-v1[0]*v2[2];
+                               vp[2]=v1[0]*v2[1]-v1[1]*v2[0];
+double nvp = vp[0]*vp[0]+vp[1]*vp[1]+vp[2]*vp[2];
+if(nvp<=0.) return 1;
+nvp = sqrt(nvp);
+vp[0] /= nvp; vp[1] /= nvp; vp[2] /= nvp;
+// | vp[0] |   | cos(dp)*cos(ap) |
+// | vp[1] | = | cos(dp)*sin(ap) |
+// | vp[2] |   | sin(dp)         |
+dp = asin(vp[2]); // asin retourne entre -Pi/2 et Pi/2 ... Ok
+double cdp = cos(dp);
+if(fabs(cdp)<SMALL_ANGLE) { // cas ou dp=+Pi/2 ou -Pi/2, ap est indifferent
+  ap = 0.;
+} else {
+  ap = atan2(vp[1]/cdp,vp[0]/cdp); // renvoie entre -Pi et +Pi
+  if(ap<0.) ap += M_2PI;
+}
+
+ap *= HRS_IN_RADIAN; dp *= DEG_IN_RADIAN;
+// Ca ne doit pas arriver sauf pb de precision machine
+if(ap<0. || ap>=24.) ap = 0.;
+if(dp<-90.) dp = -90.; if(dp>90.) dp = 90.;
+return 0;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/plgalcross.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/plgalcross.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/plgalcross.h	(revision 439)
@@ -0,0 +1,11 @@
+#define DEG_IN_RADIAN 57.2957795130823
+#define HRS_IN_RADIAN 3.819718634205
+// SMALL_ANGLE 1.e-8 radian = 1e-3 ArcSec
+#define SMALL_ANGLE 1.e-8
+#define SMALL_ANGLE_2 (SMALL_ANGLE*SMALL_ANGLE)
+
+int PlGalCross(double TSid,double Lat,double zRot,double alpG,double decG
+              ,double& azCr1,double& azCr2);
+int EquatToHoriz(double alpha,double delta,double TSid,double latitude
+                ,double& azimuth,double& elevation);
+int FindPerpEquat(double a1,double d1,double a2,double d2,double& ap,double& dp);
Index: /tags/V_240999/Poubelle/archTOI.old/sstetoile.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/sstetoile.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/sstetoile.cc	(revision 439)
@@ -0,0 +1,14 @@
+#include "sstetoile.h"
+
+void SSTEtoile::print(ofstream& str) {
+	str<<setprecision(11);
+	str<<InpCurrent<<'\t'<<TEchan<<'\t'<<NoDiode<<'\t'<<LargMiHauteur;
+	str<<'\t'<<InpCurrNoisRMS<<endl;
+	//	<<'\t'<<X2Calc<<'\t'<<FitForme
+	return;
+}
+
+string SSTEtoile::printHeader() {
+	string a("InpCurrent\tTempsEchan\tNoDiode\tLarMiHauteur\tICurrRMS\tX2Calc\tFitForme");
+	return a;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/sstetoile.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/sstetoile.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/sstetoile.h	(revision 439)
@@ -0,0 +1,25 @@
+#ifndef SSTEtoile_H
+#define SSTEtoile_H
+
+#include <stdio.h>
+#include <string>
+#include <fstream.h>
+#include <iomanip.h>
+
+
+class SSTEtoile{
+public:
+	double InpCurrent;		// En Ampère
+//	double IInteg;			// En Ampère
+	double TEchan;			// Temps en indexEchantillon
+	double InpCurrNoisRMS;	// Bruit en Ampère
+	double X2Calc;			// Sans dimension
+	int NoDiode;
+	bool FitForme;			// Fit de forme?
+	int LargMiHauteur;		// Comme son nom l'indique
+	
+	void print(ofstream& str);
+	string printHeader();
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/ssthandler.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/ssthandler.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/ssthandler.cc	(revision 439)
@@ -0,0 +1,391 @@
+// ssthandler.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+// Prediction mouvement d'etoiles entre un tour et le suivant...
+// si TS -> TS + dT, H -> H + dT,    dT=dH
+//
+// dz   =  - cos phi sin az dH    (check sign)
+// daz  = (sin phi - cos az cotg z cos phi) dH    (check sign)
+// 
+// free parameters = period + phase
+
+#include <math.h>
+#include "ssthandler.h"
+#include "pisteetoile.h"
+
+#ifdef SST_DUMPLOG
+ofstream SSTHandler::sstchass("SSTChassLogFile");
+bool     SSTHandler::sstchassinit=false;
+#endif
+
+// diodpermut[i] = channel de la diode i
+int SSTHandler::diodpermut[46]=
+ { 8,24,40, 9,25,41,10,26,42,11,
+  27,43,16,32, 1,17,33, 2,18,34,
+   3,19,35,12,28,44,13,29,45,14,
+  30,46,15,31,47,20,36, 5,21,37,
+   6,22,38, 7,23,39};
+ // voies 0 et 4 non connectees, voie 1 en panne.
+
+SSTHandler::SSTHandler()
+{
+  diodeHistLength = nb_per_block*2+10;
+  diodeT = new int[diodeHistLength*nb_photo_diodes];
+  starHistLength = 300;
+
+  lastBlkNum = -1;
+  
+  //Has2Bars(false);
+  prcTodo=0;
+  
+  pPiste = NULL;
+  LastBlockSSTNb = -2;
+  noStarDet = 0;
+  
+  findStarConstruct();
+  
+}
+
+SSTHandler::SSTHandler(SSTHandler const& x) 
+{
+  diodeHistLength = x.diodeHistLength;
+  diodeT = new int[diodeHistLength*nb_photo_diodes];
+  memcpy(diodeT, x.diodeT, diodeHistLength*nb_photo_diodes);
+  starHistLength = x.starHistLength;
+    
+  prcTodo    = x.prcTodo;
+ // has2bars   = x.has2bars;
+  lastBlkNum = x.lastBlkNum;
+  
+  pPiste = NULL;
+  LastBlockSSTNb = x.LastBlockSSTNb;
+  noStarDet = x.noStarDet;
+
+  findStarConstruct();
+  for(int i=0; i<NbPhotDiodBarette; i++) {
+  	*PisteBar[i]=*(x.PisteBar[i]);
+  }
+}
+
+SSTHandler& SSTHandler::operator = (SSTHandler const& x) {
+  delete[] diodeT; 
+  diodeHistLength = x.diodeHistLength;
+  diodeT = new int[diodeHistLength*nb_photo_diodes];
+  memcpy(diodeT, x.diodeT, diodeHistLength*nb_photo_diodes);
+    
+  prcTodo    = x.prcTodo;
+ // has2bars   = x.has2bars;
+ // elecOffset = x.elecOffset;
+  lastBlkNum = x.lastBlkNum;
+  for(int i=0; i<NbPhotDiodBarette; i++) *PisteBar[i]=*(x.PisteBar[i]);
+  return *this;
+}
+
+SSTHandler::~SSTHandler(){
+  delete[] diodeT;
+  findStarDestruct();
+}
+
+void SSTHandler::NeedProcess(int prcMask)
+{
+  prcTodo |= prcMask;
+  if (prcTodo & findAxis)   prcTodo |= findPeriod;
+  if (prcTodo & findPeriod) prcTodo |= findStars;
+  if (prcTodo & findStars)  prcTodo |= permDiode;
+}
+
+bool SSTHandler::has2bars = false;
+int  SSTHandler::elecOffset = 1;
+
+void SSTHandler::Has2Bars(bool has, int eo)
+{
+  has2bars = has;
+  elecOffset = eo;
+}
+
+void SSTHandler::DecodeTMBlock(block_type_sst* blk, int i, int* diod)
+{
+  int j; // 0-5 : numero du bloc de 8 diodes
+  int k; // 0-2 : indice du bloc de 4 bits (une diode = 12 bits = 3 blocs de 4 bits)
+  int l; // 0-7 : indice de la diode dans son bloc (8 diodes * 4 bits = 1 mot de 32 bits)
+  
+  // numero de la diode (0-47) = j*8+l;
+  // indice dans le bloc sst du mot de 32 bits (0-17) = j*3+k;
+  // indice dans mot de 32 bits du premier bit utile = 4*l;
+    
+  for (j=0; j<48; j++) diod[j] = 0;
+  
+  for (j=0; j<6; j++)
+    for (k=0; k<3; k++)
+      for (l=0; l<8; l++) {
+        int4 word = blk->sst[i][j*3+k];
+        word = (word >> (4*l)) & 0xF;
+	// printf("diode %d mot %d valeur %d\n", j*8+l, k, word);
+        diod[j*8+l] = (diod[j*8+l] << 4) + word;
+      }
+
+  //for (j=0; j<48; j++) if (diod[j]>2047) diod[j] -= 4096;
+  for (j=0; j<48; j++)  diod[j] -= 2048;
+  
+}
+
+
+void SSTHandler::PermutDiode()
+{
+  int j0 = diodeHistLength-(nb_per_block*2);
+  
+  // Decalage vers la gauche de la taille d'un bloc
+  memcpy(diodeT, diodeT + (nb_per_block*2)*nb_photo_diodes, j0*nb_photo_diodes);
+  
+  for (int j=0; j<nb_per_block*2; j++) {
+    // permutation des diodes
+    for (int i=0; i<46; i++)
+      diode(j+j0,i) = diodeRaw[j][diodpermut[i]];
+  
+    /*
+    // calcul d'un fond sur la rangee. Moyenne clippee.
+    float m = 0; float sig = 1.e10;
+    for (int k=0; k<2; k++) {
+      float s=0; float s2=0; int n=0;
+      for (int i=0; i<46; i++) {
+        if (fabs(diode(j+j0,i)-m)<3*sig+1) {
+          s += diode(j+j0,i); s2 += diode(j+j0,i)*diode(j+j0,i); n++;
+        }
+      }
+      if (n>0) {
+        m = s/n; sig = sqrt(s2/n - m*m);
+      } else {
+        m = 0; break;
+      }
+    }
+    for (int i=0; i<46; i++) 
+      diode(j+j0,i) -= m;
+    */
+  }
+}
+
+int SSTHandler::getRawSignal(int imesure, int idiode) // for last block
+{
+  if (imesure<0 || imesure>=nb_per_block*2 || idiode<0 || idiode>=48) return -99999;
+  return diodeRaw[imesure][idiode];
+}
+
+int SSTHandler::getSignal(int imesure, int idiode) // for last block
+{
+  int j0 = diodeHistLength-(nb_per_block*2);
+  if (imesure+j0<0 || imesure>=nb_per_block*2 || 
+      idiode<0 || idiode>=nb_photo_diodes) return -99999;
+  return diode(imesure+j0, idiode);
+}
+
+int SSTHandler::FindStars(block_type_sst* blk) {
+	NbStarInBlock=0;
+	LastBlockStarVec.clear();
+	
+	int NoFirstSpInBlock=FirstSplNb(blk);
+  	int jd0 = diodeHistLength-NbSampleBlock;
+
+	bool FlagLBlockPerdu=false;
+	int ThisBlockNumb=numero_block(blk);
+	
+	if ((LastBlockSSTNb+1)==ThisBlockNumb) LastBlockSSTNb++;
+	else {
+		FlagLBlockPerdu=true;
+		LastBlockSSTNb=ThisBlockNumb;
+	}
+
+//	On cherche les etoiles	
+	for(int NoDiode=0;NoDiode<NbPhotDiodBarette; NoDiode++) {	
+		pPiste=PisteBar[NoDiode];
+		
+	// Traitons une diode pendant un block
+		offseDataDiod=0;
+		for (int i=0; i<NbSampleBlock; i++) Diodedata[i]=diode(jd0+i,NoDiode);
+
+		if (FlagLBlockPerdu)  {
+			pPiste->fill(Diodedata+offseDataDiod,FirstSplNb(blk),PhDiodTabLong);
+			offseDataDiod+=PhDiodTabLong;
+		}
+		else {
+			pPiste->push(Diodedata,Pousslong);
+			offseDataDiod+=Pousslong;
+		}
+		
+	// Recherchons les etoiles
+		while (true) {
+			if (pPiste->traque()) {				// On a trouve!
+				LastStar=pPiste->DonneEtoile();
+/*				double dum= LastStar.TEchan;
+				pair<const double, SSTEtoile> unepaire=make_pair(dum,LastStar);
+				StarHistoryMap.insert(unepaire);	
+*/
+				StarHistoryMap[LastStar.TEchan]=LastStar;
+					//On empile sur la map.
+				NbStarInBlock++;
+#ifdef SST_DEBUG			
+			// On écrit les pistes ayant déclénchées
+				int NoDiodeEvt=LastStar.NoDiode;
+				if(pPisteDump[NoDiodeEvt]->is_open())	
+					for(int noSamp=0; noSamp<NbSampleBlock;noSamp++)
+						(*pPisteDump[NoDiodeEvt])<<noStarDet<<'\t'<<NoDiode<<'\t'<<NoFirstSpInBlock+noSamp<<'\t'<<Diodedata[noSamp]<<endl;
+#endif
+				noStarDet++;
+			}
+		// Est-on en bout de Piste?
+		    if (offseDataDiod+Pousslong > NbSampleBlock) break;
+		    pPiste->push(Diodedata+offseDataDiod,Pousslong);
+		    offseDataDiod+=Pousslong;
+		}
+	}
+	
+//	On ne garde que les NbEtInSetMax dernières étoiles
+	int nbEtoileInMap=StarHistoryMap.size();
+	if(nbEtoileInMap>NbEtInMapMax) {
+		int nbErase=nbEtoileInMap-NbEtInMapMax;
+		StarHistIter StarIter=StarHistoryMap.begin();
+		for(int i=0;i<nbErase;i++){
+			StarIter++;
+		}
+		StarHistoryMap.erase(StarHistoryMap.begin(),StarIter);
+		nbEtoileInMap-=nbErase;
+	}			
+	
+//	On stocke les etoiles du block dans LastBlockStarVec
+	map<double,SSTEtoile>::reverse_iterator StarHistReIter= StarHistoryMap.rbegin() ;
+	for(int i=0; i<NbStarInBlock; i++, StarHistReIter++) 
+		LastBlockStarVec.push_back((*StarHistReIter).second);
+	
+#ifdef SST_DUMPLOG
+	if(NbStarInBlock>0) {
+			
+	// On écrit les étoiles detectées
+		vector<SSTEtoile>::reverse_iterator StarVecRevIter;
+		StarVecRevIter=LastBlockStarVec.rbegin();
+		for(int i=0; i<NbStarInBlock;i++,StarVecRevIter++) 
+			(*StarVecRevIter).print(sstchass);
+	}
+		
+#endif
+
+	return NbStarInBlock;
+}
+
+void SSTHandler::findStarConstruct() {
+	PisteBar=new PisteEtoile*[NbPhotDiodBarette];
+	for(int i=0; i<NbPhotDiodBarette; i++) PisteBar[i]=new PisteEtoile(i);
+	StarHistoryMap.clear();
+#ifdef SST_DUMPLOG
+	if (!sstchassinit) {
+	  sstchass<<LastStar.printHeader()<<endl;
+	  sstchassinit = true;
+	}
+#endif
+	
+#ifdef SST_DEBUG	
+	char s[32];
+	string fileName;
+//	if(pPisteDump==NULL)
+		pPisteDump= new ofstream* [NbChanDump];
+	
+	for (int pistNumb=0; pistNumb<NbChanDump; pistNumb++) {
+		sprintf(s,"%i", pistNumb);	
+		string piste=s;
+		fileName="pisteno"+piste+"dump";
+/*		
+		if ((*pPisteDump[pistNumb]).is_open()) {
+			cerr<<"Erreur: le fichier "<<fileName<<" devrait être libre"<<endl;
+				//On libère
+			(*pPisteDump[pistNumb]).close();
+			delete pPisteDump[pistNumb];
+		}
+*/			
+		pPisteDump[pistNumb]=new ofstream(fileName.c_str(),ios::out|ios::trunc);
+		
+		if(!(*pPisteDump[pistNumb]).is_open()) {
+			cerr<<"Warning Echec à l'ouverture du fichier: "<<fileName<<endl;
+		}
+	}
+#endif
+	return;
+}
+
+void SSTHandler::findStarDestruct() {
+	for(int i=0; i<NbPhotDiodBarette; i++) {
+		delete PisteBar[i];
+	}
+	delete[] PisteBar;
+		
+#ifdef SST_DEBUG	
+	for (int pistNumb=0; pistNumb<NbChanDump; pistNumb++) {
+		pPisteDump[pistNumb]->close();
+		delete pPisteDump[pistNumb];
+	}
+	delete 	pPisteDump;
+#endif
+
+	return;
+}
+
+int SSTHandler::getNumbStar(int iSampl) {
+	StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
+	StarHistIter IterHigh=StarHistoryMap.upper_bound((double)(iSampl+1.));
+	int Compteur=0;
+	while (!(IterLow==IterHigh)) {IterLow++; Compteur++;}
+	return Compteur;
+}
+
+double SSTHandler::getStarF(int iSampl, int istar){ 
+	if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
+	else {
+		StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
+		while(!(istar==0)) {
+			IterLow++;
+			istar--;
+		}
+	return (double) ((*IterLow).second).InpCurrent;
+	}
+}
+
+
+int SSTHandler::getStarZ(int iSampl, int istar) {
+	if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
+	StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
+	while(!(istar==0)) {
+		IterLow++;
+		istar--;
+	}
+	return ((*IterLow).second).NoDiode;
+}
+
+double SSTHandler::getStarTime(int iSampl, int istar) {
+	if( (getNumbStar(iSampl)==0)||(getNumbStar(iSampl)<=istar)) return -1;
+	StarHistIter IterLow=StarHistoryMap.lower_bound((double)iSampl);
+	while(!(istar==0)) {
+		IterLow++;
+		istar--;
+	}
+	return ((*IterLow).second).TEchan;
+}
+
+int SSTHandler::FirstSplNb(block_type_sst* blk){
+	return NbSampleBlock*numero_block(blk);	// BUGG	A verifier
+}
+
+
+void SSTHandler::ProcessBlock(block_type_sst* blk)
+{
+  lastBlkNum = numero_block(blk);
+  if (prcTodo != 0) {
+    for (int i = 0; i<nb_per_block*2; i++) {
+      DecodeTMBlock(blk, i, diodeRaw[i]);
+    }
+  }
+  if (prcTodo & permDiode) {
+    PermutDiode();
+  }
+  if (prcTodo & findStars) {
+    FindStars(blk);
+  }
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/ssthandler.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/ssthandler.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/ssthandler.h	(revision 439)
@@ -0,0 +1,120 @@
+// ssthandler.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef SSTHANDLER_H
+#define SSTHANDLER_H
+
+#include <math.h>
+#include <vector>
+#include <map>
+
+#ifndef nb_max_bolo
+#define _archeops		//  Acquisition Archeops (avec transputer) 
+#define programme
+extern "C" {
+#include "archeops.h"
+}
+#endif
+
+class ArcheopsFile;
+
+// Zone findStar
+#include "sstetoile.h"
+#include "pisteetoile.h"
+
+//#define SST_DEBUG
+//#define SST_DUMPLOG
+#define NbChanDump (10)
+#define	NbPhotDiodBarette (46)
+#define NbEtInMapMax 	(100)
+#define SSTChassLog (true)
+#define NbSampleBlock (2*nb_per_block)
+// Fin Zone findStar
+
+class SSTHandler {
+public:
+  SSTHandler();
+  SSTHandler(SSTHandler const&);
+  SSTHandler& operator = (SSTHandler const&);
+  virtual ~SSTHandler();
+  
+  enum process { permDiode = 1, 
+         findStars  = 2,
+         findPeriod = 4,
+         findAxis   = 8 };
+         
+  void NeedProcess(int prcMask);
+  void ProcessBlock(block_type_sst*);
+  bool NeedBlocks() {return prcTodo != 0;}
+
+  static void Has2Bars(bool, int elecOffset=0); // elecOffset : which wired together
+  
+  long getLastBlkNum() {return lastBlkNum;}
+  int  getRawSignal(int imesure, int idiode); // for last block
+  int  getSignal(int imesure, int idiode);    // for last block, imesure<0 -> history
+  	
+  	//	Zone findStar 
+  int  getNumbStar(int iSampl);	
+  			// return number of star found in sample number iSampl	
+  int  getStarZ(int iSampl, int istar); 
+  			// return diode number of the star     
+  double getStarF(int iSampl, int istar);  
+  			// return star flux in Ampère
+  double getStarTime(int iSampl, int istar); 
+  			// return star time in this sample
+  			
+  static int getDiodPermut(int i) {return diodpermut[i];}
+
+protected:
+  int   diodeRaw[nb_per_block*2][48];
+  int   diodeHistLength;
+  int*  diodeT;       //[>nb_per_block*2]*[nb_photo_diodes];
+  int   prcTodo;
+  int   starHistLength;
+  long  lastBlkNum;
+  
+  	// Is there two photoDiod Arrays and how are they connected?
+  static bool  has2bars;
+  static int   elecOffset;
+  
+  inline int& diode(int iSamp, int iDiod) {return diodeT[iSamp*nb_photo_diodes+iDiod];}
+  
+  static int  diodpermut[46]; // diodpermut[i] = channel de la diode i
+  
+  void DecodeTMBlock(block_type_sst*, int i, int* diodes); // mesure i -> diodes
+  void PermutDiode(); // diodeRaw -> diode, avec decalage, 1 echantillon.
+  int FindStars(block_type_sst* blk); 		// sur les 72 derniers echantillons dans diode.
+  						// return nmber of star found in last block
+  
+  	// 	Zone findStar
+  int NbStarInBlock;
+
+  PisteEtoile** PisteBar; 
+  	
+#ifdef SST_DEBUG
+  	ofstream** pPisteDump;
+#endif
+
+  map<double,SSTEtoile> StarHistoryMap;	
+  		// On stocke les etoiles de manière ordonnée en temps
+  typedef  map<double,SSTEtoile>::iterator StarHistIter;
+  typedef  map<double,SSTEtoile>::const_iterator StarConstHistIter;
+  
+  vector<SSTEtoile> LastBlockStarVec;	
+  		// Vecteur des SSTEtoile du block classees en ordre de temps decroissant.
+  //vector<SSTEtoile> reverse_iterator StarVecRevIter LastBlockStarVec.rbegin();
+  SSTEtoile LastStar;
+  PisteEtoile* pPiste;		// Piste courante d'analyse
+  int Diodedata[NbSampleBlock];
+  int offseDataDiod;
+  int LastBlockSSTNb; // Gère la disparition des blocs défectueux
+  int noStarDet;
+  int FirstSplNb(block_type_sst* blk); // Calcule l'index du premier echantillon du block analysé
+  static ofstream sstchass;
+  static bool     sstchassinit;
+  
+  void findStarConstruct();
+  void findStarDestruct();
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/ssthardware.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/ssthardware.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/ssthardware.h	(revision 439)
@@ -0,0 +1,16 @@
+#ifndef SSTHARDWARE_SEEN
+#define SSTHARDWARE_SEEN
+
+// Telescope SST
+#define SSTTelesElevation (41./180*3.1416)		// Elevation du boresigth telescope SST, radian
+#define SSTLongFocale (1.8)						// Longueur focale en metre
+#define SSTNbPhotDiod (46)						// Nombre de PhotoDiodes
+#define SSTLongPhotDiode (4.4e-3)					// Longueur Photdiode en metre
+#define SSTLargPhotDiode (1.e-3)					// Largueur Photdiode en metre
+
+
+// Paramètres du Vol
+#define PeriodRotTeles (20.)						// Periode de rotation du telescope en seconde
+
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/templocator.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/templocator.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/templocator.cc	(revision 439)
@@ -0,0 +1,202 @@
+#include "templocator.h"
+#include <math.h>
+extern "C" {
+#include "aa_hadec.h"
+}
+
+#include "fitsio.h"
+#include "plgalcross.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+TempLocator tempLocator;
+
+TempLocator::TempLocator()
+{
+  lon = lat = ts = 0;
+  raZ  = decZ = -99999;
+  xSampleNum = -99999;
+  fitsfile* fptr;
+  int status=0;
+  fits_open_file(&fptr, "samplenum_gal_cross.fits", READONLY, &status);
+  int simple, bitpix, naxis;
+  long naxes;
+  long pcount, gcount;
+  int extend;
+  fits_read_imghdr(fptr, 1, &simple, &bitpix, &naxis, &naxes, &pcount, &gcount, &extend, &status);
+  nGalCross = naxes;
+  crossings = new long[nGalCross];
+  int anynul;
+  fits_read_img_lng(fptr, 0, 1, nGalCross, 0, crossings, &anynul, &status);
+  fits_close_file(fptr, &status);
+  fits_report_error(stderr, status);  /* print out any error messages */
+}
+           
+           
+void TempLocator::setEarthPos(double lon, double lat) {
+  if (this->lon == lon && this->lat == lat) return;
+  this->lon = lon;
+  this->lat = lat;
+  raZ  = decZ = -99999; xSampleNum = -99999;
+}
+
+void TempLocator::setTSid(double ts) {
+  if (this->ts == ts) return;
+  this->ts  = ts;
+  raZ  = decZ = -99999; xSampleNum = -99999;
+}
+  
+void   TempLocator::ComputeZenith() {
+  double ha;
+  aa_hadec (lat * M_PI/180, .5 * M_PI, 0, &ha, &decZ);
+  raZ = - (ha * 180. / M_PI / 15) + (ts/3600.);
+  if (raZ>24) raZ -= 24;
+  if (raZ<0)  raZ += 24;
+  decZ = decZ * 180. / M_PI;
+}
+  
+double TempLocator::getAlphaZenith() {
+  if (raZ < -100) ComputeZenith();
+  return raZ;
+}
+
+double TempLocator::getDeltaZenith() {
+  if (decZ < -100) ComputeZenith();
+  return decZ;
+}
+
+#define altbolo1 41.5
+
+void TempLocator::findGeomFromGC(int sampleNum) // pour le bolo qui voit les xing
+{
+  if (sampleNum == xSampleNum) return;
+  if (decZ < -100) ComputeZenith();
+  
+  azimBolGC = -9999;
+  
+  // On trouve les croisements juste avant et juste apres notre sampleNum
+  int icross;
+  for (icross=0; icross<nGalCross; icross++) {
+    if (crossings[icross] > sampleNum) break;
+  }
+  if (icross == 0 || icross >= nGalCross) return;
+  
+  // On trouve l'azimut du croisement principal pour notre position actuelle
+  double alpG = 12. + 51./60. + 30./3600.;
+  double delG = 27. + 07./60. + 42./3600.;
+  double azCr1, azCr2;
+  int rc = PlGalCross(ts/3600., lat, (90. - altbolo1), alpG, delG, azCr1, azCr2);
+  if (rc != 0) return; // pas deux points d'intersection
+  
+  // Il faut determiner le croisement principal, ie le plus proche
+  // du centre galactique. Pendant le vol de Trapani, c'etait celui
+  // le plus proche de 220° d'azimut.
+  
+  double azCross = azCr1;
+  if (fabs(azCr2-220) < fabs(azCr1-220)) azCross = azCr2;
+  
+  double rotSpeed = 360./(crossings[icross] - crossings[icross-1]); // °/sample
+  
+  azimBolGC = azCross - (sampleNum - (crossings[icross-1]+12))*rotSpeed;
+  // azimut bolo 1 from crossing, for sampleNum
+  if (azimBolGC > 360) azimBolGC -= 360;
+}
+
+void TempLocator::getAltAzBolo(int sampleNum, int ibolo, double& elv, double& az) {
+  findGeomFromGC(sampleNum);
+  double delElv = 0;
+  double delAz = 0;  // relative to ch1-bolo1
+  elv = -99999;
+  az  = -99999;
+  switch (ibolo) {
+    case 11:
+      delElv =   0;
+      delAz  =   0;
+      break;
+    case 8:
+      delElv =   0.78 * sqrt(3.)/2.;
+      delAz  =   0.78 * 1./2.;
+      break;
+    case 13:
+      delElv = - 0.78 * sqrt(3.)/2.;
+      delAz  =   0.78 * 1./2.;
+      break;
+    case 9:
+      delElv =   0.78 * sqrt(3.)/2.;
+      delAz  = - 0.78 * 1./2.;
+      break;
+    case 4:
+      delElv =   0.;
+      delAz  =   0.78;
+      break;
+    case 15:
+      delElv =   0.;
+      delAz  = - 0.78;
+      break;
+    default:
+      return;
+  }
+  delAz /= cos(41 * M_PI/180);
+  elv = altbolo1 + delElv;
+  az  = azimBolGC + delAz;
+  if (az>360) az -= 360;
+  if (az<0)   az += 360;
+  return;
+}
+
+double TempLocator::getAzimutBolo(int sampleNum, int ibolo) {
+  double elv, az;
+  getAltAzBolo(sampleNum, ibolo, elv, az);
+  return az;
+}
+
+double TempLocator::getElvBolo(int sampleNum, int ibolo) {
+  double elv, az;
+  getAltAzBolo(sampleNum, ibolo, elv, az);
+  return elv;
+}
+
+double TempLocator::getAlphaBolo(int sampleNum, int ibolo) {
+  double elv, az;
+  getAltAzBolo(sampleNum, ibolo, elv, az);
+  double ha;
+  double ra,dec;
+  aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
+  ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
+  dec = dec * 180. / M_PI;
+  return ra;
+}
+
+double TempLocator::getDeltaBolo(int sampleNum, int ibolo) {
+  double elv, az;
+  getAltAzBolo(sampleNum, ibolo, elv, az);
+  double ha;
+  double ra,dec;
+  aa_hadec (lat * M_PI/180, elv * M_PI/180, az * M_PI/180, &ha, &dec);
+  ra = - (ha * 180. / M_PI / 15) + (ts/3600.);
+  dec = dec * 180. / M_PI;
+  return dec;
+}
+
+double TempLocator::getAlphaCenter(int sampleNum) {
+  return getAlphaBolo(sampleNum, 11);
+}
+
+double TempLocator::getDeltaCenter(int sampleNum) {
+  return getDeltaBolo(sampleNum, 11);
+}
+
+
+
+
+ 			//	 ;
+  			//	 ;                            /\         4     2
+  			//	 ;                  elevation ||                       positive scanning, clockwise
+  			//	 ;                            ||       6    1    5      ---------->
+  			//	 ;                            ||                      == positive azimut
+  			//	 ;                            ||         x     3
+            //                                         |----|      = 0.78 deg / cos(elev)
+            // bol 1 = 41° elevation
+            
Index: /tags/V_240999/Poubelle/archTOI.old/templocator.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/templocator.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/templocator.h	(revision 439)
@@ -0,0 +1,46 @@
+// temporaire, positionnement en utilisant la galaxie...
+
+#ifndef TEMPLOCATOR_H
+#define TEMPLOCATOR_H
+
+class TempLocator {
+public:
+  TempLocator();
+
+  void setEarthPos(double lon, double lat);
+  void setTSid(double ts);
+  
+  double getAlphaZenith();
+  double getDeltaZenith();
+  
+      
+  double getAzimutBolo(int sampleNum, int ibolo); // ibolo, comme dans les TOI
+  double getElvBolo(int sampleNum, int ibolo);
+  double getAlphaBolo(int sampleNum, int ibolo);
+  double getDeltaBolo(int sampleNum, int ibolo);
+  double getAlphaCenter(int sampleNum);
+  double getDeltaCenter(int sampleNum);
+  
+  void getAltAzBolo(int sampleNum, int ibolo, double& elv, double& az);
+
+protected:
+  double lon; // degrees  +=EST
+  double lat; // degrees  +=NORD
+  double ts;  // secondes 
+  
+  int    nGalCross;
+  long*   crossings; // samplenum des croisements galactiques
+  
+  double raZ;  //zenith
+  double decZ; //zenith
+  int xSampleNum; // pour le dernier calcul
+  double azimBolGC;
+  
+  void findGeomFromGC(int sampleNum); // pour le bolo qui voit les xing
+    // il faut avoir positionne lon, lat et ts.
+  void ComputeZenith();
+};
+
+extern TempLocator tempLocator;
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/test.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/test.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/test.cc	(revision 439)
@@ -0,0 +1,79 @@
+
+#include <iostream.h>
+#include <fstream.h>
+#include <iomanip.h>
+
+#include "archeopsfile.h"
+#include "archtoi.h"
+#include "toisvr.h"
+
+using namespace std;  //introduces namespace std
+
+int main()
+{	
+
+    ArchTOI toi("test.toi");
+    toi.run("test.data");
+    return(0);
+    
+	TOISvr svr;
+	//svr.SetFile("h99_04_29-15h36m22");
+	//svr.SetFile("Stock:ARCHEOPS:DATA:arch_24:arch-99_06_08:h99_06_08-11h49m15");
+	svr.SetFile("Stock:ARCHEOPS:DATA:arch_26:arch-99_06_28:h99_06_28-11h23m41");
+	//svr.SetFile("/home/manip/mnt/planck/aubourg/h99_06_08-11h49m15");
+	//svr.SetDirectory("Stock:ARCHEOPS:DATA:arch_24:arch-99_06_08:");
+	//svr.SetDirectory("Stock:ARCHEOPS:DATA:arch_24");
+	svr.AddInfo(sampleNum);
+	svr.AddInfo(internalTime);
+	svr.AddInfo(utc);
+	//svr.AddInfo(longitude);
+	svr.AddInfo(longitude, true, true);
+	svr.AddInfo(sstSignal,0);
+	svr.AddInfo(sstStarZ,0);
+	svr.AddInfo(boloTens,1);
+	svr.AddInfo(boloTens,2);
+	
+	SSTHandler::Has2Bars(true,1);
+	
+	TOIIter iter = svr.DoQuery();
+	ofstream of ("test.out");
+	while (iter.Next()) {
+	  //if (iter.getValue(4) != 0 || iter.getValue(5) !=0 )
+/*	  cout << iter.getValue(0) << " " << iter.getValue(1) << " " <<
+	    setprecision(12) << iter.getValue(2) << " " << 
+	    setprecision(7) << iter.getValue(3) << " " << 
+	    setprecision(4) << iter.getValue(4) << " " <<
+	                       iter.getValue(5) << " " << iter.getValue(6) << "\n";*/
+	                      // cout << iter.getValue(5) << endl;
+	                       
+	  cout << iter.getTOI(sampleNum) << " " << iter.getTOI(internalTime) << " " <<
+	    setprecision(12) << iter.getTOI(utc)       << " " << 
+	    setprecision(7)  << iter.getTOI(longitude) << " " << 
+	    setprecision(4)  << iter.getTOI(sstSignal) << " " <<
+	                        iter.getTOI(sstStarZ)  << " " << 
+	                        iter.getTOI(boloTens,1) << "\n";
+	  of << iter.getValue(0) << " " << iter.getValue(1) << " " <<
+	    setprecision(12) << iter.getValue(2) << " " << 
+	    setprecision(7)  << iter.getValue(3) << " " << 
+	    setprecision(4)  << iter.getValue(4) << " " <<
+	                        iter.getValue(5) << " " << 
+	                        iter.getValue(6) << "\n";
+	}
+	
+	/*
+    int nblk[20];
+    for (int i=0; i<20; i++) nblk[i] = 0;
+	cout << "opening" << endl;
+	//ArcheopsFile file("Stock:ARCHEOPS:h99_04_29-15h36m22");
+	ArcheopsFile file("h99_04_29-15h36m22");
+	cout << file.getStartMJD() << endl;
+	cout << "reading" << endl;
+	while (file.nextBlock()) {
+	  //cout << file.blockKdName() << " " << file.blockNum() << "\n";
+	  nblk[file.blockKind()]++;
+	}
+	cout << "done" << endl;
+    for (int i=0; i<20; i++) cout << i <<" " << nblk[i] << endl;
+    */
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.cc	(revision 439)
@@ -0,0 +1,82 @@
+// toiinterpolator.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#include "toiinterpolator.h"
+
+void TOIInterpolator::enterValue(double value, long sample)
+{
+  // $CHECK$ sample > back.sample
+  if (!hist.empty() && sample == hist.back().t) return; // pour eviter /0
+  hist.push_back(pair(value, sample));
+}
+
+bool TOIInterpolator::needMoreDataFor(long sample)
+{
+  if (hist.empty()) return true;
+  int xx = hist.back().t;
+  return (hist.empty() || sample > xx);
+}
+
+bool TOIInterpolator::canGet(long sample)
+{
+  return (!hist.empty() && (sample >= hist.front().t && sample <= hist.back().t));
+}
+
+double TOIInterpolator::getEValue(long sample) // can forget before sample
+{
+  if (!canGet(sample)) return -9.e99;   // user should have checked before
+  deque<pair>::iterator i = hist.begin();
+  while ((*i).t < sample) i++;
+  if ((*i).t > sample) i--;
+  double value = (*i).val;
+  if (i != hist.begin()) {
+    i--;
+    hist.erase(hist.begin(), i);
+  }
+  return value;
+}
+
+double TOIInterpolator::getIValue(long sample) // can forget before sample
+{
+  if (!canGet(sample)) return -9.e99;   // user should have checked before
+  
+  deque<pair>::iterator i = hist.begin();
+  while ((*i).t < sample) i++;
+  double value;
+  if ((*i).t == sample) {
+    value = (*i).val;
+  } else {    
+    long samp2 = (*i).t;
+    double val2 = (*i).val;
+    i--;
+    long samp1 = (*i).t;
+    double val1 = (*i).val;
+    value = val1 + (val2-val1)*(sample-samp1)/(samp2-samp1);
+  }
+  if (i != hist.begin()) {
+    i--;
+    hist.erase(hist.begin(), i);
+  }
+  return value;
+}
+
+bool TOIInterpolator::isNewValue(long sample) 
+{
+  deque<pair>::iterator i = hist.begin();
+  while (i!=hist.end()) {
+    if ((*i).t == sample) return true;
+    if ((*i).t > sample) return false;
+    i++;
+  }
+  return false;
+}
+
+
+long TOIInterpolator::nextSample(long sampleMin)
+{
+  for (deque<pair>::iterator i = hist.begin(); i<hist.end(); i++) 
+    if ((*i).t >= sampleMin) return (*i).t;
+  return -1;
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toiinterpolator.h	(revision 439)
@@ -0,0 +1,37 @@
+// toiinterpolator.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#ifndef TOIINTERPOLATOR_H
+#define TOIINTERPOLATOR_H
+
+#include <deque>
+
+using namespace std;
+
+
+class TOIInterpolator {
+public:
+
+  void enterValue(double value, long sample);
+  bool   needMoreDataFor(long sample);   // need more data ? (for interp)
+  bool   canGet(long sample);        // enough info ?
+  double getIValue(long sample);     // can forget before sample
+  double getEValue(long sample);     // can forget before sample
+  bool   isNewValue(long sample);    
+  long   nextSample(long sampleMin); // the next true sample available
+
+protected:
+  struct pair {
+    pair(double v, long tt) : val(v), t(tt) {}
+    pair() {}
+    double val;
+    long t;
+  };
+  
+  deque<pair> hist;
+};
+
+
+#endif
+
Index: /tags/V_240999/Poubelle/archTOI.old/toiiter.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toiiter.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toiiter.cc	(revision 439)
@@ -0,0 +1,998 @@
+// toiiter.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef nb_max_bolo
+#define _archeops		//  Acquisition Archeops (avec transputer) 
+#define programme
+extern "C" {
+#include "archeops.h"
+#include "arcunit.h"
+}
+#endif
+
+
+#include "toiiter.h"
+#include "toiinterpolator.h"
+#include "archparam.h"
+#include <dirent.h>
+#include <iostream.h>
+#include "templocator.h"
+
+// Format bloc GPS
+// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
+
+TOIIter::TOIIter() {
+ // Toutes les valeurs initialisees par defaut. Le TOISvr les positionnera,
+ // puis lancera l'initialisation
+ 
+ file = NULL;
+ directory = "";
+ 
+ files.clear();
+
+ isOnBoardRecorder = false;
+   
+ imes=0;
+
+ tStart = -9.e99;
+ tEnd   = 9.e99;
+ utcStart = -9.e99;
+ utcEnd   = 9.e99;
+ 
+ sStart = -999999999;
+ sEnd   =  999999999;
+ 
+ //tBlock0 = -1;
+ // perEch = -1;
+ // Values for Trapani 99 = default values
+ //tBlock0 = 1376.8358818;
+ //perEch = 0.005836818076;
+ 
+ trigMask = 0;
+ rawIter = NULL;
+ interp  = NULL;
+ lastSample = -1;
+ maxLookAhead = 10000;
+ 
+ auxGPS = NULL;
+ 
+ initDone = false;
+ 
+ underSample = 1;
+}
+
+TOIIter::TOIIter(TOIIter const& x) {
+  directory = x.directory;
+  files = x.files;
+  if (x.initDone && x.curFile != x.files.end()) curFile = files.find(*(x.curFile));
+  isOnBoardRecorder = x.isOnBoardRecorder;
+  imes   = x.imes;
+  
+  tStart   = x.tStart;
+  tEnd     = x.tEnd;
+  utcStart = x.utcStart;
+  utcEnd   = x.utcEnd;
+  sStart   = x.sStart;
+  sEnd     = x.sEnd;
+  
+  trigMask = x.trigMask;
+  infos = x.infos;   
+
+  if (x.file)
+    file = new ArcheopsFile(*x.file);
+  else 
+    file = NULL;
+    
+  if (x.rawIter) {
+    rawIter = new TOIIter(*x.rawIter);
+    interp = new TOIInterpolator[infos.size()];
+    for (int i=0; i<infos.size(); i++)
+      interp[i] = x.interp[i];
+  } else {
+    rawIter = NULL;
+    interp  = NULL;
+  }
+  
+  lastSample = x.lastSample;
+  maxLookAhead = x.maxLookAhead;
+  
+  auxGPS = x.auxGPS; 
+  if (auxGPS) auxGPS = auxGPS->clone();
+  
+  initDone = x.initDone;
+  underSample = x.underSample;
+}
+
+TOIIter::~TOIIter() {
+  delete file;
+  delete rawIter;
+  delete[] interp;
+  delete auxGPS;
+}
+
+#ifdef __MWERKS__
+#define filesep ':'
+#else
+#define filesep '/'
+#endif
+
+void TOIIter::Init() {
+ if (initDone) return;
+ initDone = true;
+ if (utcStart > 0) {
+   double t = (utcStart/24.) + archParam.acq.utcOrigin;
+   if (t > tStart) tStart=t;
+ }
+ if (utcEnd > 0) {
+   double t = (utcEnd/24.) + archParam.acq.utcOrigin;
+   if (t < tEnd) tEnd=t;
+ }
+ // On a soit un repertoire, soit une liste de fichiers....
+  if (directory == "") {
+    if (files.empty()) {   // Ni repertoire, ni fichiers
+      cerr << "toiiter : pas de repertoire, pas de fichiers" << endl;
+      exit(-1);
+    } else {
+      // On a deja une liste de fichiers
+    }
+  } else { // On a un repertoire a explorer
+    // On cherche soit les fichiers dans le repertoire donne, soit des fichiers
+    // dans un sous-repertoire "arch-YY_MM_DD". Les fichiers ont un nom en
+    // "hYY_MM_DD-hh_mm_ss".
+    // Pour l'enregistreur de vol, les fichiers ont un nom en ARKxxxxxx.DAT
+    if (directory[directory.length()-1] != filesep) 
+      directory += filesep;
+    DIR* dir = opendir(directory.c_str());
+    struct dirent* ent;
+    while ((ent = readdir(dir)) != NULL) {
+      // si c'est un repertoire, avec un nom de jour, il faut l'explorer...
+      if (!strncmp(ent->d_name, "arch-", 5)) {
+        double mjd = ArcheopsFile::decodeMJD(ent->d_name+5) - 2./24.; // ENTIER + .5 en temps local!
+        if (mjd >= tStart - 1. && mjd <= tEnd) {
+          string direc2 = directory + ent->d_name + filesep;
+          DIR* dir2 = opendir(direc2.c_str());
+          struct dirent* ent2;
+          while ((ent2 = readdir(dir2)) != NULL) {
+            if (*ent2->d_name == 'h') {
+              double mjd2 = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.;
+              if (mjd2 >= tStart - 1./24. && mjd2 <= tEnd) {
+                files.insert(direc2 + ent2->d_name);
+              }
+            }
+          }
+        }
+      } else {
+        if (!isOnBoardRecorder && *ent->d_name == 'h') {
+          double mjd = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; // $CHECK$ UTCOffset
+          if (mjd >= tStart - 1./24. && mjd <= tEnd) {
+            files.insert(directory + ent->d_name);
+          }
+        } else if (isOnBoardRecorder) {
+          if (strncmp(ent->d_name, "ARK", 3) && strncmp(ent->d_name, "ark", 3)) continue;
+          char * sfx = ent->d_name + strlen(ent->d_name) - 4;
+          if (strcmp(sfx, ".DAT") && strcmp(sfx, ".dat")) continue;
+          files.insert(directory + ent->d_name);
+        }
+      }
+    }
+    closedir(dir);
+  }
+    
+  ScanFiles();
+  
+  curFile = files.begin();
+  file = new ArcheopsFile((*curFile).c_str());
+  cout << "opening file " << (*curFile).c_str() << endl;
+
+  // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
+  // car on ne peut rien faire sans...
+  // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
+  // on en simule un
+  double oldTStart = tStart;
+  tStart = -9.e99; // pour init, on accepte des blocs avant tstart....
+  
+  if (!file->lastParam()) {
+    if (isOnBoardRecorder) {
+      extern param_bolo  parametr;
+      block_type_param block;
+      block.param = parametr;
+      valide_block((block_type_modele*)&block, block_param, 0);
+      file->forceBlock((block_type_modele*)&block);
+    } else {
+      file->nextBlock(block_param_mask);
+    }
+  }
+  if (!file->lastReglage()) file->nextBlock(block_reglage_mask);
+  
+  // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC.
+  // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire
+  // mieux en prenant le min de tous les delta_T, a condition d'avoir un 
+  // peu plus de details sur la facon dont le GPS est lu.
+  
+  if (archParam.acq.tBlock0 < 0) {
+    archParam.acq.tBlock0 = file->getStartMJD();
+
+    file->pushMark();
+    if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
+      // le temps du bloc courant, en secondes
+      double dt = file->blockNum() * file->perBlock();
+      archParam.acq.tBlock0 = file->getGPSMJD() - dt/86400.;
+    } else { // pas de bloc GPS...
+      archParam.acq.tBlock0 = file->getStartMJD();
+    }
+    file->popMark();
+  }
+  tStart = oldTStart;  // on restaure
+  
+  if (archParam.acq.perEch < 0)
+    archParam.acq.perEch = file->perEchant();
+
+  bool hasInterp = false;
+  
+  trigMask = 0;
+  for (vector<info>::iterator i = infos.begin(); i != infos.end(); i++) {
+    if ((*i).interpolated) hasInterp = true;
+    if ((*i).triggering) {
+      switch ((*i).kind) {
+      case boloMuV:
+      case boloMuV2:
+      case boloRawMuV:
+      case boloRawMuVCN:
+        trigMask |= block_bolo_mask;
+        break;
+      case boloMuV2T:
+      case boloRes:
+      case boloTemp:
+         trigMask |= block_bolo_mask | block_reglage_mask;
+        break;
+      case dilDAC:
+      case dilSwitch:
+        trigMask |= block_dilution_mask;
+      case boloGainAmpli:
+      case boloDACV:
+      case boloDACI:
+        trigMask |= block_reglage_mask;
+        break;
+      case gpsTime:
+      case longitude:
+      case latitude:
+      case altitude:
+        trigMask |= block_gps_mask;
+        break;
+      case azimuthBolo:
+        trigMask |= block_bolo_mask;
+        //file->needSSTProcessMask(SSTHandler::findPeriod);
+        //trigMask |= block_sst_mask;
+        break;
+      case sstStarCnt:
+      case sstStarZ:
+      case sstStarF:
+      case sstStarT:
+        file->needSSTProcessMask(SSTHandler::findStars);
+        trigMask |= block_sst_mask;
+        break;
+      case sstDiode:
+      case sstDiodeCN:
+        file->needSSTProcessMask(SSTHandler::permDiode);
+        trigMask |= block_sst_mask;
+        break;
+      case sstChannel:
+      case sstChannelCN:
+        trigMask |= block_sst_mask;
+        break;
+      case gyroRaw:
+      case gyroV:
+        trigMask |= block_gyro_mask;
+        break;
+      case gyroSpeed:
+        trigMask |= block_gyro_mask; // $CHECK$ + info to calibrate gyros
+        break;
+      case alphaRotAxis:
+      case deltaRotAxis:
+      case alphaSst:
+      case deltaSst:
+      case alphaFPAxis:
+      case deltaFPAxis:
+      case alphaBolo:
+      case deltaBolo:
+        trigMask |= block_bolo_mask;
+        //file->needSSTProcessMask(SSTHandler::findAxis);
+        //trigMask |= block_sst_mask;
+        break;
+      case alphaZenith:
+      case deltaZenith:
+        trigMask |= block_gps_mask;
+        break;
+      case voyantEVO:
+      case voyantEVF:
+      case commandeEV0:
+      case commandeEVF:
+      case commandeEVB:
+      case commandeEVV:
+      case pressEnt3He:
+      case debit3He:
+      case pressSor3He:
+      case pressEnt4He:
+      case debit4He:
+      case pressSor4He:
+      case pressAirVanne:
+      case pressPompChar:
+      case pressMembrane:
+      case pressExterne:
+      case tensPile10T:
+      case tensPileP18D:
+      case tensPileM18D:
+      case tensPile10B:
+      case tensPileP18B:
+      case tensPileM18B:
+      case tensPileCh:
+      case swPile5:
+      case swPile15:
+      case tempCaissH1:
+      case tempCaissH2:
+      case tempCaissB1:
+      case tempCaissB2:
+      case tempCaissTHe:
+      case tempCaissPiles:
+      case tempCaissDrv:
+      case pressHeBain:
+      case pressPirani:
+        trigMask |= block_dilution_mask;
+        break;
+      }
+    }
+  }
+  
+  if (trigMask & (block_bolo_mask | block_sst_mask)) {
+    imes = 9999;
+  } else {
+    imes = 0;
+  }
+  
+  if (hasInterp) {
+    rawIter = new TOIIter(*this);
+    interp = new TOIInterpolator[infos.size()];
+    for (int i=0; i<infos.size(); i++) {
+      rawIter->infos[i].interpolated = false;
+    }
+    delete file; file = NULL; // on ne travaille plus sur le fichier directement...
+  }
+}
+
+void TOIIter::ScanFiles() {
+  file1stSamp.clear();
+  cout << "Scanning all files" << endl;
+  // Petite astuce pour les STL non conformes comme celles de digital
+  // qui ne supportent pas files.erase(i) suivi de i++....
+  set<string> copy = files;
+  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
+    ArcheopsFile fich((*i).c_str());
+    if (fich.nextBlock()) {
+      file1stSamp[*i] = fich.blockNum()*72; // premier numsample
+      cout << "File " << *i << " 1st sample = " << fich.blockNum()*72 << endl;
+    } else {
+      cout << "File " << *i << " unrecoverable, skipping" << endl;
+      files.erase(*i);
+    }
+  }
+  cout << "Scan done" << endl;
+  
+  // Et maintenant, on ne garde que ceux qui tombent dans l'intervalle...
+  copy = files;
+  string prev="";
+  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
+    double smp = file1stSamp[*i];
+    double t   = archParam.acq.tBlock0 + smp * archParam.acq.perEch/86400.;
+    if (t>tEnd || smp>sEnd) {  // premier echantillon apres tEnd
+     files.erase(*i);
+     prev = "";
+     continue;
+    }
+    if (t<tStart || smp<sStart) { // premier echantillon avant tStart -> on vire le precedent si existe
+      if (prev != "") {
+        files.erase(prev);
+      }
+    }
+    prev = *i;
+  }
+}
+
+bool TOIIter::NextFile() {
+  if (rawIter)
+    return rawIter->NextFile();
+    
+  if (files.empty()) {
+    return false;
+  } else {
+    if (curFile == files.end()) return false;
+    curFile++;
+    if (curFile == files.end()) return false;
+    cout << "opening file " << (*curFile).c_str() << endl;
+    ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str());
+    newfile->grabLastBlocs(*file);
+    delete file;
+    file = newfile;
+    return true;
+  }
+}
+
+bool TOIIter::Next() {
+  for (int ii=0; ii<underSample; ii++)
+    if (!Next1()) return false;
+  return true;
+}
+
+bool TOIIter::Next1() {
+  if (!initDone) Init();
+  while (1) {
+    if (!NextSample()) return false; // end of files
+    double t = getMJD();
+    if (t < tStart) continue;
+    if (t > tEnd) return false;
+    return true;
+  }
+}
+
+bool TOIIter::NextSample() {
+  if (rawIter) {  // Delegation pour interpolation
+    // Trouve prochain sample disponible
+    for (int k=0; k<2; k++) {
+      long smp = 2147483647L;
+      for (int i=0; i<infos.size(); i++) {
+        long ss = interp[i].nextSample(lastSample+1);
+        if (ss > 0 && ss < smp) smp=ss;
+      }
+      if (smp != 2147483647L) {
+        lastSample = smp;
+        break;
+      }
+      if (!fetchAhead())  // tout le monde etait en bout de course,
+        return false;     // on lit un echantillon, ca suffit, d'ou le k<2
+    }
+    // Verifie que tous les interpolateurs ont assez de donnees pour
+    // trouver la valeur correspondante
+    for (int i=0; i<infos.size(); i++) {
+      //rif (infos[i].interpolated) 
+        while (interp[i].needMoreDataFor(lastSample) && 
+               rawIter->getSampleIndex() - lastSample < maxLookAhead)
+          if (!fetchAhead()) return false;
+    }
+    
+    // On est pret...
+    return true;
+  }
+
+  // trigger sur info indexee dans bloc bolo, bloc gyro ou bloc sst ?
+  if (trigMask & (block_bolo_mask | block_sst_mask | block_gyro_mask )) {
+    imes++;
+    if (imes < file->nEchBlock()) return true;
+    imes = 0;
+  }
+  
+  // soit pas d'info indexee, soit fin bloc courant...
+  while (1) {
+    if (file->nextBlock(trigMask)) {
+      while (file->sameBlockNumAhead()) {  // tant que meme numero de bloc, on lit
+        if (!file->nextBlock()) {          // fin de fichier ?
+          if (NextFile()) file->nextBlock(); // fichier suivant
+          else return false;    // tout fini
+        }
+      }
+      return true;
+    }
+    if (!NextFile()) return false;
+  }
+}
+
+/* double TOIIter::getTime() {                // MJD 
+   // le temps du bloc courant, en secondes
+   double dt = file->blockNum() * file->perBlock();
+   return tBlock0 + dt/86400. + imes*file->perEchant()/86400.;
+ }
+ */
+ 
+bool TOIIter::canGetValue(int column) {
+  if (!initDone) Init();
+   if (column < 0 || column >= infos.size()) return false;
+   TOIKind kind = infos[column].kind;
+   if (auxGPS && 
+       (kind == longitude || kind == latitude || kind == altitude || kind == tsid ||
+        kind == alphaZenith || kind == deltaZenith)) {
+         double dummy;
+         return auxGPS->getLocation(getMJD(), dummy, dummy, dummy) == 0;
+   }
+   if (rawIter) {
+       return interp[column].canGet(lastSample);
+   }
+   int index = infos[column].index;
+   switch (kind) {
+   case sampleNum:
+   case internalTime:
+   case mjd:
+   case mutc:
+     return true;
+   case boloMuV:
+   case boloMuV2:
+   case boloMuV2T:
+   case boloRes:
+   case boloRawMuVCN:
+   case boloTemp:
+     if (imes==0 && file->llastBolo()==NULL) return false;
+     return file->lastBolo() != NULL;
+   case boloRawMuV:
+     return file->lastBolo() != NULL;
+   case boloGainAmpli:
+   case boloDACV:
+   case boloDACI:
+     return file->lastReglage() != NULL;
+   case dilDAC:
+   case dilSwitch:
+     return file->lastDilution() != NULL;
+   case sstDiode:
+   case sstChannel:
+   case sstDiodeCN:
+   case sstChannelCN:
+     return file->lastSST() != NULL;
+   case sstStarCnt:
+   case sstStarZ:
+   case sstStarF:
+   case sstStarT:{
+     if (file->lastSST() == NULL) return false;
+     int n = file->getNumbStar(imes);
+     return (n > 0 && index < n);
+   }
+   case gyroRaw:
+   case gyroV:
+   case gyroSpeed:
+     return (file->lastGyro() != NULL);
+   case gpsTime:
+     return file->hasGPSTime();
+   case longitude:
+   case latitude:
+   case alphaZenith:
+   case deltaZenith:
+     return file->hasGPSPos();
+   case altitude:
+     return file->hasGPSAlt();
+   case tsid:
+     return file->hasGPSPos();
+   case azimuthBolo:
+   case alphaRotAxis:
+   case deltaRotAxis:
+   case alphaFPAxis:
+   case deltaFPAxis:
+   case alphaBolo:
+   case deltaBolo:
+     return true;
+     //return (file->lastGPS() != NULL && file->lastSST() != NULL);
+   case alphaSst:
+   case deltaSst:
+     return false;
+   case voyantEVO:
+   case voyantEVF:
+   case commandeEV0:
+   case commandeEVF:
+   case commandeEVB:
+   case commandeEVV:
+   case pressEnt3He:
+   case debit3He:
+   case pressSor3He:
+   case pressEnt4He:
+   case debit4He:
+   case pressSor4He:
+   case pressAirVanne:
+   case pressPompChar:
+   case pressMembrane:
+   case pressExterne:
+   case tensPile10T:
+   case tensPileP18D:
+   case tensPileM18D:
+   case tensPile10B:
+   case tensPileP18B:
+   case tensPileM18B:
+   case tensPileCh:
+   case swPile5:
+   case swPile15:
+   case tempCaissH1:
+   case tempCaissH2:
+   case tempCaissB1:
+   case tempCaissB2:
+   case tempCaissTHe:
+   case tempCaissPiles:
+   case tempCaissDrv:
+   case pressHeBain:
+   case pressPirani:
+     return file->lastDilution() != NULL;
+   }
+   return false;
+}
+
+
+double TOIIter::getValue(int column) {
+  if (!initDone) Init();
+   if (column < 0 || column >= infos.size()) return -1;
+   TOIKind kind = infos[column].kind;
+   if (auxGPS && 
+       (kind == longitude || kind == latitude || kind == altitude || kind == tsid)) {
+         double lat,lon,alt;
+         if (auxGPS->getLocation(getMJD(), lat, lon, alt)) return -99999;
+         if (kind == longitude) return lon;
+         if (kind == latitude)  return lat;
+         if (kind == altitude)  return alt;
+         if (kind == tsid) {
+           tSid.setLongitude(lon);
+           return tSid.getLST(getMJD());
+         }
+         
+   }
+   if (rawIter) {
+     if (infos[column].interpolated)
+       return interp[column].getIValue(lastSample);
+     else
+       return interp[column].getEValue(lastSample);
+   }
+   int index = infos[column].index;
+   switch (kind) {
+   case sampleNum:
+     return getSampleIndex();
+   case internalTime:
+     return getSampleIndex() * archParam.acq.perEch;
+   case mjd:
+     return getMJD();
+   case mutc:
+     return (getMJD()-archParam.acq.utcOrigin)*24.;
+   case boloMuV:
+     return file->getBoloMuV(index, imes);
+   case boloMuV2:
+     return file->getBoloMuV2(index, imes);
+   case boloRawMuV:
+     return file->getBoloRawMuV(index, imes);
+   case boloRawMuVCN:
+     return file->getBoloRawMuVCN(index, imes);
+   case boloGainAmpli:
+     return file->getGainAmpli(index);
+   case boloDACV:
+     return file->getDACV(index);
+   case boloDACI:
+     return file->getDACI(index);
+   case boloMuV2T:
+     return file->getBoloMuV2T(index, imes);
+   case boloRes:
+     return file->getBoloRes(index, imes);
+   case boloTemp:
+     return file->getBoloTemp(index, imes);
+   case dilDAC:
+     return file->getADCDil(index);
+   case dilSwitch:
+     return file->getSwitchDil();
+   case sstDiode:
+     return file->getSSTSignal(index, imes);
+   case sstChannel:
+     return file->getSSTRawSignal(index, imes);
+   case sstDiodeCN:
+     return file->getSSTSignalCN(index, imes);
+   case sstChannelCN:
+     return file->getSSTRawSignalCN(index, imes);
+   case sstStarCnt:
+     return file->getNumbStar(imes);
+   case sstStarZ:
+     return file->getSSTStarZ(index, imes);
+   case sstStarF:
+     return file->getSSTStarF(index, imes);
+   case sstStarT:
+     return file->getSSTStarT(index, imes);
+   case gyroRaw:
+     return file->getGyroRaw(index, imes);
+   case gyroV:
+     return file->getGyroTens(index, imes);
+   case gyroSpeed:
+     return file->getGyroSpeed(index, imes);
+   case gpsTime:
+     return file->getGPSUTC();
+   case longitude:
+     return file->getGPSLong();
+   case latitude:
+     return file->getGPSLat();
+   case altitude:
+     return file->getGPSAlt();
+   case tsid:
+     tSid.setLongitude(file->getGPSLong());
+     return tSid.getLST(getMJD());
+   case azimuthBolo:
+   case alphaRotAxis:
+   case deltaRotAxis: 
+   case alphaFPAxis:
+   case deltaFPAxis: 
+   case alphaZenith:
+   case deltaZenith: 
+   case alphaBolo:
+   case deltaBolo: {
+        double lat, lon;
+        if (auxGPS) {
+          double alti;
+          auxGPS->getLocation(getMJD(), lat, lon, alti);
+        } else {
+          lon = file->getGPSLong();
+          lat = file->getGPSLat();
+        }
+        tSid.setLongitude(lon);
+        double ts = tSid.getLST(getMJD());
+        tempLocator.setEarthPos(lon, lat);
+        tempLocator.setTSid(ts);
+        if ((kind) == alphaRotAxis) return tempLocator.getAlphaZenith();
+        if ((kind) == deltaRotAxis) return tempLocator.getDeltaZenith();
+        if ((kind) == alphaZenith) return tempLocator.getAlphaZenith();
+        if ((kind) == deltaZenith) return tempLocator.getDeltaZenith();
+        if ((kind) == azimuthBolo) return tempLocator.getAzimutBolo(getSampleIndex(),index);
+        if ((kind) == alphaBolo) return tempLocator.getAlphaBolo(getSampleIndex(),index);
+        if ((kind) == deltaBolo) return tempLocator.getDeltaBolo(getSampleIndex(),index);
+        if ((kind) == alphaFPAxis) return tempLocator.getAlphaCenter(getSampleIndex());
+        if ((kind) == deltaFPAxis) return tempLocator.getDeltaCenter(getSampleIndex());
+        return 0;
+     }
+   case voyantEVO:
+        return voyant_EVO(file->lastDilution());
+   case voyantEVF:
+        return voyant_EVF(file->lastDilution());
+   case commandeEV0:
+        return commande_EVO(file->lastDilution());
+   case commandeEVF:
+        return commande_EVF(file->lastDilution());
+   case commandeEVB:
+        return commande_EVB(file->lastDilution());
+   case commandeEVV:
+        return commande_EVV(file->lastDilution());
+   case pressEnt3He:
+        return pression_entree_3He(file->lastDilution());
+   case debit3He:
+        return debit_3He(file->lastDilution());
+   case pressSor3He:
+        return pression_sortie_3He(file->lastDilution());
+   case pressEnt4He:
+        return pression_entree_4He(file->lastDilution());
+   case debit4He:
+        return debit_4He(file->lastDilution());
+   case pressSor4He:
+        return pression_sortie_4He(file->lastDilution());
+   case pressAirVanne:
+        return pression_air_vanne(file->lastDilution());
+   case pressPompChar:
+        return pression_pompe_charbon(file->lastDilution());
+   case pressMembrane:
+        return pression_membranne(file->lastDilution());
+   case pressExterne:
+        return pression_externe(file->lastDilution());
+   case tensPile10T:
+        return tension_pile_10T(file->lastDilution());
+   case tensPileP18D:
+        return tension_pile_p18D(file->lastDilution());
+   case tensPileM18D:
+        return tension_pile_m18D(file->lastDilution());
+   case tensPile10B:
+        return tension_pile_10B(file->lastDilution());
+   case tensPileP18B:
+        return tension_pile_p18B(file->lastDilution());
+   case tensPileM18B:
+        return tension_pile_m18B(file->lastDilution());
+   case tensPileCh:
+        return tension_pile_Ch(file->lastDilution());
+   case swPile5:
+        return switch_pile_5(file->lastDilution());
+   case swPile15:
+        return switch_pile_15(file->lastDilution());
+   case tempCaissH1:
+        return temperature_caisson_haut1(file->lastDilution());
+   case tempCaissH2:
+        return temperature_caisson_haut2(file->lastDilution());
+   case tempCaissB1:
+        return temperature_caisson_bas1(file->lastDilution());
+   case tempCaissB2:
+        return temperature_caisson_bas2(file->lastDilution());
+   case tempCaissTHe:
+        return temperature_caisson_tube_helium(file->lastDilution());
+   case tempCaissPiles:
+        return temperature_caisson_piles(file->lastDilution());
+   case tempCaissDrv:
+        return temperature_caisson_driver_moteur(file->lastDilution());
+   case pressHeBain:
+        return pression_helium_bain(file->lastDilution());
+   case pressPirani:
+        return pression_pirani(file->lastDilution());
+   }
+   return -1;
+}
+ 
+bool   TOIIter::newValue(int column) {
+  if (!initDone) Init();
+   if (column < 0 || column >= infos.size()) return false;
+   TOIKind kind = infos[column].kind;
+   if (auxGPS && 
+       (kind == longitude || kind == latitude || kind == altitude)) {
+      return true;
+   }
+   if (rawIter) {
+       return interp[column].isNewValue(lastSample);
+   }
+   switch (kind) {
+     case sampleNum:
+     case internalTime:
+     case mjd:
+     case mutc:
+     case tsid:
+       return true;
+     case boloMuV:
+     case boloMuV2:
+     case boloMuV2T:
+     case boloRes:
+     case boloTemp:
+       return file->blockNum() == file->getBoloBlockNum();
+     case boloRawMuV:
+     case boloRawMuVCN:
+       return file->blockNum() == file->getBoloBlockNum();
+     case boloGainAmpli:
+       return file->blockNum() == file->getReglageBlockNum() && imes==0;
+     case boloDACI:
+     case boloDACV:
+       return file->blockNum() == file->getReglageBlockNum() && imes==0;
+     case dilDAC:
+     case dilSwitch:
+       return file->blockNum() == file->getDilutionBlockNum() && imes==0;
+     case sstChannel:
+     case sstDiode:
+     case sstStarCnt:
+     case sstStarZ:
+     case sstStarF:
+     case sstStarT:
+       return file->blockNum() == file->getSSTBlockNum();
+     case sstChannelCN:
+     case sstDiodeCN:
+       return file->blockNum() == file->getSSTCompBlockNum();
+     case gyroRaw:
+     case gyroV:
+     case gyroSpeed:
+       return file->blockNum() == file->getGyroBlockNum();
+     case gpsTime:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
+     case longitude:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
+     case latitude:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
+     case altitude:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
+     case azimuthBolo:
+     case alphaBolo:
+     case deltaBolo:
+     case alphaZenith:
+     case deltaZenith:
+     case alphaFPAxis:
+     case deltaFPAxis:
+       return true; // $CHECK$ with SSTHandler
+     case alphaRotAxis:
+       return true; // $CHECK$ with SSTHandler
+     case deltaRotAxis:
+       return true; // $CHECK$ with SSTHandler
+     case voyantEVO:
+     case voyantEVF:
+     case commandeEV0:
+     case commandeEVF:
+     case commandeEVB:
+     case commandeEVV:
+     case pressEnt3He:
+     case debit3He:
+     case pressSor3He:
+     case pressEnt4He:
+     case debit4He:
+     case pressSor4He:
+     case pressAirVanne:
+     case pressPompChar:
+     case pressMembrane:
+     case pressExterne:
+     case tensPile10T:
+     case tensPileP18D:
+     case tensPileM18D:
+     case tensPile10B:
+     case tensPileP18B:
+     case tensPileM18B:
+     case tensPileCh:
+     case swPile5:
+     case swPile15:
+     case tempCaissH1:
+     case tempCaissH2:
+     case tempCaissB1:
+     case tempCaissB2:
+     case tempCaissTHe:
+     case tempCaissPiles:
+     case tempCaissDrv:
+     case pressHeBain:
+     case pressPirani:
+       return file->blockNum() == file->getDilutionBlockNum() && imes==0;
+   }
+   return false;
+}
+ 
+bool   TOIIter::extendValue(int column) {
+   return (!infos[column].interpolated && !newValue(column));
+}
+ 
+bool   TOIIter::interpValue(int column) {
+   return (infos[column].interpolated && !newValue(column));
+}
+
+bool TOIIter::isTrig(int column) {
+   if (column < 0 || column >= infos.size()) return false;
+   return infos[column].triggering;
+}
+
+ 
+TOIKind TOIIter::getKind(int column) {
+   if (column < 0 || column >= infos.size()) return (TOIKind)-1;
+   return infos[column].kind;
+}
+ 
+int TOIIter::getIndex(int column) {
+   if (column < 0 || column >= infos.size()) return (TOIKind)-1;
+   return infos[column].index;
+}
+
+int TOIIter::getColTOI(TOIKind kind, int index) {
+   for (int i=0; i<infos.size(); i++)
+     if (infos[i].kind == kind && infos[i].index == index)
+       return i;
+   return -1;
+}
+
+bool TOIIter::canGetTOI(TOIKind kind, int index) {
+   int col = getColTOI(kind, index);
+   if (col<0) return false;
+   return canGetValue(col);
+}
+
+double TOIIter::getTOI(TOIKind kind, int index) {
+   int col = getColTOI(kind, index);
+   if (col<0) return -9.e99;
+   return getValue(col);
+}
+
+   
+int TOIIter::getBlockSampleIndex() {
+   return imes;
+}
+ 
+int TOIIter::getUnderSampling() {
+  return underSample;
+}
+
+int TOIIter::getSampleIndex() {
+  if (!initDone) Init();
+   if (file) {
+     return file->blockNum() * file->nEchBlock() + imes;
+   } else {
+     return lastSample;
+   }
+}
+
+double TOIIter::getMJD() {
+  if (!initDone) Init();
+  int sample = getSampleIndex();
+  return archParam.acq.tBlock0 + sample*archParam.acq.perEch/86400.;
+}
+ 
+bool TOIIter::fetchAhead() { // Seulement si delegation
+  if (!rawIter) return false;
+  if (!rawIter->Next()) return false;
+  long sample = rawIter->getSampleIndex();
+  for (int i=0; i<infos.size(); i++) {
+    if (rawIter->canGetValue(i) && rawIter->newValue(i)) {
+      interp[i].enterValue(rawIter->getValue(i), sample);
+    }
+  }
+  return true;
+}
+
+block_type_param* TOIIter::lastParam() {
+  if (!initDone) Init();
+  if (file) return file->lastParam(); 
+  else return rawIter->lastParam();
+}
+
+
Index: /tags/V_240999/Poubelle/archTOI.old/toiiter.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toiiter.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toiiter.h	(revision 439)
@@ -0,0 +1,198 @@
+// toiiter.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#ifndef TOIITER_H
+#define TOIITER_H
+
+
+#include <vector>
+#include <set>
+#include <map>
+#include <string>
+#include "archeopsfile.h"
+#include "auxgps.h"
+#include "tsid.h"
+
+enum TOIKind {
+  sampleNum,     // Numero d''echantillon (timer interne transputer)
+  internalTime,  // temps transputer depuis debut manip, en secondes.
+  mjd,           // UTC (en jours, MJD = JD - 2450000).
+  mutc,          // UTC en heure, avec soustraction d'origine
+  boloMuV,       // tension en microVolts, filtree avec filtre carre indexe par bolometre
+  boloMuV2,      // tension en microVolts, avec soustraction offset filtre
+  boloRawMuV,    // tension brute en microVolts, non filtree indexe par bolometre, sans chgt signe
+  boloTemp,      // Kelvins, need R(T) -> N/A
+  boloDACV,      // tension de reference du DAC (microVolts)
+  boloDACI,      // courant (microAmps)
+  boloRawMuVCN,  // compression noise on bolo (microVolts), no filter
+  boloMuV2T,     // total, microVolts, avec consigne DAC
+  boloRes,       // Resistance, ohms
+  boloGainAmpli, //
+  dilDAC,        // dilution DAC, index = 0-47
+  dilSwitch,     // dilution, mot de 32 bits
+  serviceTemp,   // service temperature, K
+  sstDiode,      // signal brut SST, indice = diode, 0-45
+  sstChannel,    // signal brut SST, indice = canal, 0-47
+  sstDiodeCN,    // compression noise
+  sstChannelCN,  // compression noise
+  sstStarCnt,    // nombre d''etoiles detectees durant ce sample
+  sstStarZ,      // numero de diode d''une eventuelle etoile,   i=etoile 0..n
+  sstStarF,      // flux d''une eventuelle etoile,             <0 si moins de i+1 etoiles
+  sstStarT,      // temps d''une eventuelle etoile,            <0 si moins de i+1 etoiles
+  gyroRaw,       // valeur brute du gyro, index = 0,1,2
+  gyroV,         // tension gyro, V, index = 0,1,2
+  gyroSpeed,     // vitesse gyro, deg/s, index = 0,1,2, calibree...
+  gpsTime,       // temps fourni par GPS
+  longitude,     // position ballon, degrees  +=EST
+  latitude,      // position ballon, degrees  +=NORD
+  altitude,      // position ballon, m
+  tsid,          // temps sideral en secondes
+  azimuthBolo,   // azimut 
+  alphaRotAxis,  // 
+  deltaRotAxis,  //
+  alphaZenith,   // 
+  deltaZenith,   //
+  alphaSst,      // 
+  deltaSst,      //
+  alphaFPAxis,   //
+  deltaFPAxis,   //
+  alphaBolo,     // sur le ciel, indexe par bolometre
+  deltaBolo,     // sur le ciel, indexe par bolometre
+  voyantEVO,
+  voyantEVF,
+  commandeEV0,
+  commandeEVF,
+  commandeEVB,
+  commandeEVV,
+  pressEnt3He,
+  debit3He,
+  pressSor3He,
+  pressEnt4He,
+  debit4He,
+  pressSor4He,
+  pressAirVanne,
+  pressPompChar,
+  pressMembrane,
+  pressExterne,
+  tensPile10T,
+  tensPileP18D,
+  tensPileM18D,
+  tensPile10B,
+  tensPileP18B,
+  tensPileM18B,
+  tensPileCh,
+  swPile5,
+  swPile15,
+  tempCaissH1,
+  tempCaissH2,
+  tempCaissB1,
+  tempCaissB2,
+  tempCaissTHe,
+  tempCaissPiles,
+  tempCaissDrv,
+  pressHeBain,
+  pressPirani
+}; 
+
+class TOIInterpolator;
+
+class TOIIter {
+public:
+   TOIIter(TOIIter const&);   // $CHECK$ prevoir operator = ?
+   ~TOIIter();
+   bool Next();
+   
+   bool    canGetValue(int column);  // data is available for that...
+   double  getValue(int column);
+   bool    newValue(int column);     // a juste change ?
+   bool    extendValue(int column);  // une valeur plus ancienne, etendue ?
+   bool    interpValue(int column);  // une valeur interpolee avec valeur future ?
+   bool    isTrig(int column);  
+   TOIKind getKind(int column);
+   int     getIndex(int column);     // si plusieurs, exemple, tension bolo 2
+   
+   bool    canGetTOI(TOIKind kind, int index=0);
+   double  getTOI(TOIKind kind, int index=0);
+   
+   
+   int    getBlockSampleIndex();        // numero d''echantillon dans dernier bloc bolo
+   int    getSampleIndex();             // numero d''echantillon 
+   int    getUnderSampling();           
+   double getMJD();            
+
+   block_type_param*         lastParam();  
+   block_type_journal*       lastJournal();
+   block_type_reglage*       lastReglage();
+   block_type_dilution*      lastDilution();
+   block_type_gps*           lastGPS();
+   block_type_une_periode*   lastUnePeriode();
+   block_type_synchro_sol*   lastSynchroSol();
+   block_type_pointage_sol*  lastPointageSol();
+   block_type_bolo*          lastBolo();   
+   block_type_gyro*          lastGyro();
+   block_type_sst*           lastSST();
+   block_type_bolo_comprime* lastBoloComp();   
+   block_type_gyro_comprime* lastGyroComp();
+   block_type_sst_comprime*  lastSSTComp();
+   
+   ArcheopsFile* currentFile() {if (!initDone) Init(); return file;}
+
+protected:
+   TOIIter();
+   void Init(); // After setting the options, opens the first file.
+   void ScanFiles(); // Parcourt tous les fichiers, cherche le premier echantillon...
+   
+   bool Next1();
+   bool NextSample(); // no test of trange
+   bool NextFile();
+   
+   ArcheopsFile* file;
+   string directory;   // If directory scanning
+   set<string> files;  // list of files to be read...
+   map<string, long> file1stSamp; // premier echantillon de chaque fichier
+   set<string>::iterator curFile;
+   bool  isOnBoardRecorder;
+   
+   int imes;
+   
+   double tStart, tEnd;      // MJD
+   double utcStart, utcEnd;  // UTC, will be converted towards tStart tEnd at init
+   long   sStart, sEnd;      // samplenum
+   
+   //double tBlock0;  // MJD du bloc numero zero...
+   //double perEch;   // periode d''echantillonage en secondes
+   
+   struct info {
+     TOIKind kind;
+     int index;
+     bool triggering;
+     bool interpolated;
+   };
+   
+   int getColTOI(TOIKind kind, int index=0);
+   
+   long trigMask;
+   
+   vector<info>   infos;
+   
+   friend class TOISvr;
+   
+   // Gestion de l''interpolation, par delegation a un autre iterateur
+   TOIIter* rawIter; // iterateur sans interpolation, qui avance avec retard
+                     // en bufferisant les valeurs. S''il existe, on lui delegue
+                     // toutes les operations agissant sur le fichier.
+   TOIInterpolator* interp; // interpolateurs pour stocker les valeurs
+   long lastSample;  // last interpolated sample
+   long maxLookAhead;
+   bool fetchAhead(); // avance d''une TOI en nourrissant les interpolateurs
+   
+   AuxGPS* auxGPS;
+   TSid tSid;
+   
+   int underSample;
+   
+   private:
+   bool initDone;
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/toisvr.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toisvr.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toisvr.cc	(revision 439)
@@ -0,0 +1,279 @@
+// toisvr.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+#include <iostream.h>
+#include "toisvr.h"
+#include "archparam.h"
+#include "asigps.h"
+
+
+
+TOISvr::TOISvr()
+{
+  initDone = false;
+}
+
+// To avoid special copy constructor handling, we will not
+// register ourself to us... Special dealing in readReq.
+
+void TOISvr::setDirectory(string d) {
+  iter.directory = d;
+}
+
+void TOISvr::addFile(string f) {
+  iter.files.insert(f);
+}
+
+void TOISvr::useAuxGPS(AuxGPS* gps) {
+  if (iter.auxGPS) delete iter.auxGPS;
+  iter.auxGPS = gps;
+}
+
+
+void TOISvr::onBoardRecorderFiles(bool x) {
+  iter.isOnBoardRecorder = x;
+}
+
+  
+void TOISvr::setMJDInterval(double tStart, double tEnd) {
+  if (tStart>0) iter.tStart = tStart;
+  if (tEnd>0)   iter.tEnd = tEnd;
+}
+
+void TOISvr::setUTCInterval(double tStart, double tEnd) {
+  if (tStart>0) iter.utcStart = tStart;
+  if (tEnd>0)   iter.utcEnd = tEnd;
+}
+
+void TOISvr::setSNInterval(long tStart, long tEnd) {
+  if (tStart>0) iter.sStart = tStart;
+  if (tEnd>0)   iter.sEnd = tEnd;
+}
+
+
+void TOISvr::setUnderSample(int n) {
+  if (n<=1) n=1;
+  iter.underSample = n;
+}
+
+  
+void TOISvr::addInfo(TOIKind kind, int index, bool triggering, bool interp) {
+  TOIIter::info i;
+  i.kind = kind; 
+  i.index = index;
+  i.triggering = triggering;
+  i.interpolated= interp;
+  iter.infos.push_back(i);
+}
+
+void TOISvr::addInfo(TOIKind kind, bool triggering, bool interp) {
+  addInfo(kind,0,triggering,interp);
+}
+  
+TOIIter TOISvr::doQuery() {
+  //iter.Init();
+  return iter;
+}
+
+void TOISvr::registerReqHandler(RequestHandler* h) {
+  handlers.push_back(h);
+}
+
+
+void TOISvr::readReq(istream& str) {
+   if (!initDone) defaultInclude();
+   string line;
+   while (str) {
+     getline(str,line);
+     if (!str) break;
+     if (line.substr(0,4)=="#END") break;
+     if (line[0] != '@' && line[0] != '#') continue;
+     bool handled=processRequest(line); 
+     if (!handled) {
+        cerr << "*Warning, unrecognized directive " << line << endl;
+     }
+   }
+}
+
+#define tsttoi(toi)   if (keyw == "@"#toi) kind = toi;
+
+bool TOISvr::processRequest(string line) {
+  int x = line.find(' ');
+  string keyw = line.substr(0, x);
+  string args = (x>0) ? line.substr(x) : string("");
+  if (keyw[0] == '#') {
+     bool handled = processOption(keyw,args);
+     for (list<RequestHandler*>::iterator i = handlers.begin(); 
+          i != handlers.end(); i++) {
+       handled |= (*i)->processOption(keyw,args);
+     }
+     return handled;
+  }
+  if (keyw[0] == '@') {
+	// find TOI kind, index and options
+    TOIKind kind= (TOIKind)-1;
+    int index=-1;
+    bool interp=false;
+    bool repet =false;
+    bool flag  =false;
+    bool notrig=false;
+    tsttoi(sampleNum)
+    else tsttoi(internalTime)
+    else tsttoi(mjd)
+    else tsttoi(mutc)
+    else tsttoi(boloMuV)
+    else tsttoi(boloMuV2)
+    else tsttoi(boloRawMuV)
+    else tsttoi(boloRes)
+    else tsttoi(boloTemp)
+    else tsttoi(boloGainAmpli)
+    else tsttoi(boloDACV)
+    else tsttoi(boloDACI)
+    else tsttoi(boloMuV2T)
+    else tsttoi(boloRawMuVCN)
+    else tsttoi(dilDAC)
+    else tsttoi(dilSwitch)
+    else tsttoi(serviceTemp)
+    else tsttoi(sstDiode)
+    else tsttoi(sstChannel)
+    else tsttoi(sstDiodeCN)
+    else tsttoi(sstChannelCN)
+    else tsttoi(sstStarCnt)
+    else tsttoi(sstStarZ)
+    else tsttoi(sstStarF)
+    else tsttoi(sstStarT)
+    else tsttoi(gyroRaw)
+    else tsttoi(gyroV)
+    else tsttoi(gyroSpeed)
+    else tsttoi(gpsTime)
+    else tsttoi(longitude)
+    else tsttoi(latitude)
+    else tsttoi(altitude)
+    else tsttoi(tsid)
+    else tsttoi(azimuthBolo)
+    else tsttoi(alphaRotAxis)
+    else tsttoi(deltaRotAxis)
+    else tsttoi(alphaSst)
+    else tsttoi(deltaSst)
+    else tsttoi(alphaZenith)
+    else tsttoi(deltaZenith)
+    else tsttoi(alphaFPAxis)
+    else tsttoi(deltaFPAxis)
+    else tsttoi(alphaBolo)
+    else tsttoi(deltaBolo)
+    else {
+      // cerr << "*Warning, unrecognized TOI " << line << endl;
+      return false;
+    }
+    if (kind  == sampleNum || kind == mjd || kind == mutc) notrig = true;
+    string toiname = keyw.substr(1); 
+    while (args != "") {
+      if (args[0] == ' ') {
+        x = args.find_first_not_of(' ');
+        if (x==string::npos) break;
+        args = args.substr(x);
+        if (args == "") break;
+      }
+      x = args.find(' ');
+      string opt = args.substr(0, x);
+      args = (x>0) ? args.substr(x) : string("");
+      if (opt[0]>='0' && opt[0]<='9') {
+        index = atoi(opt.c_str());
+      } else if (opt == "notrig") {
+        notrig = true;
+      } else if (opt == "repet") {
+        repet = true; interp = false;
+      } else if (opt == "interp") {
+        interp = true; repet = false;
+      } else if (opt == "flag") {
+        flag = true;
+      }
+    }
+    bool handled = processTOIReq(line, toiname, kind, index, interp, repet, flag, notrig);
+    for (list<RequestHandler*>::iterator i = handlers.begin(); 
+         i != handlers.end(); i++) {
+      handled |= (*i)->processTOIReq(line, toiname, kind, index, interp, repet, flag, notrig);
+    }
+    return handled;
+  }
+  return false;
+}
+
+
+bool TOISvr::processTOIReq(string /*line*/, string /*toiname*/, TOIKind kind, int index, 
+                           bool interp, bool /*repet*/, bool /*flag*/, bool notrig)
+{
+  if (index<0) index=0;
+  addInfo(kind, index, !notrig, interp);
+  return true;
+} 
+
+bool TOISvr::processOption(string key, string arg)
+{
+  if (arg.length()>0 && arg[0] == ' ') {
+    arg = arg.substr(arg.find_first_not_of(' '));
+  }
+  if (key == "#MJDRANGE") {
+    double tmin, tmax;
+    sscanf(arg.c_str(), "%lg %lg", &tmin, &tmax);
+    setMJDInterval(tmin, tmax);
+  } else if (key == "#UTCRANGE") {
+    double tmin, tmax;
+    sscanf(arg.c_str(), "%lg %lg", &tmin, &tmax);
+    setUTCInterval(tmin, tmax);
+  } else if (key == "#SNRANGE") {
+    long tmin, tmax;
+    sscanf(arg.c_str(), "%ld %ld", &tmin, &tmax);
+    setSNInterval(tmin, tmax);
+  } else if (key == "#PATH") {
+    setDirectory(arg);
+  } else if (key == "#FILE") {
+    addFile(arg);
+  } else if (key == "#UNDERSAMPLE") {
+    setUnderSample(atoi(arg.c_str()));
+  } else if (key == "#RECORDER") {
+    onBoardRecorderFiles(true);
+  } else if (key == "#MJD0") {
+    double t0;
+    sscanf(arg.c_str(), "%lg", &t0);
+    archParam.acq.tBlock0 = t0;
+  } else if (key == "#UTCORIGIN") {
+    double t0;
+    sscanf(arg.c_str(), "%lg", &t0);
+    archParam.acq.utcOrigin = t0;
+  } else if (key == "#PERECH") {
+    double t0;
+    sscanf(arg.c_str(), "%lg", &t0);
+    archParam.acq.perEch = t0;
+  } else if (key == "#ASIGPS") {
+    ASIGPS* gps = new ASIGPS(arg);
+    gps->FitsDump("GPSDump.fits");
+    useAuxGPS(gps);
+  } else if (key == "#INCLUDE") {
+    ifstream f(arg.c_str());
+    readReq(f);
+  } else {
+    // cerr << "*Warning, unrecognized option " << line << endl;
+    return false;
+  }
+  return true;
+}
+
+void TOISvr::defaultInclude() {
+  initDone = true;
+  processRequest("#REQVERSION V_240999");
+  processRequest("#MJD0 1376.8358818");
+  processRequest("#PERECH 0.005836818076");
+  processRequest("#UTCORIGIN 1376.5");
+  processRequest("#ASIGPS ASI_GPS_archeops1999.ascii");
+  processRequest("#COMMENT Archtoi -- 23 september 1999 -- Eric Aubourg CEA/DAPNIA");
+  processRequest("#COMMENT ***WARNING***");
+  processRequest("#COMMENT ***SOME TOI'S ARE PRELIMINARY***");
+  processRequest("#COMMENT gyroSpeed is not calibrated");
+  processRequest("#COMMENT azimut/alpha/delta use galaxy crossings and ASI GPS data");
+  processRequest("#COMMENT and assume no pendulation");
+  processRequest("#COMMENT boloTens2 is not protected against glitches");
+  processRequest("#COMMENT sst software has not been updated to last DY code");
+  processRequest("#COMMENT trajectory info only while italian TM got GPS info");
+  
+}
Index: /tags/V_240999/Poubelle/archTOI.old/toisvr.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/toisvr.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/toisvr.h	(revision 439)
@@ -0,0 +1,57 @@
+// toisvr.h
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
+#ifndef TOISVR_H
+#define TOISVR_H
+
+#include "toiiter.h"
+#include <list>
+
+class AuxGPS;
+
+class RequestHandler {
+public:
+  virtual bool processTOIReq(string line, string toiname, TOIKind toi, int index, 
+                             bool interp, bool repet, bool flag, bool notrig)=0;
+  virtual bool processOption(string keyw, string args)=0;
+};
+
+class TOISvr : public RequestHandler {
+public:
+  TOISvr();
+  
+  void setDirectory(string);
+  void addFile(string);
+  void onBoardRecorderFiles(bool);
+  void useAuxGPS(AuxGPS* gps);
+  
+  void setMJDInterval(double tStart, double tEnd);
+  void setUTCInterval(double tStart, double tEnd);
+  void setSNInterval(long sStart, long sEnd);
+  void setUnderSample(int n);
+  
+  void addInfo(TOIKind kind, int index, bool triggering=true, bool interp=false);
+  void addInfo(TOIKind kind, bool triggering=true, bool interp=false);
+  
+  void readReq(istream& s);
+  
+  TOIIter doQuery();
+
+  bool processRequest(string line);
+  void registerReqHandler(RequestHandler*);
+  virtual bool processTOIReq(string line, string toiname, TOIKind toi, int index, 
+                             bool interp, bool repet, bool flag, bool notrig);
+  virtual bool processOption(string keyw, string args);
+  
+  void defaultInclude();
+  
+protected:
+  TOIIter iter;
+  list<RequestHandler*> handlers;
+  
+  bool initDone;
+};
+
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/transfelec.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/transfelec.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/transfelec.cc	(revision 439)
@@ -0,0 +1,37 @@
+#include "transfelec.h"
+
+
+// Parametres du circuit electrique de lecture SST
+// Valeurs Importantes du circuit electrique: 4 filtres
+
+static double T1=0.15; 		static double C1=1.5e-9;	// Farad
+static double T2=5.e-4; 								// secondes
+static double R2=1.E9; 									// Ohm
+static double T3=4.7e-3; 								// secondes
+static double R4=1.e5; 		static double R3=1.8e3;		// Ohm
+static double T4=4.84e-3;
+
+
+Dcomplex TransFuncElec::TsFunc(double w){
+	Dcomplex tempComp= H1(w)*H2(w)*H3(w)*H4(w); 			// Omega en radian/s
+	return tempComp;
+}
+
+Dcomplex TransFuncElec::H1(double w) {
+	Dcomplex tempComp=jImagPur*T1*w/(1.+jImagPur*T1*w); 	// passe haut
+	return tempComp;
+}
+
+Dcomplex TransFuncElec::H2(double w) {
+	return R2/(1.+jImagPur*T2*w); 		// passe bas leger
+}
+		
+Dcomplex TransFuncElec::H3(double w) {
+	return 1.+ R4/(R3*(1.+jImagPur*T3*w));  // passe bas dominant n°1
+}
+		
+Dcomplex TransFuncElec::H4(double w) {
+	if (w==0.) return 0.;
+	else return 1./(1.+jImagPur*T4*w);		// passe bas dominant n°2
+}
+
Index: /tags/V_240999/Poubelle/archTOI.old/transfelec.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/transfelec.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/transfelec.h	(revision 439)
@@ -0,0 +1,33 @@
+#ifndef TRANSFELEC_SEEN
+#define TRANSFELEC_SEEN
+
+//#include <math.h>
+
+#ifdef __MWERKS__
+	#include <complex.h>
+#else	
+	#include <complex>
+#endif 
+
+
+typedef complex<double> Dcomplex;
+
+
+class TransFuncElec{
+public:
+	TransFuncElec() {
+		Dcomplex Imag((double)0.,(double)1.);
+		jImagPur=Imag;
+	}
+	~TransFuncElec(){ }
+	Dcomplex TsFunc(double Omega);
+			// Omega en radian/s	
+private:
+	Dcomplex H1(double w);
+	Dcomplex H2(double w);
+	Dcomplex H3(double w);
+	Dcomplex H4(double w);
+	Dcomplex jImagPur;
+};
+
+#endif
Index: /tags/V_240999/Poubelle/archTOI.old/trigtbl.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/trigtbl.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/trigtbl.h	(revision 439)
@@ -0,0 +1,164 @@
+/*
+** Please only distribute this with it's associated FHT routine.
+** This algorithm is apparently patented(!) and the code copyrighted. 
+** See the comment with the fht routine for more info.
+**   -Thanks,
+**   Ron Mayer
+*/
+
+#ifdef REAL
+#else
+#define REAL double
+#endif
+
+#ifdef GOOD_TRIG
+#else
+#define FAST_TRIG
+#endif
+
+#if defined(GOOD_TRIG)
+#define FHT_SWAP(a,b,t) {(t)=(a);(a)=(b);(b)=(t);}
+#define TRIG_VARS					         \
+      int t_lam=0;
+#define TRIG_INIT(k,c,s)					 \
+     {								 \
+      int i;							 \
+      for (i=2 ; i<=k ; i++)					 \
+          {coswrk[i]=costab[i];sinwrk[i]=sintab[i];}		 \
+      t_lam = 0;					         \
+      c = 1;							 \
+      s = 0;							 \
+     }
+#define TRIG_NEXT(k,c,s)					 \
+     {								 \
+	 int i,j;	                                         \
+         (t_lam)++;	  					 \
+         for (i=0 ; !((1<<i)&t_lam) ; i++);			 \
+         i = k-i;						 \
+         s = sinwrk[i];						 \
+         c = coswrk[i];						 \
+         if (i>1)   						 \
+            {	    						 \
+             for (j=k-i+2 ; (1<<j)&t_lam ; j++);		 \
+             j	       = k - j;					 \
+             sinwrk[i] = halsec[i] * (sinwrk[i-1] + sinwrk[j]);  \
+             coswrk[i] = halsec[i] * (coswrk[i-1] + coswrk[j]);  \
+            }                                                    \
+     }
+#define TRIG_RESET(k,c,s)
+#endif
+
+#if defined(FAST_TRIG)
+#define TRIG_VARS					 \
+      REAL t_c,t_s;
+#define TRIG_INIT(k,c,s)				 \
+    {				        		 \
+     t_c  = costab[k];				         \
+     t_s  = sintab[k];				         \
+     c    = 1;				    		 \
+     s    = 0;				    		 \
+    }
+#define TRIG_NEXT(k,c,s)				 \
+    {                                                    \
+     REAL t = c;                                         \
+     c   = t*t_c - s*t_s;				 \
+     s   = t*t_s + s*t_c;				 \
+    }
+#define TRIG_RESET(k,c,s)
+#endif
+
+static REAL halsec[20]=
+    {
+     0,
+     0,
+     .54119610014619698439972320536638942006107206337801,
+     .50979557910415916894193980398784391368261849190893,
+     .50241928618815570551167011928012092247859337193963,
+     .50060299823519630134550410676638239611758632599591,
+     .50015063602065098821477101271097658495974913010340,
+     .50003765191554772296778139077905492847503165398345,
+     .50000941253588775676512870469186533538523133757983,
+     .50000235310628608051401267171204408939326297376426,
+     .50000058827484117879868526730916804925780637276181,
+     .50000014706860214875463798283871198206179118093251,
+     .50000003676714377807315864400643020315103490883972,
+     .50000000919178552207366560348853455333939112569380,
+     .50000000229794635411562887767906868558991922348920,
+     .50000000057448658687873302235147272458812263401372
+    };
+static REAL costab[20]=
+    {
+     .00000000000000000000000000000000000000000000000000,
+     .70710678118654752440084436210484903928483593768847,
+     .92387953251128675612818318939678828682241662586364,
+     .98078528040323044912618223613423903697393373089333,
+     .99518472667219688624483695310947992157547486872985,
+     .99879545620517239271477160475910069444320361470461,
+     .99969881869620422011576564966617219685006108125772,
+     .99992470183914454092164649119638322435060646880221,
+     .99998117528260114265699043772856771617391725094433,
+     .99999529380957617151158012570011989955298763362218,
+     .99999882345170190992902571017152601904826792288976,
+     .99999970586288221916022821773876567711626389934930,
+     .99999992646571785114473148070738785694820115568892,
+     .99999998161642929380834691540290971450507605124278,
+     .99999999540410731289097193313960614895889430318945,
+     .99999999885102682756267330779455410840053741619428
+    };
+static REAL sintab[20]=
+    {
+     1.0000000000000000000000000000000000000000000000000,
+     .70710678118654752440084436210484903928483593768846,
+     .38268343236508977172845998403039886676134456248561,
+     .19509032201612826784828486847702224092769161775195,
+     .09801714032956060199419556388864184586113667316749,
+     .04906767432741801425495497694268265831474536302574,
+     .02454122852291228803173452945928292506546611923944,
+     .01227153828571992607940826195100321214037231959176,
+     .00613588464915447535964023459037258091705788631738,
+     .00306795676296597627014536549091984251894461021344,
+     .00153398018628476561230369715026407907995486457522,
+     .00076699031874270452693856835794857664314091945205,
+     .00038349518757139558907246168118138126339502603495,
+     .00019174759731070330743990956198900093346887403385,
+     .00009587379909597734587051721097647635118706561284,
+     .00004793689960306688454900399049465887274686668768
+    };
+static REAL coswrk[20]=
+    {
+     .00000000000000000000000000000000000000000000000000,
+     .70710678118654752440084436210484903928483593768847,
+     .92387953251128675612818318939678828682241662586364,
+     .98078528040323044912618223613423903697393373089333,
+     .99518472667219688624483695310947992157547486872985,
+     .99879545620517239271477160475910069444320361470461,
+     .99969881869620422011576564966617219685006108125772,
+     .99992470183914454092164649119638322435060646880221,
+     .99998117528260114265699043772856771617391725094433,
+     .99999529380957617151158012570011989955298763362218,
+     .99999882345170190992902571017152601904826792288976,
+     .99999970586288221916022821773876567711626389934930,
+     .99999992646571785114473148070738785694820115568892,
+     .99999998161642929380834691540290971450507605124278,
+     .99999999540410731289097193313960614895889430318945,
+     .99999999885102682756267330779455410840053741619428
+    };
+static REAL sinwrk[20]=
+    {
+     1.0000000000000000000000000000000000000000000000000,
+     .70710678118654752440084436210484903928483593768846,
+     .38268343236508977172845998403039886676134456248561,
+     .19509032201612826784828486847702224092769161775195,
+     .09801714032956060199419556388864184586113667316749,
+     .04906767432741801425495497694268265831474536302574,
+     .02454122852291228803173452945928292506546611923944,
+     .01227153828571992607940826195100321214037231959176,
+     .00613588464915447535964023459037258091705788631738,
+     .00306795676296597627014536549091984251894461021344,
+     .00153398018628476561230369715026407907995486457522,
+     .00076699031874270452693856835794857664314091945205,
+     .00038349518757139558907246168118138126339502603495,
+     .00019174759731070330743990956198900093346887403385,
+     .00009587379909597734587051721097647635118706561284,
+     .00004793689960306688454900399049465887274686668768
+    };
Index: /tags/V_240999/Poubelle/archTOI.old/tsid.cc
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/tsid.cc	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/tsid.cc	(revision 439)
@@ -0,0 +1,55 @@
+// tsid.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+// adapted from TSid.java, E. Aubourg 1998.
+
+#include "tsid.h"
+
+const double TSid::SIDRATE  = 0.9972695677;
+const double TSid::MJDRef   = 1545;      // 1/1/2000, 12h UT1
+
+TSid::TSid(double lg) 
+: longitude(lg)
+{
+  InitDUT();
+}
+
+void TSid::InitDUT() {
+  dut1[1270.5] = 0.60846; // 1999,3,2 (april, 2 1999)
+  dut1[1299.5] = 0.57975; // 1999,4,1
+  dut1[1330.5] = 0.55305; // 1999,5,1
+  dut1[1360.5] = 0.54229; // 1999,6,1
+  dut1[1391.5] = 0.53916; // 1999,7,1
+  dut1[1422.5] = 0.52822; // 1999,8,1
+  dut1[1452.5] = 0.50279; // 1999,9,1
+  dut1[1483.5] = 0.46517; // 1999,10,1
+  dut1[1513.5] = 0.42700; // 1999,11,1
+  dut1[1544.5] = 0.39116; // 2000,0,1
+  dut1[1575.5] = 0.35876; // 2000,1,1
+  dut1[1604.5] = 0.30979; // 2000,2,1
+  dut1[1635.5] = 0.25614; // 2000,3,1
+}
+
+double TSid::getDUT1(double mjd) {
+  map<double, double>::iterator i = dut1.upper_bound(mjd);
+  if (i==dut1.end() || i==dut1.begin()) return -1;
+  map<double, double>::iterator j = i; j--;
+  double x = (mjd - (*j).first) / ((*i).first - (*j).first);
+  return (1-x)*(*j).second + x * (*i).second;
+}
+
+void TSid::setLongitude(double lg) {
+  longitude = lg;
+}
+
+double TSid::getLST(double mjd) {
+  double dut1 = getDUT1(mjd);
+  double T = ((mjd-MJDRef) + dut1/86400.)/36525.;
+    // T = siecles julien depuis 1/1/2000, 12h UT1
+  double GMST = 24110.54841 + 8640184.812866 * T +
+     0.093104 * T * T - 0.0000062 * T * T * T; // a 0h UT1
+  GMST += ((mjd-.5 - (int)(mjd-.5))*86400. + dut1);
+  double LST = GMST + (longitude/15. * 3600.);
+  LST -= 86400 * int(LST/86400);
+  if (LST<0) LST += 86400.;
+  return LST;
+}
Index: /tags/V_240999/Poubelle/archTOI.old/tsid.h
===================================================================
--- /tags/V_240999/Poubelle/archTOI.old/tsid.h	(revision 439)
+++ /tags/V_240999/Poubelle/archTOI.old/tsid.h	(revision 439)
@@ -0,0 +1,28 @@
+// tsid.h
+// Eric Aubourg         CEA/DAPNIA/SPP   aout 1999
+// adapted from TSid.java, E. Aubourg 1998.
+
+#ifndef TSID_H
+#define TSID_H
+
+#include <map>
+
+using namespace std;
+
+class TSid {
+public:
+  TSid(double longitude=0);               // en degres, E = +
+  
+  void setLongitude(double longitude);    // en degres, E = +
+  double getLST(double mjd);              // en secondes
+ 
+protected:
+  map<double, double> dut1;
+  void InitDUT();
+  double longitude;
+  double getDUT1(double mjd);             // UT1-UTC, secondes
+  static const double SIDRATE;
+  static const double MJDRef;
+};
+
+#endif
