source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/fichier_telescope.c@ 652

Last change on this file since 652 was 637, checked in by ansari, 26 years ago

archediab version 24 initial import

File size: 12.7 KB
Line 
1#include "diabolo.h"
2#include "fichier.h"
3
4#define long_maxi_fich_tele 20000L
5
6void renomme_fichier(int ncar,int numscan,char *nom_source);
7
8extern F_entete *E;
9extern F_block_desc *BD;
10extern F_block_param *BP;
11
12extern char *dossier_date; // dossier date pour creer le dossier ou ranger les data telescope
13extern char * nom_du_fichier;
14extern char * message_sommaire;
15extern char * fichiers_perdus;
16
17//------------------------------------------------------------------------------------------------------
18//------------------------------------------------------------------------------------------------------
19//---------------------- recherche des données du telescope ----------------------
20//------------------------------------------------------------------------------------------------------
21//------------------------------------------------------------------------------------------------------
22
23
24//-------------------------------------------------------------------------------------
25// ------------- -0- utilitaire commun -------------------------
26//-------------------------------------------------------------------------------------
27
28//----------------------- renomme le fichier ----------------------------
29// ********************* renomme les fichier *********************
30
31// fabrique le nouveau nom de fichier
32// ss[0] = longueur du string=29
33// ss[1..18] = heure et date
34// ss[19] = underscore
35// ss[20..29] = numscan et nom de la source
36
37
38void renomme_fichier(int ncar,int numscan,char *nom_source)
39{
40char nom_pascal[50],ss[256];
41Tfenetre ptf;
42FSSpec file;
43int i;
44
45nom_source[30]=0;
46
47ecritD(fenetre_fichier,f_comment,"scan numero %d source : %s ",numscan,nom_source);
48// printf("scan numero %d source : %s \n",numscan,nom_source);
49
50if(nom_du_fichier[18]!='_') return;
51if(ncar==4) sprintf(nom_du_fichier+19,"%d-%s",numscan+10000,nom_source);
52 else sprintf(nom_du_fichier+19,"%d-%s",numscan+100000,nom_source);
53nom_du_fichier[18]='_';nom_du_fichier[19]='s';nom_du_fichier[29]=0;
54for(i=0;i<29;i++) if(nom_du_fichier[i]==' ') nom_du_fichier[i]='_'; // enleve les blancs
55// printf(" nouveau nom : .................. %s \n",nom_du_fichier);
56strcpy(ss+1,nom_du_fichier);ss[0]=29;
57
58
59if(fenetre(fichier_dia2_1))
60
61 {
62 ss[1]='a';
63#ifdef lire_les_data_telescope_IRAM
64 ss[1]='t';
65#endif
66 ptf=infos(fichier_dia2_1);
67
68 strcpy(nom_pascal+1,ptf->titre);*nom_pascal=strlen(nom_pascal+1);
69 FSMakeFSSpec(ptf->dossier.volume,ptf->dossier.dossier,(ConstStr255Param)nom_pascal,&file);
70 FSpRename(&file,(ConstStr255Param)ss);
71 position(fichier_dia2_1,0L);
72 ecritF(fichier_dia2_1,(long)E->long_entete,E);
73
74 if(fenetre(fichier_dia2_2))
75 {
76 ptf=infos(fichier_dia2_2);
77 FSMakeFSSpec(ptf->dossier.volume,ptf->dossier.dossier,(ConstStr255Param)nom_pascal,&file);
78 FSpRename(&file,(ConstStr255Param)ss);
79 position(fichier_dia2_2,0L);
80 ecritF(fichier_dia2_2,(long)E->long_entete,E);
81 }
82 }
83
84if(fenetre(fichier_arch_1))
85
86 {
87 ss[1]='h';
88 ptf=infos(fichier_arch_1);
89
90 strcpy(nom_pascal+1,ptf->titre);*nom_pascal=strlen(nom_pascal+1);
91 FSMakeFSSpec(ptf->dossier.volume,ptf->dossier.dossier,(ConstStr255Param)nom_pascal,&file);
92 FSpRename(&file,(ConstStr255Param)ss);
93
94 if(fenetre(fichier_arch_2))
95 {
96 ptf=infos(fichier_arch_2);
97 FSMakeFSSpec(ptf->dossier.volume,ptf->dossier.dossier,(ConstStr255Param)nom_pascal,&file);
98 FSpRename(&file,(ConstStr255Param)ss);
99 }
100 }
101
102}
103
104
105//-------------------------------------------------------------------------------------
106// ------------- -1- r i e n -------------------------
107//-------------------------------------------------------------------------------------
108
109
110#if (!defined (lire_les_donnees_POM2) && !defined (lire_les_noms_sources_IRAM) && !defined (lire_le_numero_de_scan_iram) )
111void lit_data_telescope() {}
112
113#endif
114
115//-------------------------------------------------------------------------------------
116// ------------- -1- P O M 2 -------------------------
117//-------------------------------------------------------------------------------------
118
119
120/* lit sur la RS232 et sauve le commentaire si besoin */
121
122#ifdef lire_les_donnees_POM2
123
124
125
126void ecrit_don_telescope(char *comment,int i); // ecrit le commentaire de longueur i
127
128#define temps_d_attente 20
129
130
131void lit_data_telescope(void)
132{
133char comment[10000];
134int i,numscan;
135i=0;
136// printf("cherche les commentaires sur RS232 : ");
137while ( (i<8000) && (litRS(port_A,comment+i,finRS_cr,temps_d_attente,1)==1) ) i=strlen(comment);
138if(i>9000) erreur(" comment trop long dans fichier_telescope données POM2");
139if(i) {
140 char ss[200];
141 int j=0,k,q=0;
142// printf("lit commentaire %dcara: ",i);
143 while ( (j<i) && comment[j] )
144 {
145 while( (j<i) && (comment[j]<20) ) j++;
146 k=0;
147 while( (k<100) && (j<i) && (comment[j]>20) ) {ss[k]=comment[j];k++; j++;}
148 ss[k]=0;j++;
149// if(q<1) printf(" %s\n",ss);
150 q++;
151 }
152 ecrit_don_telescope(comment,i);
153 numscan=myatof(comment+1);
154 renomme_fichier(5,numscan,comment+7);
155 }
156// printf("\n");
157}
158
159
160
161void ecrit_don_telescope(char *comment,int i) // ecrit le commentaire de longueur i
162{
163i=(i/4+1)*4;
164BD->n_ligne_don=i;
165BD->change=10;
166BD->bololut=0;
167if(fenetre(fichier_dia2_1))
168 {
169 ecritF(fichier_dia2_1,sizeof(F_block_desc),BD); // ecrit l'entete partielle
170 ecritF(fichier_dia2_1,i,comment); // ecrit le texte du block commentaire
171 if(fenetre(fichier_dia2_2))
172 {
173 ecritF(fichier_dia2_2,sizeof(F_block_desc),BD); // ecrit l'entete partielle
174 ecritF(fichier_dia2_2,i,comment); // ecrit le texte du block commentaire
175 }
176 }
177}
178
179
180#endif
181
182//-------------------------------------------------------------------------------------
183// ------------- -2- IRAM 30m juste le numero de scan ---------
184//-------------------------------------------------------------------------------------
185
186#ifdef lire_le_numero_de_scan_iram
187
188
189void lit_data_telescope(void)
190{
191static VDos data_telescope;
192static int index=1;
193static char nomfich[40];
194
195char ss[100];
196
197
198//printf("lit_data_telescope et copie dans %s\n",nom_dossier);
199
200litD(fenetre_fichier,f_don_tele,ss);
201strcat(ss,":info");
202if( (strlen(ss)>2) && (*ss!='/') )
203 {
204 data_telescope=cherchedossier(ss);
205 if(!data_telescope.volume) {printf("erreur de dossier data telescope \n");return;}
206 fixedossier(data_telescope);
207 ouvrirT(0,0,"copied_last");
208 }
209}
210
211#endif
212
213
214//-------------------------------------------------------------------------------------
215// ------------- -2- IRAM 30m nom des sources + donnees eventuelles ---------
216//-------------------------------------------------------------------------------------
217
218
219
220
221#ifdef lire_les_noms_sources_IRAM
222
223void ouvre_et_lit(VDos dd,char * nomfich); // bonfich est un string pascal termine par un zero
224int deplace_un_fichier_telescope(VDos d1,char *nomfich);
225int cherche_fich(VDos dd,char *nomfich);
226
227
228
229void lit_data_telescope(void)
230{
231VDos data_telescope;
232char nomfich[40],ss[100];
233
234data_telescope.volume=0;
235//printf("lit_data_telescope dans %s et les deplace dans ...%s \n",ss,dossier_date);
236
237litD(fenetre_fichier,f_don_tele,ss);
238if( (strlen(ss)>2) && (*ss!='/') ) data_telescope=cherchedossier(ss);
239if(!data_telescope.volume) return;
240//printf("lit_data_telescope dans %s et les deplace dans ...%s \n",ss,dossier_date);
241
242while(1)
243 {
244 if(!cherche_fich(data_telescope,nomfich)) return; // pas de fichier a lire
245// printf("je trouve le fichier telescope %s \n",nomfich+1);
246 ouvre_et_lit(data_telescope,nomfich);
247 if(deplace_un_fichier_telescope(data_telescope,nomfich))
248 {printf("erreur dans deplace un fichier\n");return;} // return si erreur
249// printf("je deplace le fichier %s \n",nomfich+1);
250 }
251}
252
253
254
255// Cherche le premier fichier du dossier (index=1)
256// si oui, renvoie 1 et le nom du fichier dans nomfich (string pascal avec un zero a la fin)
257// si pas de fichier: renvoie 0
258
259int cherche_fich(VDos dd,char * nomfich)
260{
261HFileParam pb;
262pb.ioCompletion=0L;
263pb.ioFDirIndex=1; // index commence à 1
264pb.ioNamePtr=(StringPtr)nomfich;
265pb.ioVRefNum=dd.volume;
266pb.ioDirID=dd.dossier;
267if(PBHGetFInfo( (HParmBlkPtr) &pb,0)) return(0);
268//if( ( (pb.ioFlFndrInfo.fdType!='DATA') et (pb.ioFlFndrInfo.fdType!='TEXT') ) ou (*nomfich!=13) ) return(-1);
269nomfich[*nomfich+1]=0; // nomfich est un string pascal avec zero à la fin
270//printf("index=%d : un bon fichier : %s \n",index,nomfich+1);
271return(1);
272}
273
274
275
276void ouvre_et_lit(VDos dd,char * nomfich) // nomfich est un string pascal termine par un zero
277{
278short err;
279short data;
280FSSpec file;
281char *buf;
282char source[40];
283int i;
284long lg;
285int numscan,subscan,alire;
286int monscan;
287char ss[255];
288
289//-- recherche numscan et subscan
290monscan=0;
291if( (nom_du_fichier[18]=='_') && (nom_du_fichier[21]!='a') ) // un fichier scan en cours est ouvert
292 {
293 monscan=myatof(nom_du_fichier+20);
294// printf(" monscan=%d \n",monscan);
295 }
296
297numscan=myatof(nomfich+1);
298subscan=myatof(nomfich+11);
299
300
301switch(nomfich[6])
302 {
303 case 'h' :
304 if(monscan && (monscan != numscan) ) subscan=3000;
305 else {
306 if(subscan!=gg->compte_fichiers_th+1)
307 {
308 printf(" erreur fichier th: ancien=%d lit %d \n",gg->compte_fichiers_th,subscan);
309 sprintf(ss," -th%d",gg->compte_fichiers_th+1);ajoute_sommaire(ss);
310 }
311 gg->compte_fichiers_th=subscan;
312 subscan+=1000;
313 }
314
315 break;
316
317 case 'p' :
318 if(monscan && (monscan != numscan) ) subscan=3000;
319 else {
320 if(subscan!=gg->compte_fichiers_tp+1)
321 {
322 printf(" erreur fichier tp: ancien=%d lit %d \n",gg->compte_fichiers_tp,subscan);
323 sprintf(ss," -tp%d",gg->compte_fichiers_th+1);ajoute_sommaire(ss);
324 }
325 gg->compte_fichiers_tp=subscan;
326 subscan+=2000;
327 }
328
329 break;
330
331 default : subscan=3000;
332 break;
333 }
334
335//printf("lecture fichier type %c%c, numscan=%d subscan=%d \n",nomfich[5],nomfich[6],numscan,subscan);
336
337if(subscan==3000)
338 {
339 ajoute_sommaire2(nomfich+1);
340 printf(" fichier *s d'un autre scan \n",nomfich+1);
341 return;
342 }
343
344alire=0;
345if(subscan==1001) alire=1;
346
347#ifdef lire_les_data_telescope_IRAM
348alire=2;
349#endif
350
351if(alire)
352 {
353 FSMakeFSSpec(dd.volume,dd.dossier,(ConstStr255Param)nomfich,&file);
354 if ((err=FSpOpenDF(&file,0,&data))!=0)
355 {
356 son(1); printf("\n pas possible de lire le fichier données telescope :");
357 select(printf_ref);
358 return;
359 }
360
361 lg=long_maxi_fich_tele-5;
362 if(alire==1) lg=1100;
363 buf=malloc(long_maxi_fich_tele+16);
364 strcpy(buf,nomfich+1); //buff contient le nom du fichier (20 octets) suivit du contenu du fichier
365 FSRead(data,&lg,buf+16);
366 FSClose(data); // lit le fichier th ou tp de donnees telescope
367 printf("lecture fichier type %c%c, numscan=%d subscan=%d : lit %d caracteres \n",nomfich[5],nomfich[6],numscan,subscan,lg);
368
369 for(i=0;i<38;i++) source[i]=buf[i+1052+16];source[38]=0; // lit le nom de la source
370 if(subscan==1001) renomme_fichier(4,numscan,source); // ne renomme le fichier que pour le th.001
371
372#ifdef lire_les_data_telescope_IRAM
373
374 if(lg>long_maxi_fich_tele-10)
375 {
376 son(1);
377 printf("\nle fichier données telescope est trops gros \n");
378 printf("il depasse la taille maximum de %d octets \n",long_maxi_fich_tele);
379 select(printf_ref);
380 }
381
382 lg=(lg/4+1)*4 +16 ;
383 BD->n_ligne_don=lg;
384 BD->change=subscan;
385 BD->bololut=0;
386 if(fenetre(fichier_dia2_1))
387 {
388 position(fichier_dia2_1,fin_f);
389 ecritF(fichier_dia2_1,sizeof(F_block_desc),BD); // ecrit l'entete partielle
390 ecritF(fichier_dia2_1,lg,buf); // ecrit le texte du block data
391 if(fenetre(fichier_dia2_2))
392 {
393 position(fichier_dia2_2,fin_f);
394 ecritF(fichier_dia2_2,sizeof(F_block_desc),BD); // ecrit l'entete partielle
395 ecritF(fichier_dia2_2,lg,buf); // ecrit le texte du block data
396 }
397 }
398#endif
399
400 free(buf);
401 }
402}
403
404
405
406
407int deplace_un_fichier_telescope(VDos d1,char *nomfich) // retourne 0 si tout va bien
408{
409char dossier2[100],nom_dossier_tele[100],dossier_complet[150];
410FSSpec file1,file2;
411VDos d2;
412DateTimeRec date;
413
414FSMakeFSSpec(d1.volume,d1.dossier,(ConstStr255Param)nomfich,&file1); // le fichier source
415
416// fabrique le dossier destination
417GetTime(&date);
418
419strcpy(nom_dossier_tele+1,"tele");
420strcat(nom_dossier_tele+1,dossier_date);
421*nom_dossier_tele=strlen(nom_dossier_tele+1);
422litD(fenetre_fichier,f_d2,dossier2); // le meme dossier que le second fichier de data DIA2
423if( (strlen(dossier2)<3) ou (*dossier2=='/') ) return(1);
424strcat(dossier2,":telescope");
425d2=cherchedossier(dossier2); // cree le dossier telescope s'il n'existe pas
426//printf("deplace le fichier %s dans le dossier %s // %s \n",nomfich+1,dossier2,nom_dossier_tele+1);
427
428sprintf(dossier_complet,"%s:%s",dossier2,nom_dossier_tele+1);
429d2=cherchedossier(dossier_complet); // cree le dossier du jour s'il n'existe pas
430//printf("dossiercomplet O.K. \n");
431d2=cherchedossier(dossier2); // le dossier parent
432if(!d2.volume) return(1);
433//printf("dossier2 O.K. \n");
434FSMakeFSSpec(d2.volume,d2.dossier,(ConstStr255Param)nom_dossier_tele,&file2); // le dossier destination
435//printf(" fichier %s copie dans dossier %s \n",nomfich+1,nom_dossier_tele+1);
436return(FSpCatMove(&file1,&file2));
437}
438
439
440
441
442#endif
443
Note: See TracBrowser for help on using the repository browser.