00001 #ifndef _GLOBAL_LOC_H 00002 #define _GLOBAL_LOC_H 00003 /*---------------------------------------------------------------------------*/ 00004 00005 #include <earthworm_defs.h> /* amp types */ 00006 #include <trace_buf.h> /* TRACE_STA_LEN, TRACE_CHAN_LEN, TRACE_NET_LEN, TRACE_LOC_LEN */ 00007 #include <global_msg.h> 00008 00009 /*---------------------------------------------------------------------------*/ 00010 /* ========================================================================== 00011 ** SIZE DEFINES AND LIMITS 00012 ** ========================================================================= */ 00013 00014 /* Global Amp 01 SUPERCEDED 00015 ** 00016 ** AMP <author> <sequence_number> <version> <station> <comp> <net> <loc> <pick_time> <amplitude_type> <amplitude> <associated_period> 00017 ** 00018 ** AMP 001002003 sssssssssssssss vv ssssss cccccccc nnnnnnnn llllllll yyyymmddhhmmss.sss T aaaaaaaaaaaaa.aa pppppppp.ppppppp 00019 ** 00020 ** Global Amp 02 SUPERCEDED 00021 ** 00022 ** AMP <author> <version> <station> <comp> <net> <loc> <amplitude_type> <amplitude> <associated_period> 00023 ** 00024 ** AMP 001002003 vv ssssss cccccccc nnnnnnnn llllllll T aaaaaaaaaaaaa.aa pppppppp.ppppppp 00025 ** 00026 ** Global Amp 03 SUPERCEDED 00027 ** 00028 ** AMP <author> <pick_sequence> <version> <station> <comp> <net> <loc> <amplitude_type> <amplitude> <associated_period> 00029 ** 00030 ** AMP 001002003 sssssssssssssss vv ssssss cccccccc nnnnnnnn llllllll T aaaaaaaaaaaaa.aa pppppppp.ppppppp 00031 ** 00032 ** Global Amp 04 00033 ** 00034 ** AMP <author> <pick_sequence> <version> <station> <comp> <net> <loc> <amp_time> <amplitude_type> <amplitude> <associated_period> 00035 ** 00036 ** AMP 001002003 sssssssssssssss vv ssssss cccccccc nnnnnnnn llllllll yyyymmddhhmmss.sss T aaaaaaaaaaaaa.aa pppppppp.ppppppp 00037 ** \n 00038 ** \0 00039 ** 1 2 3 4 5 6 7 8 9 0 1 2 00040 ** 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 00041 ** 00042 ** NOTE: These are not fixed-width fields, the counter is only to assist with in determining the maximum size 00043 */ 00044 00045 #define GLOBAL_AMPLINE_MAXBUFSIZE (122 + BUFF_OVERRUN_SIZE) 00046 00047 typedef char GLOBAL_AMPLINE_BUFFER[GLOBAL_AMPLINE_MAXBUFSIZE+1]; 00048 00049 00050 typedef struct _GLOBAL_AMPLINE_STRUCT 00051 { 00052 unsigned short version; /* only set using InitGlobalAMP() or InitGlobalLoc() */ 00053 MSG_LOGO logo; 00054 long pick_sequence; 00055 char station[TRACE_STA_LEN]; 00056 char channel[TRACE_CHAN_LEN]; /* aka "component" */ 00057 char network[TRACE_NET_LEN]; 00058 char location[TRACE_LOC_LEN]; 00059 char amp_time[19]; 00060 AMPLITUDE_TYPE amptype; 00061 double adcounts; /* a/d counts */ 00062 double period; /* seconds */ 00063 } GLOBAL_AMPLINE_STRUCT; 00064 00065 00066 00067 /* Global Phase 01 00068 ** 00069 ** PHS <author> <sequence_number> <version> <station> <comp> <net> <loc> <pick_time> <phase_name> <quality> <polarity> <namp> 00070 ** 00071 ** PHS 001002003 sssssssssssssss vv ssssss cccccccc nnnnnnnn llllllll nnnnnnnn yyyymmddhhmmss.sss qqqqqqqqqqqqq.qq p 10000 00072 ** 1 1 00073 ** 1 2 3 4 5 6 7 8 9 0 1 00074 ** 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 00075 ** 00076 ** NOTE: These are not fixed-width fields, the counter is only to assist in determining the maximum size 00077 */ 00078 00079 #define MAX_AMPS_PER_GLOBALPHASE (AMPTYPE_COUNT - 1) 00080 00081 #define GLOBAL_PHSLINE_SUM_MAXSIZE (119+ BUFF_OVERRUN_SIZE) 00082 00083 typedef char GLOBAL_PHSLINE_SUM_BUFFER[GLOBAL_PHSLINE_SUM_MAXSIZE+1]; 00084 00085 #define GLOBAL_PHSLINE_MAXBUFSIZE (GLOBAL_PHSLINE_SUM_MAXSIZE + (MAX_AMPS_PER_GLOBALPHASE * GLOBAL_AMPLINE_MAXBUFSIZE) ) 00086 00087 typedef char GLOBAL_PHSLINE_BUFFER[GLOBAL_PHSLINE_MAXBUFSIZE+1]; 00088 00089 typedef struct _GLOBAL_PHSLINE_STRUCT 00090 { 00091 unsigned short version; /* only set using InitGlobalPhase() or InitGlobalLoc() */ 00092 MSG_LOGO logo; 00093 long sequence; 00094 char station[TRACE_STA_LEN]; 00095 char channel[TRACE_CHAN_LEN]; /* aka "component" */ 00096 char network[TRACE_NET_LEN]; 00097 char location[TRACE_LOC_LEN]; 00098 char pick_time[19]; 00099 char phase_name[9]; 00100 double quality; 00101 char polarity; 00102 GLOBAL_AMPLINE_STRUCT amps[MAX_AMPS_PER_GLOBALPHASE]; /* -1 because unknown/invalid not used */ 00103 } GLOBAL_PHSLINE_STRUCT; 00104 00105 00106 00107 00108 00109 /* Global Location 02 (SUM line) 00110 ** 00111 ** SUM <author> <version> <event_id> <origin_id> <origin_time> <lat> <lon> <z> <gap> <dmin> <rms> <id> <pick_count> <nph> 00112 ** 00113 ** SUM 001002003 vvvvv eeeeeeeeeeeee ooooo YYYYMMDDhhmmss.sss -90.0000 -180.0000 -000.000 000.00 000.00 00.000 100000000000 10000 00114 ** 00115 ** 1 2 3 4 5 6 7 8 9 0 1 2 3 00116 ** 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 00117 ** 00118 ** NOTE: These are not fixed-width fields, the counter is only to assist in determining the maximum size 00119 */ 00120 00121 #define GLOBAL_LOC_SUM_MAXSIZE (127 + BUFF_OVERRUN_SIZE) 00122 00123 typedef char GLOBAL_LOC_SUM_BUFFER[GLOBAL_LOC_SUM_MAXSIZE+1]; 00124 00125 00126 #define GLOBAL_LOC_MAXPHS 250 /* max phases in global loc msg */ 00127 00128 #define GLOBAL_LOC_MAXBUFSIZE (GLOBAL_LOC_SUM_MAXSIZE + (GLOBAL_LOC_MAXPHS * GLOBAL_PHSLINE_MAXBUFSIZE) ) 00129 00130 typedef char GLOBAL_LOC_BUFFER[GLOBAL_LOC_MAXBUFSIZE+1]; 00131 00132 00133 typedef struct GLOBAL_LOC_DATA 00134 { 00135 unsigned short version; /* only set using InitGlobalLoc */ 00136 MSG_LOGO logo; 00137 long event_id; 00138 long origin_id; /* which edition of event_id contained herein */ 00139 char origin_time[19]; 00140 double lat; 00141 double lon; 00142 float depth; 00143 float gap; 00144 float dmin; 00145 float rms; 00146 short pick_count; /* number of picks used to calculate origin (reported by glass) */ 00147 short nphs; /* number of valid phase structures included */ 00148 GLOBAL_PHSLINE_STRUCT phases[GLOBAL_LOC_MAXPHS]; 00149 } GLOBAL_LOC_STRUCT; 00150 00151 00152 00153 00154 00155 00156 00157 00158 00159 /* ========================================================================== 00160 00161 ** FUNCTION PROTOTYPES 00162 00163 ** ========================================================================= */ 00164 00165 00166 00167 /* InitGlobalAmp 00168 ** InitGlobalPhase 00169 ** InitGlobalLoc 00170 ** 00171 ** Used to initialize, including allocate working memory for 00172 ** a global message struct. 00173 ** 00174 ** 00175 ** PARAMETER: 00176 ** p_struct -- pointer to structure to contain the message information 00177 ** 00178 ** RETURNS: 00179 ** GLOBAL_MSG_SUCCESS 00180 ** GLOBAL_MSG_NULL = structure pointer is NULL 00181 */ 00182 GLOBAL_MSG_STATUS InitGlobalAmpLine( GLOBAL_AMPLINE_STRUCT * p_struct ); 00183 GLOBAL_MSG_STATUS InitGlobalPhaseLine( GLOBAL_PHSLINE_STRUCT * p_struct ); 00184 GLOBAL_MSG_STATUS InitGlobalLoc( GLOBAL_LOC_STRUCT * p_struct ); 00185 00186 00187 00188 00189 /* WriteAmpToBuffer 00190 ** WritePhaseToBuffer 00191 ** WriteLocToBuffer 00192 ** 00193 ** Writes a global message structure to a buffer. 00194 ** 00195 ** PARAMETERS: 00196 ** p_struct -- the source structure 00197 ** p_buffer -- the target buffer 00198 ** (on successful return, buffer will be null-terminated) 00199 ** p_length -- the available buffer size 00200 ** 00201 ** RETURNS: 00202 ** GLOBAL_MSG_SUCCESS 00203 ** GLOBAL_MSG_NULL = structure pointer is NULL 00204 ** GLOBAL_MSG_VERSINVALID = invalid message version 00205 ** GLOBAL_MSG_BADPARAM = buffer pointer is NULL 00206 ** GLOBAL_MSG_TOOSMALL = buffer not large enough to contain message 00207 ** (may be partly written anyway) 00208 ** GLOBAL_MSG_DEFINESMALL = max buffer size too small for normal write 00209 */ 00210 GLOBAL_MSG_STATUS WriteAmpLineToBuffer( GLOBAL_AMPLINE_STRUCT * p_struct, char * p_buffer, unsigned int p_length ); 00211 GLOBAL_MSG_STATUS WritePhaseLineToBuffer( GLOBAL_PHSLINE_STRUCT * p_struct, char * p_buffer, unsigned int p_length ); 00212 GLOBAL_MSG_STATUS WriteLocToBuffer( GLOBAL_LOC_STRUCT * p_struct, char * p_buffer, unsigned int p_length ); 00213 00214 00215 00216 /* StringToAmp 00217 ** StringToPhase 00218 ** StringToLoc 00219 ** 00220 ** Parses any global message from a supplied string. 00221 ** 00222 ** Do not include the "PHS " or "AMP " line id strings. 00223 ** 00224 ** RETURNS: 00225 ** GLOBAL_MSG_SUCCESS 00226 ** GLOBAL_MSG_NULL = structure pointer is NULL 00227 ** GLOBAL_MSG_VERSINVALID = invalid message version 00228 ** GLOBAL_MSG_BADPARAM = string pointer is NULL 00229 ** GLOBAL_MSG_FORMATERROR = invalid string format 00230 ** GLOBAL_MSG_MAXCHILDREN = too many children [StringToLoc() only] 00231 ** GLOBAL_MSG_BADCHILD = invalid child line [StringToLoc() only] 00232 */ 00233 GLOBAL_MSG_STATUS StringToAmpLine( GLOBAL_AMPLINE_STRUCT * p_amp, char * p_string ); 00234 GLOBAL_MSG_STATUS StringToPhaseLine( GLOBAL_PHSLINE_STRUCT * p_phase, char * p_string ); 00235 GLOBAL_MSG_STATUS StringToLoc( GLOBAL_LOC_STRUCT * p_loc, char * p_string ); 00236 00237 00238 /* AddAmpToPhase 00239 ** AddPhaseToLoc 00240 ** 00241 ** Add an Amp to a Phase, or a Phase to a Location 00242 ** 00243 ** RETURNS 00244 ** number 0 - n = index of successfully added item 00245 ** GLOBAL_MSG_NULL = location structure pointer is NULL 00246 ** GLOBAL_MSG_VERSINVALID = invalid message version (location) 00247 ** GLOBAL_MSG_BADPARAM = child pointer is NULL, or version invalid 00248 ** GLOBAL_MSG_MAXCHILDREN = too many children (of this type) 00249 */ 00250 int AddAmpLineToPhase( GLOBAL_PHSLINE_STRUCT * p_phase 00251 , GLOBAL_AMPLINE_STRUCT * p_amp 00252 ); 00253 int AddPhaseLineToLoc( GLOBAL_LOC_STRUCT * p_loc 00254 , GLOBAL_PHSLINE_STRUCT * p_phase 00255 ); 00256 00257 00258 00259 /* GetLocPhaseIndex 00260 ** 00261 ** Find the location index of an Amp or Phase or Amp in another structure 00262 ** 00263 ** RETURNS 00264 ** p_loc.nphs = item does not exist in the location 00265 ** other = index of item in the nphs[] or namp[] array 00266 */ 00267 int GetLocPhaseIndex( GLOBAL_LOC_STRUCT * p_loc 00268 , GLOBAL_PHSLINE_STRUCT * p_phase 00269 ); 00270 00271 /* ClearAmps 00272 ** ClearPhases 00273 ** 00274 ** Used to clear work structure of children's data 00275 ** 00276 ** RETURNS 00277 ** GLOBAL_MSG_SUCCESS 00278 ** GLOBAL_MSG_NULL = location structure pointer is NULL 00279 ** GLOBAL_MSG_VERSINVALID = invalid message version 00280 */ 00281 GLOBAL_MSG_STATUS ClearAmpLines( GLOBAL_PHSLINE_STRUCT * p_phase ); 00282 GLOBAL_MSG_STATUS ClearPhaseLines( GLOBAL_LOC_STRUCT * p_loc ); 00283 00284 #endif 00285 00286 00287