00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <stdlib.h>
00030 #include <stdio.h>
00031 #include <time.h>
00032 #include <ctype.h>
00033 #include <math.h>
00034 #include <errno.h>
00035 #include <unistd.h>
00036 #include <string.h>
00037 #include <sys/types.h>
00038 #include <sys/stat.h>
00039 #include <fcntl.h>
00040 #include <dirent.h>
00041 #include <assert.h>
00042 #include <signal.h>
00043
00044 #define CR 13
00045 #define LF 10
00046
00047 #include "common.h"
00048
00049 int64_t avg[MAX_CHANNEL];
00050 int64_t ndata[MAX_CHANNEL];
00051
00052 FILE *sisBinFile=NULL;
00053 char sisBinFileName[255];
00054 int sisOffset[MAX_CHANNEL];
00055
00056 #define BLOCK_LENGTH 1024
00057 #define BLOCK_SIZE (BLOCK_LENGTH/sizeof(int32_t))
00058
00061 FILE* OpenSisBinFile(void)
00062 {
00063 int i;
00064
00065 for (i=0; i<MAX_CHANNEL; i++)
00066 {
00067
00068
00069 if ((HWConfig.srObs[i].npts>0)&&(infoHeader[i].npts==0))
00070 {
00071
00072 avg[i]=0;
00073 ndata[i]=0;
00074 InitInfoHeader(i);
00075 }
00076 }
00077 if (sisBinFile==NULL)
00078 {
00079 int fd;
00080 strcpy(sisBinFileName,"titanfileXXXXXX");
00081 fd=OpenTempFile(sisBinFileName);
00082 assert((sisBinFile=fdopen(fd,"wb"))!=NULL);
00083 setvbuf(sisBinFile,NULL,_IOFBF,FILE_BUFFER_SIZE);
00084 }
00085 return(sisBinFile);
00086 }
00087
00089 void AbortSisBinFile(void)
00090 {
00091 if (sisBinFile)
00092 {
00093 fclose(sisBinFile);
00094 sisBinFile=NULL;
00095 }
00096 unlink(sisBinFileName);
00097 }
00098
00101 void AddSisData(int channel)
00102 {
00103 int i;
00104 int end=HWConfig.srObs[channel].npts;
00105 if (channel>MAX_CHANNEL)
00106 {
00107 PrintError("channel number out of bounds\n");
00108 return;
00109 }
00110 if ((HWConfig.srObs[channel].npts==0)||(HWConfig.srExp[channel].npts==0))
00111 {
00112 return;
00113 }
00114 if (end+infoHeader[channel].npts>999999)
00115 {
00116 CloseSisFile();
00117 }
00118
00119 if (OpenSisBinFile())
00120 {
00121 if (end>HWConfig.srExp[channel].npts)
00122 {
00123 end=HWConfig.srExp[channel].npts;
00124 }
00125 for (i=0; i<end; i++)
00126 {
00127 int32_t d=HWConfig.data[channel][i];
00128 if (fwrite(&channel,sizeof(int32_t),1,sisBinFile)!=1)
00129 {
00130 PrintError("unable to write to %s: %m\n",
00131 sisBinFileName);
00132 AbortSisBinFile();
00133 exit(0);
00134 }
00135 if (fwrite(&d,sizeof(int32_t),1, sisBinFile)!=1)
00136 {
00137 PrintError("unable to write to %s: %m\n",
00138 sisBinFileName);
00139 AbortSisBinFile();
00140 exit(0);
00141 }
00142
00143 if (removeMean)
00144 {
00145 avg[channel]+=d;
00146 ndata[channel]++;
00147 }
00148 }
00149 infoHeader[channel].npts+=end;
00150 }
00151 }
00152
00156 char *time2strSismalp(double temps)
00157 {
00158 static char ligne[40];
00159 time_t T0;
00160 struct tm tm0;
00161 T0=(time_t)temps;
00162 memcpy(&tm0,gmtime(&T0),sizeof(struct tm));
00163 memset(ligne,0,40);
00164 strftime(ligne,40,"%d.%m.%Y %H:%M:%S.",&tm0);
00165 sprintf(ligne+strlen(ligne),"%03d",(int)(1000.*(temps-(double)T0)));
00166 return(ligne);
00167 }
00168
00169
00173 void CloseSisFile(void)
00174 {
00175 int32_t i,ch,d,len;
00176 int ok=-1;
00177 char sisFileName[255];
00178 char ndxFileName[255];
00179 FILE *fsis=NULL, *fndx=NULL;
00180 int ptsCnt[MAX_CHANNEL];
00181
00182 if (sisBinFile==NULL)
00183 {
00184 return;
00185 }
00186
00187 fclose(sisBinFile);
00188 sisBinFile=NULL;
00189
00190 for (i=0; i<MAX_CHANNEL; i++)
00191 {
00192
00193 if (ndata[i])
00194 {
00195 avg[i]/=ndata[i];
00196
00197 PrintLog("offset[%2d]=%d\n",i,(int)(avg[i]));
00198 }
00199
00200 ptsCnt[i]=0;
00201 if (infoHeader[i].npts>=128)
00202 {
00203 UpdateInfoHeader(i);
00204 if (ok<0)
00205 {
00206 ok=i;
00207 }
00208 }
00209 else
00210 {
00211 infoHeader[i].npts=0;
00212 }
00213 }
00214
00215 if (ok<0)
00216 {
00217 return;
00218 }
00219
00220 strcpy(sisFileName,FileName("", ".SIS", ok, fileNameOptions&(~ADD_CHANNEL_CODE)));
00221 strcpy(ndxFileName,sisFileName);
00222 memcpy(ndxFileName+strlen(ndxFileName)-3,"NDX",3);
00223
00224 fsis=fopen(sisFileName,"wb");
00225 if (fsis==NULL)
00226 {
00227 goto end_sis;
00228 }
00229 fndx=fopen(ndxFileName,"wt");
00230 if (fndx==NULL)
00231 {
00232 goto end_sis;
00233 }
00234
00235
00236
00237
00238 len=0;
00239
00240 sisOffset[0]=1;
00241 for (i=0; i<MAX_CHANNEL; i++)
00242 {
00243 char compChar[MAX_CHANNEL]="ZNEabcdefghiklmnoprqstuvwx";
00244
00245 if (i==0)
00246 {
00247 sisOffset[i]=1;
00248 }
00249 else
00250 {
00251 sisOffset[i]=sisOffset[i-1]+(infoHeader[i-1].npts+(BLOCK_SIZE-1))/BLOCK_SIZE;
00252 }
00253 if (infoHeader[i].npts<=0)
00254 {
00255 continue;
00256 }
00257 len+=(infoHeader[i].npts+(BLOCK_SIZE-1))/BLOCK_SIZE;
00258
00259 fprintf(fndx,"%8s%6d%6d%6d%8.3f %s%c%c",
00260 infoHeader[i].station,
00261 infoHeader[i].npts,
00262 sisOffset[i],
00263 (infoHeader[i].npts+(BLOCK_SIZE-1))/BLOCK_SIZE,
00264 (double)oldHWConfig.srExp[i].base/(double)oldHWConfig.srExp[i].div,
00265 time2strSismalp(infoHeader[i].correctedTime),
00266 CR,LF);
00267 fprintf(fndx,"TIT%04d 3 %c 32 0 %c 14.00"
00268 "%c%c",
00269
00270 i,compChar[i],' ',CR,LF);
00271 }
00272
00273
00274 d=0;
00275 for (i=0; i<len*BLOCK_SIZE; i++)
00276 {
00277 fwrite(&d,sizeof(int32_t),1,fsis);
00278 }
00279
00280
00281
00282 sisBinFile=fopen(sisBinFileName,"rb");
00283 if (sisBinFile)
00284 {
00285 while (fread(&ch,sizeof(int32_t),1,sisBinFile)==1)
00286 {
00287 int64_t offset;
00288 if (infoHeader[ch].npts<0)
00289 {
00290 continue;
00291 }
00292
00293 if (ch>=MAX_CHANNEL)
00294 {
00295 PrintError("corrupted temp file, aborting\n");
00296 goto end_sis;
00297 }
00298 if (fread(&d,sizeof(int32_t),1,sisBinFile)!=1)
00299 {
00300 goto end_sis;
00301 }
00302
00303 offset=(((sisOffset[ch]-1)*BLOCK_SIZE)+ptsCnt[ch])*4;
00304 if (0!=fseek(fsis,offset, SEEK_SET))
00305 {
00306 PrintError("seek: %m\n");
00307 }
00308 if (removeMean)
00309 {
00310 d-=avg[ch];
00311 }
00312 fwrite(&d,4,1,fsis);
00313 ptsCnt[ch]++;
00314 }
00315 fclose(sisBinFile);
00316 }
00317 else
00318 {
00319 PrintError("%s: %m\n",sisBinFileName);
00320 }
00321 sisBinFile=NULL;
00322 end_sis:
00323
00324 if (fsis)
00325 {
00326 fclose(fsis);
00327 }
00328 if (fndx)
00329 {
00330 fclose(fndx);
00331 }
00332 PrintLog("OUTPUT: %s, %s\n",ndxFileName,sisFileName);
00333 if (sisBinFile)
00334 {
00335 fclose(sisBinFile);
00336 }
00337
00338
00339 unlink(sisBinFileName);
00340 for (i=0; i<MAX_CHANNEL; i++)
00341 {
00342 infoHeader[i].npts=0;
00343 }
00344 if (skipTime>-1)
00345 {
00346 FILE *f;
00347 f=fopen("skip","wt");
00348 if (f!=NULL)
00349 {
00350 fprintf(f,"%d",(int)(correctedTime.usecond>>32)-60);
00351 fclose(f);
00352 }
00353 }
00354 }