Initial commit based on common repo commit ffeb9c9b
This commit is contained in:
7
libs/3rd-party/mseed/CMakeLists.txt
vendored
Normal file
7
libs/3rd-party/mseed/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
SET(LIB_NAME mseed)
|
||||
FILE(GLOB SOURCES "*.cpp" "*.c" "*.h")
|
||||
|
||||
|
||||
ADD_LIBRARY(${LIB_NAME} STATIC ${SOURCES})
|
||||
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS -fPIC)
|
||||
|
1183
libs/3rd-party/mseed/fileutils.c
vendored
Normal file
1183
libs/3rd-party/mseed/fileutils.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1407
libs/3rd-party/mseed/genutils.c
vendored
Normal file
1407
libs/3rd-party/mseed/genutils.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
150
libs/3rd-party/mseed/gswap.c
vendored
Normal file
150
libs/3rd-party/mseed/gswap.c
vendored
Normal file
@ -0,0 +1,150 @@
|
||||
/***************************************************************************
|
||||
* gswap.c:
|
||||
*
|
||||
* Functions for generalized, in-pace byte swapping between LSBF and
|
||||
* MSBF byte orders.
|
||||
*
|
||||
* Some standard integer types are needed, namely uint8_t and
|
||||
* uint32_t, (these are normally declared by including inttypes.h or
|
||||
* stdint.h). Each function expects it's input to be a void pointer
|
||||
* to a quantity of the appropriate size.
|
||||
*
|
||||
* There are two versions of most routines, one that works on
|
||||
* quantities regardless of alignment (gswapX) and one that works on
|
||||
* memory aligned quantities (gswapXa). The memory aligned versions
|
||||
* (gswapXa) are much faster than the other versions (gswapX), but the
|
||||
* memory *must* be aligned.
|
||||
*
|
||||
* Written by Chad Trabant,
|
||||
* IRIS Data Management Center
|
||||
*
|
||||
* Version: 2010.006
|
||||
***************************************************************************/
|
||||
|
||||
#include "lmplatform.h"
|
||||
|
||||
/* Swap routines that work on any (aligned or not) quantities */
|
||||
|
||||
void
|
||||
ms_gswap2 ( void *data2 )
|
||||
{
|
||||
uint8_t temp;
|
||||
|
||||
union
|
||||
{
|
||||
uint8_t c[2];
|
||||
} dat;
|
||||
|
||||
memcpy( &dat, data2, 2 );
|
||||
temp = dat.c[0];
|
||||
dat.c[0] = dat.c[1];
|
||||
dat.c[1] = temp;
|
||||
memcpy( data2, &dat, 2 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ms_gswap3 ( void *data3 )
|
||||
{
|
||||
uint8_t temp;
|
||||
|
||||
union
|
||||
{
|
||||
uint8_t c[3];
|
||||
} dat;
|
||||
|
||||
memcpy( &dat, data3, 3 );
|
||||
temp = dat.c[0];
|
||||
dat.c[0] = dat.c[2];
|
||||
dat.c[2] = temp;
|
||||
memcpy( data3, &dat, 3 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ms_gswap4 ( void *data4 )
|
||||
{
|
||||
uint8_t temp;
|
||||
|
||||
union {
|
||||
uint8_t c[4];
|
||||
} dat;
|
||||
|
||||
memcpy( &dat, data4, 4 );
|
||||
temp = dat.c[0];
|
||||
dat.c[0] = dat.c[3];
|
||||
dat.c[3] = temp;
|
||||
temp = dat.c[1];
|
||||
dat.c[1] = dat.c[2];
|
||||
dat.c[2] = temp;
|
||||
memcpy( data4, &dat, 4 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ms_gswap8 ( void *data8 )
|
||||
{
|
||||
uint8_t temp;
|
||||
|
||||
union
|
||||
{
|
||||
uint8_t c[8];
|
||||
} dat;
|
||||
|
||||
memcpy( &dat, data8, 8 );
|
||||
temp = dat.c[0];
|
||||
dat.c[0] = dat.c[7];
|
||||
dat.c[7] = temp;
|
||||
|
||||
temp = dat.c[1];
|
||||
dat.c[1] = dat.c[6];
|
||||
dat.c[6] = temp;
|
||||
|
||||
temp = dat.c[2];
|
||||
dat.c[2] = dat.c[5];
|
||||
dat.c[5] = temp;
|
||||
|
||||
temp = dat.c[3];
|
||||
dat.c[3] = dat.c[4];
|
||||
dat.c[4] = temp;
|
||||
memcpy( data8, &dat, 8 );
|
||||
}
|
||||
|
||||
/* Swap routines that work on memory aligned quantities */
|
||||
|
||||
void
|
||||
ms_gswap2a ( void *data2 )
|
||||
{
|
||||
uint16_t *data = data2;
|
||||
|
||||
*data=(((*data>>8)&0xff) | ((*data&0xff)<<8));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ms_gswap4a ( void *data4 )
|
||||
{
|
||||
uint32_t *data = data4;
|
||||
|
||||
*data=(((*data>>24)&0xff) | ((*data&0xff)<<24) |
|
||||
((*data>>8)&0xff00) | ((*data&0xff00)<<8));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ms_gswap8a ( void *data8 )
|
||||
{
|
||||
uint32_t *data4 = data8;
|
||||
uint32_t h0, h1;
|
||||
|
||||
h0 = data4[0];
|
||||
h0 = (((h0>>24)&0xff) | ((h0&0xff)<<24) |
|
||||
((h0>>8)&0xff00) | ((h0&0xff00)<<8));
|
||||
|
||||
h1 = data4[1];
|
||||
h1 = (((h1>>24)&0xff) | ((h1&0xff)<<24) |
|
||||
((h1>>8)&0xff00) | ((h1&0xff00)<<8));
|
||||
|
||||
data4[0] = h1;
|
||||
data4[1] = h0;
|
||||
}
|
106
libs/3rd-party/mseed/libmseed.def
vendored
Normal file
106
libs/3rd-party/mseed/libmseed.def
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
LIBRARY libmseed.dll
|
||||
EXPORTS
|
||||
msr_parse
|
||||
msr_parse_selection
|
||||
msr_unpack
|
||||
msr_pack
|
||||
msr_pack_header
|
||||
msr_init
|
||||
msr_free
|
||||
msr_free_blktchain
|
||||
msr_addblockette
|
||||
msr_normalize_header
|
||||
msr_duplicate
|
||||
msr_samprate
|
||||
msr_nomsamprate
|
||||
msr_starttime
|
||||
msr_starttime_uc
|
||||
msr_endtime
|
||||
msr_srcname
|
||||
msr_print
|
||||
msr_host_latency
|
||||
ms_detect
|
||||
ms_parse_raw
|
||||
mst_init
|
||||
mst_free
|
||||
mst_initgroup
|
||||
mst_freegroup
|
||||
mst_findmatch
|
||||
mst_findadjacent
|
||||
mst_addmsr
|
||||
mst_addspan
|
||||
mst_addmsrtogroup
|
||||
mst_addtracetogroup
|
||||
mst_groupheal
|
||||
mst_groupsort
|
||||
mst_srcname
|
||||
mst_printtracelist
|
||||
mst_printsynclist
|
||||
mst_printgaplist
|
||||
mst_pack
|
||||
mst_packgroup
|
||||
mstl_init
|
||||
mstl_free
|
||||
mstl_addmsr
|
||||
mstl_printtracelist
|
||||
mstl_printsynclist
|
||||
mstl_printgaplist
|
||||
ms_readmsr
|
||||
ms_readmsr_r
|
||||
ms_readmsr_main
|
||||
ms_readtraces
|
||||
ms_readtraces_timewin
|
||||
ms_readtraces_selection
|
||||
ms_readtracelist
|
||||
ms_readtracelist_timewin
|
||||
ms_readtracelist_selection
|
||||
msr_writemseed
|
||||
mst_writemseed
|
||||
mst_writemseedgroup
|
||||
ms_recsrcname
|
||||
ms_splitsrcname
|
||||
ms_strncpclean
|
||||
ms_strncpopen
|
||||
ms_doy2md
|
||||
ms_md2doy
|
||||
ms_btime2hptime
|
||||
ms_btime2isotimestr
|
||||
ms_btime2mdtimestr
|
||||
ms_btime2seedtimestr
|
||||
ms_hptime2btime
|
||||
ms_hptime2isotimestr
|
||||
ms_hptime2mdtimestr
|
||||
ms_hptime2seedtimestr
|
||||
ms_time2hptime
|
||||
ms_seedtimestr2hptime
|
||||
ms_timestr2hptime
|
||||
ms_nomsamprate
|
||||
ms_genfactmult
|
||||
ms_ratapprox
|
||||
ms_bigendianhost
|
||||
ms_dabs
|
||||
ms_samplesize
|
||||
ms_encodingstr
|
||||
ms_blktdesc
|
||||
ms_blktlen
|
||||
ms_errorstr
|
||||
ms_log
|
||||
ms_log_l
|
||||
ms_loginit
|
||||
ms_loginit_l
|
||||
ms_matchselect
|
||||
msr_matchselect
|
||||
ms_addselect
|
||||
ms_addselect_comp
|
||||
ms_readselectionsfile
|
||||
ms_freeselections
|
||||
ms_printselections
|
||||
ms_gswap2
|
||||
ms_gswap3
|
||||
ms_gswap4
|
||||
ms_gswap8
|
||||
ms_gswap2a
|
||||
ms_gswap4a
|
||||
ms_gswap8a
|
||||
msr_unpack_steim2
|
||||
msr_unpack_steim1
|
735
libs/3rd-party/mseed/libmseed.h
vendored
Normal file
735
libs/3rd-party/mseed/libmseed.h
vendored
Normal file
@ -0,0 +1,735 @@
|
||||
|
||||
/***************************************************************************
|
||||
* libmseed.h:
|
||||
*
|
||||
* Interface declarations for the Mini-SEED library (libmseed).
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License (GNU-LGPL) for more details. The
|
||||
* GNU-LGPL and further information can be found here:
|
||||
* http://www.gnu.org/
|
||||
*
|
||||
* Written by Chad Trabant
|
||||
* IRIS Data Management Center
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef LIBMSEED_H
|
||||
#define LIBMSEED_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "lmplatform.h"
|
||||
|
||||
#define LIBMSEED_VERSION "2.13"
|
||||
#define LIBMSEED_RELEASE "2014.234"
|
||||
|
||||
#define MINRECLEN 128 /* Minimum Mini-SEED record length, 2^7 bytes */
|
||||
/* Note: the SEED specification minimum is 256 */
|
||||
#define MAXRECLEN 1048576 /* Maximum Mini-SEED record length, 2^20 bytes */
|
||||
|
||||
/* SEED data encoding types */
|
||||
#define DE_ASCII 0
|
||||
#define DE_INT16 1
|
||||
#define DE_INT32 3
|
||||
#define DE_FLOAT32 4
|
||||
#define DE_FLOAT64 5
|
||||
#define DE_STEIM1 10
|
||||
#define DE_STEIM2 11
|
||||
#define DE_GEOSCOPE24 12
|
||||
#define DE_GEOSCOPE163 13
|
||||
#define DE_GEOSCOPE164 14
|
||||
#define DE_CDSN 16
|
||||
#define DE_SRO 30
|
||||
#define DE_DWWSSN 32
|
||||
|
||||
/* Library return and error code values, error values should always be negative */
|
||||
#define MS_ENDOFFILE 1 /* End of file reached return value */
|
||||
#define MS_NOERROR 0 /* No error */
|
||||
#define MS_GENERROR -1 /* Generic unspecified error */
|
||||
#define MS_NOTSEED -2 /* Data not SEED */
|
||||
#define MS_WRONGLENGTH -3 /* Length of data read was not correct */
|
||||
#define MS_OUTOFRANGE -4 /* SEED record length out of range */
|
||||
#define MS_UNKNOWNFORMAT -5 /* Unknown data encoding format */
|
||||
#define MS_STBADCOMPFLAG -6 /* Steim, invalid compression flag(s) */
|
||||
|
||||
/* Define the high precision time tick interval as 1/modulus seconds */
|
||||
/* Default modulus of 1000000 defines tick interval as a microsecond */
|
||||
#define HPTMODULUS 1000000
|
||||
|
||||
/* Error code for routines that normally return a high precision time.
|
||||
* The time value corresponds to '1902/1/1 00:00:00.000000' with the
|
||||
* default HPTMODULUS */
|
||||
#define HPTERROR -2145916800000000LL
|
||||
|
||||
/* Macros to scale between Unix/POSIX epoch time & high precision time */
|
||||
#define MS_EPOCH2HPTIME(X) X * (hptime_t) HPTMODULUS
|
||||
#define MS_HPTIME2EPOCH(X) X / HPTMODULUS
|
||||
|
||||
/* Macro to test a character for data record indicators */
|
||||
#define MS_ISDATAINDICATOR(X) (X=='D' || X=='R' || X=='Q' || X=='M')
|
||||
|
||||
/* Macro to test default sample rate tolerance: abs(1-sr1/sr2) < 0.0001 */
|
||||
#define MS_ISRATETOLERABLE(A,B) (ms_dabs (1.0 - (A / B)) < 0.0001)
|
||||
|
||||
/* Macro to test for sane year and day values, used primarily to
|
||||
* determine if byte order swapping is needed.
|
||||
*
|
||||
* Year : between 1900 and 2100
|
||||
* Day : between 1 and 366
|
||||
*
|
||||
* This test is non-unique (non-deterministic) for days 1, 256 and 257
|
||||
* in the year 2056 because the swapped values are also within range.
|
||||
*/
|
||||
#define MS_ISVALIDYEARDAY(Y,D) (Y >= 1900 && Y <= 2100 && D >= 1 && D <= 366)
|
||||
|
||||
/* Macro to test memory for a SEED data record signature by checking
|
||||
* SEED data record header values at known byte offsets to determine
|
||||
* if the memory contains a valid record.
|
||||
*
|
||||
* Offset = Value
|
||||
* [0-5] = Digits, spaces or NULL, SEED sequence number
|
||||
* 6 = Data record quality indicator
|
||||
* 7 = Space or NULL [not valid SEED]
|
||||
* 24 = Start hour (0-23)
|
||||
* 25 = Start minute (0-59)
|
||||
* 26 = Start second (0-60)
|
||||
*
|
||||
* Usage:
|
||||
* MS_ISVALIDHEADER ((char *)X) X buffer must contain at least 27 bytes
|
||||
*/
|
||||
#define MS_ISVALIDHEADER(X) ( \
|
||||
(isdigit ((unsigned char) *(X)) || *(X) == ' ' || !*(X) ) && \
|
||||
(isdigit ((unsigned char) *(X+1)) || *(X+1) == ' ' || !*(X+1) ) && \
|
||||
(isdigit ((unsigned char) *(X+2)) || *(X+2) == ' ' || !*(X+2) ) && \
|
||||
(isdigit ((unsigned char) *(X+3)) || *(X+3) == ' ' || !*(X+3) ) && \
|
||||
(isdigit ((unsigned char) *(X+4)) || *(X+4) == ' ' || !*(X+4) ) && \
|
||||
(isdigit ((unsigned char) *(X+5)) || *(X+5) == ' ' || !*(X+5) ) && \
|
||||
MS_ISDATAINDICATOR(*(X+6)) && \
|
||||
(*(X+7) == ' ' || *(X+7) == '\0') && \
|
||||
(int)(*(X+24)) >= 0 && (int)(*(X+24)) <= 23 && \
|
||||
(int)(*(X+25)) >= 0 && (int)(*(X+25)) <= 59 && \
|
||||
(int)(*(X+26)) >= 0 && (int)(*(X+26)) <= 60)
|
||||
|
||||
/* Macro to test memory for a blank/noise SEED data record signature
|
||||
* by checking for a valid SEED sequence number and padding characters
|
||||
* to determine if the memory contains a valid blank/noise record.
|
||||
*
|
||||
* Offset = Value
|
||||
* [0-5] = Digits or NULL, SEED sequence number
|
||||
* [6-47] = Space character (ASCII 32), remainder of fixed header
|
||||
*
|
||||
* Usage:
|
||||
* MS_ISVALIDBLANK ((char *)X) X buffer must contain at least 27 bytes
|
||||
*/
|
||||
#define MS_ISVALIDBLANK(X) ((isdigit ((unsigned char) *(X)) || !*(X) ) && \
|
||||
(isdigit ((unsigned char) *(X+1)) || !*(X+1) ) && \
|
||||
(isdigit ((unsigned char) *(X+2)) || !*(X+2) ) && \
|
||||
(isdigit ((unsigned char) *(X+3)) || !*(X+3) ) && \
|
||||
(isdigit ((unsigned char) *(X+4)) || !*(X+4) ) && \
|
||||
(isdigit ((unsigned char) *(X+5)) || !*(X+5) ) && \
|
||||
(*(X+6)==' ')&&(*(X+7)==' ')&&(*(X+8)==' ') && \
|
||||
(*(X+9)==' ')&&(*(X+10)==' ')&&(*(X+11)==' ') && \
|
||||
(*(X+12)==' ')&&(*(X+13)==' ')&&(*(X+14)==' ') && \
|
||||
(*(X+15)==' ')&&(*(X+16)==' ')&&(*(X+17)==' ') && \
|
||||
(*(X+18)==' ')&&(*(X+19)==' ')&&(*(X+20)==' ') && \
|
||||
(*(X+21)==' ')&&(*(X+22)==' ')&&(*(X+23)==' ') && \
|
||||
(*(X+24)==' ')&&(*(X+25)==' ')&&(*(X+26)==' ') && \
|
||||
(*(X+27)==' ')&&(*(X+28)==' ')&&(*(X+29)==' ') && \
|
||||
(*(X+30)==' ')&&(*(X+31)==' ')&&(*(X+32)==' ') && \
|
||||
(*(X+33)==' ')&&(*(X+34)==' ')&&(*(X+35)==' ') && \
|
||||
(*(X+36)==' ')&&(*(X+37)==' ')&&(*(X+38)==' ') && \
|
||||
(*(X+39)==' ')&&(*(X+40)==' ')&&(*(X+41)==' ') && \
|
||||
(*(X+42)==' ')&&(*(X+43)==' ')&&(*(X+44)==' ') && \
|
||||
(*(X+45)==' ')&&(*(X+46)==' ')&&(*(X+47)==' ') )
|
||||
|
||||
/* A simple bitwise AND test to return 0 or 1 */
|
||||
#define bit(x,y) (x&y)?1:0
|
||||
|
||||
/* Require a large (>= 64-bit) integer type for hptime_t */
|
||||
typedef int64_t hptime_t;
|
||||
|
||||
/* A single byte flag type */
|
||||
typedef int8_t flag;
|
||||
|
||||
/* SEED binary time */
|
||||
typedef struct btime_s
|
||||
{
|
||||
uint16_t year;
|
||||
uint16_t day;
|
||||
uint8_t hour;
|
||||
uint8_t min;
|
||||
uint8_t sec;
|
||||
uint8_t unused;
|
||||
uint16_t fract;
|
||||
} LMP_PACKED
|
||||
BTime;
|
||||
|
||||
/* Fixed section data of header */
|
||||
struct fsdh_s
|
||||
{
|
||||
char sequence_number[6];
|
||||
char dataquality;
|
||||
char reserved;
|
||||
char station[5];
|
||||
char location[2];
|
||||
char channel[3];
|
||||
char network[2];
|
||||
BTime start_time;
|
||||
uint16_t numsamples;
|
||||
int16_t samprate_fact;
|
||||
int16_t samprate_mult;
|
||||
uint8_t act_flags;
|
||||
uint8_t io_flags;
|
||||
uint8_t dq_flags;
|
||||
uint8_t numblockettes;
|
||||
int32_t time_correct;
|
||||
uint16_t data_offset;
|
||||
uint16_t blockette_offset;
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 100, Sample Rate (without header) */
|
||||
struct blkt_100_s
|
||||
{
|
||||
float samprate;
|
||||
int8_t flags;
|
||||
uint8_t reserved[3];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 200, Generic Event Detection (without header) */
|
||||
struct blkt_200_s
|
||||
{
|
||||
float amplitude;
|
||||
float period;
|
||||
float background_estimate;
|
||||
uint8_t flags;
|
||||
uint8_t reserved;
|
||||
BTime time;
|
||||
char detector[24];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 201, Murdock Event Detection (without header) */
|
||||
struct blkt_201_s
|
||||
{
|
||||
float amplitude;
|
||||
float period;
|
||||
float background_estimate;
|
||||
uint8_t flags;
|
||||
uint8_t reserved;
|
||||
BTime time;
|
||||
uint8_t snr_values[6];
|
||||
uint8_t loopback;
|
||||
uint8_t pick_algorithm;
|
||||
char detector[24];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 300, Step Calibration (without header) */
|
||||
struct blkt_300_s
|
||||
{
|
||||
BTime time;
|
||||
uint8_t numcalibrations;
|
||||
uint8_t flags;
|
||||
uint32_t step_duration;
|
||||
uint32_t interval_duration;
|
||||
float amplitude;
|
||||
char input_channel[3];
|
||||
uint8_t reserved;
|
||||
uint32_t reference_amplitude;
|
||||
char coupling[12];
|
||||
char rolloff[12];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 310, Sine Calibration (without header) */
|
||||
struct blkt_310_s
|
||||
{
|
||||
BTime time;
|
||||
uint8_t reserved1;
|
||||
uint8_t flags;
|
||||
uint32_t duration;
|
||||
float period;
|
||||
float amplitude;
|
||||
char input_channel[3];
|
||||
uint8_t reserved2;
|
||||
uint32_t reference_amplitude;
|
||||
char coupling[12];
|
||||
char rolloff[12];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 320, Pseudo-random Calibration (without header) */
|
||||
struct blkt_320_s
|
||||
{
|
||||
BTime time;
|
||||
uint8_t reserved1;
|
||||
uint8_t flags;
|
||||
uint32_t duration;
|
||||
float ptp_amplitude;
|
||||
char input_channel[3];
|
||||
uint8_t reserved2;
|
||||
uint32_t reference_amplitude;
|
||||
char coupling[12];
|
||||
char rolloff[12];
|
||||
char noise_type[8];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 390, Generic Calibration (without header) */
|
||||
struct blkt_390_s
|
||||
{
|
||||
BTime time;
|
||||
uint8_t reserved1;
|
||||
uint8_t flags;
|
||||
uint32_t duration;
|
||||
float amplitude;
|
||||
char input_channel[3];
|
||||
uint8_t reserved2;
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 395, Calibration Abort (without header) */
|
||||
struct blkt_395_s
|
||||
{
|
||||
BTime time;
|
||||
uint8_t reserved[2];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 400, Beam (without header) */
|
||||
struct blkt_400_s
|
||||
{
|
||||
float azimuth;
|
||||
float slowness;
|
||||
uint16_t configuration;
|
||||
uint8_t reserved[2];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 405, Beam Delay (without header) */
|
||||
struct blkt_405_s
|
||||
{
|
||||
uint16_t delay_values[1];
|
||||
};
|
||||
|
||||
/* Blockette 500, Timing (without header) */
|
||||
struct blkt_500_s
|
||||
{
|
||||
float vco_correction;
|
||||
BTime time;
|
||||
int8_t usec;
|
||||
uint8_t reception_qual;
|
||||
uint32_t exception_count;
|
||||
char exception_type[16];
|
||||
char clock_model[32];
|
||||
char clock_status[128];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 1000, Data Only SEED (without header) */
|
||||
struct blkt_1000_s
|
||||
{
|
||||
uint8_t encoding;
|
||||
uint8_t byteorder;
|
||||
uint8_t reclen;
|
||||
uint8_t reserved;
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 1001, Data Extension (without header) */
|
||||
struct blkt_1001_s
|
||||
{
|
||||
uint8_t timing_qual;
|
||||
int8_t usec;
|
||||
uint8_t reserved;
|
||||
uint8_t framecnt;
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette 2000, Opaque Data (without header) */
|
||||
struct blkt_2000_s
|
||||
{
|
||||
uint16_t length;
|
||||
uint16_t data_offset;
|
||||
uint32_t recnum;
|
||||
uint8_t byteorder;
|
||||
uint8_t flags;
|
||||
uint8_t numheaders;
|
||||
char payload[1];
|
||||
} LMP_PACKED;
|
||||
|
||||
/* Blockette chain link, generic linkable blockette index */
|
||||
typedef struct blkt_link_s
|
||||
{
|
||||
uint16_t blktoffset; /* Offset to this blockette */
|
||||
uint16_t blkt_type; /* Blockette type */
|
||||
uint16_t next_blkt; /* Offset to next blockette */
|
||||
void *blktdata; /* Blockette data */
|
||||
uint16_t blktdatalen; /* Length of blockette data in bytes */
|
||||
struct blkt_link_s *next;
|
||||
}
|
||||
BlktLink;
|
||||
|
||||
typedef struct StreamState_s
|
||||
{
|
||||
int64_t packedrecords; /* Count of packed records */
|
||||
int64_t packedsamples; /* Count of packed samples */
|
||||
int32_t lastintsample; /* Value of last integer sample packed */
|
||||
flag comphistory; /* Control use of lastintsample for compression history */
|
||||
}
|
||||
StreamState;
|
||||
|
||||
typedef struct MSRecord_s {
|
||||
char *record; /* Mini-SEED record */
|
||||
int32_t reclen; /* Length of Mini-SEED record in bytes */
|
||||
|
||||
/* Pointers to SEED data record structures */
|
||||
struct fsdh_s *fsdh; /* Fixed Section of Data Header */
|
||||
BlktLink *blkts; /* Root of blockette chain */
|
||||
struct blkt_100_s *Blkt100; /* Blockette 100, if present */
|
||||
struct blkt_1000_s *Blkt1000; /* Blockette 1000, if present */
|
||||
struct blkt_1001_s *Blkt1001; /* Blockette 1001, if present */
|
||||
|
||||
/* Common header fields in accessible form */
|
||||
int32_t sequence_number; /* SEED record sequence number */
|
||||
char network[11]; /* Network designation, NULL terminated */
|
||||
char station[11]; /* Station designation, NULL terminated */
|
||||
char location[11]; /* Location designation, NULL terminated */
|
||||
char channel[11]; /* Channel designation, NULL terminated */
|
||||
char dataquality; /* Data quality indicator */
|
||||
hptime_t starttime; /* Record start time, corrected (first sample) */
|
||||
double samprate; /* Nominal sample rate (Hz) */
|
||||
int64_t samplecnt; /* Number of samples in record */
|
||||
int8_t encoding; /* Data encoding format */
|
||||
int8_t byteorder; /* Original/Final byte order of record */
|
||||
|
||||
/* Data sample fields */
|
||||
void *datasamples; /* Data samples, 'numsamples' of type 'sampletype'*/
|
||||
int64_t numsamples; /* Number of data samples in datasamples */
|
||||
char sampletype; /* Sample type code: a, i, f, d */
|
||||
|
||||
/* Stream oriented state information */
|
||||
StreamState *ststate; /* Stream processing state information */
|
||||
}
|
||||
MSRecord;
|
||||
|
||||
/* Container for a continuous trace, linkable */
|
||||
typedef struct MSTrace_s {
|
||||
char network[11]; /* Network designation, NULL terminated */
|
||||
char station[11]; /* Station designation, NULL terminated */
|
||||
char location[11]; /* Location designation, NULL terminated */
|
||||
char channel[11]; /* Channel designation, NULL terminated */
|
||||
char dataquality; /* Data quality indicator */
|
||||
char type; /* MSTrace type code */
|
||||
hptime_t starttime; /* Time of first sample */
|
||||
hptime_t endtime; /* Time of last sample */
|
||||
double samprate; /* Nominal sample rate (Hz) */
|
||||
int64_t samplecnt; /* Number of samples in trace coverage */
|
||||
void *datasamples; /* Data samples, 'numsamples' of type 'sampletype' */
|
||||
int64_t numsamples; /* Number of data samples in datasamples */
|
||||
char sampletype; /* Sample type code: a, i, f, d */
|
||||
void *prvtptr; /* Private pointer for general use, unused by libmseed */
|
||||
StreamState *ststate; /* Stream processing state information */
|
||||
struct MSTrace_s *next; /* Pointer to next trace */
|
||||
}
|
||||
MSTrace;
|
||||
|
||||
/* Container for a group (chain) of traces */
|
||||
typedef struct MSTraceGroup_s {
|
||||
int32_t numtraces; /* Number of MSTraces in the trace chain */
|
||||
struct MSTrace_s *traces; /* Root of the trace chain */
|
||||
}
|
||||
MSTraceGroup;
|
||||
|
||||
/* Container for a continuous trace segment, linkable */
|
||||
typedef struct MSTraceSeg_s {
|
||||
hptime_t starttime; /* Time of first sample */
|
||||
hptime_t endtime; /* Time of last sample */
|
||||
double samprate; /* Nominal sample rate (Hz) */
|
||||
int64_t samplecnt; /* Number of samples in trace coverage */
|
||||
void *datasamples; /* Data samples, 'numsamples' of type 'sampletype'*/
|
||||
int64_t numsamples; /* Number of data samples in datasamples */
|
||||
char sampletype; /* Sample type code: a, i, f, d */
|
||||
void *prvtptr; /* Private pointer for general use, unused by libmseed */
|
||||
struct MSTraceSeg_s *prev; /* Pointer to previous segment */
|
||||
struct MSTraceSeg_s *next; /* Pointer to next segment */
|
||||
}
|
||||
MSTraceSeg;
|
||||
|
||||
/* Container for a trace ID, linkable */
|
||||
typedef struct MSTraceID_s {
|
||||
char network[11]; /* Network designation, NULL terminated */
|
||||
char station[11]; /* Station designation, NULL terminated */
|
||||
char location[11]; /* Location designation, NULL terminated */
|
||||
char channel[11]; /* Channel designation, NULL terminated */
|
||||
char dataquality; /* Data quality indicator */
|
||||
char srcname[45]; /* Source name (Net_Sta_Loc_Chan_Qual), NULL terminated */
|
||||
char type; /* Trace type code */
|
||||
hptime_t earliest; /* Time of earliest sample */
|
||||
hptime_t latest; /* Time of latest sample */
|
||||
void *prvtptr; /* Private pointer for general use, unused by libmseed */
|
||||
int32_t numsegments; /* Number of segments for this ID */
|
||||
struct MSTraceSeg_s *first; /* Pointer to first of list of segments */
|
||||
struct MSTraceSeg_s *last; /* Pointer to last of list of segments */
|
||||
struct MSTraceID_s *next; /* Pointer to next trace */
|
||||
}
|
||||
MSTraceID;
|
||||
|
||||
/* Container for a continuous trace segment, linkable */
|
||||
typedef struct MSTraceList_s {
|
||||
int32_t numtraces; /* Number of traces in list */
|
||||
struct MSTraceID_s *traces; /* Pointer to list of traces */
|
||||
struct MSTraceID_s *last; /* Pointer to last used trace in list */
|
||||
}
|
||||
MSTraceList;
|
||||
|
||||
/* Data selection structure time window definition containers */
|
||||
typedef struct SelectTime_s {
|
||||
hptime_t starttime; /* Earliest data for matching channels */
|
||||
hptime_t endtime; /* Latest data for matching channels */
|
||||
struct SelectTime_s *next;
|
||||
} SelectTime;
|
||||
|
||||
/* Data selection structure definition containers */
|
||||
typedef struct Selections_s {
|
||||
char srcname[100]; /* Matching (globbing) source name: Net_Sta_Loc_Chan_Qual */
|
||||
struct SelectTime_s *timewindows;
|
||||
struct Selections_s *next;
|
||||
} Selections;
|
||||
|
||||
|
||||
/* Global variables (defined in pack.c) and macros to set/force
|
||||
* pack byte orders */
|
||||
extern flag packheaderbyteorder;
|
||||
extern flag packdatabyteorder;
|
||||
#define MS_PACKHEADERBYTEORDER(X) (packheaderbyteorder = X);
|
||||
#define MS_PACKDATABYTEORDER(X) (packdatabyteorder = X);
|
||||
|
||||
/* Global variables (defined in unpack.c) and macros to set/force
|
||||
* unpack byte orders */
|
||||
extern flag unpackheaderbyteorder;
|
||||
extern flag unpackdatabyteorder;
|
||||
#define MS_UNPACKHEADERBYTEORDER(X) (unpackheaderbyteorder = X);
|
||||
#define MS_UNPACKDATABYTEORDER(X) (unpackdatabyteorder = X);
|
||||
|
||||
/* Global variables (defined in unpack.c) and macros to set/force
|
||||
* encoding and fallback encoding */
|
||||
extern int unpackencodingformat;
|
||||
extern int unpackencodingfallback;
|
||||
#define MS_UNPACKENCODINGFORMAT(X) (unpackencodingformat = X);
|
||||
#define MS_UNPACKENCODINGFALLBACK(X) (unpackencodingfallback = X);
|
||||
|
||||
/* Mini-SEED record related functions */
|
||||
extern int msr_parse (char *record, int recbuflen, MSRecord **ppmsr, int reclen,
|
||||
flag dataflag, flag verbose);
|
||||
|
||||
extern int msr_parse_selection ( char *recbuf, int recbuflen, int64_t *offset,
|
||||
MSRecord **ppmsr, int reclen,
|
||||
Selections *selections, flag dataflag, flag verbose );
|
||||
|
||||
extern int msr_unpack (char *record, int reclen, MSRecord **ppmsr,
|
||||
flag dataflag, flag verbose);
|
||||
|
||||
extern int msr_pack (MSRecord *msr, void (*record_handler) (char *, int, void *),
|
||||
void *handlerdata, int64_t *packedsamples, flag flush, flag verbose );
|
||||
|
||||
extern int msr_pack_header (MSRecord *msr, flag normalize, flag verbose);
|
||||
|
||||
extern int msr_unpack_data (MSRecord *msr, int swapflag, flag verbose);
|
||||
|
||||
extern MSRecord* msr_init (MSRecord *msr);
|
||||
extern void msr_free (MSRecord **ppmsr);
|
||||
extern void msr_free_blktchain (MSRecord *msr);
|
||||
extern BlktLink* msr_addblockette (MSRecord *msr, char *blktdata, int length,
|
||||
int blkttype, int chainpos);
|
||||
extern int msr_normalize_header (MSRecord *msr, flag verbose);
|
||||
extern MSRecord* msr_duplicate (MSRecord *msr, flag datadup);
|
||||
extern double msr_samprate (MSRecord *msr);
|
||||
extern double msr_nomsamprate (MSRecord *msr);
|
||||
extern hptime_t msr_starttime (MSRecord *msr);
|
||||
extern hptime_t msr_starttime_uc (MSRecord *msr);
|
||||
extern hptime_t msr_endtime (MSRecord *msr);
|
||||
extern char* msr_srcname (MSRecord *msr, char *srcname, flag quality);
|
||||
extern void msr_print (MSRecord *msr, flag details);
|
||||
extern double msr_host_latency (MSRecord *msr);
|
||||
|
||||
extern int ms_detect (const char *record, int recbuflen);
|
||||
extern int ms_parse_raw (char *record, int maxreclen, flag details, flag swapflag);
|
||||
|
||||
|
||||
/* MSTrace related functions */
|
||||
extern MSTrace* mst_init (MSTrace *mst);
|
||||
extern void mst_free (MSTrace **ppmst);
|
||||
extern MSTraceGroup* mst_initgroup (MSTraceGroup *mstg);
|
||||
extern void mst_freegroup (MSTraceGroup **ppmstg);
|
||||
extern MSTrace* mst_findmatch (MSTrace *startmst, char dataquality,
|
||||
char *network, char *station, char *location, char *channel);
|
||||
extern MSTrace* mst_findadjacent (MSTraceGroup *mstg, flag *whence, char dataquality,
|
||||
char *network, char *station, char *location, char *channel,
|
||||
double samprate, double sampratetol,
|
||||
hptime_t starttime, hptime_t endtime, double timetol);
|
||||
extern int mst_addmsr (MSTrace *mst, MSRecord *msr, flag whence);
|
||||
extern int mst_addspan (MSTrace *mst, hptime_t starttime, hptime_t endtime,
|
||||
void *datasamples, int64_t numsamples,
|
||||
char sampletype, flag whence);
|
||||
extern MSTrace* mst_addmsrtogroup (MSTraceGroup *mstg, MSRecord *msr, flag dataquality,
|
||||
double timetol, double sampratetol);
|
||||
extern MSTrace* mst_addtracetogroup (MSTraceGroup *mstg, MSTrace *mst);
|
||||
extern int mst_groupheal (MSTraceGroup *mstg, double timetol, double sampratetol);
|
||||
extern int mst_groupsort (MSTraceGroup *mstg, flag quality);
|
||||
extern int mst_convertsamples (MSTrace *mst, char type, flag truncate);
|
||||
extern char * mst_srcname (MSTrace *mst, char *srcname, flag quality);
|
||||
extern void mst_printtracelist (MSTraceGroup *mstg, flag timeformat,
|
||||
flag details, flag gaps);
|
||||
extern void mst_printsynclist ( MSTraceGroup *mstg, char *dccid, flag subsecond );
|
||||
extern void mst_printgaplist (MSTraceGroup *mstg, flag timeformat,
|
||||
double *mingap, double *maxgap);
|
||||
extern int mst_pack (MSTrace *mst, void (*record_handler) (char *, int, void *),
|
||||
void *handlerdata, int reclen, flag encoding, flag byteorder,
|
||||
int64_t *packedsamples, flag flush, flag verbose,
|
||||
MSRecord *mstemplate);
|
||||
extern int mst_packgroup (MSTraceGroup *mstg, void (*record_handler) (char *, int, void *),
|
||||
void *handlerdata, int reclen, flag encoding, flag byteorder,
|
||||
int64_t *packedsamples, flag flush, flag verbose,
|
||||
MSRecord *mstemplate);
|
||||
|
||||
/* MSTraceList related functions */
|
||||
extern MSTraceList * mstl_init ( MSTraceList *mstl );
|
||||
extern void mstl_free ( MSTraceList **ppmstl, flag freeprvtptr );
|
||||
extern MSTraceSeg * mstl_addmsr ( MSTraceList *mstl, MSRecord *msr, flag dataquality,
|
||||
flag autoheal, double timetol, double sampratetol );
|
||||
extern int mstl_convertsamples ( MSTraceSeg *seg, char type, flag truncate );
|
||||
extern void mstl_printtracelist ( MSTraceList *mstl, flag timeformat,
|
||||
flag details, flag gaps );
|
||||
extern void mstl_printsynclist ( MSTraceList *mstl, char *dccid, flag subsecond );
|
||||
extern void mstl_printgaplist (MSTraceList *mstl, flag timeformat,
|
||||
double *mingap, double *maxgap);
|
||||
|
||||
/* Reading Mini-SEED records from files */
|
||||
typedef struct MSFileParam_s
|
||||
{
|
||||
FILE *fp;
|
||||
char filename[512];
|
||||
char *rawrec;
|
||||
int readlen;
|
||||
int readoffset;
|
||||
int packtype;
|
||||
off_t packhdroffset;
|
||||
off_t filepos;
|
||||
off_t filesize;
|
||||
int recordcount;
|
||||
} MSFileParam;
|
||||
|
||||
extern int ms_readmsr (MSRecord **ppmsr, const char *msfile, int reclen, off_t *fpos, int *last,
|
||||
flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readmsr_r (MSFileParam **ppmsfp, MSRecord **ppmsr, const char *msfile, int reclen,
|
||||
off_t *fpos, int *last, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readmsr_main (MSFileParam **ppmsfp, MSRecord **ppmsr, const char *msfile, int reclen,
|
||||
off_t *fpos, int *last, flag skipnotdata, flag dataflag, Selections *selections, flag verbose);
|
||||
extern int ms_readtraces (MSTraceGroup **ppmstg, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readtraces_timewin (MSTraceGroup **ppmstg, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
hptime_t starttime, hptime_t endtime, flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readtraces_selection (MSTraceGroup **ppmstg, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
Selections *selections, flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readtracelist (MSTraceList **ppmstl, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readtracelist_timewin (MSTraceList **ppmstl, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
hptime_t starttime, hptime_t endtime, flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
extern int ms_readtracelist_selection (MSTraceList **ppmstl, const char *msfile, int reclen, double timetol, double sampratetol,
|
||||
Selections *selections, flag dataquality, flag skipnotdata, flag dataflag, flag verbose);
|
||||
|
||||
extern int msr_writemseed ( MSRecord *msr, const char *msfile, flag overwrite, int reclen,
|
||||
flag encoding, flag byteorder, flag verbose );
|
||||
extern int mst_writemseed ( MSTrace *mst, const char *msfile, flag overwrite, int reclen,
|
||||
flag encoding, flag byteorder, flag verbose );
|
||||
extern int mst_writemseedgroup ( MSTraceGroup *mstg, const char *msfile, flag overwrite,
|
||||
int reclen, flag encoding, flag byteorder, flag verbose );
|
||||
|
||||
/* General use functions */
|
||||
extern char* ms_recsrcname (char *record, char *srcname, flag quality);
|
||||
extern int ms_splitsrcname (char *srcname, char *net, char *sta, char *loc, char *chan, char *qual);
|
||||
extern int ms_strncpclean (char *dest, const char *source, int length);
|
||||
extern int ms_strncpcleantail (char *dest, const char *source, int length);
|
||||
extern int ms_strncpopen (char *dest, const char *source, int length);
|
||||
extern int ms_doy2md (int year, int jday, int *month, int *mday);
|
||||
extern int ms_md2doy (int year, int month, int mday, int *jday);
|
||||
extern hptime_t ms_btime2hptime (BTime *btime);
|
||||
extern char* ms_btime2isotimestr (BTime *btime, char *isotimestr);
|
||||
extern char* ms_btime2mdtimestr (BTime *btime, char *mdtimestr);
|
||||
extern char* ms_btime2seedtimestr (BTime *btime, char *seedtimestr);
|
||||
extern int ms_hptime2btime (hptime_t hptime, BTime *btime);
|
||||
extern char* ms_hptime2isotimestr (hptime_t hptime, char *isotimestr, flag subsecond);
|
||||
extern char* ms_hptime2mdtimestr (hptime_t hptime, char *mdtimestr, flag subsecond);
|
||||
extern char* ms_hptime2seedtimestr (hptime_t hptime, char *seedtimestr, flag subsecond);
|
||||
extern hptime_t ms_time2hptime (int year, int day, int hour, int min, int sec, int usec);
|
||||
extern hptime_t ms_seedtimestr2hptime (char *seedtimestr);
|
||||
extern hptime_t ms_timestr2hptime (char *timestr);
|
||||
extern double ms_nomsamprate (int factor, int multiplier);
|
||||
extern int ms_genfactmult (double samprate, int16_t *factor, int16_t *multiplier);
|
||||
extern int ms_ratapprox (double real, int *num, int *den, int maxval, double precision);
|
||||
extern int ms_bigendianhost (void);
|
||||
extern double ms_dabs (double val);
|
||||
|
||||
|
||||
/* Lookup functions */
|
||||
extern uint8_t ms_samplesize (const char sampletype);
|
||||
extern char* ms_encodingstr (const char encoding);
|
||||
extern char* ms_blktdesc (uint16_t blkttype);
|
||||
extern uint16_t ms_blktlen (uint16_t blkttype, const char *blktdata, flag swapflag);
|
||||
extern char * ms_errorstr (int errorcode);
|
||||
|
||||
/* Logging facility */
|
||||
#define MAX_LOG_MSG_LENGTH 200 /* Maximum length of log messages */
|
||||
|
||||
/* Logging parameters */
|
||||
typedef struct MSLogParam_s
|
||||
{
|
||||
void (*log_print)(char*);
|
||||
const char *logprefix;
|
||||
void (*diag_print)(char*);
|
||||
const char *errprefix;
|
||||
} MSLogParam;
|
||||
|
||||
extern int ms_log (int level, ...);
|
||||
extern int ms_log_l (MSLogParam *logp, int level, ...);
|
||||
extern void ms_loginit (void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix);
|
||||
extern MSLogParam *ms_loginit_l (MSLogParam *logp,
|
||||
void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix);
|
||||
|
||||
/* Selection functions */
|
||||
extern Selections *ms_matchselect (Selections *selections, char *srcname,
|
||||
hptime_t starttime, hptime_t endtime, SelectTime **ppselecttime);
|
||||
extern Selections *msr_matchselect (Selections *selections, MSRecord *msr, SelectTime **ppselecttime);
|
||||
extern int ms_addselect (Selections **ppselections, char *srcname,
|
||||
hptime_t starttime, hptime_t endtime);
|
||||
extern int ms_addselect_comp (Selections **ppselections, char *net, char* sta, char *loc,
|
||||
char *chan, char *qual, hptime_t starttime, hptime_t endtime);
|
||||
extern int ms_readselectionsfile (Selections **ppselections, char *filename);
|
||||
extern void ms_freeselections (Selections *selections);
|
||||
extern void ms_printselections (Selections *selections);
|
||||
|
||||
/* Generic byte swapping routines */
|
||||
extern void ms_gswap2 ( void *data2 );
|
||||
extern void ms_gswap3 ( void *data3 );
|
||||
extern void ms_gswap4 ( void *data4 );
|
||||
extern void ms_gswap8 ( void *data8 );
|
||||
|
||||
/* Generic byte swapping routines for memory aligned quantities */
|
||||
extern void ms_gswap2a ( void *data2 );
|
||||
extern void ms_gswap4a ( void *data4 );
|
||||
extern void ms_gswap8a ( void *data8 );
|
||||
|
||||
/* Byte swap macro for the BTime struct */
|
||||
#define MS_SWAPBTIME(x) \
|
||||
ms_gswap2 (x.year); \
|
||||
ms_gswap2 (x.day); \
|
||||
ms_gswap2 (x.fract);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LIBMSEED_H */
|
65
libs/3rd-party/mseed/lmplatform.c
vendored
Normal file
65
libs/3rd-party/mseed/lmplatform.c
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
/***************************************************************************
|
||||
* lmplatform.c:
|
||||
*
|
||||
* Platform portability routines.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License (GNU-LGPL) for more details. The
|
||||
* GNU-LGPL and further information can be found here:
|
||||
* http://www.gnu.org/
|
||||
*
|
||||
* Written by Chad Trabant, IRIS Data Management Center
|
||||
*
|
||||
* modified: 2010.304
|
||||
***************************************************************************/
|
||||
|
||||
/* Define _LARGEFILE_SOURCE to get ftello/fseeko on some systems (Linux) */
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
|
||||
#include "lmplatform.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* lmp_ftello:
|
||||
*
|
||||
* Return the current file position for the specified descriptor using
|
||||
* the system's closest match to the POSIX ftello.
|
||||
***************************************************************************/
|
||||
off_t
|
||||
lmp_ftello (FILE *stream)
|
||||
{
|
||||
#if defined(LMP_WIN32)
|
||||
return (off_t) ftell (stream);
|
||||
|
||||
#else
|
||||
return (off_t) ftello (stream);
|
||||
|
||||
#endif
|
||||
} /* End of lmp_ftello() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* lmp_fseeko:
|
||||
*
|
||||
* Seek to a specific file position for the specified descriptor using
|
||||
* the system's closest match to the POSIX fseeko.
|
||||
***************************************************************************/
|
||||
int
|
||||
lmp_fseeko (FILE *stream, off_t offset, int whence)
|
||||
{
|
||||
#if defined(LMP_WIN32)
|
||||
return (int) fseek (stream, (long int) offset, whence);
|
||||
|
||||
#else
|
||||
return (int) fseeko (stream, offset, whence);
|
||||
|
||||
#endif
|
||||
} /* End of lmp_fseeko() */
|
||||
|
166
libs/3rd-party/mseed/lmplatform.h
vendored
Normal file
166
libs/3rd-party/mseed/lmplatform.h
vendored
Normal file
@ -0,0 +1,166 @@
|
||||
/***************************************************************************
|
||||
* lmplatform.h:
|
||||
*
|
||||
* Platform specific headers. This file provides a basic level of platform
|
||||
* portability.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License (GNU-LGPL) for more details. The
|
||||
* GNU-LGPL and further information can be found here:
|
||||
* http://www.gnu.org/
|
||||
*
|
||||
* Written by Chad Trabant, IRIS Data Management Center
|
||||
*
|
||||
* modified: 2014.074
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef LMPLATFORM_H
|
||||
#define LMPLATFORM_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* On some platforms (e.g. ARM) structures are aligned on word boundaries
|
||||
by adding padding between the elements. This library uses structs that
|
||||
map to SEED header/blockette structures that are required to have a
|
||||
layout exactly as specified, i.e. no padding.
|
||||
|
||||
If "ATTRIBUTE_PACKED" is defined at compile time (e.g. -DATTRIBUTE_PACKED)
|
||||
the preprocessor will use the define below to add the "packed" attribute
|
||||
to effected structs. This attribute is supported by GCC and increasingly
|
||||
more compilers.
|
||||
*/
|
||||
#if defined(ATTRIBUTE_PACKED)
|
||||
#define LMP_PACKED __attribute__((packed))
|
||||
#else
|
||||
#define LMP_PACKED
|
||||
#endif
|
||||
|
||||
/* Make some guesses about the system libraries based
|
||||
* on the architecture. Currently the assumptions are:
|
||||
* Linux => glibc2 libraries (LMP_GLIBC2)
|
||||
* Sun => Solaris libraties (LMP_SOLARIS)
|
||||
* BSD => BSD libraries, including Apple Mac OS X (LMP_BSD)
|
||||
* WIN32 => WIN32 and Windows Sockets 2 (LMP_WIN32)
|
||||
*/
|
||||
|
||||
#if defined(__linux__) || defined(__linux) || defined(__CYGWIN__)
|
||||
#define LMP_GLIBC2 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <features.h>
|
||||
|
||||
#elif defined(__sun__) || defined(__sun)
|
||||
#define LMP_SOLARIS 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
#define LMP_BSD 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#elif defined(WIN32) || defined(WIN64)
|
||||
#define LMP_WIN32 1
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdarg.h>
|
||||
#include <winsock.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
#define strcasecmp _stricmp
|
||||
#define strncasecmp _strnicmp
|
||||
#define strtoull _strtoui64
|
||||
#define strdup _strdup
|
||||
#define fileno _fileno
|
||||
#endif
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
#define fstat _fstat
|
||||
#define stat _stat
|
||||
#endif
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed short int int16_t;
|
||||
typedef unsigned short int uint16_t;
|
||||
typedef signed int int32_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef signed __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed short int int16_t;
|
||||
typedef unsigned short int uint16_t;
|
||||
typedef signed int int32_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef signed long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
|
||||
#endif
|
||||
|
||||
extern off_t lmp_ftello (FILE *stream);
|
||||
extern int lmp_fseeko (FILE *stream, off_t offset, int whence);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LMPLATFORM_H */
|
334
libs/3rd-party/mseed/logging.c
vendored
Normal file
334
libs/3rd-party/mseed/logging.c
vendored
Normal file
@ -0,0 +1,334 @@
|
||||
/***************************************************************************
|
||||
* logging.c
|
||||
*
|
||||
* Log handling routines for libmseed
|
||||
*
|
||||
* Chad Trabant
|
||||
* IRIS Data Management Center
|
||||
*
|
||||
* modified: 2014.197
|
||||
***************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libmseed.h"
|
||||
|
||||
void ms_loginit_main (MSLogParam *logp,
|
||||
void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix);
|
||||
|
||||
int ms_log_main (MSLogParam *logp, int level, va_list *varlist);
|
||||
|
||||
/* Initialize the global logging parameters */
|
||||
MSLogParam gMSLogParam = {NULL, NULL, NULL, NULL};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_loginit:
|
||||
*
|
||||
* Initialize the global logging parameters.
|
||||
*
|
||||
* See ms_loginit_main() description for usage.
|
||||
***************************************************************************/
|
||||
void
|
||||
ms_loginit (void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix)
|
||||
{
|
||||
ms_loginit_main(&gMSLogParam, log_print, logprefix, diag_print, errprefix);
|
||||
} /* End of ms_loginit() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_loginit_l:
|
||||
*
|
||||
* Initialize MSLogParam specific logging parameters. If the logging parameters
|
||||
* have not been initialized (log == NULL) new parameter space will
|
||||
* be allocated.
|
||||
*
|
||||
* See ms_loginit_main() description for usage.
|
||||
*
|
||||
* Returns a pointer to the created/re-initialized MSLogParam struct
|
||||
* on success and NULL on error.
|
||||
***************************************************************************/
|
||||
MSLogParam *
|
||||
ms_loginit_l (MSLogParam *logp,
|
||||
void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix)
|
||||
{
|
||||
MSLogParam *llog;
|
||||
|
||||
if ( logp == NULL )
|
||||
{
|
||||
llog = (MSLogParam *) malloc (sizeof(MSLogParam));
|
||||
|
||||
if ( llog == NULL )
|
||||
{
|
||||
ms_log (2, "ms_loginit_l(): Cannot allocate memory\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
llog->log_print = NULL;
|
||||
llog->logprefix = NULL;
|
||||
llog->diag_print = NULL;
|
||||
llog->errprefix = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
llog = logp;
|
||||
}
|
||||
|
||||
ms_loginit_main (llog, log_print, logprefix, diag_print, errprefix);
|
||||
|
||||
return llog;
|
||||
} /* End of ms_loginit_l() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_loginit_main:
|
||||
*
|
||||
* Initialize the logging subsystem. Given values determine how ms_log()
|
||||
* and ms_log_l() emit messages.
|
||||
*
|
||||
* This function modifies the logging parameters in the passed MSLogParam.
|
||||
*
|
||||
* Any log/error printing functions indicated must except a single
|
||||
* argument, namely a string (char *). The ms_log() and
|
||||
* ms_log_r() functions format each message and then pass the result
|
||||
* on to the log/error printing functions.
|
||||
*
|
||||
* If the log/error prefixes have been set they will be pre-pended to the
|
||||
* message.
|
||||
*
|
||||
* Use NULL for the function pointers or the prefixes if they should not
|
||||
* be changed from previously set or default values. The default behavior
|
||||
* of the logging subsystem is given in the example below.
|
||||
*
|
||||
* Example: ms_loginit_main (0, (void*)&printf, NULL, (void*)&printf, "error: ");
|
||||
***************************************************************************/
|
||||
void
|
||||
ms_loginit_main (MSLogParam *logp,
|
||||
void (*log_print)(char*), const char *logprefix,
|
||||
void (*diag_print)(char*), const char *errprefix)
|
||||
{
|
||||
if ( ! logp )
|
||||
return;
|
||||
|
||||
if ( log_print )
|
||||
logp->log_print = log_print;
|
||||
|
||||
if ( logprefix )
|
||||
{
|
||||
if ( strlen(logprefix) >= MAX_LOG_MSG_LENGTH )
|
||||
{
|
||||
ms_log_l (logp, 2, 0, "log message prefix is too large\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
logp->logprefix = logprefix;
|
||||
}
|
||||
}
|
||||
|
||||
if ( diag_print )
|
||||
logp->diag_print = diag_print;
|
||||
|
||||
if ( errprefix )
|
||||
{
|
||||
if ( strlen(errprefix) >= MAX_LOG_MSG_LENGTH )
|
||||
{
|
||||
ms_log_l (logp, 2, 0, "error message prefix is too large\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
logp->errprefix = errprefix;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
} /* End of ms_loginit_main() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_log:
|
||||
*
|
||||
* A wrapper to ms_log_main() that uses the global logging parameters.
|
||||
*
|
||||
* See ms_log_main() description for return values.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_log (int level, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list varlist;
|
||||
|
||||
va_start (varlist, level);
|
||||
|
||||
retval = ms_log_main (&gMSLogParam, level, &varlist);
|
||||
|
||||
va_end (varlist);
|
||||
|
||||
return retval;
|
||||
} /* End of ms_log() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_log_l:
|
||||
*
|
||||
* A wrapper to ms_log_main() that uses the logging parameters in a
|
||||
* supplied MSLogParam. If the supplied pointer is NULL the global logging
|
||||
* parameters will be used.
|
||||
*
|
||||
* See ms_log_main() description for return values.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_log_l (MSLogParam *logp, int level, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list varlist;
|
||||
MSLogParam *llog;
|
||||
|
||||
if ( ! logp )
|
||||
llog = &gMSLogParam;
|
||||
else
|
||||
llog = logp;
|
||||
|
||||
va_start (varlist, level);
|
||||
|
||||
retval = ms_log_main (llog, level, &varlist);
|
||||
|
||||
va_end (varlist);
|
||||
|
||||
return retval;
|
||||
} /* End of ms_log_l() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_log_main:
|
||||
*
|
||||
* A standard logging/printing routine.
|
||||
*
|
||||
* The function uses logging parameters specified in the supplied
|
||||
* MSLogParam.
|
||||
*
|
||||
* This function expects 2+ arguments: message level, fprintf format,
|
||||
* and fprintf arguments.
|
||||
*
|
||||
* Three levels are recognized:
|
||||
* 0 : Normal log messages, printed using log_print with logprefix
|
||||
* 1 : Diagnostic messages, printed using diag_print with logprefix
|
||||
* 2+ : Error messagess, printed using diag_print with errprefix
|
||||
*
|
||||
* This function builds the log/error message and passes to it as a
|
||||
* string (char *) to the functions defined with ms_loginit() or
|
||||
* ms_loginit_l(). If the log/error printing functions have not been
|
||||
* defined messages will be printed with fprintf, log messages to
|
||||
* stdout and error messages to stderr.
|
||||
*
|
||||
* If the log/error prefix's have been set with ms_loginit() or
|
||||
* ms_loginit_l() they will be pre-pended to the message.
|
||||
*
|
||||
* All messages will be truncated to the MAX_LOG_MSG_LENGTH, this includes
|
||||
* any set prefix.
|
||||
*
|
||||
* Returns the number of characters formatted on success, and a
|
||||
* a negative value on error.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_log_main (MSLogParam *logp, int level, va_list *varlist)
|
||||
{
|
||||
static char message[MAX_LOG_MSG_LENGTH];
|
||||
int retvalue = 0;
|
||||
int presize;
|
||||
const char *format;
|
||||
|
||||
if ( ! logp )
|
||||
{
|
||||
fprintf(stderr, "ms_log_main() called without specifying log parameters");
|
||||
return -1;
|
||||
}
|
||||
|
||||
message[0] = '\0';
|
||||
|
||||
format = va_arg (*varlist, const char *);
|
||||
|
||||
if ( level >= 2 ) /* Error message */
|
||||
{
|
||||
if ( logp->errprefix != NULL )
|
||||
{
|
||||
strncpy (message, logp->errprefix, MAX_LOG_MSG_LENGTH);
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy (message, "Error: ", MAX_LOG_MSG_LENGTH);
|
||||
}
|
||||
|
||||
presize = strlen(message);
|
||||
retvalue = vsnprintf (&message[presize],
|
||||
MAX_LOG_MSG_LENGTH - presize,
|
||||
format, *varlist);
|
||||
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
|
||||
if ( logp->diag_print != NULL )
|
||||
{
|
||||
logp->diag_print (message);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "%s", message);
|
||||
}
|
||||
}
|
||||
else if ( level == 1 ) /* Diagnostic message */
|
||||
{
|
||||
if ( logp->logprefix != NULL )
|
||||
{
|
||||
strncpy (message, logp->logprefix, MAX_LOG_MSG_LENGTH);
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
}
|
||||
|
||||
presize = strlen(message);
|
||||
retvalue = vsnprintf (&message[presize],
|
||||
MAX_LOG_MSG_LENGTH - presize,
|
||||
format, *varlist);
|
||||
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
|
||||
if ( logp->diag_print != NULL )
|
||||
{
|
||||
logp->diag_print (message);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "%s", message);
|
||||
}
|
||||
}
|
||||
else if ( level == 0 ) /* Normal log message */
|
||||
{
|
||||
if ( logp->logprefix != NULL )
|
||||
{
|
||||
strncpy (message, logp->logprefix, MAX_LOG_MSG_LENGTH);
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
}
|
||||
|
||||
presize = strlen(message);
|
||||
retvalue = vsnprintf (&message[presize],
|
||||
MAX_LOG_MSG_LENGTH - presize,
|
||||
format, *varlist);
|
||||
|
||||
message[MAX_LOG_MSG_LENGTH - 1] = '\0';
|
||||
|
||||
if ( logp->log_print != NULL )
|
||||
{
|
||||
logp->log_print (message);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stdout, "%s", message);
|
||||
}
|
||||
}
|
||||
|
||||
return retvalue;
|
||||
} /* End of ms_log_main() */
|
235
libs/3rd-party/mseed/lookup.c
vendored
Normal file
235
libs/3rd-party/mseed/lookup.c
vendored
Normal file
@ -0,0 +1,235 @@
|
||||
/***************************************************************************
|
||||
* lookup.c:
|
||||
*
|
||||
* Generic lookup routines for Mini-SEED information.
|
||||
*
|
||||
* Written by Chad Trabant, ORFEUS/EC-Project MEREDIAN
|
||||
*
|
||||
* modified: 2006.346
|
||||
***************************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "libmseed.h"
|
||||
|
||||
/***************************************************************************
|
||||
* ms_samplesize():
|
||||
*
|
||||
* Returns the sample size based on type code or 0 for unknown.
|
||||
***************************************************************************/
|
||||
uint8_t
|
||||
ms_samplesize (const char sampletype)
|
||||
{
|
||||
switch (sampletype)
|
||||
{
|
||||
case 'a':
|
||||
return 1;
|
||||
case 'i':
|
||||
case 'f':
|
||||
return 4;
|
||||
case 'd':
|
||||
return 8;
|
||||
default:
|
||||
return 0;
|
||||
} /* end switch */
|
||||
|
||||
} /* End of ms_samplesize() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_encodingstr():
|
||||
*
|
||||
* Returns a string describing a data encoding format.
|
||||
***************************************************************************/
|
||||
char *
|
||||
ms_encodingstr (const char encoding)
|
||||
{
|
||||
switch (encoding)
|
||||
{
|
||||
case 0:
|
||||
return "ASCII text";
|
||||
case 1:
|
||||
return "16 bit integers";
|
||||
case 2:
|
||||
return "24 bit integers";
|
||||
case 3:
|
||||
return "32 bit integers";
|
||||
case 4:
|
||||
return "IEEE floating point";
|
||||
case 5:
|
||||
return "IEEE double precision float";
|
||||
case 10:
|
||||
return "STEIM 1 Compression";
|
||||
case 11:
|
||||
return "STEIM 2 Compression";
|
||||
case 12:
|
||||
return "GEOSCOPE Muxed 24 bit int";
|
||||
case 13:
|
||||
return "GEOSCOPE Muxed 16/3 bit gain/exp";
|
||||
case 14:
|
||||
return "GEOSCOPE Muxed 16/4 bit gain/exp";
|
||||
case 15:
|
||||
return "US National Network compression";
|
||||
case 16:
|
||||
return "CDSN 16 bit gain ranged";
|
||||
case 17:
|
||||
return "Graefenberg 16 bit gain ranged";
|
||||
case 18:
|
||||
return "IPG - Strasbourg 16 bit gain";
|
||||
case 19:
|
||||
return "STEIM 3 Compression";
|
||||
case 30:
|
||||
return "SRO Gain Ranged Format";
|
||||
case 31:
|
||||
return "HGLP Format";
|
||||
case 32:
|
||||
return "DWWSSN Format";
|
||||
case 33:
|
||||
return "RSTN 16 bit gain ranged";
|
||||
default:
|
||||
return "Unknown format code";
|
||||
} /* end switch */
|
||||
|
||||
} /* End of ms_encodingstr() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_blktdesc():
|
||||
*
|
||||
* Return a string describing a given blockette type or NULL if the
|
||||
* type is unknown.
|
||||
***************************************************************************/
|
||||
char *
|
||||
ms_blktdesc (uint16_t blkttype)
|
||||
{
|
||||
switch (blkttype)
|
||||
{
|
||||
case 100:
|
||||
return "Sample Rate";
|
||||
case 200:
|
||||
return "Generic Event Detection";
|
||||
case 201:
|
||||
return "Murdock Event Detection";
|
||||
case 300:
|
||||
return "Step Calibration";
|
||||
case 310:
|
||||
return "Sine Calibration";
|
||||
case 320:
|
||||
return "Pseudo-random Calibration";
|
||||
case 390:
|
||||
return "Generic Calibration";
|
||||
case 395:
|
||||
return "Calibration Abort";
|
||||
case 400:
|
||||
return "Beam";
|
||||
case 500:
|
||||
return "Timing";
|
||||
case 1000:
|
||||
return "Data Only SEED";
|
||||
case 1001:
|
||||
return "Data Extension";
|
||||
case 2000:
|
||||
return "Opaque Data";
|
||||
} /* end switch */
|
||||
|
||||
return NULL;
|
||||
|
||||
} /* End of ms_blktdesc() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_blktlen():
|
||||
*
|
||||
* Returns the total length of a given blockette type in bytes or 0 if
|
||||
* type unknown.
|
||||
***************************************************************************/
|
||||
uint16_t
|
||||
ms_blktlen (uint16_t blkttype, const char *blkt, flag swapflag)
|
||||
{
|
||||
uint16_t blktlen = 0;
|
||||
|
||||
switch (blkttype)
|
||||
{
|
||||
case 100: /* Sample Rate */
|
||||
blktlen = 12;
|
||||
break;
|
||||
case 200: /* Generic Event Detection */
|
||||
blktlen = 28;
|
||||
break;
|
||||
case 201: /* Murdock Event Detection */
|
||||
blktlen = 36;
|
||||
break;
|
||||
case 300: /* Step Calibration */
|
||||
blktlen = 32;
|
||||
break;
|
||||
case 310: /* Sine Calibration */
|
||||
blktlen = 32;
|
||||
break;
|
||||
case 320: /* Pseudo-random Calibration */
|
||||
blktlen = 28;
|
||||
break;
|
||||
case 390: /* Generic Calibration */
|
||||
blktlen = 28;
|
||||
break;
|
||||
case 395: /* Calibration Abort */
|
||||
blktlen = 16;
|
||||
break;
|
||||
case 400: /* Beam */
|
||||
blktlen = 16;
|
||||
break;
|
||||
case 500: /* Timing */
|
||||
blktlen = 8;
|
||||
break;
|
||||
case 1000: /* Data Only SEED */
|
||||
blktlen = 8;
|
||||
break;
|
||||
case 1001: /* Data Extension */
|
||||
blktlen = 8;
|
||||
break;
|
||||
case 2000: /* Opaque Data */
|
||||
/* First 2-byte field after the blockette header is the length */
|
||||
if ( blkt )
|
||||
{
|
||||
memcpy ((void *) &blktlen, blkt+4, sizeof (int16_t));
|
||||
if ( swapflag ) ms_gswap2 (&blktlen);
|
||||
}
|
||||
break;
|
||||
} /* end switch */
|
||||
|
||||
return blktlen;
|
||||
|
||||
} /* End of ms_blktlen() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_errorstr():
|
||||
*
|
||||
* Return a string describing a given libmseed error code or NULL if the
|
||||
* code is unknown.
|
||||
***************************************************************************/
|
||||
char *
|
||||
ms_errorstr (int errorcode)
|
||||
{
|
||||
switch (errorcode)
|
||||
{
|
||||
case MS_ENDOFFILE:
|
||||
return "End of file reached";
|
||||
case MS_NOERROR:
|
||||
return "No error";
|
||||
case MS_GENERROR:
|
||||
return "Generic error";
|
||||
case MS_NOTSEED:
|
||||
return "No SEED data detected";
|
||||
case MS_WRONGLENGTH:
|
||||
return "Length of data read does not match record length";
|
||||
case MS_OUTOFRANGE:
|
||||
return "SEED record length out of range";
|
||||
case MS_UNKNOWNFORMAT:
|
||||
return "Unknown data encoding format";
|
||||
case MS_STBADCOMPFLAG:
|
||||
return "Bad Steim compression flag(s) detected";
|
||||
} /* end switch */
|
||||
|
||||
return NULL;
|
||||
|
||||
} /* End of ms_blktdesc() */
|
1179
libs/3rd-party/mseed/msrutils.c
vendored
Normal file
1179
libs/3rd-party/mseed/msrutils.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1065
libs/3rd-party/mseed/pack.c
vendored
Normal file
1065
libs/3rd-party/mseed/pack.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
699
libs/3rd-party/mseed/packdata.c
vendored
Normal file
699
libs/3rd-party/mseed/packdata.c
vendored
Normal file
@ -0,0 +1,699 @@
|
||||
/***********************************************************************
|
||||
* Routines for packing INT_32, INT_16, FLOAT_32, FLOAT_64,
|
||||
* STEIM1 and STEIM2 data records.
|
||||
*
|
||||
* Douglas Neuhauser
|
||||
* Seismological Laboratory
|
||||
* University of California, Berkeley
|
||||
* doug@seismo.berkeley.edu
|
||||
*
|
||||
*
|
||||
* modified Aug 2008:
|
||||
* - Optimize Steim 1 & 2 packing routines using small, re-used buffers.
|
||||
*
|
||||
* modified Sep 2004:
|
||||
* - Reworked and cleaned routines for use within libmseed.
|
||||
* - Added float32 and float64 packing routines.
|
||||
*
|
||||
* Modified by Chad Trabant, IRIS Data Management Center
|
||||
*
|
||||
* modified: 2009.111
|
||||
************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996-2004 The Regents of the University of California.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for educational, research and non-profit purposes,
|
||||
* without fee, and without a written agreement is hereby granted,
|
||||
* provided that the above copyright notice, this paragraph and the
|
||||
* following three paragraphs appear in all copies.
|
||||
*
|
||||
* Permission to incorporate this software into commercial products may
|
||||
* be obtained from the Office of Technology Licensing, 2150 Shattuck
|
||||
* Avenue, Suite 510, Berkeley, CA 94704.
|
||||
*
|
||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
|
||||
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
* INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
|
||||
* ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
|
||||
* PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
|
||||
* CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
|
||||
* UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <memory.h>
|
||||
|
||||
#include "libmseed.h"
|
||||
#include "packdata.h"
|
||||
|
||||
static int pad_steim_frame (DFRAMES*, int, int, int, int, int);
|
||||
|
||||
#define EMPTY_BLOCK(fn,wn) (fn+wn == 0)
|
||||
|
||||
#define X0 dframes->f[0].w[0].fw
|
||||
#define XN dframes->f[0].w[1].fw
|
||||
|
||||
#define BIT4PACK(i,points_remaining) \
|
||||
(points_remaining >= 7 && \
|
||||
(minbits[i] <= 4) && (minbits[i+1] <= 4) && \
|
||||
(minbits[i+2] <= 4) && (minbits[i+3] <= 4) && \
|
||||
(minbits[i+4] <= 4) && (minbits[i+5] <= 4) && \
|
||||
(minbits[i+6] <= 4))
|
||||
|
||||
#define BIT5PACK(i,points_remaining) \
|
||||
(points_remaining >= 6 && \
|
||||
(minbits[i] <= 5) && (minbits[i+1] <= 5) && \
|
||||
(minbits[i+2] <= 5) && (minbits[i+3] <= 5) && \
|
||||
(minbits[i+4] <= 5) && (minbits[i+5] <= 5))
|
||||
|
||||
#define BIT6PACK(i,points_remaining) \
|
||||
(points_remaining >= 5 && \
|
||||
(minbits[i] <= 6) && (minbits[i+1] <= 6) && \
|
||||
(minbits[i+2] <= 6) && (minbits[i+3] <= 6) && \
|
||||
(minbits[i+4] <= 6))
|
||||
|
||||
#define BYTEPACK(i,points_remaining) \
|
||||
(points_remaining >= 4 && \
|
||||
(minbits[i] <= 8) && (minbits[i+1] <= 8) && \
|
||||
(minbits[i+2] <= 8) && (minbits[i+3] <= 8))
|
||||
|
||||
#define BIT10PACK(i,points_remaining) \
|
||||
(points_remaining >= 3 && \
|
||||
(minbits[i] <= 10) && (minbits[i+1] <= 10) && \
|
||||
(minbits[i+2] <= 10))
|
||||
|
||||
#define BIT15PACK(i,points_remaining) \
|
||||
(points_remaining >= 2 && \
|
||||
(minbits[i] <= 15) && (minbits[i+1] <= 15))
|
||||
|
||||
#define HALFPACK(i,points_remaining) \
|
||||
(points_remaining >= 2 && (minbits[i] <= 16) && (minbits[i+1] <= 16))
|
||||
|
||||
#define BIT30PACK(i,points_remaining) \
|
||||
(points_remaining >= 1 && \
|
||||
(minbits[i] <= 30))
|
||||
|
||||
#define MINBITS(diff,minbits) \
|
||||
if (diff >= -8 && diff < 8) minbits = 4; \
|
||||
else if (diff >= -16 && diff < 16) minbits = 5; \
|
||||
else if (diff >= -32 && diff < 32) minbits = 6; \
|
||||
else if (diff >= -128 && diff < 128) minbits = 8; \
|
||||
else if (diff >= -512 && diff < 512) minbits = 10; \
|
||||
else if (diff >= -16384 && diff < 16384) minbits = 15; \
|
||||
else if (diff >= -32768 && diff < 32768) minbits = 16; \
|
||||
else if (diff >= -536870912 && diff < 536870912) minbits = 30; \
|
||||
else minbits = 32;
|
||||
|
||||
#define PACK(bits,n,m1,m2) { \
|
||||
int i = 0; \
|
||||
unsigned int val = 0; \
|
||||
for (i=0;i<n;i++) { \
|
||||
val = (val<<bits) | (diff[i]&m1); \
|
||||
} \
|
||||
val |= ((unsigned int)m2 << 30); \
|
||||
dframes->f[fn].w[wn].fw = val; }
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_int_16: *
|
||||
* Pack integer data into INT_16 format. *
|
||||
* Return: 0 on success, -1 on failure. *
|
||||
************************************************************************/
|
||||
int msr_pack_int_16
|
||||
(int16_t *packed, /* output data array - packed */
|
||||
int32_t *data, /* input data array */
|
||||
int ns, /* desired number of samples to pack */
|
||||
int max_bytes, /* max # of bytes for output buffer */
|
||||
int pad, /* flag to specify padding to max_bytes */
|
||||
int *pnbytes, /* number of bytes actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns; /* number of samples remaining to pack */
|
||||
int i = 0;
|
||||
|
||||
while (points_remaining > 0 && max_bytes >= 2)
|
||||
{ /* Pack the next available data into INT_16 format */
|
||||
if ( data[i] < -32768 || data[i] > 32767 )
|
||||
ms_log (2, "msr_pack_int_16(%s): input sample out of range: %d\n",
|
||||
PACK_SRCNAME, data[i]);
|
||||
|
||||
*packed = data[i];
|
||||
if ( swapflag ) ms_gswap2 (packed);
|
||||
|
||||
packed++;
|
||||
max_bytes -= 2;
|
||||
points_remaining--;
|
||||
i++;
|
||||
}
|
||||
|
||||
*pnbytes = (ns - points_remaining) * 2;
|
||||
|
||||
/* Pad miniSEED block if necessary */
|
||||
if (pad)
|
||||
{
|
||||
memset ((void *)packed, 0, max_bytes);
|
||||
*pnbytes += max_bytes;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_int_32: *
|
||||
* Pack integer data into INT_32 format. *
|
||||
* Return: 0 on success, -1 on failure. *
|
||||
************************************************************************/
|
||||
int msr_pack_int_32
|
||||
(int32_t *packed, /* output data array - packed */
|
||||
int32_t *data, /* input data array - unpacked */
|
||||
int ns, /* desired number of samples to pack */
|
||||
int max_bytes, /* max # of bytes for output buffer */
|
||||
int pad, /* flag to specify padding to max_bytes */
|
||||
int *pnbytes, /* number of bytes actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns; /* number of samples remaining to pack */
|
||||
int i = 0;
|
||||
|
||||
while (points_remaining > 0 && max_bytes >= 4)
|
||||
{ /* Pack the next available data into INT_32 format */
|
||||
*packed = data[i];
|
||||
if ( swapflag ) ms_gswap4 (packed);
|
||||
|
||||
packed++;
|
||||
max_bytes -= 4;
|
||||
points_remaining--;
|
||||
i++;
|
||||
}
|
||||
|
||||
*pnbytes = (ns - points_remaining) * 4;
|
||||
|
||||
/* Pad miniSEED block if necessary */
|
||||
if (pad)
|
||||
{
|
||||
memset ((void *)packed, 0, max_bytes);
|
||||
*pnbytes += max_bytes;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_float_32: *
|
||||
* Pack float data into FLOAT32 format. *
|
||||
* Return: 0 on success, -1 on error. *
|
||||
************************************************************************/
|
||||
int msr_pack_float_32
|
||||
(float *packed, /* output data array - packed */
|
||||
float *data, /* input data array - unpacked */
|
||||
int ns, /* desired number of samples to pack */
|
||||
int max_bytes, /* max # of bytes for output buffer */
|
||||
int pad, /* flag to specify padding to max_bytes */
|
||||
int *pnbytes, /* number of bytes actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns; /* number of samples remaining to pack */
|
||||
int i = 0;
|
||||
|
||||
while (points_remaining > 0 && max_bytes >= 4)
|
||||
{
|
||||
*packed = data[i];
|
||||
if ( swapflag ) ms_gswap4 (packed);
|
||||
|
||||
packed++;
|
||||
max_bytes -= 4;
|
||||
points_remaining--;
|
||||
i++;
|
||||
}
|
||||
|
||||
*pnbytes = (ns - points_remaining) * 4;
|
||||
|
||||
/* Pad miniSEED block if necessary */
|
||||
if (pad)
|
||||
{
|
||||
memset ((void *)packed, 0, max_bytes);
|
||||
*pnbytes += max_bytes;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_float_64: *
|
||||
* Pack double data into FLOAT64 format. *
|
||||
* Return: 0 on success, -1 on error. *
|
||||
************************************************************************/
|
||||
int msr_pack_float_64
|
||||
(double *packed, /* output data array - packed */
|
||||
double *data, /* input data array - unpacked */
|
||||
int ns, /* desired number of samples to pack */
|
||||
int max_bytes, /* max # of bytes for output buffer */
|
||||
int pad, /* flag to specify padding to max_bytes */
|
||||
int *pnbytes, /* number of bytes actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns; /* number of samples remaining to pack */
|
||||
int i = 0;
|
||||
|
||||
while (points_remaining > 0 && max_bytes >= 8)
|
||||
{
|
||||
*packed = data[i];
|
||||
if ( swapflag ) ms_gswap8 (packed);
|
||||
|
||||
packed++;
|
||||
max_bytes -= 8;
|
||||
points_remaining--;
|
||||
i++;
|
||||
}
|
||||
|
||||
*pnbytes = (ns - points_remaining) * 8;
|
||||
|
||||
/* Pad miniSEED block if necessary */
|
||||
if (pad)
|
||||
{
|
||||
memset ((void *)packed, 0, max_bytes);
|
||||
*pnbytes += max_bytes;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_steim1: *
|
||||
* Pack data into STEIM1 data frames. *
|
||||
* return: *
|
||||
* 0 on success. *
|
||||
* -1 on error. *
|
||||
************************************************************************/
|
||||
int msr_pack_steim1
|
||||
(DFRAMES *dframes, /* ptr to data frames */
|
||||
int32_t *data, /* ptr to unpacked data array */
|
||||
int32_t d0, /* first difference value */
|
||||
int ns, /* number of samples to pack */
|
||||
int nf, /* total number of data frames */
|
||||
int pad, /* flag to specify padding to nf */
|
||||
int *pnframes, /* number of frames actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns;
|
||||
int points_packed = 0;
|
||||
int32_t diff[4]; /* array of differences */
|
||||
uint8_t minbits[4]; /* array of minimum bits for diffs */
|
||||
int i, j;
|
||||
int mask;
|
||||
int ipt = 0; /* index of initial data to pack. */
|
||||
int fn = 0; /* index of initial frame to pack. */
|
||||
int wn = 2; /* index of initial word to pack. */
|
||||
int32_t itmp;
|
||||
int16_t stmp;
|
||||
|
||||
/* Calculate initial difference and minbits buffers */
|
||||
diff[0] = d0;
|
||||
MINBITS(diff[0],minbits[0]);
|
||||
for (i=1; i < 4 && i < ns; i++)
|
||||
{
|
||||
diff[i] = data[i] - data[i-1];
|
||||
MINBITS(diff[i],minbits[i]);
|
||||
}
|
||||
|
||||
dframes->f[fn].ctrl = 0;
|
||||
|
||||
/* Set X0 and XN values in first frame */
|
||||
X0 = data[0];
|
||||
if ( swapflag ) ms_gswap4 (&X0);
|
||||
dframes->f[0].ctrl = (dframes->f[0].ctrl<<2) | STEIM1_SPECIAL_MASK;
|
||||
XN = data[ns-1];
|
||||
if ( swapflag ) ms_gswap4 (&XN);
|
||||
dframes->f[0].ctrl = (dframes->f[0].ctrl<<2) | STEIM1_SPECIAL_MASK;
|
||||
|
||||
while (points_remaining > 0)
|
||||
{
|
||||
points_packed = 0;
|
||||
|
||||
/* Pack the next available data into the most compact form */
|
||||
if (BYTEPACK(0,points_remaining))
|
||||
{
|
||||
mask = STEIM1_BYTE_MASK;
|
||||
for (j=0; j<4; j++) { dframes->f[fn].w[wn].byte[j] = diff[j]; }
|
||||
points_packed = 4;
|
||||
}
|
||||
else if (HALFPACK(0,points_remaining))
|
||||
{
|
||||
mask = STEIM1_HALFWORD_MASK;
|
||||
for (j=0; j<2; j++)
|
||||
{
|
||||
stmp = diff[j];
|
||||
if ( swapflag ) ms_gswap2 (&stmp);
|
||||
dframes->f[fn].w[wn].hw[j] = stmp;
|
||||
}
|
||||
points_packed = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
mask = STEIM1_FULLWORD_MASK;
|
||||
itmp = diff[0];
|
||||
if ( swapflag ) ms_gswap4 (&itmp);
|
||||
dframes->f[fn].w[wn].fw = itmp;
|
||||
points_packed = 1;
|
||||
}
|
||||
|
||||
/* Append mask for this word to current mask */
|
||||
dframes->f[fn].ctrl = (dframes->f[fn].ctrl<<2) | mask;
|
||||
|
||||
points_remaining -= points_packed;
|
||||
ipt += points_packed;
|
||||
|
||||
/* Check for full frame or full block */
|
||||
if (++wn >= VALS_PER_FRAME)
|
||||
{
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].ctrl);
|
||||
/* Reset output index to beginning of frame */
|
||||
wn = 0;
|
||||
/* If block is full, output block and reinitialize */
|
||||
if (++fn >= nf) break;
|
||||
dframes->f[fn].ctrl = 0;
|
||||
}
|
||||
|
||||
/* Shift and re-fill difference and minbits buffers */
|
||||
for ( i=points_packed; i < 4; i++ )
|
||||
{
|
||||
/* Shift remaining buffer entries */
|
||||
diff[i-points_packed] = diff[i];
|
||||
minbits[i-points_packed] = minbits[i];
|
||||
}
|
||||
for ( i=4-points_packed,j=ipt+(4-points_packed); i < 4 && j < ns; i++,j++ )
|
||||
{
|
||||
/* Re-fill entries */
|
||||
diff[i] = data[j] - data[j-1];
|
||||
MINBITS(diff[i],minbits[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update XN value in first frame */
|
||||
XN = data[(ns-1)-points_remaining];
|
||||
if ( swapflag ) ms_gswap4 (&XN);
|
||||
|
||||
/* End of data. Pad current frame and optionally rest of block */
|
||||
/* Do not pad and output a completely empty block */
|
||||
if ( ! EMPTY_BLOCK(fn,wn) )
|
||||
{
|
||||
*pnframes = pad_steim_frame (dframes, fn, wn, nf, swapflag, pad);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pnframes = 0;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_steim2: *
|
||||
* Pack data into STEIM1 data frames. *
|
||||
* return: *
|
||||
* 0 on success. *
|
||||
* -1 on error. *
|
||||
************************************************************************/
|
||||
int msr_pack_steim2
|
||||
(DFRAMES *dframes, /* ptr to data frames */
|
||||
int32_t *data, /* ptr to unpacked data array */
|
||||
int32_t d0, /* first difference value */
|
||||
int ns, /* number of samples to pack */
|
||||
int nf, /* total number of data frames to pack */
|
||||
int pad, /* flag to specify padding to nf */
|
||||
int *pnframes, /* number of frames actually packed */
|
||||
int *pnsamples, /* number of samples actually packed */
|
||||
int swapflag) /* if data should be swapped */
|
||||
{
|
||||
int points_remaining = ns;
|
||||
int points_packed = 0;
|
||||
int32_t diff[7]; /* array of differences */
|
||||
uint8_t minbits[7]; /* array of minimum bits for diffs */
|
||||
int i, j;
|
||||
int mask;
|
||||
int ipt = 0; /* index of initial data to pack. */
|
||||
int fn = 0; /* index of initial frame to pack. */
|
||||
int wn = 2; /* index of initial word to pack. */
|
||||
|
||||
/* Calculate initial difference and minbits buffers */
|
||||
diff[0] = d0;
|
||||
MINBITS(diff[0],minbits[0]);
|
||||
for (i=1; i < 7 && i < ns; i++)
|
||||
{
|
||||
diff[i] = data[i] - data[i-1];
|
||||
MINBITS(diff[i],minbits[i]);
|
||||
}
|
||||
|
||||
dframes->f[fn].ctrl = 0;
|
||||
|
||||
/* Set X0 and XN values in first frame */
|
||||
X0 = data[0];
|
||||
if ( swapflag ) ms_gswap4 (&X0);
|
||||
dframes->f[0].ctrl = (dframes->f[0].ctrl<<2) | STEIM2_SPECIAL_MASK;
|
||||
XN = data[ns-1];
|
||||
if ( swapflag ) ms_gswap4 (&XN);
|
||||
dframes->f[0].ctrl = (dframes->f[0].ctrl<<2) | STEIM2_SPECIAL_MASK;
|
||||
|
||||
while (points_remaining > 0)
|
||||
{
|
||||
points_packed = 0;
|
||||
|
||||
/* Pack the next available datapoints into the most compact form */
|
||||
if (BIT4PACK(0,points_remaining))
|
||||
{
|
||||
PACK(4,7,0x0000000f,02)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_567_MASK;
|
||||
points_packed = 7;
|
||||
}
|
||||
else if (BIT5PACK(0,points_remaining))
|
||||
{
|
||||
PACK(5,6,0x0000001f,01)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_567_MASK;
|
||||
points_packed = 6;
|
||||
}
|
||||
else if (BIT6PACK(0,points_remaining))
|
||||
{
|
||||
PACK(6,5,0x0000003f,00)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_567_MASK;
|
||||
points_packed = 5;
|
||||
}
|
||||
else if (BYTEPACK(0,points_remaining))
|
||||
{
|
||||
mask = STEIM2_BYTE_MASK;
|
||||
for (j=0; j<4; j++) dframes->f[fn].w[wn].byte[j] = diff[j];
|
||||
points_packed = 4;
|
||||
}
|
||||
else if (BIT10PACK(0,points_remaining))
|
||||
{
|
||||
PACK(10,3,0x000003ff,03)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_123_MASK;
|
||||
points_packed = 3;
|
||||
}
|
||||
else if (BIT15PACK(0,points_remaining))
|
||||
{
|
||||
PACK(15,2,0x00007fff,02)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_123_MASK;
|
||||
points_packed = 2;
|
||||
}
|
||||
else if (BIT30PACK(0,points_remaining))
|
||||
{
|
||||
PACK(30,1,0x3fffffff,01)
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].w[wn].fw);
|
||||
mask = STEIM2_123_MASK;
|
||||
points_packed = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_log (2, "msr_pack_steim2(%s): Unable to represent difference in <= 30 bits\n",
|
||||
PACK_SRCNAME);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Append mask for this word to current mask */
|
||||
dframes->f[fn].ctrl = (dframes->f[fn].ctrl<<2) | mask;
|
||||
|
||||
points_remaining -= points_packed;
|
||||
ipt += points_packed;
|
||||
|
||||
/* Check for full frame or full block */
|
||||
if (++wn >= VALS_PER_FRAME)
|
||||
{
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].ctrl);
|
||||
/* Reset output index to beginning of frame */
|
||||
wn = 0;
|
||||
/* If block is full, output block and reinitialize */
|
||||
if (++fn >= nf) break;
|
||||
dframes->f[fn].ctrl = 0;
|
||||
}
|
||||
|
||||
/* Shift and re-fill difference and minbits buffers */
|
||||
for ( i=points_packed; i < 7; i++ )
|
||||
{
|
||||
/* Shift remaining buffer entries */
|
||||
diff[i-points_packed] = diff[i];
|
||||
minbits[i-points_packed] = minbits[i];
|
||||
}
|
||||
for ( i=7-points_packed,j=ipt+(7-points_packed); i < 7 && j < ns; i++,j++ )
|
||||
{
|
||||
/* Re-fill entries */
|
||||
diff[i] = data[j] - data[j-1];
|
||||
MINBITS(diff[i],minbits[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update XN value in first frame */
|
||||
XN = data[(ns-1)-points_remaining];
|
||||
if ( swapflag ) ms_gswap4 (&XN);
|
||||
|
||||
/* End of data. Pad current frame and optionally rest of block */
|
||||
/* Do not pad and output a completely empty block */
|
||||
if ( ! EMPTY_BLOCK(fn,wn) )
|
||||
{
|
||||
*pnframes = pad_steim_frame (dframes, fn, wn, nf, swapflag, pad);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pnframes = 0;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* pad_steim_frame: *
|
||||
* Pad the rest of the data record with null values, *
|
||||
* and optionally the rest of the total number of frames. *
|
||||
* return: *
|
||||
* total number of frames in record. *
|
||||
************************************************************************/
|
||||
static int pad_steim_frame
|
||||
(DFRAMES *dframes,
|
||||
int fn, /* current frame number. */
|
||||
int wn, /* current work number. */
|
||||
int nf, /* total number of data frames. */
|
||||
int swapflag, /* flag to swap byte order of data. */
|
||||
int pad) /* flag to pad # frames to nf. */
|
||||
{
|
||||
/* Finish off the current frame */
|
||||
if (wn < VALS_PER_FRAME && fn < nf)
|
||||
{
|
||||
for (; wn < VALS_PER_FRAME; wn++)
|
||||
{
|
||||
dframes->f[fn].w[wn].fw = 0;
|
||||
dframes->f[fn].ctrl = (dframes->f[fn].ctrl<<2) | STEIM1_SPECIAL_MASK;
|
||||
}
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].ctrl);
|
||||
fn++;
|
||||
}
|
||||
|
||||
/* Fill the remaining frames in the block */
|
||||
if (pad)
|
||||
{
|
||||
for (; fn<nf; fn++)
|
||||
{
|
||||
dframes->f[fn].ctrl = STEIM1_SPECIAL_MASK; /* mask for ctrl */
|
||||
for (wn=0; wn<VALS_PER_FRAME; wn++)
|
||||
{
|
||||
dframes->f[fn].w[wn].fw = 0;
|
||||
dframes->f[fn].ctrl = (dframes->f[fn].ctrl<<2) | STEIM1_SPECIAL_MASK;
|
||||
}
|
||||
|
||||
if ( swapflag ) ms_gswap4 (&dframes->f[fn].ctrl);
|
||||
}
|
||||
}
|
||||
|
||||
return fn;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_pack_text: *
|
||||
* Pack text data into text format. Split input data on line *
|
||||
* breaks so as to not split lines between records. *
|
||||
* Return: 0 on success, -1 on error. *
|
||||
************************************************************************/
|
||||
int msr_pack_text
|
||||
(char *packed, /* output data array - packed. */
|
||||
char *data, /* input data array - unpacked. */
|
||||
int ns, /* desired number of samples to pack. */
|
||||
int max_bytes, /* max # of bytes for output buffer. */
|
||||
int pad, /* flag to specify padding to max_bytes.*/
|
||||
int *pnbytes, /* number of bytes actually packed. */
|
||||
int *pnsamples) /* number of samples actually packed. */
|
||||
{
|
||||
int points_remaining = ns; /* number of samples remaining to pack. */
|
||||
int last = -1;
|
||||
int nbytes;
|
||||
int i;
|
||||
|
||||
/* Split lines only if a single line will not fit in 1 record */
|
||||
if (points_remaining > max_bytes)
|
||||
{
|
||||
/* Look for the last newline that will fit in output buffer */
|
||||
for (i=max_bytes-1; i>=0; i--)
|
||||
{
|
||||
if (data[i] == '\n') {
|
||||
last = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (last < 0) last = max_bytes - 1;
|
||||
}
|
||||
|
||||
if (last < 0) last = points_remaining - 1;
|
||||
nbytes = last + 1;
|
||||
memcpy (packed, data, nbytes);
|
||||
packed += nbytes;
|
||||
max_bytes -= nbytes;
|
||||
*pnbytes = nbytes;
|
||||
*pnsamples = nbytes;
|
||||
points_remaining -= nbytes;
|
||||
|
||||
/* Pad miniSEED block if necessary */
|
||||
if (pad)
|
||||
{
|
||||
memset ((void *)packed, 0, max_bytes);
|
||||
*pnbytes += max_bytes;
|
||||
}
|
||||
|
||||
*pnsamples = ns - points_remaining;
|
||||
|
||||
return 0;
|
||||
}
|
35
libs/3rd-party/mseed/packdata.h
vendored
Normal file
35
libs/3rd-party/mseed/packdata.h
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
/***************************************************************************
|
||||
* packdata.h:
|
||||
*
|
||||
* Interface declarations for the Mini-SEED packing routines in
|
||||
* packdata.c
|
||||
*
|
||||
* modified: 2008.220
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef PACKDATA_H
|
||||
#define PACKDATA_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "steimdata.h"
|
||||
|
||||
/* Pointer to srcname of record being packed, declared in pack.c */
|
||||
extern char *PACK_SRCNAME;
|
||||
|
||||
extern int msr_pack_int_16 (int16_t*, int32_t*, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_int_32 (int32_t*, int32_t*, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_float_32 (float*, float*, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_float_64 (double*, double*, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_steim1 (DFRAMES*, int32_t*, int32_t, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_steim2 (DFRAMES*, int32_t*, int32_t, int, int, int, int*, int*, int);
|
||||
extern int msr_pack_text (char *, char *, int, int, int, int*, int*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
1163
libs/3rd-party/mseed/parseutils.c
vendored
Normal file
1163
libs/3rd-party/mseed/parseutils.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
680
libs/3rd-party/mseed/selection.c
vendored
Normal file
680
libs/3rd-party/mseed/selection.c
vendored
Normal file
@ -0,0 +1,680 @@
|
||||
/***************************************************************************
|
||||
* selection.c:
|
||||
*
|
||||
* Generic routines to manage selection lists.
|
||||
*
|
||||
* Written by Chad Trabant unless otherwise noted
|
||||
* IRIS Data Management Center
|
||||
*
|
||||
* modified: 2014.197
|
||||
***************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "libmseed.h"
|
||||
|
||||
static int ms_globmatch (char *string, char *pattern);
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_matchselect:
|
||||
*
|
||||
* Test the specified parameters for a matching selection entry. The
|
||||
* srcname parameter may contain globbing characters. The NULL value
|
||||
* (matching any times) for the start and end times is HPTERROR.
|
||||
*
|
||||
* Return Selections pointer to matching entry on successful match and
|
||||
* NULL for no match or error.
|
||||
***************************************************************************/
|
||||
Selections *
|
||||
ms_matchselect (Selections *selections, char *srcname, hptime_t starttime,
|
||||
hptime_t endtime, SelectTime **ppselecttime)
|
||||
{
|
||||
Selections *findsl = NULL;
|
||||
SelectTime *findst = NULL;
|
||||
SelectTime *matchst = NULL;
|
||||
|
||||
if ( selections )
|
||||
{
|
||||
findsl = selections;
|
||||
while ( findsl )
|
||||
{
|
||||
if ( ms_globmatch (srcname, findsl->srcname) )
|
||||
{
|
||||
findst = findsl->timewindows;
|
||||
while ( findst )
|
||||
{
|
||||
if ( starttime != HPTERROR && findst->starttime != HPTERROR &&
|
||||
(starttime < findst->starttime && ! (starttime <= findst->starttime && endtime >= findst->starttime)) )
|
||||
{ findst = findst->next; continue; }
|
||||
else if ( endtime != HPTERROR && findst->endtime != HPTERROR &&
|
||||
(endtime > findst->endtime && ! (starttime <= findst->endtime && endtime >= findst->endtime)) )
|
||||
{ findst = findst->next; continue; }
|
||||
|
||||
matchst = findst;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( matchst )
|
||||
break;
|
||||
else
|
||||
findsl = findsl->next;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ppselecttime )
|
||||
*ppselecttime = matchst;
|
||||
|
||||
return ( matchst ) ? findsl : NULL;
|
||||
} /* End of ms_matchselect() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* msr_matchselect:
|
||||
*
|
||||
* A simple wrapper for calling ms_matchselect() using details from a
|
||||
* MSRecord struct.
|
||||
*
|
||||
* Return Selections pointer to matching entry on successful match and
|
||||
* NULL for no match or error.
|
||||
***************************************************************************/
|
||||
Selections *
|
||||
msr_matchselect (Selections *selections, MSRecord *msr, SelectTime **ppselecttime)
|
||||
{
|
||||
char srcname[50];
|
||||
hptime_t endtime;
|
||||
|
||||
if ( ! selections || ! msr )
|
||||
return NULL;
|
||||
|
||||
msr_srcname (msr, srcname, 1);
|
||||
endtime = msr_endtime (msr);
|
||||
|
||||
return ms_matchselect (selections, srcname, msr->starttime, endtime,
|
||||
ppselecttime);
|
||||
} /* End of msr_matchselect() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_addselect:
|
||||
*
|
||||
* Add select parameters to a specified selection list. The srcname
|
||||
* argument may contain globbing parameters. The NULL value (matching
|
||||
* any value) for the start and end times is HPTERROR.
|
||||
*
|
||||
* Return 0 on success and -1 on error.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_addselect (Selections **ppselections, char *srcname,
|
||||
hptime_t starttime, hptime_t endtime)
|
||||
{
|
||||
Selections *newsl = NULL;
|
||||
SelectTime *newst = NULL;
|
||||
|
||||
if ( ! ppselections || ! srcname )
|
||||
return -1;
|
||||
|
||||
/* Allocate new SelectTime and populate */
|
||||
if ( ! (newst = (SelectTime *) calloc (1, sizeof(SelectTime))) )
|
||||
{
|
||||
ms_log (2, "Cannot allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
newst->starttime = starttime;
|
||||
newst->endtime = endtime;
|
||||
|
||||
/* Add new Selections struct to begining of list */
|
||||
if ( ! *ppselections )
|
||||
{
|
||||
/* Allocate new Selections and populate */
|
||||
if ( ! (newsl = (Selections *) calloc (1, sizeof(Selections))) )
|
||||
{
|
||||
ms_log (2, "Cannot allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
strncpy (newsl->srcname, srcname, sizeof(newsl->srcname));
|
||||
newsl->srcname[sizeof(newsl->srcname) - 1] = '\0';
|
||||
|
||||
/* Add new Selections struct as first in list */
|
||||
*ppselections = newsl;
|
||||
newsl->timewindows = newst;
|
||||
}
|
||||
else
|
||||
{
|
||||
Selections *findsl = *ppselections;
|
||||
Selections *matchsl = 0;
|
||||
|
||||
/* Search for matching Selectlink entry */
|
||||
while ( findsl )
|
||||
{
|
||||
if ( ! strcmp (findsl->srcname, srcname) )
|
||||
{
|
||||
matchsl = findsl;
|
||||
break;
|
||||
}
|
||||
|
||||
findsl = findsl->next;
|
||||
}
|
||||
|
||||
if ( matchsl )
|
||||
{
|
||||
/* Add time window selection to beginning of window list */
|
||||
newst->next = matchsl->timewindows;
|
||||
matchsl->timewindows = newst;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate new Selections and populate */
|
||||
if ( ! (newsl = (Selections *) calloc (1, sizeof(Selections))) )
|
||||
{
|
||||
ms_log (2, "Cannot allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
strncpy (newsl->srcname, srcname, sizeof(newsl->srcname));
|
||||
newsl->srcname[sizeof(newsl->srcname) - 1] = '\0';
|
||||
|
||||
/* Add new Selections to beginning of list */
|
||||
newsl->next = *ppselections;
|
||||
*ppselections = newsl;
|
||||
newsl->timewindows = newst;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* End of ms_addselect() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_addselect_comp:
|
||||
*
|
||||
* Add select parameters to a specified selection list based on
|
||||
* separate name components. The network, station, location, channel
|
||||
* and quality arguments may contain globbing parameters. The NULL
|
||||
* value (matching any value) for the start and end times is HPTERROR.
|
||||
*
|
||||
* If any of the naming parameters are not supplied (pointer is NULL)
|
||||
* a wildcard for all matches is substituted. As a special case, if
|
||||
* the location ID (loc) is set to "--" to match a space-space/blank
|
||||
* ID it will be translated to an empty string to match libmseed's
|
||||
* notation.
|
||||
*
|
||||
* Return 0 on success and -1 on error.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_addselect_comp (Selections **ppselections, char *net, char* sta, char *loc,
|
||||
char *chan, char *qual, hptime_t starttime, hptime_t endtime)
|
||||
{
|
||||
char srcname[100];
|
||||
char selnet[20];
|
||||
char selsta[20];
|
||||
char selloc[20];
|
||||
char selchan[20];
|
||||
char selqual[20];
|
||||
|
||||
if ( ! ppselections )
|
||||
return -1;
|
||||
|
||||
if ( net )
|
||||
{
|
||||
strncpy (selnet, net, sizeof(selnet));
|
||||
selnet[sizeof(selnet)-1] = '\0';
|
||||
}
|
||||
else
|
||||
strcpy (selnet, "*");
|
||||
|
||||
if ( sta )
|
||||
{
|
||||
strncpy (selsta, sta, sizeof(selsta));
|
||||
selsta[sizeof(selsta)-1] = '\0';
|
||||
}
|
||||
else
|
||||
strcpy (selsta, "*");
|
||||
|
||||
if ( loc )
|
||||
{
|
||||
/* Test for special case blank location ID */
|
||||
if ( ! strcmp (loc, "--") )
|
||||
selloc[0] = '\0';
|
||||
else
|
||||
{
|
||||
strncpy (selloc, loc, sizeof(selloc));
|
||||
selloc[sizeof(selloc)-1] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
strcpy (selloc, "*");
|
||||
|
||||
if ( chan )
|
||||
{
|
||||
strncpy (selchan, chan, sizeof(selchan));
|
||||
selchan[sizeof(selchan)-1] = '\0';
|
||||
}
|
||||
else
|
||||
strcpy (selchan, "*");
|
||||
|
||||
if ( qual )
|
||||
{
|
||||
strncpy (selqual, qual, sizeof(selqual));
|
||||
selqual[sizeof(selqual)-1] = '\0';
|
||||
}
|
||||
else
|
||||
strcpy (selqual, "?");
|
||||
|
||||
/* Create the srcname globbing match for this entry */
|
||||
snprintf (srcname, sizeof(srcname), "%s_%s_%s_%s_%s",
|
||||
selnet, selsta, selloc, selchan, selqual);
|
||||
|
||||
/* Add selection to list */
|
||||
if ( ms_addselect (ppselections, srcname, starttime, endtime) )
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
} /* End of ms_addselect_comp() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_readselectionsfile:
|
||||
*
|
||||
* Read a list of data selections from a file and them to the
|
||||
* specified selections list. On errors this routine will leave
|
||||
* allocated memory unreachable (leaked), it is expected that this is
|
||||
* a program failing condition.
|
||||
*
|
||||
* As a special case if the filename is "-", selection lines will be
|
||||
* read from stdin.
|
||||
*
|
||||
* Returns count of selections added on success and -1 on error.
|
||||
***************************************************************************/
|
||||
int
|
||||
ms_readselectionsfile (Selections **ppselections, char *filename)
|
||||
{
|
||||
FILE *fp;
|
||||
hptime_t starttime;
|
||||
hptime_t endtime;
|
||||
char selectline[200];
|
||||
char *selnet;
|
||||
char *selsta;
|
||||
char *selloc;
|
||||
char *selchan;
|
||||
char *selqual;
|
||||
char *selstart;
|
||||
char *selend;
|
||||
char *cp;
|
||||
char next;
|
||||
int selectcount = 0;
|
||||
int linecount = 0;
|
||||
|
||||
if ( ! ppselections || ! filename )
|
||||
return -1;
|
||||
|
||||
if ( strcmp (filename, "-" ) )
|
||||
{
|
||||
if ( ! (fp = fopen(filename, "rb")) )
|
||||
{
|
||||
ms_log (2, "Cannot open file %s: %s\n", filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use stdin as special case */
|
||||
fp = stdin;
|
||||
}
|
||||
|
||||
while ( fgets (selectline, sizeof(selectline)-1, fp) )
|
||||
{
|
||||
selnet = 0;
|
||||
selsta = 0;
|
||||
selloc = 0;
|
||||
selchan = 0;
|
||||
selqual = 0;
|
||||
selstart = 0;
|
||||
selend = 0;
|
||||
|
||||
linecount++;
|
||||
|
||||
/* Guarantee termination */
|
||||
selectline[sizeof(selectline)-1] = '\0';
|
||||
|
||||
/* End string at first newline character if any */
|
||||
if ( (cp = strchr(selectline, '\n')) )
|
||||
*cp = '\0';
|
||||
|
||||
/* Skip empty lines */
|
||||
if ( ! strlen (selectline) )
|
||||
continue;
|
||||
|
||||
/* Skip comment lines */
|
||||
if ( *selectline == '#' )
|
||||
continue;
|
||||
|
||||
/* Parse: identify components of selection and terminate */
|
||||
cp = selectline;
|
||||
next = 1;
|
||||
while ( *cp )
|
||||
{
|
||||
if ( *cp == ' ' || *cp == '\t' ) { *cp = '\0'; next = 1; }
|
||||
else if ( *cp == '#' ) { *cp = '\0'; break; }
|
||||
else if ( next && ! selnet ) { selnet = cp; next = 0; }
|
||||
else if ( next && ! selsta ) { selsta = cp; next = 0; }
|
||||
else if ( next && ! selloc ) { selloc = cp; next = 0; }
|
||||
else if ( next && ! selchan ) { selchan = cp; next = 0; }
|
||||
else if ( next && ! selqual ) { selqual = cp; next = 0; }
|
||||
else if ( next && ! selstart ) { selstart = cp; next = 0; }
|
||||
else if ( next && ! selend ) { selend = cp; next = 0; }
|
||||
else if ( next ) { *cp = '\0'; break; }
|
||||
cp++;
|
||||
}
|
||||
|
||||
/* Skip line if network, station, location and channel are not defined */
|
||||
if ( ! selnet || ! selsta || ! selloc || ! selchan )
|
||||
{
|
||||
ms_log (2, "[%s] Skipping data selection line number %d\n", filename, linecount);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( selstart )
|
||||
{
|
||||
starttime = ms_seedtimestr2hptime (selstart);
|
||||
if ( starttime == HPTERROR )
|
||||
{
|
||||
ms_log (2, "Cannot convert data selection start time (line %d): %s\n", linecount, selstart);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
starttime = HPTERROR;
|
||||
}
|
||||
|
||||
if ( selend )
|
||||
{
|
||||
endtime = ms_seedtimestr2hptime (selend);
|
||||
if ( endtime == HPTERROR )
|
||||
{
|
||||
ms_log (2, "Cannot convert data selection end time (line %d): %s\n", linecount, selend);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
endtime = HPTERROR;
|
||||
}
|
||||
|
||||
/* Add selection to list */
|
||||
if ( ms_addselect_comp (ppselections, selnet, selsta, selloc, selchan, selqual, starttime, endtime) )
|
||||
{
|
||||
ms_log (2, "[%s] Error adding selection on line %d\n", filename, linecount);
|
||||
return -1;
|
||||
}
|
||||
|
||||
selectcount++;
|
||||
}
|
||||
|
||||
if ( fp != stdin )
|
||||
fclose (fp);
|
||||
|
||||
return selectcount;
|
||||
} /* End of ms_readselectionsfile() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_freeselections:
|
||||
*
|
||||
* Free all memory associated with a Selections struct.
|
||||
***************************************************************************/
|
||||
void
|
||||
ms_freeselections ( Selections *selections )
|
||||
{
|
||||
Selections *select;
|
||||
Selections *selectnext;
|
||||
SelectTime *selecttime;
|
||||
SelectTime *selecttimenext;
|
||||
|
||||
if ( selections )
|
||||
{
|
||||
select = selections;
|
||||
|
||||
while ( select )
|
||||
{
|
||||
selectnext = select->next;
|
||||
|
||||
selecttime = select->timewindows;
|
||||
|
||||
while ( selecttime )
|
||||
{
|
||||
selecttimenext = selecttime->next;
|
||||
|
||||
free (selecttime);
|
||||
|
||||
selecttime = selecttimenext;
|
||||
}
|
||||
|
||||
free (select);
|
||||
|
||||
select = selectnext;
|
||||
}
|
||||
}
|
||||
|
||||
} /* End of ms_freeselections() */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ms_printselections:
|
||||
*
|
||||
* Print the selections list using the ms_log() facility.
|
||||
***************************************************************************/
|
||||
void
|
||||
ms_printselections ( Selections *selections )
|
||||
{
|
||||
Selections *select;
|
||||
SelectTime *selecttime;
|
||||
char starttime[50];
|
||||
char endtime[50];
|
||||
|
||||
if ( ! selections )
|
||||
return;
|
||||
|
||||
select = selections;
|
||||
while ( select )
|
||||
{
|
||||
ms_log (0, "Selection: %s\n", select->srcname);
|
||||
|
||||
selecttime = select->timewindows;
|
||||
while ( selecttime )
|
||||
{
|
||||
if ( selecttime->starttime != HPTERROR )
|
||||
ms_hptime2seedtimestr (selecttime->starttime, starttime, 1);
|
||||
else
|
||||
strncpy (starttime, "No start time", sizeof(starttime)-1);
|
||||
|
||||
if ( selecttime->endtime != HPTERROR )
|
||||
ms_hptime2seedtimestr (selecttime->endtime, endtime, 1);
|
||||
else
|
||||
strncpy (endtime, "No end time", sizeof(endtime)-1);
|
||||
|
||||
ms_log (0, " %30s %30s\n", starttime, endtime);
|
||||
|
||||
selecttime = selecttime->next;
|
||||
}
|
||||
|
||||
select = select->next;
|
||||
}
|
||||
} /* End of ms_printselections() */
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* robust glob pattern matcher
|
||||
* ozan s. yigit/dec 1994
|
||||
* public domain
|
||||
*
|
||||
* glob patterns:
|
||||
* * matches zero or more characters
|
||||
* ? matches any single character
|
||||
* [set] matches any character in the set
|
||||
* [^set] matches any character NOT in the set
|
||||
* where a set is a group of characters or ranges. a range
|
||||
* is written as two characters seperated with a hyphen: a-z denotes
|
||||
* all characters between a to z inclusive.
|
||||
* [-set] set matches a literal hypen and any character in the set
|
||||
* []set] matches a literal close bracket and any character in the set
|
||||
*
|
||||
* char matches itself except where char is '*' or '?' or '['
|
||||
* \char matches char, including any pattern character
|
||||
*
|
||||
* examples:
|
||||
* a*c ac abc abbc ...
|
||||
* a?c acc abc aXc ...
|
||||
* a[a-z]c aac abc acc ...
|
||||
* a[-a-z]c a-c aac abc ...
|
||||
*
|
||||
* Revision 1.4 2004/12/26 12:38:00 ct
|
||||
* Changed function name (amatch -> globmatch), variables and
|
||||
* formatting for clarity. Also add matching header globmatch.h.
|
||||
*
|
||||
* Revision 1.3 1995/09/14 23:24:23 oz
|
||||
* removed boring test/main code.
|
||||
*
|
||||
* Revision 1.2 94/12/11 10:38:15 oz
|
||||
* charset code fixed. it is now robust and interprets all
|
||||
* variations of charset [i think] correctly, including [z-a] etc.
|
||||
*
|
||||
* Revision 1.1 94/12/08 12:45:23 oz
|
||||
* Initial revision
|
||||
***********************************************************************/
|
||||
|
||||
#define GLOBMATCH_TRUE 1
|
||||
#define GLOBMATCH_FALSE 0
|
||||
#define GLOBMATCH_NEGATE '^' /* std char set negation char */
|
||||
|
||||
/***********************************************************************
|
||||
* ms_globmatch:
|
||||
*
|
||||
* Check if a string matches a globbing pattern.
|
||||
*
|
||||
* Return 0 if string does not match pattern and non-zero otherwise.
|
||||
**********************************************************************/
|
||||
static int
|
||||
ms_globmatch (char *string, char *pattern)
|
||||
{
|
||||
int negate;
|
||||
int match;
|
||||
int c;
|
||||
|
||||
while ( *pattern )
|
||||
{
|
||||
if ( !*string && *pattern != '*' )
|
||||
return GLOBMATCH_FALSE;
|
||||
|
||||
switch ( c = *pattern++ )
|
||||
{
|
||||
|
||||
case '*':
|
||||
while ( *pattern == '*' )
|
||||
pattern++;
|
||||
|
||||
if ( !*pattern )
|
||||
return GLOBMATCH_TRUE;
|
||||
|
||||
if ( *pattern != '?' && *pattern != '[' && *pattern != '\\' )
|
||||
while ( *string && *pattern != *string )
|
||||
string++;
|
||||
|
||||
while ( *string )
|
||||
{
|
||||
if ( ms_globmatch(string, pattern) )
|
||||
return GLOBMATCH_TRUE;
|
||||
string++;
|
||||
}
|
||||
return GLOBMATCH_FALSE;
|
||||
|
||||
case '?':
|
||||
if ( *string )
|
||||
break;
|
||||
return GLOBMATCH_FALSE;
|
||||
|
||||
/* set specification is inclusive, that is [a-z] is a, z and
|
||||
* everything in between. this means [z-a] may be interpreted
|
||||
* as a set that contains z, a and nothing in between.
|
||||
*/
|
||||
case '[':
|
||||
if ( *pattern != GLOBMATCH_NEGATE )
|
||||
negate = GLOBMATCH_FALSE;
|
||||
else
|
||||
{
|
||||
negate = GLOBMATCH_TRUE;
|
||||
pattern++;
|
||||
}
|
||||
|
||||
match = GLOBMATCH_FALSE;
|
||||
|
||||
while ( !match && (c = *pattern++) )
|
||||
{
|
||||
if ( !*pattern )
|
||||
return GLOBMATCH_FALSE;
|
||||
|
||||
if ( *pattern == '-' ) /* c-c */
|
||||
{
|
||||
if ( !*++pattern )
|
||||
return GLOBMATCH_FALSE;
|
||||
if ( *pattern != ']' )
|
||||
{
|
||||
if ( *string == c || *string == *pattern ||
|
||||
( *string > c && *string < *pattern ) )
|
||||
match = GLOBMATCH_TRUE;
|
||||
}
|
||||
else
|
||||
{ /* c-] */
|
||||
if ( *string >= c )
|
||||
match = GLOBMATCH_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else /* cc or c] */
|
||||
{
|
||||
if ( c == *string )
|
||||
match = GLOBMATCH_TRUE;
|
||||
if ( *pattern != ']' )
|
||||
{
|
||||
if ( *pattern == *string )
|
||||
match = GLOBMATCH_TRUE;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( negate == match )
|
||||
return GLOBMATCH_FALSE;
|
||||
|
||||
/*
|
||||
* if there is a match, skip past the charset and continue on
|
||||
*/
|
||||
while ( *pattern && *pattern != ']' )
|
||||
pattern++;
|
||||
if ( !*pattern++ ) /* oops! */
|
||||
return GLOBMATCH_FALSE;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
if ( *pattern )
|
||||
c = *pattern++;
|
||||
default:
|
||||
if ( c != *string )
|
||||
return GLOBMATCH_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
string++;
|
||||
}
|
||||
|
||||
return !*string;
|
||||
} /* End of ms_globmatch() */
|
51
libs/3rd-party/mseed/steimdata.h
vendored
Normal file
51
libs/3rd-party/mseed/steimdata.h
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
/***************************************************************************
|
||||
* steimdata.h:
|
||||
*
|
||||
* Declarations for Steim compression routines.
|
||||
*
|
||||
* modified: 2004.278
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef STEIMDATA_H
|
||||
#define STEIMDATA_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define STEIM1_FRAME_MAX_SAMPLES 60
|
||||
#define STEIM2_FRAME_MAX_SAMPLES 105
|
||||
|
||||
#define VALS_PER_FRAME 15 /* # of ints for data per frame.*/
|
||||
|
||||
#define STEIM1_SPECIAL_MASK 0
|
||||
#define STEIM1_BYTE_MASK 1
|
||||
#define STEIM1_HALFWORD_MASK 2
|
||||
#define STEIM1_FULLWORD_MASK 3
|
||||
|
||||
#define STEIM2_SPECIAL_MASK 0
|
||||
#define STEIM2_BYTE_MASK 1
|
||||
#define STEIM2_123_MASK 2
|
||||
#define STEIM2_567_MASK 3
|
||||
|
||||
typedef union u_diff { /* union for Steim objects. */
|
||||
int8_t byte[4]; /* 4 1-byte differences. */
|
||||
int16_t hw[2]; /* 2 halfword differences. */
|
||||
int32_t fw; /* 1 fullword difference. */
|
||||
} U_DIFF;
|
||||
|
||||
typedef struct frame { /* frame in a seed data record. */
|
||||
uint32_t ctrl; /* control word for frame. */
|
||||
U_DIFF w[15]; /* compressed data. */
|
||||
} FRAME;
|
||||
|
||||
typedef struct dframes { /* seed data frames. */
|
||||
FRAME f[1]; /* data record header frames. */
|
||||
} DFRAMES;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* STEIMDATA_H */
|
1277
libs/3rd-party/mseed/tracelist.c
vendored
Normal file
1277
libs/3rd-party/mseed/tracelist.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1855
libs/3rd-party/mseed/traceutils.c
vendored
Normal file
1855
libs/3rd-party/mseed/traceutils.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1083
libs/3rd-party/mseed/unpack.c
vendored
Normal file
1083
libs/3rd-party/mseed/unpack.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
892
libs/3rd-party/mseed/unpackdata.c
vendored
Normal file
892
libs/3rd-party/mseed/unpackdata.c
vendored
Normal file
@ -0,0 +1,892 @@
|
||||
/************************************************************************
|
||||
* Routines for unpacking INT_16, INT_32, FLOAT_32, FLOAT_64,
|
||||
* STEIM1, STEIM2, GEOSCOPE (24bit and gain ranged), CDSN, SRO
|
||||
* and DWWSSN encoded data records.
|
||||
*
|
||||
* Some routines originated and were borrowed from qlib2 by:
|
||||
*
|
||||
* Douglas Neuhauser
|
||||
* Seismographic Station
|
||||
* University of California, Berkeley
|
||||
* doug@seismo.berkeley.edu
|
||||
*
|
||||
* Modified by Chad Trabant,
|
||||
* (previously) ORFEUS/EC-Project MEREDIAN
|
||||
* (currently) IRIS Data Management Center
|
||||
*
|
||||
* modified: 2012.357
|
||||
************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 The Regents of the University of California.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for educational, research and non-profit purposes,
|
||||
* without fee, and without a written agreement is hereby granted,
|
||||
* provided that the above copyright notice, this paragraph and the
|
||||
* following three paragraphs appear in all copies.
|
||||
*
|
||||
* Permission to incorporate this software into commercial products may
|
||||
* be obtained from the Office of Technology Licensing, 2150 Shattuck
|
||||
* Avenue, Suite 510, Berkeley, CA 94704.
|
||||
*
|
||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
|
||||
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
||||
* INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
|
||||
* ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
|
||||
* PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
|
||||
* CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
|
||||
* UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <memory.h>
|
||||
|
||||
#include "libmseed.h"
|
||||
#include "unpackdata.h"
|
||||
|
||||
#define MAX12 0x7ff /* maximum 12 bit positive # */
|
||||
#define MAX14 0x1fff /* maximum 14 bit positive # */
|
||||
#define MAX16 0x7fff /* maximum 16 bit positive # */
|
||||
#define MAX24 0x7fffff /* maximum 24 bit positive # */
|
||||
|
||||
/* For Steim encodings */
|
||||
#define X0 pf->w[0].fw
|
||||
#define XN pf->w[1].fw
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_int_16: *
|
||||
* *
|
||||
* Unpack int_16 miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_int_16
|
||||
(int16_t *ibuf, /* ptr to input data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
int16_t stmp;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++) {
|
||||
stmp = ibuf[nd];
|
||||
if ( swapflag ) ms_gswap2a (&stmp);
|
||||
databuff[nd] = stmp;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_int_16() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_int_32: *
|
||||
* *
|
||||
* Unpack int_32 miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_int_32
|
||||
(int32_t *ibuf, /* ptr to input data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
int32_t itmp;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++) {
|
||||
itmp = ibuf[nd];
|
||||
if ( swapflag) ms_gswap4a (&itmp);
|
||||
databuff[nd] = itmp;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_int_32() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_float_32: *
|
||||
* *
|
||||
* Unpack float_32 miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_float_32
|
||||
(float *fbuf, /* ptr to input data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
float *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
float ftmp;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++) {
|
||||
memcpy (&ftmp, &fbuf[nd], sizeof(float));
|
||||
if ( swapflag ) ms_gswap4a (&ftmp);
|
||||
databuff[nd] = ftmp;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_float_32() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_float_64: *
|
||||
* *
|
||||
* Unpack float_64 miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_float_64
|
||||
(double *fbuf, /* ptr to input data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
double *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
double dtmp;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++) {
|
||||
memcpy (&dtmp, &fbuf[nd], sizeof(double));
|
||||
if ( swapflag ) ms_gswap8a (&dtmp);
|
||||
databuff[nd] = dtmp;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_float_64() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_steim1: *
|
||||
* *
|
||||
* Unpack STEIM1 data frames and place in supplied buffer. *
|
||||
* See the SEED format manual for Steim-1 encoding details. *
|
||||
* *
|
||||
* Return: # of samples returned or negative error code. *
|
||||
************************************************************************/
|
||||
int msr_unpack_steim1
|
||||
(FRAME *pf, /* ptr to Steim1 data frames. */
|
||||
int nbytes, /* number of bytes in all data frames. */
|
||||
int num_samples, /* number of data samples in all frames.*/
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int32_t *diffbuff, /* ptr to unpacked diff array. */
|
||||
int32_t *px0, /* return X0, first sample in frame. */
|
||||
int32_t *pxn, /* return XN, last sample in frame. */
|
||||
int swapflag, /* if data should be swapped. */
|
||||
int verbose)
|
||||
{
|
||||
int32_t *diff = diffbuff;
|
||||
int32_t *data = databuff;
|
||||
int32_t *prev;
|
||||
int num_data_frames = nbytes / sizeof(FRAME);
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
int fn; /* current frame number. */
|
||||
int wn; /* current work number in the frame. */
|
||||
int compflag; /* current compression flag. */
|
||||
int nr, i;
|
||||
int32_t last_data;
|
||||
int32_t itmp;
|
||||
int16_t stmp;
|
||||
uint32_t ctrl;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (num_samples == 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
/* Extract forward and reverse integration constants in first frame */
|
||||
*px0 = X0;
|
||||
*pxn = XN;
|
||||
|
||||
if ( swapflag )
|
||||
{
|
||||
ms_gswap4a (px0);
|
||||
ms_gswap4a (pxn);
|
||||
}
|
||||
|
||||
if ( verbose > 2 )
|
||||
ms_log (1, "%s: forward/reverse integration constants:\nX0: %d XN: %d\n",
|
||||
UNPACK_SRCNAME, *px0, *pxn);
|
||||
|
||||
/* Decode compressed data in each frame */
|
||||
for (fn = 0; fn < num_data_frames; fn++)
|
||||
{
|
||||
|
||||
ctrl = pf->ctrl;
|
||||
if ( swapflag ) ms_gswap4a (&ctrl);
|
||||
|
||||
for (wn = 0; wn < VALS_PER_FRAME; wn++)
|
||||
{
|
||||
if (nd >= num_samples) break;
|
||||
|
||||
compflag = (ctrl >> ((VALS_PER_FRAME-wn-1)*2)) & 0x3;
|
||||
|
||||
switch (compflag)
|
||||
{
|
||||
|
||||
case STEIM1_SPECIAL_MASK:
|
||||
/* Headers info -- skip it */
|
||||
break;
|
||||
|
||||
case STEIM1_BYTE_MASK:
|
||||
/* Next 4 bytes are 4 1-byte differences */
|
||||
for (i=0; i < 4 && nd < num_samples; i++, nd++)
|
||||
*diff++ = pf->w[wn].byte[i];
|
||||
break;
|
||||
|
||||
case STEIM1_HALFWORD_MASK:
|
||||
/* Next 4 bytes are 2 2-byte differences */
|
||||
for (i=0; i < 2 && nd < num_samples; i++, nd++)
|
||||
{
|
||||
if ( swapflag )
|
||||
{
|
||||
stmp = pf->w[wn].hw[i];
|
||||
ms_gswap2a (&stmp);
|
||||
*diff++ = stmp;
|
||||
}
|
||||
else *diff++ = pf->w[wn].hw[i];
|
||||
}
|
||||
break;
|
||||
|
||||
case STEIM1_FULLWORD_MASK:
|
||||
/* Next 4 bytes are 1 4-byte difference */
|
||||
if ( swapflag )
|
||||
{
|
||||
itmp = pf->w[wn].fw;
|
||||
ms_gswap4a (&itmp);
|
||||
*diff++ = itmp;
|
||||
}
|
||||
else *diff++ = pf->w[wn].fw;
|
||||
nd++;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Should NEVER get here */
|
||||
ms_log (2, "msr_unpack_steim1(%s): invalid compression flag = %d\n",
|
||||
UNPACK_SRCNAME, compflag);
|
||||
return MS_STBADCOMPFLAG;
|
||||
}
|
||||
}
|
||||
++pf;
|
||||
}
|
||||
|
||||
/* Test if the number of samples implied by the data frames is the
|
||||
* same number indicated in the header.
|
||||
*/
|
||||
if ( nd != num_samples )
|
||||
{
|
||||
ms_log (1, "Warning: msr_unpack_steim1(%s): number of samples indicated in header (%d) does not equal data (%d)\n",
|
||||
UNPACK_SRCNAME, num_samples, nd);
|
||||
}
|
||||
|
||||
/* For now, assume sample count in header to be correct. */
|
||||
/* One way of "trimming" data from a block is simply to reduce */
|
||||
/* the sample count. It is not clear from the documentation */
|
||||
/* whether this is a valid or not, but it appears to be done */
|
||||
/* by other program, so we should not complain about its effect. */
|
||||
|
||||
nr = req_samples;
|
||||
|
||||
/* Compute first value based on last_value from previous buffer. */
|
||||
/* The two should correspond in all cases EXCEPT for the first */
|
||||
/* record for each component (because we don't have a valid xn from */
|
||||
/* a previous record). Although the Steim compression algorithm */
|
||||
/* defines x(-1) as 0 for the first record, this only works for the */
|
||||
/* first record created since coldstart of the datalogger, NOT the */
|
||||
/* first record of an arbitrary starting record. */
|
||||
|
||||
/* In all cases, assume x0 is correct, since we don't have x(-1). */
|
||||
data = databuff;
|
||||
diff = diffbuff;
|
||||
last_data = *px0;
|
||||
if (nr > 0)
|
||||
*data = *px0;
|
||||
|
||||
/* Compute all but first values based on previous value */
|
||||
prev = data - 1;
|
||||
while (--nr > 0 && --nd > 0)
|
||||
last_data = *++data = *++diff + *++prev;
|
||||
|
||||
/* If a short count was requested compute the last sample in order */
|
||||
/* to perform the integrity check comparison */
|
||||
while (--nd > 0)
|
||||
last_data = *++diff + last_data;
|
||||
|
||||
/* Verify that the last value is identical to xn = rev. int. constant */
|
||||
if (last_data != *pxn)
|
||||
{
|
||||
ms_log (1, "%s: Warning: Data integrity check for Steim-1 failed, last_data=%d, xn=%d\n",
|
||||
UNPACK_SRCNAME, last_data, *pxn);
|
||||
}
|
||||
|
||||
return ((req_samples < num_samples) ? req_samples : num_samples);
|
||||
} /* End of msr_unpack_steim1() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_steim2: *
|
||||
* *
|
||||
* Unpack STEIM2 data frames and place in supplied buffer. *
|
||||
* See the SEED format manual for Steim-2 encoding details. *
|
||||
* *
|
||||
* Return: # of samples returned or negative error code. *
|
||||
************************************************************************/
|
||||
int msr_unpack_steim2
|
||||
(FRAME *pf, /* ptr to Steim2 data frames. */
|
||||
int nbytes, /* number of bytes in all data frames. */
|
||||
int num_samples, /* number of data samples in all frames.*/
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int32_t *diffbuff, /* ptr to unpacked diff array. */
|
||||
int32_t *px0, /* return X0, first sample in frame. */
|
||||
int32_t *pxn, /* return XN, last sample in frame. */
|
||||
int swapflag, /* if data should be swapped. */
|
||||
int verbose)
|
||||
{
|
||||
int32_t *diff = diffbuff;
|
||||
int32_t *data = databuff;
|
||||
int32_t *prev;
|
||||
int num_data_frames = nbytes / sizeof(FRAME);
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
int fn; /* current frame number. */
|
||||
int wn; /* current work number in the frame. */
|
||||
int compflag; /* current compression flag. */
|
||||
int nr, i;
|
||||
int n, bits, m1, m2;
|
||||
int32_t last_data;
|
||||
int32_t val;
|
||||
int8_t dnib;
|
||||
uint32_t ctrl;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (num_samples == 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
/* Extract forward and reverse integration constants in first frame.*/
|
||||
*px0 = X0;
|
||||
*pxn = XN;
|
||||
|
||||
if ( swapflag )
|
||||
{
|
||||
ms_gswap4a (px0);
|
||||
ms_gswap4a (pxn);
|
||||
}
|
||||
|
||||
if ( verbose > 2 )
|
||||
ms_log (1, "%s: forward/reverse integration constants: X0: %d XN: %d\n",
|
||||
UNPACK_SRCNAME, *px0, *pxn);
|
||||
|
||||
/* Decode compressed data in each frame */
|
||||
for (fn = 0; fn < num_data_frames; fn++)
|
||||
{
|
||||
|
||||
ctrl = pf->ctrl;
|
||||
if ( swapflag ) ms_gswap4a (&ctrl);
|
||||
|
||||
for (wn = 0; wn < VALS_PER_FRAME; wn++)
|
||||
{
|
||||
if (nd >= num_samples) break;
|
||||
|
||||
compflag = (ctrl >> ((VALS_PER_FRAME-wn-1)*2)) & 0x3;
|
||||
|
||||
switch (compflag)
|
||||
{
|
||||
case STEIM2_SPECIAL_MASK:
|
||||
/* Headers info -- skip it */
|
||||
break;
|
||||
|
||||
case STEIM2_BYTE_MASK:
|
||||
/* Next 4 bytes are 4 1-byte differences */
|
||||
for (i=0; i < 4 && nd < num_samples; i++, nd++)
|
||||
*diff++ = pf->w[wn].byte[i];
|
||||
break;
|
||||
|
||||
case STEIM2_123_MASK:
|
||||
val = pf->w[wn].fw;
|
||||
if ( swapflag ) ms_gswap4a (&val);
|
||||
dnib = val >> 30 & 0x3;
|
||||
switch (dnib)
|
||||
{
|
||||
case 1: /* 1 30-bit difference */
|
||||
bits = 30; n = 1; m1 = 0x3fffffff; m2 = 0x20000000; break;
|
||||
case 2: /* 2 15-bit differences */
|
||||
bits = 15; n = 2; m1 = 0x00007fff; m2 = 0x00004000; break;
|
||||
case 3: /* 3 10-bit differences */
|
||||
bits = 10; n = 3; m1 = 0x000003ff; m2 = 0x00000200; break;
|
||||
default: /* should NEVER get here */
|
||||
ms_log (2, "msr_unpack_steim2(%s): invalid compflag, dnib, fn, wn = %d, %d, %d, %d\n",
|
||||
UNPACK_SRCNAME, compflag, dnib, fn, wn);
|
||||
return MS_STBADCOMPFLAG;
|
||||
}
|
||||
/* Uncompress the differences */
|
||||
for (i=(n-1)*bits; i >= 0 && nd < num_samples; i-=bits, nd++)
|
||||
{
|
||||
*diff = (val >> i) & m1;
|
||||
*diff = (*diff & m2) ? *diff | ~m1 : *diff;
|
||||
diff++;
|
||||
}
|
||||
break;
|
||||
|
||||
case STEIM2_567_MASK:
|
||||
val = pf->w[wn].fw;
|
||||
if ( swapflag ) ms_gswap4a (&val);
|
||||
dnib = val >> 30 & 0x3;
|
||||
switch (dnib)
|
||||
{
|
||||
case 0: /* 5 6-bit differences */
|
||||
bits = 6; n = 5; m1 = 0x0000003f; m2 = 0x00000020; break;
|
||||
case 1: /* 6 5-bit differences */
|
||||
bits = 5; n = 6; m1 = 0x0000001f; m2 = 0x00000010; break;
|
||||
case 2: /* 7 4-bit differences */
|
||||
bits = 4; n = 7; m1 = 0x0000000f; m2 = 0x00000008; break;
|
||||
default:
|
||||
ms_log (2, "msr_unpack_steim2(%s): invalid compflag, dnib, fn, wn = %d, %d, %d, %d\n",
|
||||
UNPACK_SRCNAME, compflag, dnib, fn, wn);
|
||||
return MS_STBADCOMPFLAG;
|
||||
}
|
||||
/* Uncompress the differences */
|
||||
for (i=(n-1)*bits; i >= 0 && nd < num_samples; i-=bits, nd++)
|
||||
{
|
||||
*diff = (val >> i) & m1;
|
||||
*diff = (*diff & m2) ? *diff | ~m1 : *diff;
|
||||
diff++;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Should NEVER get here */
|
||||
ms_log (2, "msr_unpack_steim2(%s): invalid compflag, fn, wn = %d, %d, %d - nsamp: %d\n",
|
||||
UNPACK_SRCNAME, compflag, fn, wn, nd);
|
||||
return MS_STBADCOMPFLAG;
|
||||
}
|
||||
}
|
||||
++pf;
|
||||
}
|
||||
|
||||
/* Test if the number of samples implied by the data frames is the
|
||||
* same number indicated in the header.
|
||||
*/
|
||||
if ( nd != num_samples )
|
||||
{
|
||||
ms_log (1, "Warning: msr_unpack_steim2(%s): number of samples indicated in header (%d) does not equal data (%d)\n",
|
||||
UNPACK_SRCNAME, num_samples, nd);
|
||||
}
|
||||
|
||||
/* For now, assume sample count in header to be correct. */
|
||||
/* One way of "trimming" data from a block is simply to reduce */
|
||||
/* the sample count. It is not clear from the documentation */
|
||||
/* whether this is a valid or not, but it appears to be done */
|
||||
/* by other program, so we should not complain about its effect. */
|
||||
|
||||
nr = req_samples;
|
||||
|
||||
/* Compute first value based on last_value from previous buffer. */
|
||||
/* The two should correspond in all cases EXCEPT for the first */
|
||||
/* record for each component (because we don't have a valid xn from */
|
||||
/* a previous record). Although the Steim compression algorithm */
|
||||
/* defines x(-1) as 0 for the first record, this only works for the */
|
||||
/* first record created since coldstart of the datalogger, NOT the */
|
||||
/* first record of an arbitrary starting record. */
|
||||
|
||||
/* In all cases, assume x0 is correct, since we don't have x(-1). */
|
||||
data = databuff;
|
||||
diff = diffbuff;
|
||||
last_data = *px0;
|
||||
if (nr > 0)
|
||||
*data = *px0;
|
||||
|
||||
/* Compute all but first values based on previous value */
|
||||
prev = data - 1;
|
||||
while (--nr > 0 && --nd > 0)
|
||||
last_data = *++data = *++diff + *++prev;
|
||||
|
||||
/* If a short count was requested compute the last sample in order */
|
||||
/* to perform the integrity check comparison */
|
||||
while (--nd > 0)
|
||||
last_data = *++diff + last_data;
|
||||
|
||||
/* Verify that the last value is identical to xn = rev. int. constant */
|
||||
if (last_data != *pxn)
|
||||
{
|
||||
ms_log (1, "%s: Warning: Data integrity check for Steim-2 failed, last_data=%d, xn=%d\n",
|
||||
UNPACK_SRCNAME, last_data, *pxn);
|
||||
}
|
||||
|
||||
return ((req_samples < num_samples) ? req_samples : num_samples);
|
||||
} /* End of msr_unpack_steim2() */
|
||||
|
||||
|
||||
/* Defines for GEOSCOPE encoding */
|
||||
#define GEOSCOPE_MANTISSA_MASK 0x0fff /* mask for mantissa */
|
||||
#define GEOSCOPE_GAIN3_MASK 0x7000 /* mask for gainrange factor */
|
||||
#define GEOSCOPE_GAIN4_MASK 0xf000 /* mask for gainrange factor */
|
||||
#define GEOSCOPE_SHIFT 12 /* # bits in mantissa */
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_geoscope: *
|
||||
* *
|
||||
* Unpack GEOSCOPE gain ranged data (demultiplexed only) encoded *
|
||||
* miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_geoscope
|
||||
(const char *edata, /* ptr to encoded data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
float *databuff, /* ptr to unpacked data array. */
|
||||
int encoding, /* specific GEOSCOPE encoding type */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int nd = 0; /* # of data points in packet. */
|
||||
int mantissa; /* mantissa from SEED data */
|
||||
int gainrange; /* gain range factor */
|
||||
int exponent; /* total exponent */
|
||||
int k;
|
||||
uint64_t exp2val;
|
||||
int16_t sint;
|
||||
double dsample = 0.0;
|
||||
|
||||
union {
|
||||
uint8_t b[4];
|
||||
uint32_t i;
|
||||
} sample32;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
/* Make sure we recognize this as a GEOSCOPE encoding format */
|
||||
if ( encoding != DE_GEOSCOPE24 &&
|
||||
encoding != DE_GEOSCOPE163 &&
|
||||
encoding != DE_GEOSCOPE164 )
|
||||
{
|
||||
ms_log (2, "msr_unpack_geoscope(%s): unrecognized GEOSCOPE encoding: %d\n",
|
||||
UNPACK_SRCNAME, encoding);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++)
|
||||
{
|
||||
switch (encoding)
|
||||
{
|
||||
case DE_GEOSCOPE24:
|
||||
sample32.i = 0;
|
||||
if ( swapflag )
|
||||
for (k=0; k < 3; k++)
|
||||
sample32.b[2-k] = edata[k];
|
||||
else
|
||||
for (k=0; k < 3; k++)
|
||||
sample32.b[1+k] = edata[k];
|
||||
|
||||
mantissa = sample32.i;
|
||||
|
||||
/* Take 2's complement for mantissa for overflow */
|
||||
if (mantissa > MAX24)
|
||||
mantissa -= 2 * (MAX24 + 1);
|
||||
|
||||
/* Store */
|
||||
dsample = (double) mantissa;
|
||||
|
||||
break;
|
||||
case DE_GEOSCOPE163:
|
||||
memcpy (&sint, edata, sizeof(int16_t));
|
||||
if ( swapflag ) ms_gswap2a(&sint);
|
||||
|
||||
/* Recover mantissa and gain range factor */
|
||||
mantissa = (sint & GEOSCOPE_MANTISSA_MASK);
|
||||
gainrange = (sint & GEOSCOPE_GAIN3_MASK) >> GEOSCOPE_SHIFT;
|
||||
|
||||
/* Exponent is just gainrange for GEOSCOPE */
|
||||
exponent = gainrange;
|
||||
|
||||
/* Calculate sample as mantissa / 2^exponent */
|
||||
exp2val = (uint64_t) 1 << exponent;
|
||||
dsample = ((double) (mantissa-2048)) / exp2val;
|
||||
|
||||
break;
|
||||
case DE_GEOSCOPE164:
|
||||
memcpy (&sint, edata, sizeof(int16_t));
|
||||
if ( swapflag ) ms_gswap2a(&sint);
|
||||
|
||||
/* Recover mantissa and gain range factor */
|
||||
mantissa = (sint & GEOSCOPE_MANTISSA_MASK);
|
||||
gainrange = (sint & GEOSCOPE_GAIN4_MASK) >> GEOSCOPE_SHIFT;
|
||||
|
||||
/* Exponent is just gainrange for GEOSCOPE */
|
||||
exponent = gainrange;
|
||||
|
||||
/* Calculate sample as mantissa / 2^exponent */
|
||||
exp2val = (uint64_t) 1 << exponent;
|
||||
dsample = ((double) (mantissa-2048)) / exp2val;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Save sample in output array */
|
||||
databuff[nd] = (float) dsample;
|
||||
|
||||
/* Increment edata pointer depending on size */
|
||||
switch (encoding)
|
||||
{
|
||||
case DE_GEOSCOPE24:
|
||||
edata += 3;
|
||||
break;
|
||||
case DE_GEOSCOPE163:
|
||||
case DE_GEOSCOPE164:
|
||||
edata += 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_geoscope() */
|
||||
|
||||
|
||||
/* Defines for CDSN encoding */
|
||||
#define CDSN_MANTISSA_MASK 0x3fff /* mask for mantissa */
|
||||
#define CDSN_GAINRANGE_MASK 0xc000 /* mask for gainrange factor */
|
||||
#define CDSN_SHIFT 14 /* # bits in mantissa */
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_cdsn: *
|
||||
* *
|
||||
* Unpack CDSN gain ranged data encoded miniSEED data and place in *
|
||||
* supplied buffer. *
|
||||
* *
|
||||
* Notes from original rdseed routine: *
|
||||
* CDSN data are compressed according to the formula *
|
||||
* *
|
||||
* sample = M * (2 exp G) *
|
||||
* *
|
||||
* where *
|
||||
* sample = seismic data sample *
|
||||
* M = mantissa; biased mantissa B is written to tape *
|
||||
* G = exponent of multiplier (i.e. gain range factor); *
|
||||
* key K is written to tape *
|
||||
* exp = exponentiation operation *
|
||||
* B = M + 8191, biased mantissa, written to tape *
|
||||
* K = key to multiplier exponent, written to tape *
|
||||
* K may have any of the values 0 - 3, as follows: *
|
||||
* 0 => G = 0, multiplier = 2 exp 0 = 1 *
|
||||
* 1 => G = 2, multiplier = 2 exp 2 = 4 *
|
||||
* 2 => G = 4, multiplier = 2 exp 4 = 16 *
|
||||
* 3 => G = 7, multiplier = 2 exp 7 = 128 *
|
||||
* Data are stored on tape in two bytes as follows: *
|
||||
* fedc ba98 7654 3210 = bit number, power of two *
|
||||
* KKBB BBBB BBBB BBBB = form of SEED data *
|
||||
* where K = key to multiplier exponent and B = biased mantissa *
|
||||
* *
|
||||
* Masks to recover key to multiplier exponent and biased mantissa *
|
||||
* from tape are: *
|
||||
* fedc ba98 7654 3210 = bit number = power of two *
|
||||
* 0011 1111 1111 1111 = 0x3fff = mask for biased mantissa *
|
||||
* 1100 0000 0000 0000 = 0xc000 = mask for gain range key *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_cdsn
|
||||
(int16_t *edata, /* ptr to encoded data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int32_t nd = 0; /* sample count */
|
||||
int32_t mantissa; /* mantissa */
|
||||
int32_t gainrange; /* gain range factor */
|
||||
int32_t mult = -1; /* multiplier for gain range */
|
||||
uint16_t sint;
|
||||
int32_t sample;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++)
|
||||
{
|
||||
memcpy (&sint, &edata[nd], sizeof(int16_t));
|
||||
if ( swapflag ) ms_gswap2a(&sint);
|
||||
|
||||
/* Recover mantissa and gain range factor */
|
||||
mantissa = (sint & CDSN_MANTISSA_MASK);
|
||||
gainrange = (sint & CDSN_GAINRANGE_MASK) >> CDSN_SHIFT;
|
||||
|
||||
/* Determine multiplier from the gain range factor and format definition
|
||||
* because shift operator is used later, these are powers of two */
|
||||
if ( gainrange == 0 ) mult = 0;
|
||||
else if ( gainrange == 1 ) mult = 2;
|
||||
else if ( gainrange == 2 ) mult = 4;
|
||||
else if ( gainrange == 3 ) mult = 7;
|
||||
|
||||
/* Unbias the mantissa */
|
||||
mantissa -= MAX14;
|
||||
|
||||
/* Calculate sample from mantissa and multiplier using left shift
|
||||
* mantissa << mult is equivalent to mantissa * (2 exp (mult)) */
|
||||
sample = (mantissa << mult);
|
||||
|
||||
/* Save sample in output array */
|
||||
databuff[nd] = sample;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_cdsn() */
|
||||
|
||||
|
||||
/* Defines for SRO encoding */
|
||||
#define SRO_MANTISSA_MASK 0x0fff /* mask for mantissa */
|
||||
#define SRO_GAINRANGE_MASK 0xf000 /* mask for gainrange factor */
|
||||
#define SRO_SHIFT 12 /* # bits in mantissa */
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_sro: *
|
||||
* *
|
||||
* Unpack SRO gain ranged data encoded miniSEED data and place in *
|
||||
* supplied buffer. *
|
||||
* *
|
||||
* Notes from original rdseed routine: *
|
||||
* SRO data are represented according to the formula *
|
||||
* *
|
||||
* sample = M * (b exp {[m * (G + agr)] + ar}) *
|
||||
* *
|
||||
* where *
|
||||
* sample = seismic data sample *
|
||||
* M = mantissa *
|
||||
* G = gain range factor *
|
||||
* b = base to be exponentiated = 2 for SRO *
|
||||
* m = multiplier = -1 for SRO *
|
||||
* agr = term to be added to gain range factor = 0 for SRO *
|
||||
* ar = term to be added to [m * (gr + agr)] = 10 for SRO *
|
||||
* exp = exponentiation operation *
|
||||
* Data are stored in two bytes as follows: *
|
||||
* fedc ba98 7654 3210 = bit number, power of two *
|
||||
* GGGG MMMM MMMM MMMM = form of SEED data *
|
||||
* where G = gain range factor and M = mantissa *
|
||||
* Masks to recover gain range and mantissa: *
|
||||
* fedc ba98 7654 3210 = bit number = power of two *
|
||||
* 0000 1111 1111 1111 = 0x0fff = mask for mantissa *
|
||||
* 1111 0000 0000 0000 = 0xf000 = mask for gain range *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_sro
|
||||
(int16_t *edata, /* ptr to encoded data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int32_t nd = 0; /* sample count */
|
||||
int32_t mantissa; /* mantissa */
|
||||
int32_t gainrange; /* gain range factor */
|
||||
int32_t add2gr; /* added to gainrage factor */
|
||||
int32_t mult; /* multiplier for gain range */
|
||||
int32_t add2result; /* added to multiplied gain rage */
|
||||
int32_t exponent; /* total exponent */
|
||||
uint16_t sint;
|
||||
int32_t sample;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
add2gr = 0;
|
||||
mult = -1;
|
||||
add2result = 10;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++)
|
||||
{
|
||||
memcpy (&sint, &edata[nd], sizeof(int16_t));
|
||||
if ( swapflag ) ms_gswap2a(&sint);
|
||||
|
||||
/* Recover mantissa and gain range factor */
|
||||
mantissa = (sint & SRO_MANTISSA_MASK);
|
||||
gainrange = (sint & SRO_GAINRANGE_MASK) >> SRO_SHIFT;
|
||||
|
||||
/* Take 2's complement for mantissa */
|
||||
if ( mantissa > MAX12 )
|
||||
mantissa -= 2 * (MAX12 + 1);
|
||||
|
||||
/* Calculate exponent, SRO exponent = 0..10 */
|
||||
exponent = (mult * (gainrange + add2gr)) + add2result;
|
||||
|
||||
if ( exponent < 0 || exponent > 10 )
|
||||
{
|
||||
ms_log (2, "msr_unpack_sro(%s): SRO gain ranging exponent out of range: %d\n",
|
||||
UNPACK_SRCNAME, exponent);
|
||||
return MS_GENERROR;
|
||||
}
|
||||
|
||||
/* Calculate sample as mantissa * 2^exponent */
|
||||
sample = mantissa * ( (uint64_t) 1 << exponent );
|
||||
|
||||
/* Save sample in output array */
|
||||
databuff[nd] = sample;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_sro() */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* msr_unpack_dwwssn: *
|
||||
* *
|
||||
* Unpack DWWSSN encoded miniSEED data and place in supplied buffer. *
|
||||
* *
|
||||
* Return: # of samples returned. *
|
||||
************************************************************************/
|
||||
int msr_unpack_dwwssn
|
||||
(int16_t *edata, /* ptr to encoded data. */
|
||||
int num_samples, /* number of data samples in total. */
|
||||
int req_samples, /* number of data desired by caller. */
|
||||
int32_t *databuff, /* ptr to unpacked data array. */
|
||||
int swapflag) /* if data should be swapped. */
|
||||
{
|
||||
int32_t nd = 0; /* sample count */
|
||||
int32_t sample;
|
||||
uint16_t sint;
|
||||
|
||||
if (num_samples < 0) return 0;
|
||||
if (req_samples < 0) return 0;
|
||||
|
||||
for (nd=0; nd<req_samples && nd<num_samples; nd++)
|
||||
{
|
||||
memcpy (&sint, &edata[nd], sizeof(uint16_t));
|
||||
if ( swapflag ) ms_gswap2a(&sint);
|
||||
sample = (int32_t) sint;
|
||||
|
||||
/* Take 2's complement for sample */
|
||||
if ( sample > MAX16 )
|
||||
sample -= 2 * (MAX16 + 1);
|
||||
|
||||
/* Save sample in output array */
|
||||
databuff[nd] = sample;
|
||||
}
|
||||
|
||||
return nd;
|
||||
} /* End of msr_unpack_dwwssn() */
|
40
libs/3rd-party/mseed/unpackdata.h
vendored
Normal file
40
libs/3rd-party/mseed/unpackdata.h
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
/***************************************************************************
|
||||
* unpack.h:
|
||||
*
|
||||
* Interface declarations for the Mini-SEED unpacking routines in
|
||||
* unpackdata.c
|
||||
*
|
||||
* modified: 2009.111
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef UNPACKDATA_H
|
||||
#define UNPACKDATA_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "steimdata.h"
|
||||
|
||||
/* Pointer to srcname of record being unpacked, declared in unpack.c */
|
||||
extern char *UNPACK_SRCNAME;
|
||||
|
||||
extern int msr_unpack_int_16 (int16_t*, int, int, int32_t*, int);
|
||||
extern int msr_unpack_int_32 (int32_t*, int, int, int32_t*, int);
|
||||
extern int msr_unpack_float_32 (float*, int, int, float*, int);
|
||||
extern int msr_unpack_float_64 (double*, int, int, double*, int);
|
||||
extern int msr_unpack_steim1 (FRAME*, int, int, int, int32_t*, int32_t*,
|
||||
int32_t*, int32_t*, int, int);
|
||||
extern int msr_unpack_steim2 (FRAME*, int, int, int, int32_t*, int32_t*,
|
||||
int32_t*, int32_t*, int, int);
|
||||
extern int msr_unpack_geoscope (const char*, int, int, float*, int, int);
|
||||
extern int msr_unpack_cdsn (int16_t*, int, int, int32_t*, int);
|
||||
extern int msr_unpack_sro (int16_t*, int, int, int32_t*, int);
|
||||
extern int msr_unpack_dwwssn (int16_t*, int, int, int32_t*, int);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user