00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include <ctype.h>
00025 #include <stdlib.h>
00026 #include <unistd.h>
00027 #include <time.h>
00028 #include <string.h>
00029 #include <assert.h>
00030 #include <sys/types.h>
00031
00032 #include "common.h"
00033
00034
00035 FILE *ascChannelFile[MAX_CHANNEL] = {
00036 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00037 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00038 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00039 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00040 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
00041 };
00042 char ascChannelFileName[MAX_CHANNEL][128];
00043
00047 FILE* OpenAscChannel(int channel)
00048 {
00049 if (ascChannelFile[channel]==NULL)
00050 {
00051 int fd;
00052 strcpy(ascChannelFileName[channel],"titanfileXXXXXX");
00053 fd=OpenTempFile(ascChannelFileName[channel]);
00054 assert((ascChannelFile[channel]=fdopen(fd,"wt"))!=NULL);
00055 setvbuf(ascChannelFile[channel],NULL,_IOFBF,FILE_BUFFER_SIZE);
00056
00057 if (ascChannelFile[channel])
00058 {
00059 int l,c;
00060
00061 InitInfoHeader(channel);
00062
00063
00064 for (l=0; l<8; l++)
00065 {
00066 for (c=0; c<78; c++)
00067 {
00068 fprintf(ascChannelFile[channel],"#");
00069 }
00070 fprintf(ascChannelFile[channel],"\n");
00071 }
00072 }
00073 else
00074 {
00075 PrintError("unable to open %s: %m\n",ascChannelFileName[channel]);
00076 }
00077 }
00078 return(ascChannelFile[channel]);
00079 }
00080
00084 void CloseAscFile(int channel)
00085 {
00086 char line[128];
00087 if (ascChannelFile[channel]==NULL)
00088 {
00089 return;
00090 }
00091
00092 UpdateInfoHeader(channel);
00093
00094 fseek(ascChannelFile[channel],0,SEEK_SET);
00095
00096 fprintf(ascChannelFile[channel],PROGRAMNAME" version %d.%d.%d\n",VERSION,MAJOR,MINOR);
00097 fprintf(ascChannelFile[channel],"%s station\n%d channel\n%.6f sample rate\n",
00098 infoHeader[channel].station,
00099 channel,
00100 (double)infoHeader[channel].sr.base/(double)infoHeader[channel].sr.div);
00101 fprintf(ascChannelFile[channel],"%s start time %s\n",time2str(infoHeader[channel].correctedTime),
00102 "(corrected by observed dt)");
00103 if (channel<MAX_OSIRIS_CHANNEL)
00104 {
00105 fprintf(ascChannelFile[channel],"%s uncorrected time\n",
00106 StrTime(&(infoHeader[channel].uncorrected)));
00107 fprintf(ascChannelFile[channel],"?????? system reset time\n");
00108 fprintf(ascChannelFile[channel],"%s external pulse time (%d seconds old)\n",
00109 StrTime(&(infoHeader[channel].pulse)),infoHeader[channel].pulseAge);
00110 fprintf(ascChannelFile[channel],"%.6f observed dt",infoHeader[channel].otshift);
00111 if (strlen(infoHeader[channel].driftFile))
00112 {
00113 fprintf(ascChannelFile[channel]," (%s)",infoHeader[channel].driftFile);
00114 }
00115 fprintf(ascChannelFile[channel],"\n");
00116 fprintf(ascChannelFile[channel],"%.6f estimated dt\n",infoHeader[channel].tshift);
00117 fprintf(ascChannelFile[channel],"%.6f adc delay\n",infoHeader[channel].tadc);
00118 fprintf(ascChannelFile[channel],"%.6f filter delay\n",infoHeader[channel].tfilter);
00119 fprintf(ascChannelFile[channel],"%.6f extra time correction\n",0.0);
00120 fprintf(ascChannelFile[channel],"%d num of samples\n",infoHeader[channel].npts);
00121 }
00122 else
00123 {
00124 if (oldHWConfig.formatVersion==2)
00125 {
00126 extern char *auxChannelName[];
00127 extern char *auxChannelUnit[];
00128 fprintf(ascChannelFile[channel],"Auxilliary channel %d: %s\n",
00129 channel-MAX_OSIRIS_CHANNEL,
00130 auxChannelName[channel-MAX_OSIRIS_CHANNEL]);
00131 fprintf(ascChannelFile[channel],"Unit is %s\n",
00132 auxChannelUnit[channel-MAX_OSIRIS_CHANNEL]);
00133 }
00134 else
00135 {
00136 fprintf(ascChannelFile[channel],"Auxilliary channel %d\n",
00137 channel-MAX_OSIRIS_CHANNEL);
00138 }
00139 }
00140
00141 fclose(ascChannelFile[channel]);
00142 ascChannelFile[channel]=NULL;
00143 strcpy(line,FileName("", ".ASC", channel, fileNameOptions));
00144 if (noWrite==0)
00145 {
00146 Rename(ascChannelFileName[channel],line);
00147 }
00148 PrintLog("OUTPUT: %s %d samples (%.2fs)\n",line,
00149 infoHeader[channel].npts,
00150 (float)infoHeader[channel].npts/(float)infoHeader[channel].sr.npts);
00151 unlink(ascChannelFileName[channel]);
00152 }
00153
00156 void AbortAscFile(int channel)
00157 {
00158 PrintDebug("abort for %s\n",ascChannelFileName[channel]);
00159 if (ascChannelFile[channel])
00160 {
00161 fclose(ascChannelFile[channel]);
00162 ascChannelFile[channel]=NULL;
00163 unlink(ascChannelFileName[channel]);
00164 }
00165 }
00166
00168 void AddAscData(int channel)
00169 {
00170 int i;
00171 if ((HWConfig.srObs[channel].npts==0)||(HWConfig.srExp[channel].npts==0))
00172 {
00173 return;
00174 }
00175 if (OpenAscChannel(channel))
00176 {
00177 int d;
00178 d=HWConfig.srObs[channel].npts-HWConfig.srExp[channel].npts;
00179 for (i=0; i<HWConfig.srExp[channel].npts; i++)
00180 {
00181 if (0>=fprintf(ascChannelFile[channel],"%d\n",HWConfig.data[channel][d+i]))
00182 {
00183 PrintError("unable to write to %s: %m\n",
00184 ascChannelFileName[channel]);
00185 AbortAscFile(channel);
00186 }
00187 }
00188 infoHeader[channel].npts+=HWConfig.srExp[channel].npts;
00189 }
00190 }