UNAVCO Home UNAVCO Home
   |    |   |  
UNAVCO Home UNAVCO Facility

Software Remote PC Software RedHat Linux Auxiliary utilities Downloading & Data Transfer AOA Ashtech Trimble Other Pre-Processing TEQC Other Processing GAMIT/GLOBK Bernese GIPSY-OASIS II Trimble Geomatics (TGO)
TEQC — Development & Release Log

Contact: UNAVCO teqc guru

Index

changes/bug fixes/enhancements in next teqc release
2008 Feb 15 release
2007 Jun 25 release

Last modified: 1 July 2008


changes/bug fixes/enhancements in next teqc release:

2008 July 1: minor change in conditions at start of qc_nav_files() and in main() for calling it so that -nav can be used with an existing GLONASS RINEX nav file to create the slot number vs. frequency mapping for translating raw GLONASS observation data to RINEX obs file when or if needed (can be used if the raw data is missing GLONASS ephemerides or if some are missing prior to when they might be needed for conversion of GLONASS code range in time to a pseudorange in distance by dividing by the SV frequency

new epoch_increment() function

2008 June 30: for reading of Leica LB2 message 0x0d and MDB record 120 with GLONASS, and Topcon TPS/Javad JPS messages [DC], [D1], and [D2] with GLONASS and "bug 8192", there is now a check to make sure that the specified GLONASS frequency is defined and non-zero (e.g. extracted from a navigation message) before converting the code range in time to a pseudorange in distance by dividing by the frequency

for reading of Leica LB2 message 0xd1 (GLONASS alamanac, ephemeris, or clock data) in decompose_Leica_LB2_d1() tests are now made using the "source" flag in the message to make sure that the data are valid

2008 June 26: save_filename() (see also 18 May 2007) is modified to also reserve '+' as a special filename placeholder (coming attractions … hopefully)

2008 June 25: a new option +force_dBHz forces an interpretation of snr flags in data formats to be interpreted as dBHz; normally this option does not need to be used, but might be useful if using a format that previously used proprietary non-dBHz snr values with older receivers but now has dBHz snr values with newer receivers (e.g. newer Ashtech and Trimble receivers are likely examples); use of this option should only effect the mapping comments in the RINEX obs header and the RINEX obs snr 0-9 flag values

2008 June 24: decompose_Leica_MDB_82(), currently for reading of Leica MDB record 130, was modified to work smoothly with Leica's upcoming GPS1200 6.0 firmware release, i.e. files collected at the same site with no longer show a new site occupation in the RINEX obs file at the file boundaries of the translated MDB files

new options +rssc (== "report site survey changes") and -rssc (== "don't ...) were added, with +rssc being the default; if multiple Leica MBD files are translated to RINEX with -rssc, then the survey start/end flags in MDB record 130 are completely ignored (note: but there is no reason to use -rssc with data collected with Leica's upcoming GPS1200 6.0 firmware release; -rssc is mainly for use with data collected with pre-6.0 firmware)

2008 June 19: Lecia_GLONASS_nav(), currently for reading of Leica LB2 0xd1 and Leica MDB record 141, was modified to 1) round the nav message time to the nearest 0.1 second for correct outputting in the RINEX format (even though GLONASS messages should always be on an integer second), 2) if rounding of the time message occurred, then a warning is printed with the Leica time of the message and the rounded time representation (unless -warn or +quiet is being used), and 3) the method of computing the minutes of the navigation message time was changed to be correct even with non-integer seconds

2008 June 5: rinex_out_event() was modified so that event info when using +events would be output in a sane manner to stdout (or file redirection using +out) when no RINEX output is being used, e.g. with +meta or +mds

2008 June 4: drastic code addition to adjust_week() to try to eliminate old ephemerides in the data file or data stream that occur after a current ephemeris but just before the actual data (e.g. these are now showing up in Trimble NetRS .dat files from at least firmware 1.1-3 and 1.2-00; the object of this change is to have the metadata options like +meta and +mds terminate with the correct GPS week value instead of the old ephemeris GPS week value

bug fix for calling obs_out_epoch(): conditions on when to call this function in rinex_out_comment() where changed so that it's only called when there are no other header elements; this seems to eliminate the extra time stamp/"lines to follow" RINEX line that was occurring in certain situations

bug fix in event_epoch_no_gps_week() so that the GPS week is only updated if an data observation has occurred; this prevents an accidental auto-increment of the GPS week from occurring when the GSP week is specified with the -week option and one or more events occur in the previous week but the first data observation occurs in the specified week

2008 May 28: for reading of Ashtech stream format, dectection of ACK messages was added to next_Ashtech_stream_record() and MBN_DBN_record_id()

2008 May 12: constellation_total() now takes into account a user override for the SV maximum set with -max_rx_SVs for the maximum SVs allowed in an epoch

set the maximum number of SVs for an epoch for a Septentrio receiver to be 18 (up from the original value of 16)

2008 May 9: bug fix in obs_out_preheader() so that obs_out_epoch() is only called if there are post-header metadata lines and no pending RINEX comments; if there are pending comments, the buffer will be flushed later by flush_bs_buffer()

2008 Apr 18: bug fix in all_header_records() so that editing options (e.g. via command line options) can (yet again) be applied to missing non-optional RINEX header elements, and now +relax option is no longer needed in this situation

2008 Apr 16: updated IGS receiver/antenna designations up through 9 Apr 2008 entry

2008 Apr 2: updated IGS receiver/antenna designations up through 2 Apr 2008 entry

2008 Mar 19: added case in Ashtech_rx_specifics() for Ashtech DG14 and DG16 receivers

2008 Mar 18: updated IGS receiver/antenna designations up through 18 Mar 2008 entry

added more complete set of *_rx_specifics() functions, and these are now called from obs_receiver_id() when doing a qc of RINEX OBS to try to automatically set the maximum number of SVs expected to be tracked when this number is different from 12

2008 Mar 14: antenna position now also extracted from u-blox UBX message NAV-POSECEF (0x0101) with new decompose_ublox_UBX_nav_posecef()

updated extract_Trimble_rx_type() to id the GNSS R7 GNSS receiver — but there are not yet official IGS receiver name which is different than the original non-GNSS R7 receiver

2008 Mar 4: updated IGS receiver/antenna designations up through 28 Feb 2008 entry

2008 Feb 26: compilation on all supported platforms for release of the 15 Feb 2008 version

2008 Feb 15: updated extract_Trimble_ant_type() to id the internal GNSS R8 (Model 2)/SPS880 antenna and extract_Trimble_rx_type() to id the GNSS R8 (model 2) receiver — but there are not yet official IGS names for antenna or receiver which is different than the original non-GNSS R8 receiver and antenna

2008 Jan 25: explicit file positions (for non-stdin input) are now given in next_Topcon_record() for reading of Topcon TPS/Javad JPS format when either a non-standard record is suspected of being detected, data corruption, or a possible mis-parsing of the file by teqc; additionally, only one warning of possible data corruption or mis-parsing is now output

2008 Jan 24: a change made on 31 Dec 2007 in Topcon_cks08() to clean up # defined(BC) was changed back to the original Borland code for all compilers

2008 Jan 23: corrected code in met_epoch_no_gps_week(): a comma instead of a semicolon at the end of a +notice print statement caused the GPS week auto-decrement when met data at the end of the GPS week was detected to only occur when notices were being output

the value of the GLONASS frequency channel number in bad_GLONASS_freq_no() and compute_GLONASS_n_constants() had to be explicitly cast to a an "esint1" (== "signed char") before casting as an "sint4" or "sint2" in cases where the starting value is an "uint1" (== "unsigned char"); the absence of the first cast to an "esint1" was causing negative frequency channel numbers in Leica MDB and Topcon TPS/Javad JPS data to be skipped

2008 Jan 22: parser for Ashtech R-file in next_Ashtech_R_record() now set to rewind only one byte upon bad read of Ashtech R-file record 9 instead of two bytes (but why was it two bytes before?)

2007 Dec 31: Topcon TPS/Javad JPS L2C messages [P3], [3P], [D3], [F3], and [E3] now always processed after corresponding L2(P2) messages [P2], [2P], [D2], [F2], and [E2] for a given epoch

another set of cleanup to eliminate special Borland preprocessor # defined(BC) blocks (see 26 Nov 2007 entry)

2007 Dec 28: reading of Topcon TPS/Javad JPS [>>] messages was extended to include a port e (if it occurs in the future; see 21 Dec 2007 entry)

small addition to qc_position_out(): if the longitude is greater than 180 degrees, it will also be printed out as that value minus 360 degrees

2007 Dec 27: use of +L2C_L2 included for Topcon TPS/Javad JPS messages [P3], [3P], [D3], [F3], [E3] vs. [P2], [2P], [D2], [F2], [E2] (i.e. which L2 to use for phase, doppler, SNR), but this will only work if the TPS/JPS L2C messages occur after the corresponding normal L2 messages (e.g. [P2] followed later by [P3], and so on) for the same epoch

2007 Dec 21: reading of Topcon TPS/Javad JPS [>>] messages was generalized to accept and parse external strings from serial ports a-d, mostly in decompose_Topcon__g(), though the since now an array, the storage was combined the storage of the nav messages in Topcon_store_nav_message() and decompose_Topcon_RD()

external_data_string() was modified to ignore strings with "YXXDR", i.e. NMEA strings from tilt sensors (since currently there is nowhere for teqc to further process these), though the full strings can still be recovered using the +event and/or +eds options (former embeds events in RINEX obs file, latter outputs to stderr or redirected stderr)

a loop was added to the beginning of event_logger() to trim out any non-printable characters (allowing only 0x20 — 0x7e) from event or external strings

unsetting of the observation line mask was found to be needed outside of the loop for printing the observables in obs_out_data() — in case one is using +diag -O.obs - (see 4 Dec 2007 entry)

2007 Dec 20: in Ashtech_BEN_block(), missing "else" after testing for valid L1 phase for the -C1 case was put in (otherwise, reading of C1 and D1 occurs 8 bytes further into the record than where the fields are really located)

auto-setting of L1-only observables (L1 C1 D1 S1) for Ashtech AC12 receiver in Ashtech_rx_specifics()

reading of new Topcon TPS/Javad JPS messages for GPS L2C is tested (see 5 Dec 2007 entry)

2007 Dec 19: detection for Ashtech stream record MCA added to MBN_DBN_record_id() (MCA detection might have been accidentally dropped with an earlier code rewrite)

Ashtech AC12 receiver added to Ashtech_rx_specifics() and Ashtech_snr(); if the receiver is identified as an AC12, the SNR is now understood to be in dBHz

2007 Dec 10: typos for the IGS receiver entries for Leica GMX901 and GMX902 have been fixed

2007 Dec 5: initial boilerplate code in place for reading new Topcon TPS/Javad JPS messages [R3], [3R], [P3], [3P], [D3], [F3], and [E3] for L2C data; [3R] has been tested

2007 Dec 4: rework of the setting/unsetting of the observation line mask in out.c (numerous functions); the define and use of TERM_OUT was eliminated in the process

for reading of RINEX header elements MARKER NAME, MARKER NUMBER, LEAP SECONDS, APPROX POSITION XYZ, ANTENNA: DELTA H/E/N, and INTERVAL a conditional constraint on when to use the command override was removed in the corresponding functions rinex_marker_name(), rinex_marker_number(), rinex_leap_seconds(), obs_approx_position(), obs_ant_height(), and obs_interval(); the remaining constraint was recoded as a switch consistent with other similar functions

2007 Nov 30: setting of the observation line mask in rinex_mid_header_start() so that the correct switch case is hit in flush_bs_buffer() using this new scheme (otherwise, the current epoch is output between the "4" and the number of following header lines)

2007 Nov 29: added a bunch of missing cases for recently added native formats to qc_file_list() (only used if trying to directly qc a native format)

2007 Nov 26: slight modifications of a few places in the code that were giving warnings of "Possibly incorrect assignment in function ..." from the Borland compiler (i.e. there were no code problems, but the Borland compiler is very picky)

2007 Nov 20: Borland compilation environment reestablished? (seems to be working ...)

2007 Nov 19: modified parser for Trimble RT17 format (next_Trimble_RT17_record()) to better account for incomplete page counts for 0x57 epochs

2007 Nov 14: modified parser for Trimble RT17 format (next_Trimble_RT17_record()) to account for 0x57 record pages that are not consecutive records; previous parser could result in a segmentation fault (on just about everything except Sparc executables) if there were sufficient non-0x57 records in between consecutive 0x57 record pages

2007 Nov 12: modified parser for Trimble RT17 format (next_Trimble_RT17_record()) to ignore (i.e. not report the presence of) records 0x07 and 0x40

2007 Nov 7: a missing break in the switch in rinex_hl() since 13 Aug 2007 (see 13 Aug 2007 entry) caused the site operator agency field to not be populated in the RINEX header line OBSERVER / AGENCY

changed terminate() call in dump_format_code() to not report the exiting message

2007 Oct 22: call to update_bs_buffer() (see 18 June 2007) has to be qualified by whether the RINEX OBS header has been written out yet or not (e.g. see use in decompose_Trimble_16()); same for append_bs_buffer() (e.g. see use in rinex_out_pgm_agency_date() and related functions); same for rinex_out_comment(), plus addition of call to flush_bs_buffer() if the header has not been written out yet; extra conditional in flush_bs_buffer() so that post-header comments are only written when the header has been both started and ended

2007 Oct 18: for reading of RINEX OBS, rinex_constellation() was modified to better detect a misplaced clock offset field and report it if +relax is not in effect, or try to read it if +relax is in effect; similarly, illegal characters following the SV list after the epoch line (i.e. more than 12 SVs) are reported unless +relax is in effect

for reading of RINEX OBS, obs_receiver_clock_offset() was slightly modified so that if the RCV CLOCK OFFS APPL line is encountered in the header and neither -rx_clk_off or +rx_clk_off has been explicitly used, then +rx_clk_off is implicitly set; this allows teqc to read in RINEX OBS and output it automatically preserving the receiver clock offset without the need to explicitly use +rx_clk_off

2007 Oct 17: for reading of Trimble .dat, decompose_Trimble_16() was slightly modified to append a description (antenna height, latitude, longitude, elevation) after the extracted strings in record 16, subrecords 3 and 29 — when encountered, these continue to show up in the RINEX OBS header as comments as they had before

2007 Oct 16: a little code defuzzing for a cleaner Borland compile

2007 Oct 15: yet another small floating point tweak to clock_jump_search() (the function from hell)

2007 Oct 12: small correction to obs_data() for cases of more than 12 SVs listed for the 5 Oct 2007 code change

2007 Oct 11: mod to Leica_GPS_ephemeris() to try to correct the GPS week for the ToW epoch; the idea is to prevent an old ephemeris from an earlier week from tripping up a +meta or +mds operation and causing an abort with an old week value in possible_wrong_GPS_week() called from GPS_NAV_times_make_sense()

2007 Oct 9: minor rewording of +C2/-C2 options for better clarification

2007 Oct 5: a long, involved modification so that using the +meta option on a RINEX OBS file missing the optional INTERVAL header line and no use of the -O.int option results in a scan of the time tags through the file to determine the minimum sample interval; a new function, need_rinex_interval(), was introduced for this purpose only (used in window_OK() for explicit end time windowing, and in implied_window_limit() for implicit end time windowing) to set a special flag which changes the procedure in rinex_end_of_header(), process_rinex_obs_end(), and obs_data() (more work may be required in the latter for various event flags); if used with any time windowing options, the end time may be effected in the +meta result

2007 Oct 4: updated IGS receiver/antenna designations up through 1 Oct 2007 entry

2007 Sept 18: correction to decompose_Topcon_RD() so that when using -week option on multi-week Topcon TPS/Javad JPS data the GPS week will be correctly incremented (previous code was correct only for when -week was not being used, or for data only in a single GPS week)

improved +help for options +obs, +nav, and +met — esp. +nav which now explains that this is a list of RINEX nav filename(s) for the various systems ordered gps[,glonass[,sbas]] and that '-' (dash) or '_' (underscore) can be used to omit one or more names (see 2007 May 18)

2007 Sept 14: a change to met_out_data() prevents data for near duplicate met epochs from being output more than once (needed for some Suominet 4700 BINEX sites where the met data is duplicated in BINEX 0x00 comments and in 0x7e ancillary data records)

2007 Sept 2: small change to decompose_Topcon__g() to allow complete external data string detection with only one Topcon TPS/Javad JPS [>>] message (instead of the previous logic requiring two or more [>>] messages)

2007 Aug 31: new detection of NOAA GSOS met data strings in external_data_string() and parsing via new decompose_NOAA_GSOS() and NOAA_GSOS_met()

case added to is_met_in_00_comment() to detect NOAA GSOS met string in BINEX 0x00 comment string; needs to be tested

new +eds option to output all external data strings found to stderr (-eds by default, i.e. no external data strings are output to stderr)

2007 Aug 25: messages for RINEX OBS overflow elimination now consolidated in new obs_eliminated()

2007 Aug 24: epoch_order() generalized a bit and used in a few more places

2007 Aug 23: a switch in obs_out_epoch was added at the beginning such that if the mask indicates a prior completed epoch line (mask == 0xf), the mask is reset to 0 (needed for a few cases)

new message function epoch_order() to collapse some code and output the filename having the epoch order problem

2007 Aug 22: nav_out_ion_alpha(), nav_out_ion_beta(), nav_out_delta_UTC(), nav_out_corr_to_system_time(), and nav_out_leap_seconds() were modified so that the optional RINEX NAV header lines ION ALPHA, ION BETA, DELTA-UTC: A0,A1,T,W, CORR TO SYSTEM TIME, and LEAP SECONDS would only be output once at most per header

large ion and iod jump conditions in +qc mode are now printed out in exponential format by qc_short_report() and qc_long_report()

GPS UTC model and ionospheric parameters now extracted u-blox UBX message AID-HUI (0x0b02) with new decompose_ublox_UBX_nav_GPS_health_UTC_ion(); UBX parser set to ignore UBX messages RXM-SFRB (0x0211) and RXM-SVSI (0x0220) for the time being

2007 Aug 21: fixed wrong index and misplaced parenthesis in arg_4d() — used for parsing of -N.a[lpha] and -N.b[eta] arguments

with new clean_dD() function, made some improvements in reading in floating point values for various options, i.e. will now accept Fortran-style scientific notation (e.g. 8.3819D-09 or 8.3819d-09) as well as C-style scientific notation (e.g. 8.3819E-09 or 8.3819e-09)

2007 Aug 20: fix to change made to obs_session_start() (see 10 May 2007) — put in missing pair of parentheses; the bug allowed potentially wrong TIME OF FIRST OBS values in the RINEX obs header to override the actual first found epoch in a RINEX obs file when using +meta and +mds options

2007 Aug 15: mod to system_time() so that option +doy works with option +id to output the system date in year:day-of-year format

2007 Aug 13: all but one function in out.c now use the new rinex_hl() function and the generalized append_bs_buffer() function (see 28 June 2007); this leaves only one needed call for the old reset_bs_buffer() for the moment

2007 Aug 10: added new obs_out_epoch() through which to channel the output of all RINEX OBS epoch/sat or epoch/flag lines; this substantially cleaned up the logic in flush_bs_buffer() (see 28 June 2007)

2007 Aug 6: changed terminate() call in possible_wrong_GPS_week() so that the exiting message is not output if a GPS week discrepency is found

a flag conflict between setting the value for ion qc bins and value for the multipath rms window was resolved

2007 July 26: updated IGS receiver/antenna designations up through 16 July 2007 entry

for Leica system 1200 MDB, the reading of records 104 (0x68) and 108 (0x6c) were updated to include the receiver and antenna types from version 2.13 (26 July 2007) of Leica's MDB control document

2007 July 24: also need call to clock_jump_search in obs_epoch_check() for data formats other than RINEX or ARGO if in -smtt (== not smooth time tag); see 2006 Nov 15

2007 July 23: a clarification in the +help of the CA_L1 option, because since 11 June 2007 the default for Topcon TPS, Javad JPS, and Septentrio Binary Format has been +CA_L1 (using L1(C/A) and associated SNR and doppler) — opposite to the default for other formats

2007 July 20: a little re-crafting of spew_NavCom_epoch() for parsing NavCom binary format observation epoch made up of 0xb0 and possibly 0x86 and/or 0xab to eliminate the possibility of overflow in the epoch buffer

2007 July 2: a bit of code improvement for reading CMC binary, now ignoring records 33 and 49, and decoding of record 20 in new decompose_CMC_Allstar_20() (user coordinates, for initial lon/lat/elevation)

2007 June 28: as part of a larger code overhaul for outputting RINEX, a call to flush_bs_buffer() was put in at the start of obs_out_data() — to output any accumulated post-header fields at the start of any data epoch — and at the start of dump_binary_config() — to output any post-header fields at the end of reading; the structure of append_bs_buffer() was generalized; a new function update_bs_buffer() was written to append certain post-header fields if there is a detected change; a new function rinex_hl() was written to handle building most header lines and all post-header lines

2007 June 25: compilation on all supported platforms for release

2007 June 22: more fiddling with is_met_in_00_comment() so that if the Trimble ASCII time tag is present and there appears to be a week rollover before the BINEX 0x00 comment gets written, then the week value is decremented to the previous week when the data probably was actually logged by the receiver

update to met_sensor_mod() and met_sensor_pos() to include cases for WS (wind speed), WD (wind direction), RI (rain increment), and HI (hail indicator) for RINEX met 2.11

storage for "session" start and end epochs were added for all the different types of allowed RINEX files besides an observation file, with initialization in initialize(), population in implied_window_limit(), and use in dump_metadata() so that +mds will now give the correct "epoch" limits for a RINEX navigation file (GPS, GLONASS, and SBAS) or met file in addition to an observation file

2007 June 21: the RINEX version testing in rinex_version_type() was modified to be more rigorous and specific based on the RINEX file type

modification to NMEA_XDR_met() to assume that the NMEA XDR string (if used, i.e. +xdr) from the WXT510 has a first 'V' designator corresponding to rain increment and a second 'V' designator corresponding to hail increment

modifications to is_met_in_00_comment() to extract Trimble's leading seconds-into-week time stamp if present, and improved pointer to "$WIXDR," using strrstr(), and setting the met observables if "$WIXDR" to include rain and hail increment

modification to event_logger() to directly pass the suspected GPS week value

2007 June 20: in binex.c, the ordering array obs_order_7e_00[] for BINEX record 0x7e was modified to include the new RINEX 2.11 observables, and related changes in binex_7e_00_met() (reading 0x7e) and binex_site_data_7e_00() (writing 0x7e)

the logic for conversion of pressure in probable units of bars to millibars (see 2007 June 18) was changed from met_out_data() (which effects only RINEX output) to met_filtering() (which effects all output), and is now limited to non-RINEX input only and is only modified if the pressure value is both > 0 and < 2

extra if block added to is_met_in_00_comment() to deal with met strings from Vaisala WXT510 in BINEX 0x00 comments (tested with NetRS/WXT510 combination)

2007 June 19: have the template options -tbin and -ast in place — though not yet implemented (see http://ls.unavco.org/pipermail/teqc/2007/000549.html)

for reading Leica MDB record 120 (0x78) in Leica_MDB_78_obs(), the reading of the phase observable is now only permitted when both bit24 and bit25 of the ChanStatus word are set, and likewise the reading of the code pseudorange observable is now only permitted when bit26 of the ChanStatus word is set

new -xdr option ignores reading of NMEA XDR data strings, thus avoiding trying to interpret non-met XDR data strings as met XDR data strings; default is +xdr, i.e. to attempt to use NMEA XDR data strings for met data as was the case for earlier versions

2007 June 18: when encountering a BINEX 0x00 comment, either an initial one in binex_00_field_basis() or a later one in next_binex_00_field_basis(), a check for a possible met string is done by calling a new function is_met_in_00_comment(); initially is_met_in_00_comment() is just looking for a comment string that starts with "MET Data: " — this is what Trimble firmware (e.g. in 4700 and NetRS) inserts prior to an external string which it can't parse

the old decompose_MET3_string() function has been renamed decompose_ext_string() because the string in question doesn't necessarily come from a MET3 met pack anymore and it's not necessarily even met data

NMEA_XDR_met() was modified to have two new cases: "S,<value>,M,<unit>" and "A,<value>,D,<unit>" for extract wind speed and direction from the Vailala WXT510 NMEA string

the parsing of NMEA comma-delimited quadtuples is now done with the function NMEA_quadtuple(); likewise the parsing of the Vaisala ASCII 0R0 strings is now done with the function ASCII_0R0()

conversion of pressure in probable units of bars (i.e. value < 2) to millibars is now done in met_out_data() for each pressure value

2007 June 15: window_OK() was modified for the case where the input is not RINEX to set both the default window start and end date/times if the user is requesting either a metadata output (as the code has been) or a configuration output (the new addition)

2007 June 13: by Leica's recommendation, use of Leica's MMT corrections, even if present, will be skipped when reading MDB record 120; option +mmt has been removed (see 2006 Apr 27 entry)

had to adjust the logic of +CA_L1 and +L2C_L2 in SeptentrioBF_5944_obs() (though for a different reason than for Leica MDB record 120); now correctly allows extraction of L2(L2C) with +L2C_L2 or L2(P2) with -L2C_L2 (latter being the current default); a qc on a short SBF file with L2C tracking on and tracking of G17 and G31 shows that the multipath rms is slightly lower using the L2(P2) phase

2007 June 12: added another case to initialize_epoch() for the end of time in the epoch struct (6075 Dec 31 23:59:59.999), and used this to clean up some end of window settings in window.c

activated the options +win_mo and -win_mo (monument/marker name) and +win_mn and -win_mn (monument/marker number); the + options require a maximal string match and the - options require a minimal string match; as yet untested

some more cleanup of dump_config() — adding missing options

code of options +CA_L1 and +L2C_L2 deactivated in Leica_MDB_78_obs() for reading of Leica MDB record 120 (0x78), because it appears that (like Trimble .dat record 17 and RT17 0x57) that there is only one set of observables being stored for each carrier frequency

2007 June 11: finally officially added HELP_BINEX to enums.h and teqc.c, so that the long-hidden options of -binex and +binex show up with the +help option

added new +L2C_L2 option — analogous to the current +CA_L1; this option captures the L2 phase, S2 snr, and D2 doppler values from the L2C code block instead of the P2 code block (the latter being the default); this has been implemented for Leica MDB record 120, SBF record 5944, and Topcon TPS/Javad JPS message [rM]; the option is so far not needed elsewhere, e.g. Trimble .dat record 17 and RT17 0x57 because these records only have one set of code pseudorange, phase, snr, and doppler per carrier frequency

logic for option +CA_L1 was implemented for Leica MDB record 120, SBF record 5944, and Topcon TPS/Javad JPS message [rM] (accidentally left out in Leica MDB record 120 and TPS/JPS [rM] previously)

all the "dump" functions were collapsed into new dump.c and dump.h (which cleans up args.c a bit); function binary_dump_config() was renamed dump_binary_config()

some initial long-overdue cleanup of dump_config() (called when +config or ++config is used)) and associated mapping of various #define entries in flags.h and their use throughout the code; included adding missing entries

2007 June 8: in set_obs_obs_out(), format_settings(), and binex_out_settings() Doppler D1 and D2 have been removed as default output observables for all dual-frequency receivers; in set_obs_obs_out() and format_settings() the SNR S1 and S2 observables are now default output observables

using the option +C2 now includes C2 as a default output observable for Trimble .dat and RT17, Septentrio SBF, Leica MDB, and Topcon TPS/Javad JPS formats in format_settings()

2007 June 7: some cleanup of option descriptions in usage()

in array g_opt[], the receiver manufacturer names were shortened so that a maximum of only three letters in needed for the receiver part of any receiver/format specification; can be checked by executing `teqc +help | grep "input is from"`

the reading of Septentrio Binary Format (SBF) was modified so that if a combination of measurement records (5889, 5890, 5944) exist for any one epoch and the -sbfobs option is not being used, then Septentrio's suggested hierarchy is used: 5944 over 5889 over 5890

explicit recasting of the sint1 (char) variables in SeptentrioBF_5944_obs() to esint1 (signed char) so that there would be clean compiling on systems where "char" is defined as "unsigned char"

+cct option is set to be the default over -cct (see 2007 June 6)

2007 June 6: addition of two more sets of counting bins to the qc_sv_count_obs struct in qc.h, which are populated by the original code in code_data(), and the original bins populated by the total counts by new code in code_data()

new option +cct added to output the "coarse code totals" in the qc long report statistics, as opposed to -cct which yields the original subtotals when no corresponding code pseudorange observable for that SV at the same epoch was available

when reading Trimble RT17, the code changes from 2007 Jan 10 had the fseek() following a bad 0x57 page read one byte too large in next_Trimble_RT17_record(); it is now the correct value

when reading Trimble RT17, added a switch case in next_Trimble_RT17_record() to ignore an apparently valid record 0x41 — no idea what the hell it is, but it's showing up in NetRS RT17 data

all remaining exit() calls are now sent to terminate() except obviously the final one in terminate() itself

2007 June 5: mod to decompose_binex_00() so that the deallocation of BINEX 0x00 comments is not done if outputting a BINEX configuration file with +bcf (see note for 2006 Oct 31)

2007 June 4: mod to met_epoch() and possible_wrong_GPS_week() to add a condition to suppress printing of the possible wrong GPS week message when doing a qc and the input format is RINEX

symbol_codes() (assessed with +sym) was slightly changed to show that the 'o' qc indicator in the ASCII time plot show epochs with C/A or P1 code pseudorange

set_obs_obs_out() was slightly modified to directly set the variable default_types from the accumulated number of default observables, rather than a preset upper limit as it had been before; the logic of set_met_obs_out() was slightly modified so that it matched that of set_obs_obs_out()

2007 June 1: added an update to the receiver and format code so that teqc would recognize a file of Navman SiRF binary format (though no other reading or translation capabilities at this time)

some tweaking of id() to correct a few missing or wrongly located calls to fp_adjust()

2007 May 31: added an update to the receiver and format code so that teqc would recognize a file of NovAtel binary format (though no other reading or translation capabilities at this time)

the calls to terminate() were cleaned up a bit

obs_epoch_with_gps_week(), met_epoch_with_gps_week(), and event_epoch_with_gps_week() were modified so that if the format is not in the list of formats that probably have GPS week information, then the corresponding call to obs_epoch_no_gps_week(), met_epoch_no_gps_week(), or event_epoch_no_gps_week(), respectively, is made

the returns for suspected PBO NMEA tilt and pore pressure strings in external_data_string() were changed to TRUE (i.e. these are suspected to be something valid and known) so that the strings are not put into the RINEX obs file

2007 May 30: event detection of u-blox UBX messages TIM-TP (0x0d01), TIM-TM (0x0d02), and TIM-TM2 (0x0d02) added via new decompose_ublox_UBX_tim_tp(), decompose_ublox_UBX_tim_tm(), decompose_ublox_UBX_tim_tm2(), and UBX_event() — but completely untested due to lack of sample messages

the code in initialize_basic() accessing the two standard C library functions getpwnam() and getpwuid() — used on UNIX builds to populate the RUN BY field in RINEX headers when the -[ONM].run_by option is not used — is now skipped with a preprocessor definition when compiling a statically-linked build on Linux, due to failures of statically-linked builds made on 2.4 Linux kernel distro but executed on a 2.6 Linux kernel distro when reaching these C functions

preprocessor statements #ifdef X and #ifndef X were replaced with the more flexible #if defined(X) and #if !defined(X) constructs

2007 May 29: Ashtech R-file type 6 records and U-file DRC records are now handled by the new event_logger(), which first tries to extract data as a NMEA XDR string with data extraction into a RINEX met file, but if unsuccessful, the string is logged as an event in the RINEX observation file with the ASCII string

all other cases of direct calls to external_data_string() for Ashtech, Topcon/Javad, and Trimble formats have been replaced with calls to event_logger()

new decompose_Leica_LB2_05_06() to read Leica system 500 and 1200 LB2 record id 0x05 and 0x06 (external events 1 and 2) to read the event info and output to RINEX obs using rinex_out_event()

2007 May 25: added checksum verification to reading of Ashtech MACM records in next_Ashtech_stream_record()

XDR_scan() and external_data_string() were made bool1 instead of void as a first step to use non-met NMEA strings as a trigger to record events in certain cases

2007 May 24: filled in the frame field for a number of file_position() calls for various formats — used during +diag

slight mod to record_type2() used for certain formats with +diag such that the 2-byte word is only printed as characters if both bytes are printable ASCII

2007 May 23: first cut of decoding Septentrio Binary Format (SBF), though there are still some untested pieces of functionality; if data observables are only showing up in records of one type (5889, 5890, or 5944) then no special option is needed; if data observables are in records of two or more types then the option -sbfobs is used, e.g. -sbfobs 5944 restricts the code to only reading the 5944 records; in case the format auto-identify does not work on an SBF file, the option -septentrio sbf is the forced override

2007 May 22: for Topcon TPS/Javad JPS, added decompose_Topcon_GA() which updates the GPS PRN SV antispoofing array for the associated PRN if a [GA] message is encountered

updates to the RINEX loss-of-lock flag in most places for the Topcon TPS/Javad JPS code and all cases for NavCom binary format was changed to use the new lli_mask() function

the GPS antispoofing array for NavCom binary format was changed to follow the same method as used for reading Topcon TPS/Javad JPS and Septentrio Binary Format (SBF)

2007 May 21: do_mask_decomp() was modified to allow for using '-' in a range, e.g. -G2,30-32 to exclude GPS SV PRNs 2, 30, 31, and 32

2007 May 18: save_filename() was modified to allow for using '-' or '_' as a blank spaceholder to skip that particular filename, e.g. can be used with +nav to skip creation of NAVSTAR GPS navigation file and/or GLONASS navigation file and creating the SBAS navigation file with, say, +nav -,-,tmp.sbs

out_settings() was modified to allow for a non-existent NAVSTAR GPS navigation filename (similar to the way the code already allowed for non-existent GLONASS or SBAS navigation filenames)

some further defuzzing for Galileo (to make the code consistent wtih GPS, GLONASS, SBAS)

added a switch to do_mask_decomp() to initially zero out the opt_X if a '+' flag is used; this allows the filtering options like, say, +G12,13,14 to work as expected

modifications to SV_edit_comment() and ch_edit_comment() to reduce the number of RINEX header comments when there are a number of SV or channel edits

2007 May 14: for reading of Topcon TPS/Javad JPS, added code for including the RINEX NAV curve fit interval, data flag for L2 P-code, and code on L2 channel values to decoding of message [GE] in Topcon_GE_ephemeris() (which had accidentally been left out 4 years ago ...)

2007 May 10: change to obs_session_start() that disables setting the session start time until it falls within the default or specified time window, so that if time windowing during qc the "First epoch in window" is not reported as the first epoch outside of the window

2007 May 8: updated IGS receiver/antenna designations up through 7 May 2007 entry

reading of Leica MDB event description record 16 (system 500) and record 116 (system 1200) generalized in decompose_Leica_MDB_10_74(); information in these records is output to stderr (or file redirection if +err is used) unless -notice is set

reading of Leica MDB initialization record 12 (system 500) and record 112 (system 1200) generalized in decompose_Leica_MDB_0c_70(); information in these records is output to stderr (or file redirection if +err is used) unless -notice is set

reading of Leica MDB not used/canceled point record 27 (system 500) and record 127 (system 1200) generalized in decompose_Leica_MDB_1b_7f(); information in these records is output to stderr (or file redirection if +err is used) unless -notice is set

2007 May 4: modification to rinex_comment() to skip adding comments if in verify (e.g. +v) mode; eliminates potential for a segmentation fault if reading a RINEX OBS file with +v with more than 999 comment lines in total

2007 May 3: event detection of Navcom message 0xb4 (event latch data) added via new decompose_NavCom_b4()

2007 Apr 20: Leica system 500 MDB record 17 and system 1200 MDB record 113 (event/point input) code in decompose_Leica_MDB_11() and decompose_Leica_MDB_71() was updated to read the event info and output to RINEX obs using rinex_out_event()

optional event epoch code was removed from obs_out_preheader(), i.e. event translation output is now controlled entirely by rinex_out_event()

option +event was added in order to initiate translation output of any event info to RINEX OBS (the default for the time being is equivalent to -event, which suppresses translation output of event info to RINEX OBS)

2007 Apr 19: obs_data() modified to allow normal (i.e. not using +relax) reading of RINEX OBS file with event flag 5 (external event) to occur out of time order with other event flags such as normal data epochs (event flags 0, 1, or 6), header line metadata (event flag 4), or occupation status (event flags 2 or 3)

2007 Apr 18: rinex_out_event() modified to handle (if needed) multiple RINEX comment lines per event (with a maximum of 999 due to RINEX limit), time windowing, and output of RINEX OBS header if an event epoch occurs before the first observation epoch

2007 Apr 16: event code for 13 April would not work correctly if more than one event occurred between successive epochs, so a new rinex_out_event() function was created; Topcon TPS/Javad JPS [XA] and [XB] events should also now be reported via updated decompose_Topcon_XAB(); functions event_epoch_with_gps_week(), event_epoch_no_gps_week(), and event_epoch() had receiver clock offset dependency removed

2007 Apr 15: modified teqc to fill out Form 1040 as a RINEX obs file (see entry for 1 Apr 2007)

2007 Apr 13: added an update to the receiver and format code so that teqc would recognize a file of Septentrio Binary Format (SBF) (though no other reading or translation capabilities at this time)

an event epoch was added to the obs struct, which is set with an event time via a new event_epoch_with_gps_week(), event_epoch_no_gps_week(), and event_epoch() (analogous to the obs... equivalents), and is used to record the event epoch in obs_out_preheader() in place of the observation epoch if the event epoch is set; currently, an event time is set in decompose_Trimble_19() for Trimble .dat record 19, subrecords 0 (external event), 2 (manual event), and 4 (RT17 event)

2007 Apr 6: the big Ashtech L-XII/LM-XII overhaul: extraction of Ashtech firmware from B- or S-file now includes the "channel" version (and "options" is in the S-file) in addition to the original "navigation" version; Ashtech_rx_specifics() along with set_obs_obs_out() overhauled to deal with default observables based on L-XII/LM-XII firmware; calls to Ashtech_rx_specifics() now must be done in next_Ashtech_stream_record() for any Ashtech stream format based on record type

2007 Apr 2: renamed decompose_Ashtech_dld_B_header() to read_Ashtech_B_header() and changed it to return void

rearranged calls to Ashtech_rx_specifics() so that these are in the optimal spots in Ashtech() for each format and a special location for U-files in next_Ashtech_U_record()

2007 Apr 1: see entry for 15 Apr 2007

2007 Mar 30: added reset of seconds of week to 0 if the stored value equals 604800, as well as increment of GPS week, unless -week is being used, in decompose_Ashtech_dld_B23_record() for reading of an Ashtech (version 3) B-file; this was tested on over a dozen B-files starting at 00:00:00 on a Sunday for 4 different firmware

2007 Mar 28: added entries for reading of Trimble .dat file for receiver 45 (NetR5) and antenna "GS" in extract_Trimble_rx_type() and extract_Trimble_ant_type()

moved entry for Ashtech LM-XII receiver to non-GLONASS, dual-frequency category in Ashtech_rx_specifics(); added Ashtech 3DF-XXIV to L1-only category in Ashtech_rx_specifics()

2007 Mar 26: no_of_Topcon_channels is now no_of_quasiTopcon_channels, set arbitrarily at 12, and is used only for early receivers manufactured by Ashtech, AOA, or Trimble and licensed for sale by Topcon; no_of_Topcon_20_channels and no_of_Javad_20_channels (40 frequency band channels) is now set at 22 to account for 4 single-frequency SBAS SVs and 18 dual-frequency GPS/GLONASS SVs — a reasonable maximum — and allows for 20 dual-frequency SVs

2007 Mar 23: increased the maximum excepted number of SVs from a Topcon or Javad receiver from 12 to 18 (no_of_Topcon_channels)

2007 Mar 22: activated reading of L5 observables in Leica MDB 0x78 (record 120) in Leica_MDB_78_obs() — if/when L5 comes on-line

a slight change of the location of default observables for Ashtech MACM records, now in decompose_Ashtech_MACM()

2007 Mar 21: a small repositioning of the last date_stamp() call in qc_landscape_out() and a new switch in qc_short_report() to report the date as year:day-of-year in the qc SUM line when the +doy option is used

2007 Mar 19: first cut of reading Ashtech MACM record with certain caveats, e.g. it is assumed that each record starts with the 4-byte sync word "MACM" and ends with a 1-byte checksum, and the checksum is not currently being checked

2007 Mar 16: modification to the NavCom Technologies Inc. binary format parser, so that SNR values from record 0x86 at 0.25 dBHz resolution will be given for L1 and L2 for an SV (assuming the record exists, etc.) instead of the 1 dBHz resolution SNR for L1 only from record 0xb0

2007 Mar 15: change to phs_ms_adj() to account for an early style of correction to phase values when millisecond jumps occur for old Ashtech firmware (anything starting with '1'-'9', except '1F50' — the only known exception so far); the flag is set in Ashtech_rx_specifics() if the firmware is known; this does not work for Ashtech R-files with the old firmware if the receiver clock offset is not available, e.g. record "tinyranger3" (record type 23), in which case a qc of the data will show clock slips

2007 Mar 12: slight change to main() so that it includes a call to dump_format_code() when the using +mdf and specifying the receiver/format

removal of the obsolete option +mdfi

2007 Mar 9: (long overdue) old "Javad" naming scheming for C functions, defines, etc. were changed to the "Topcon" equivalent — just an internal bookkeeping change to the C code

2007 Mar 7: everything associated with the old -tr_s_jump option (as a attempt to correct highly corrupted Trimble RT17 collected for site lkwy by USGS VSAT in '96-'98) has been removed from the code

2007 Mar 6: updated IGS receiver/antenna designations up through 6 Mar 2007 entry

2007 Mar 5: the static buffer size for reading Leica binary formats was increased to 2400 bytes — to allow for 36 dual-frequency SVs being tracked with Doppler with the MMT info block in MDB record 120 (0x78) by 1200GG system receivers (assuming only two data blocks per SV); I really have no idea what the maximum should be for this ...

the Leica k-to-n array is now dynamically allocated by the size set in format_settings(), currently set to allow for a maximum of 72 data blocks

2007 Mar 1: the static buffer size for reading Leica binary formats was increased to 1024 bytes to account for larger MDB record 120 (0x78) which are showing up now from 1200GG receivers

output of RINEX MET also officially upgraded to 2.11, to allow for new observables from Vaisala WXT510

2007 Feb 27: mod to obs_start() and obs_time_system() to detect and write out "GAL" for the time system in the TIME OF FIRST OBS header line (addition needed for RINEX 2.11)

first test compilations on Solaris x86_64 5.10, using both Sun compilers and gcc, for both 32- and 64-bit

2007 Feb 26: first version of teqc that attempts to ramp up to reading arbitrary RINEX OBS 2.11: NNSS Transit has been eliminated; Galileo has been added; observables L5, L6, L7, L8, C2, C5, C6, C7, C8, D5, D6, D7, D8, S5, S6, S7, S8 are allowed in an OBS file; option +C2 will temporarily change function in that it will include C2 in a default OBS observables list (without having to specify the entire new OBS list with -O.obs), but +C2 is not now needed to read a RINEX 2.11 OBS file containing C2 in the observables header list

2007 Feb 22: detection of Topcon TPS/Javad JPS [rE] message moved to the "do nothing" part of the main switch in next_Javad_record()

2007 Feb 8: reinstatement of met_out() and nav_out() calls with pointer to FILE_INFO due to generalized construct in all_header_records() and rinex_end_of_header() which require these prototypes in match that of obs_out() which still requires a pointer to FILE_INFO

2007 Feb 7: the pressure reading, "Pa", in Vaisala_0R0_met() for reading met strings from Vaisala's WXT510 is now checked to see if the numerical value in less than 2, and if so the value is assumed to be in bars and it is multiplied by 1000 to convert to millibars; otherwise millibars are assumed (millibars are required by RINEX)

2007 Feb 5: all calls to epoch_in_window() involving a met epoch or a navigation message with ToC or ToW were changed so that the file pointer was null, so that encountering a met epoch or nav ToC or nav ToW outside the specified time window (set with either -st or -e) will not rewind the file to the end of file

cleanup of nav and met functions no longer needing a pointer to FILE_INFO

2007 Jan 31: updated IGS receiver/antenna designations up through 4 Jan 2007 entry

2007 Jan 26: added a new filter to nav_filtering(), i.e. nav_value_out_of_range(), which for the moment just tests to make sure that no value overflows the RINEX %19.12le (D19.12) formatting field

2007 Jan 25: a few code tweaks in qc_short_report() and qc_frequency_count() so that a qc of a 1-epoch or a 0-epoch case will not crash the timecode output

2007 Jan 22: another if clause added to the first pass case of obs_epoch_check() for decimation where the true time tag is off by ±1 millisecond from the nominal epoch (e.g. to catch the random clock errors that have been observed in Trimble data if, by chance, they occur in the first epoch)

2007 Jan 10: function next_Trimble_RT17_record() was modified for parsing of Trimble RT17 data, reducing some unnecessary backtracking in a file that sometimes resulted with severely corrupted data

2006 Dec 12: the help label for option +C2 was wrong in usage() and has been fixed

2006 Dec 5: introduced a define for pointer size in types.h, and this is used in extract_root() to eliminate a couple of warnings when compiling with 64-bit gcc on Solaris (this might be needed elsewhere, but this function was the only one giving a warning)

2006 Dec 4: the end of the push to eliminate the last remnants of explicitly named primitive variables in the code, e.g. now all primitives are abstracted through defines in types.h; this also addresses all cases of signed 1-byte char which need to signed; cases where "int" needs to be used was addressed for main(), tolower(), memset(), strchr(), and strrchr()

2006 Nov 29: extract_real8() had a couple of minor (but non-trivial) typos which caused 8-byte floats to be read incorrectly on the Arm processor

2006 Nov 27: a filter to skip ephemerides with a "time of clock" epoch earlier than a windowed start time when reading binary data was added to nav_filtering() — to prevent early calls to nav_native_to_RINEX_out() — which is analogous to what has been in nav_out() (reading of input RINEX NAV files) for years

2006 Nov 15: decimation of "-smtt"-produced RINEX with +smtt was not working since the code change on 22 Mar 2006, whereas reading of RINEX is not supposed to be effected at all by +smtt or -smtt; the fix was to remove the automatic return in clock_jump_search() when +smtt, but include a switch in obs_epoch_check() to only call clock_jump_search() when decimating if the input format is RINEX (or ARGO format, which might also be in "-smtt")

2006 Nov 8: external_data_string() had case of "|*9900SO-" added to ocver two new strings ("|*9900SO-XDR" and "|*9900SO-ZDR") showing up in NetRS PBO data from a tilt meter

2006 Nov 3: an artificial (and intentionally wrong) line number reset was put into implied_window_limit() so that if one is using a metadata extraction, e.g. +meta, on a RINEX file — which does not read the file line by line — and an error is encountered while reading the file backwards from the end, then the line number reported should now be -1 instead of an arbitrary integer

2006 Nov 1: external_data_string() had the case of "||*9900" (2006 Sept 29) modified to "|*9900XY" — which seems to be the pattern from NetRS PBO data from a tilt meter

2006 Oct 31: any existing BINEX 0x00 comments are deallocated before reading the next 0x00 record at the start of decompose_binex_00()

a couple of modifications to binex_observables_7f_02() (writing of BINEX 0x7f-02) to more completely set loss-of-lock for L1 and L2 and anti-spoofing flag

special reset of the receiver clock offset was added to binex_observables_7f_02() when reading BINEX 0x7f-02, e.g. output 0x7f-02 is equivalent to +smtt RINEX

2006 Oct 30: added a default BINEX subrecord to binex_out_records() to each record if using +binex and any output record is specified without a subrecord

2006 Oct 25: switched to +smtt ("smooth time tag", or RINEX time tag as GPS time) as default; now must use -smtt to obtain millisecond jumps during translation from certain raw formats

2006 Oct 16: most stderr reports of various non-normal parts of .dat records now require +warn to be set

2006 Sept 29: external_data_string() had a case added so that if other known cases were not found and an external data string (e.g. MET/tilt/...) was found with "|*9900" — seen in NetRS PBO data from a tilt meter — then the string is skipped and not reported

2006 Sep 25: implicit setting of current GPS week from Leica MDB record 130 upon survey start in decompose_Leica_MDB_82()

2006 Sep 22: notice messages from Leica MDB record 130 at start/end of a survey session with the current GPS time in decompose_Leica_MDB_82()

minor change in extract_position()

2006 Sep 21: added some logic to detect new site occupations when reading Leica MDB record 130 from system 1200 receivers, which are being flagged with RINEX event flag 3; currently, no metadata about the new site follows event flag 3 during translation

2006 Sep 20: added some warning messages for Topcon TPS/Javad JPS [rM] if used with GLONASS or UTC time basis (i.e. messages are skipped)

2006 Sep 13: first cut of decoding Topcon TPS/Javad JPS [rM] and [rV] messages

2006 Sep 11: updated IGS receiver/antenna designations up through 8 Sep 2006 entry

2006 Aug 11: updated IGS receiver/antenna designations up through 27 July 2006 entry

2006 Aug 10: slight change in the parsing for the receiver serial number in decompose_Javad_PM()

2006 Aug 8: a new metadata field was added to store the receiver serial number if this is different from a more unique ID number for the receiver (e.g. modern Topcon and Javad receivers)

the receiver serial number field is populated by the 2nd string in a TPS/JPS [PM] message if "rcv/sn" or "rcvsn" is detected in decompose_Javad_PM()

if the receiver serial number field is populated, it is output with +meta on a new "receiver serial number:" line in dump_metadata()

if the receiver serial number field is populated, is takes precedence for the "REC #" in a RINEX OBS header in obs_out_receiver_id() and the ID number is output as a header comment

if the TPS/JPS [JP] message indicates a "GB1000" receiver, this field will be altered to "GB-1000" to be in accordance with the IGS suggested naming convention in decompose_Javad_JP()

2006 Aug 5: Trimble() and read_Trimble_mes_file() were modified to keep track of the Trimble .dat fileset index and only use the date information in the .mes for the first .dat (if the .mes exists) for setting the GPS week (otherwise, there is a potential week rollover problem — an extra week increment — when the actual data is read)

2006 Aug 4: added a +ver[sion] option, which calls a subset of the original +id (current executable, version, and build) using a subset of the original teqc_id_info()

binary_OBS() and binary_MET() were modified to report as an error any first instance of OBS or MET epochs being out of order

an additional constraint on calling sampling_interval_increase() was added: last epoch date must be after 1.0 Jan 1980

2006 Aug 2: with the growing use of teqc to look at L1-only data, two warning messages in qc_warnings() were changed to report that if there are no P-code pseudorange data, that the receiver may be either an L1-only or a P-codeless (squaring) receiver

2006 July 31: modification to decompose_Javad_RD() to set teq.tr.rx.Javad.current_RD to TRUE if any Topcon TPS/Javad JPS [RD] message later than 1 Jan 1988 is read, regardless of whether the user is forcing a week setting

2006 July 26: addition to id() to auto-identify Topcon TPS/Javad JPS file starting with [rE], [rM], or [rV] messages

2006 July 24: have Javad_cks16() working to verify the 2-byte checksum of Topcon TPS/Javad JPS messages [rE], [rM], and [rV] on big- and little-endian processors

2006 July 21: changed next_ublox_UBX_record() to report any message that would result in an overflow and continue; there may be very large UBX messages that are unknown to me

2006 July 20: an addition to spew_Javad_JPS_epoch(): any epoch is now skipped where the date of the [RD] message is 1 Jan 1988 or earlier; this seems to successfully eliminate problems introduced in reading Topcon TPS/Javad JPS when the receiver starts to log data after the NVRAM is cleared but before the firmware knows enough to determine the correct date and time

the record buffer size for u-blox UBX format was increased from 316 to 512 bytes, and a test, warning, and program termination was added to next_ublox_UBX_record() if this limit is going to be exceeded while reading a UBX file

2006 July 19: an addition was made to the BINEX 0x00 struct to hold the initial 0x00 epoch time, in decompose_binex_00() the initial epoch time is saved, and it is now output as a configuration comment in dump_config() when the +bcf option is used

2006 July 7: fixed a long-existing bug in find_position() that only recently surfaced when using +qc +eepx or +qc +eepg on Borland Windows builds

2006 July 5: with the new parsing of Topcon TPS/Javad JPS format in next_Javad_record(), an explicit case to skip an [::] message (JAVAD__c, "Epoch Time") was added to avoid [::] being reported as an unknown or uncoded message

2006 June 29: further slight modification of next_Javad_record() to improve parsing of corrupted Topcon TPS/Javad JPS data; slight change in rx_ok() to help differentiate between reporting the format as Topcon TPS or Javad JPS

2006 June 28: addition to rinex_comment() to skip any RINEX OBS header comment with the string "other post-header comments skipped" — a comment probably only added by teqc — so that if time windowing a previously spliced RINEX OBS file using `teqc -phc` then comments of from the splice points prior to the desired epochs will not show up in the header; post-header comments are not affected

various changes for the reading of Trimble .dat record 17 and RT17 57h to correctly detect SBAS tracking, which uses new good_SV_number() (essentially like the reverse of the original bad_SV_number() without the notice if a number out of range is found); tested on .dat files from a 5700 rx w/ WAAS PRN 122 (AOR-W) and a 5800 rx w/ WAAS PRN 135

some cleanup of reporting of miscellaneous strings in Trimble .dat records 8 and 16, e.g. no message printed if the string is empty

2006 June 27: first cut of adding Leica system 1200 LB2 with GLONASS enhancements; decoding of LB2 0xd1 (GLONASS almanac, ephemeris, or clock data) was added and when an ephemeris it is recast to make use of the decoding already developed for MDB 141; decoding of LB2 0x0d (measurement data) was modified to detect GLONASS SVs and correct for GLONASS frequencies

2006 June 23: slight recrafting of the detection and message reports in next_Javad_record()

2006 June 22: modification of next_Javad_record() to improve detection of a mis-parsing of the file by teqc, or reporting of a corrupted TPS/JPS data, or report of a valid TPS/JPS message not yet coded into teqc

modifications to check_interval() to properly control when obs.basic.mod_dec->rx_clock_reset.original_interval gets set, mainly to avoid it getting reset to the original sample interval when decimating and using multiple files (i.e. it was getting reset to the decimated interval for the 2nd and later files, resulting in the 2nd and later files not being decimated); tested on 1 sec and 0.05 sec raw and RINEX files

in decompose_Leica_MDB_68(), the receiver name for the Leica GRX1200 Classic was changed from GRX1200CLASSIC to GRX1200 to conform to the IGS designation when reading Leica MDB record 104 (0x68)

buffer initialization added to unicode_to_ascii() (will improve getting correct ASCII strings from Unicode strings in Leica MDB records)

2006 June 21: updated extract_Trimble_ant_type() to id the internal R8/5800 antenna and updated the antenna designation to match the 6 June 2006 IGS antenna names

2006 June 20: updated IGS receiver/antenna designations up through 6 June 2006 entry

modification to decompose_Ashtech_R_9() for acceptance of the SV tracking capability

some minor additions to obs_interval() to deal with decimation case, but these alone have not solved the problem of decimating multiple input RINEX files to a single output RINEX file

2006 June 19: decompose_NavCom_ae() was modified to gracefully handle new receiver types that are not explicitly listed in the code; NavCom record 0xe1 will now be skipped; receiver types in 0xae were updated using the NavCom Technical Reference Manual Rev. G (May 2006)

2006 June 2: modified the parsing of Leica LB2 0x0c (system 500) and 0x0d (system 1200) measurement messages to conform to the new methodology used to parse Leica MDB record 120, which corrects a bug found recently in parsing 0x0d messages; preliminary testing is OK (the same method could be modified to parse the original Leica LB2 0x03 measurement message, but this has been left as a future exercise)

2006 May 25: added some "notice" messages to report two or three possible different Trimble receivers for dat record 5 with receiver id values of 2, 4, 6, and 11; receiver id value of 0 (4000S*) is so general, it's hopeless

2006 May 23: a large change in antenna position and a few fopen error messages are now only reported with warnings turned on (e.g. +warn)

2006 May 19: a couple of corrections in reading the Leica MDB record 141 and 142 for RINEX GLONASS nav file

2006 May 11: completed first round of debugging of the updated Leica MDB code for Leica's new system 1200 "GG" (GPS + GLONASS) receivers; the decoding of the MDB record 120 looks pretty good; there are a few issues to resolve with GPS and GLONASS navigation messages in RINEX, i.e. differences between Leica's Geo Office 4.0 produced RINEX and that teqc-produced RINEX

2006 Apr 27: updated Leica MDB code for new system 1200 release with new receivers and antennae designations in MDB records 104 and 108, GLONASS and multipath mitigation correction (MMT) in record 120, and GLONASS navigation message in record 141; all needs to be tested

2006 Apr 25: changed the timecode line of the qc short report to include a frequency count to indicate (for the time being) whether the data is dual-frequency or single-frequency; at the moment, any indication of dual-frequency data in the target file sets the indicator to dual-frequency; see new qc_frequency_count()

2006 Apr 17: changed the report of negative multipath sigma to be fabs(sigma) > 1e-11 (up from 1e-13) in mp_ma_sigma(); probably this report is no longer needed since all known cases over the years have been when the sigma really is zero due to numerous slips, but the computed sigma is negative due to accumulation of floating point noise

added a print of the 4-char ID of the monument/marker, plus name and number if different, just before the receiver and antenna metadata in the qc short report in qc_short_report()

2006 Apr 13: made the reporting of uncoded identification of Leica system 1200 receivers and antennae consistent for the various MDB metadata records

2006 Apr 12: corrected reading of metadata in Leica MDB system 1200 0x68 (104), 0x6c (108), and 0x71 (113) to account for the 2-byte Unicode strings in these records; also added a quick unicode_to_ascii() string extractor

added entries for auto-population of antenna type IGS strings LEIAX1201, LEIAX1201, and LEIATX1230 from antenna 1-byte type in Leica MDB system 1200 0x6c (108) record in decompose_Leica_MDB_6c()

2006 Apr 5: added read capability for Leica MDB system 1200 0x72 (114) for met data

dealloc memory cleanup is now being skipped for all builds in terminate() — Windows and gcc builds are just too much of a pain in the neck

fixed a bracket typo in dump_config() which was leading to a segmentation fault when using +bcf and dumping out the xyz coordinates

2006 Mar 29: a sanity check for the size of the antenna (eccentricity) offsets was added, obs_out_ant_height_test(), to see if each value fits within the allowed RINEX format of %14.4lf and an error message is written if any offset does not, though the out-of-range value is still written to the RINEX header (— I suppose this type of test could be added for all the other numeric RINEX header fields, but it seems like an activity of vanishing returns)

2006 Mar 24: removal of some moving/static antenna status debugging lines from the Trimble .dat code

2006 Mar 23: the functions Javad_id() and ublox_id() were changed to both be twobyte_id() since the original functions were identical

2006 Mar 22: another attempt at more straightforward decimation for the user: the function clock_jump_search() now will immediately return (i.e. not look for possible millisecond clock resets in the time tag) if +smtt is set — which applies now for any input target file including +smtt; this has been tested on the standard decimation suite of RINEX files and all seems to be well; thus if the input data is known to be free of millisecond resets in the time tag, then the decimation should always work if using +smtt -O.dec #, though in many cases the +smtt may not be required; the original sampling interval does not need to be known and I think this change should allow the decimation to work with original sampling intervals down to 0.001 second (1000 Hz), which was also tested on a synthetic RINEX obs file

2006 Mar 17: minor debugging prints cleaned up

first attempt are putting an hourly "time code" in the qc; mods in qc_constellation() and qc_short_report(); tested on one-day and two-day data

2006 Mar 16: changed back to CLK_BASE parameter equal to 1 second, as this is the only solution that works with current algorithm and all cases, though this does continue to require to use -O.int to specify the original sample interval when less than 1 second

2006 Mar 15: rolled back the decimation code in clock_jump_search() and in obs_epoch_check() to code on Dec 12 and with the CLK_BASE parameter back to 0.002 second; for a consistent decimation for all known cases, this seems to be the right strategy even though this requires using -O.int to specify the original sample interval when the first epoch time tag is "non-standard" when decimating; tested on 20- and 30-sec data with increasing and decreasing millisecond resets, 10 sec CMC data (slightly non-integer time tags), 1 sec Zodiac data (significantly non-integer time tags), 20-Hz and 50-Hz data — though all with INTERVAL in the header

2006 Mar 14: external_data_string() had a case added so that if other known cases were not found and an external data string (e.g. MET/tilt/...) was found with "|*0100" — seen in NetRS PBO data — then the string is skipped and not reported

2006 Mar 9: u-blox UBX translation was modified a bit so that the receiver clock offset could be approximated for output in RINEX if the NAV-CLOCK messages are present

2006 Mar 7: first cut on a u-blox UBX reader, currently decomposing the UBX messages RMX-RAW (0x02 0x10), RMX-EPH (0x02 0x31), NAV-POSLLH (0x01 0x02), and NAV-CLOCK (0x01 0x22)

2006 Mar 3: finished an addition to the Ashtech R-file suite that allows for a reasonable translation of record 9 (aka ZTINYTYPE), though the exact details of what's going on with receiver millisecond clock resets is somewhat problematic

2006 Jan 31: updated IGS receiver/antenna designations up through 20 January 2006 entry

2006 Jan 26: switched compiling of all Solaris Sparc builds from Solaris 5.8 to Solaris 5.9

2005 Dec 27: following the changes made on 28 Nov, now backtracking a bit to have the CLK_BASE be 0.02 second (50-Hz sampling rate) rather than 0.002 second (500-Hz sampling rate), because a CLK_BASE of 0.002 second doesn't do the decimation of time tags with millisecond resets correctly

2005 Dec 20: added identification of Trimble's R8 receiver in extract_Trimble_rx_type()

2005 Dec 19: minor re-tweaking around strrstr() to get things to compile with other systems

added identification of Trimble's R7 receiver in extract_Trimble_rx_type(); added a placeholder of "  " in extract_Trimble_ant_type(), though I'm not sure what antenna it refers to (new default for "unknown"?)

2005 Dec 16: some minor tweaking around strrstr() to get things to compile with cc on HPUX 11.00

2005 Dec 15: corrected the phase translation for BINEX 0x7f-02 to correctly account for millisecond clock resets (e.g. from Trimble 4700) in binex_7f_02_obs(); splitting of l1_jda() and l2_jda() into l1_7f02(), l1_7f03(), l2_7f02() and l2_7f03()

the clk_base in qc_start_obs_epoch() really has to be 1 sec, so it now has its own definition in defines.h called QC_CLK_BASE

a new option +qcq was added that is a shorthand for +qc -plot -report, thus doing a "quick" qc without plot files or a report file; note, for example, that +plot +qcq would do plots without a report file (since the +plot option is evaluated before +qcq in this example) and thus this would be exactly equivalent to +qc -report since doing plot files is done by default unless specified otherwise; likewise +report +qcq is exactly equivalent to +qc -plot

2005 Dec 14: for translation of BINEX 0x7f-03, modified binex_observables_7f_03() so that the stored receiver clock offset obs.receiver.offset is set to zero any time a receiver offset value is not present or is not valid

added an output line for the file format in dump_metadata() when using +meta

2005 Dec 13: edited dump_metadata() and dump_metadata_rinex() to have new output for +meta option (to conform to new UNAVCO DMG Oracle schema)

2005 Dec 9: had to an a default initialization to the len parameter to zero in next_Javad_record() to avoid the possibility of accessing buf out of range when encountering an unknown Javad JPS/Topcon TPS record

2005 Dec 6: receiver.version was changed to receiver.firmware for internal purposes

added receiver firmware to qc_short_report() output if non-null (see 27 Oct 2005)

2005 Dec 5: find_position() was modified so that if the current point position had poor convergence (position residual > 100 m), then the antenna position is reset to the last converging antenna point position

2005 Nov 28: the top of the qc default landscape mode was modified a bit to include the current teqc version and have the "SV" line include time tic marks

check_interval(), clock_jump_search(), and qc_start_obs_epoch() are now using a clk_base value of 0.002 second (2 milliseconds) — rather than the original 1 second — which has been tested on data with normal millisecond clock resets, 50 Hz data (0.02 sec interval), and Rockwell Zodiac data (epochs significantly off from the integer second); this should greatly reduce the need to specify -O.int with the original sample interval unless the original sample rate is greater than 500 Hz, though e.g. -O.int was still needed for decimation of the Rockwell Zodiac test with epochs significantly off from the integer second

2005 Nov 23: decompose_Trimble_16() was tweaked a bit so that the ANT_H_DEBUG debug will not print beyond the 9th character (i.e. after the height code)

2005 Nov 21: possible_wrong_GPS_week() will now report the current allowed difference in time between a data epoch and a GPS ephemeris GPS week + ToW (note: currently this difference has been and still is set at ±12 hours)

IGS_receiver_designation() and IGS_antenna_designation() were modified so that the receiver and antenna type names are only tested against those in the IGS listings if they are non-null

2005 Nov 15: tests were added in obs_epoch_check() to reduce the number of false reports of sampling interval increase or decrease when the user is examining either multiple RINEX files or spliced RINEX from a receiver that uses millisecond clock resets for coarse clock steering and the translation employed millisecond jumps in time tags and smooth phase and pseudorange (equivalent to a teqc -smtt translation); the current test requires that the new interval be more than 1% different from the current interval before either an increase or decrease is reported

2005 Nov 14: changes in multiple places for doing a qc on L2C data (note that option +C2 is still required); two new qc data indicators were added to the ASCII time plot: `e` indicates L1, L2, C/A, and L2C and `=` indicates L1, C/A, and L2C

2005 Nov 9: re-do of the code changes on Nov 7 for the XDR NMEA strings where the scan and possible NMEA string repair has now been collapsed into a new XDR_scan() which is called by decompose_Ashtech_R_6() and decompose_Ashtech_U_D(); XDR_scan() also tries truncated strings starting in "R," and "," in addition to "DR,"; external_data_string() was put back to the earlier code

2005 Nov 8: added logic in met_epoch() (similar to what had been in GPS_NAV_times_make_sense() and possible_wrong_GPS_week()) so that if a data read starts with the wrong assumed GPS week and this is detected during the reading of met data, then either this is reported to the user or if a metadata extraction is being done teqc will terminate with the "week: ####" message

2005 Nov 7: format.h, format.c, id(), file_id(), and process_input() were updated so that teqc would correctly identify a Hatanaka-compress "compact" RINEX file with +mdf or if a Hatanaka-compressed file were accidentally used an an input file to teqc; note that crx2rnx is still needed to convert Hatanaka-compressed RINEX into normal RINEX before teqc can read the data

modified decompose_Ashtech_R_6(), decompose_Ashtech_U_D(), and external_data_string() to read slightly truncated XDR NMEA strings ("DR," as well as complete "XDR,")

2005 Nov 4: in obs_data() the satellite total is now set to be zero whenever a RINEX OBS epoch flag of 2, 3, 4, or 5 is encountered

obs_system_check() is aborted if the satellite total is zero

2005 Nov 2: had to change the sscanf() call in decompose_AOA_CB_ephemeris() from a "%ld" to "%d" in order to read the ToW field of a ConanBinary EPH record on the Solaris 64-bit builds

2005 Nov 1: the recasting in de_pad_right() and de_fuzz() had to altered slightly to satisfy certain gcc compilers

2005 Oct 28: updated IGS receiver/antenna designations up through 5 October 2005 entry; removed all deprecated IGS name entries

de_pad_right() was modified to remove ASCII characters 0x01 — 0x20 and 0x7f — 0xff at the end of the string (instead of just 0x0a, 0x0d, and 0x20)

a new de_fuzz() was created to remove any ASCII characters 0x01 — 0x19 and 0x7f — 0xff anywhere in a string by left-shifting over the offending characters

a call to de_fuzz() was added to the end of option_string() to eliminate ASCII characters like crtl-M (\r) at the end of a config string entry (_what_ crazy things will users try next!?)

2005 Oct 27: added metadata lines to qc_short_report() output which identify the receiver and antenna types, plus the (serial) numbers if they are present; these lines occur just before the "Time of start of window"

2005 Oct 26: compiled 64-bit version of teqc on Solaris 5.8 and tested it on various formats

2005 Oct 17: new -notice option to suppress most messages with "Notice" in them; note: some messages which before were suppressed with -warn now will also need -notice

new +quiet option, which automatically sets -warn and -notice and suppresses the qc "qc full>>>>>> ..." or "qc lite>>>>>> ..." messages during a qc run

2005 Oct 3: qc_landscape_out() was modified right after the call to qc_window() to allow the qc output of input with no epochs to proceed (previously a problem on Windows)

2005 Oct 1: implied_window_limit() was modified to only deallocate the line needed for reading in RINEX before calling terminate()

2005 Sep 30: sampling_interval_increase() was modified to suppress the reporting of sampling interval change or gaps when -warn is used

2005 Sep 27: GPS_week_check() now has a possible error message of a questionable starting GPS week being suppressed if -warn is used

2005 Sep 26: leap_seconds() was updated to include the introduction of a positive leap second at the end of December 2005

2005 Sep 16: error fixed in Leica_LB2_0d_obs(): had not been skipping over the 4-byte Continuous Lock Time parameter in Leica System 1200 0x0d messages

2005 Sep 2: updated IGS receiver/antenna designations up through 29 June 2005 entry (which leads to the question of why the on-line version of the IGS table that I checked on 2 Aug was only up to 5 May and not the 29 June changes?; Angie?)

2005 Sep 1: initial version of a new requested qc feature: -slips <filename> saves a file with more details on certain slips, currently being the SV, elevation, azimuth, type of slip (ion, mp1, or mp2), and the epoch when the slip was detected

2005 Aug 31: a couple of modifications in find_config() for dealing with paths and drive changes (e.g. A:, B:, C:, ...) in DOS for the config file

2005 Aug 29: the lower ToE - ToW limit was decreased from -70 minutes to -130 minutes in GPS_NAV_times_make_sense()

2005 Aug 2: updated IGS receiver/antenna designations up through 5 May 2005 entry

implemented new mapping for 0-9 RINEX flag for SNR: snr_rnx= min(max(int(snr_dBHz/6, 0, 9) when the SNR value is in dBHz

2005 July 29: test build on Linux x86_64 (dynamically-linked); no major problems seen

2005 July 27: new +C2 option must now be used to include RINEX version 2.11 C2 observable, and the default observable lists with and without C2 have been redefined in set_obs_obs_out()

2005 June 27: minor rewording of qc +reset and -reset options for +help in usage() (note: +reset is the default, and -reset was only intended for debugging but has remained for legacy issues)

2005 June 3: order for reading east (E) and north (N) antenna topocentric offset was reversed from the correct order in extract_binex_00_field() and binex_hdr_message_00_field() (only effected BINEX metadata representation)

2005 June 2: added help output for +r option (still only applies to BINEX)

2005 June 1: added BINEX capability for reading/writing 0x00 field ID 0x22 (geocode)

2005 May 17: a bit more compiler tweaking for K&R on HP-UX 10.20 +DAportable option for older processors (I think)

a bit of code defuzzing for gcc compilation on HP-UX 10.20, mainly to bypass system definition of strrstr()

2005 May 16: code defuzzing for K&R compilation on HP-UX 10.20

2005 May 6: the previous implementation of reading DBEN records has been changed to more accurately reflect a general DBEN sequence of data records; PBN records are no longer required, and, in fact, if they are present they will be ignored; reading of "unpacked", doppler-less RCA, RP1, RP2, and RPC DBEN records was tested; reading of "unpacked", doppler-less RWL records should be detected but will also be ignored except for the time tag (since RINEX observables cannot be extracted); because there is no GPS week information in DBEN records, it is advised that the user log ephemeris records (SNV) so that the data can be easily translated at a later date with less of a change of a GPS week ambiguity

in ancillary_filename_template() the use of mktemp() has been replaced with mkstemp except for Borland and Watcom builds

2005 May 4: in obs_epoch_with_gps_week() added case for Rockwell Zodiac (which had been accidentally omitted)

2005 Apr 29: binex_00() modified so that using -B.px or -B.pg will now accept an optional fourth argument — which must come first — which is the ellipsoid model name if one wants to specify an ellipsoid other than WGS-84; dump_config() was modified so that the optional ellipsoid model name is output when using +bcf

a slight modification to IGS_log_coord() so that it will iterate slightly if the seconds were to round to "60.0000"

2005 Apr 28: B-files from an Ashtech LM-XII2 receiver with firmware 6F was found to have full L2-phase stored in it, even though this is a L2-squaring receiver; therefore in Ashtech_dld_block(), a special case was added to not divide the stored "L2" value by 2 when the firmware is identified as 6F

2005 Apr 15: added cases to skip reporting of NavCom binary messages 0xd3 and 0x5b

2005 Apr 13: minor code additions to clock_jump_search() so that clk_base is only calculated once

2005 Apr 12: in extract_modulo_decimation() an initialization of basic->mod_dec->rx_clock_reset.original_interval to zero was added

in clock_jump_search(), there is now a test to make sure that clk_base is not less than 1 nanosecond

2005 Apr 11: new code for Leica system 1200 message 0x0d, but not tested yet due to lack of test data

2005 Apr 8: updated receiver listing in decompose_Leica_MDB_68() to reflect changes to GPS System 1200 Measurement DB, version 1.25 (4 Mar 2005)

2005 Apr 4: re-defined C2_CODE_ON in defines.h to be TRUE to allow L2C == RINEX C2 observable as per 2.11 draft; modified Trimble_17_m57h_obs() to extract L2C from Trimble .dat record 17 or RT17 0x57 and tested this using synthetic data from Trimble

2005 Mar 29: updated IGS receiver/antenna designations up through 16 Nov 2004 entry

2005 Mar 28: first cut of code for supporting Leica system 1200 MDB records, plus some minor code improvements for the original Leica system 400/500 MDB for record 20 (full observation data)

2005 Mar 25: change to epoch skipping condition in obs_epoch_check() to test decimation on Garmin 1-Hz data where the time tags are arbitrary (i.e. not integer seconds) and there is a 1.31e-5 drift (1.132 second per 24 hours); this change may or may not be kept

2005 Mar 8: Major Bug found! (due to code changes made on 21 Jan 2005): functions rinex_obs(), rinex_met(), process_rinex_obs(), process_rinex_met(), process_rinex_obs_end(), and process_rinex_met_end() were modified to include a pointer to the BSC_INFO struct for parallel construction to the equivalent rinex_nav*() functions for their being called in rinex_out()

2005 Mar 7: added cases for Javad JPS/Topcon TPS message ID [::] to play a role like message ID [||]; no other functionality at this time

2005 Mar 4: compiling with Solaris 5.8 cc showed a few warnings about "old style" function declarations (implied "int" for function type); these were corrected (all functions now have an explicit type)

added a case to skip Javad JPS/Topcon TSP message [mr] (rotation matrix) in parser next_Javad_record()

2005 Mar 2: changed calculation of clk_base in clock_jump_search() to be based on the original sample interval rather than obs.session.interval so the decimation works for original sample intervals less than 0.5 second

in extract_modulo_decimation() the base for when the multiplier is 1 (i.e. decimation supplied in seconds) is reset to the modulo_decimation factor (rather than 1) to allow for a decimation factor less than 1 second

2005 Feb 17: put a check in next_CMC_Allstar_record() so that if the data is corrupted, a buffer overflow when attempting to read is prevented

defined "version" string for dummy GPS NAV file in ephemeris_file_extract() so that it would have a valid value in rinex_nav_GPS() during a qc with an input GPS NAV file ("qc full" run)

2005 Feb 10: fixed code in decompose_binex_7f() for reading 0x7f-03 when no receiver offset field is present; previous code had an undefined clock_offset variable which was incorrectly triggering the detection of a millisecond reset at the beginning of reading a sequence of 0x7f-03 records

2005 Feb 4: a new index was added to the QC_SV_PLOT_LIST struct to keep track of the maximum number of data bins for each plot file, and this is used in qc_compact_file_allocation() so that if the data bin is reallocated during the same epoch to a new maximum, the previously stored data is not zeroed (as had been happening with the first epoch of plot data when doing a "qc lite" run, i.e. no navigation messages)

in open_qc_compact_plot_file(), the start time of the COMPACT plot files is now correctly being offset by one epoch because the 1st epoch of the COMPACT plot files corresponds to the 2nd epoch of the observation data (so that all COMPACT plot files, including iod which requires an epoch difference, are in sync with one another)

a extra switch was added to flush_bs_buffer() to terminate RINEX OBS lines with event flags 2-5 that have a blank in the following field ("number of satellites")

2005 Feb 3: the Vaisala PTU200 met strings are now thought to be formatted as: "020cxxxx.x hPa xxx.x 'C xxx %RH ..." which required a trivial change in external_data_string() to identify the string

added a new boolean in the FILE_INFO struct to identify an ASCII file that terminates lines with only 0x0d (carriage return) and logic in get_next_rinex_line() to chunk through a RINEX with such line endings

2005 Jan 28: more fun with Ashtech R-files!: for R-files from SCIGN, the receiver header string was found to contain a totally invalid value for the sampling interval — the string says 30 seconds but the data is obviously perfect 5-second sampling, so the part of Ashtech_R_receiver_header() which exacts the sampling interval from the string has been disabled

2005 Jan 27: changed the increment variable used to generate the bottom time-axis line in the ASCII time plot for +qc in qc_landscape_out() from a 1-byte unsigned integer to a 2-byte unsigned integer so that a plot width of 255 (i.e. -width 255) would not get into an infinite loop

2005 Jan 21: added additional logic in new rinex_out() to cover cases like format verification, metadata extraction, qc, BINEX output that were in out_settings()

2005 Jan 20: (OK, one more time:) RINEX() and out_settings() were modified again, postponing assignment of null *.basic*.out.fp in out_settings() to RINEX() when the input is identified as RINEX

similar sequence of calls in RINEX() for the different types of RINEX files was split off into rinex_out()

2005 Jan 19: RINEX() and out_settings() were modified again: because default assignments of stdout to null *.basic*.out.fp were not getting made if the target files were RINEX NAV or MET files; not sure if this current change nullifies the fix made on 18 Nov 2004

2005 Jan 14: the parser in next_Javad_record() (for Javad JPS and Topcon TPS formats) was modified to skip over null bytes where otherwise the start of a message should be

2005 Jan 13: when needed, id() was using the entire user-supplied filename which may include a path prefix, but now it is stripping off any leading path

+bcf with either -B.pg or -B.px entry now also outputs as a comment the lat/lon/h in IGS log format (see new IGS_log_coord() function)

2005 Jan 12: decompose_MET3_string() for reading MET3 strings from Trimble .dat or RT17 format modified to not require the presence of an "XDR," or "0R0" or "020c" string fragment (i.e. this function should not require modification as new MET string formats are discovered); identification of MET string fragments is now only in the revised (10 Jan 2005) external_data_string()

2005 Jan 10: all the NMEA MET and Vaisala WXT510 code has now been collapsed into a new yams.c and yams.h ("yet another met string") and upon detection of a possible met or external data record string the function external_data_string() should be called (which replaces start_NMEA_strtok()); Vaisala met strings of the form "020c 997.0 hPa 30.7 'C 58 %RH ..." from the PTU200 are also now parsed

2005 Jan 5: more fun with Trimble's NetRS!: the NetRS will create an entire data file with no SVs tracked ... had to add a special test in decompose_Trimble_17_m57h() to test for zero SVs in .dat record 17 before calling obs_epoch_no_gps_week() (I suppose all data record parser functions should be written this way, but until the NetRS it hasn't been a problem with any other receivers or formats)

2005 Jan 3: for Trimble .dat format, added reading for Vaisala's WXT510 weather transmitter in it's "0R0" format; this wasn't added to Ashtech or other receiver formats because it's not yet known how the 0R0 string will show up; this includes reading Sm = wind speed in m/s, Dm = wind direction in degrees CW from north, Rc = rain accumulation in tenths of mm since the last measurement reading, and Hc = hail accumulation in counts since the last measurement reading

2004 Dec 3: added a reset of teq.tr.offset to zero at the beginning of each binary file in process_input() — this seems to be needed to properly reset multiple file parsing for certain formats like Leica MDB

2004 Nov 23: some code defuzzing during test compiling on IBM AIX 4.3 and DEC Digital-UNIX 4.0; one mystery was the definition of IRRELEVANT_TRUTH from util_tools.h not being accepted in ephemeris_file_location()

2004 Nov 19: slight change in qc_file_list() to correctly identify stdin if was being used during +qc mode

2004 Nov 18: in RINEX(), tests were added to check the value of teq.standard_out before setting any null *.basic*.out.fp to out.fp (which is usually stdout, unless +out option has been used); this eliminates the problem when importing a RINEX NAV file with -nav during a qc run (+qc) on a file that is not RINEX and having any navigation messages in the data read and dumped as RINEX NAV to stdout

2004 Nov 17: added an explicit null string termination to each line of the qc ASCII plot (obs_table, clk_table, etc.) in qc_sv_line() and qc_landscape_out() (search on binary_image in code)

2004 Oct 28: added some code to dump_config() that will give the current time stamp (as a comment field) when generating a new BINEX configuration dump using +bcf

2004 Oct 27: added -warn suppression of final notice message of trying different GPS weeks in possible_wrong_GPS_week()

2004 Oct 25: added -warn suppression of notice message of conflicting GPS week message in adjust_week()

start_NMEA_strtok() was modified to start XDR strings on the last occurrence of "XDR," in the string to eliminate partial XDR string dumps from MET packs; this required adding the non-ANSI function strrstr()

2004 Sep 29: first cut of including code for -smtt/+smtt option; reading of Trimble formats is fairly straightforward, but reading of Ashtech and Javad/Topcon formats will require more extensive testing

2004 Sep 27: first cut of complete reading and writing of proposed BINEX 0x7f-03, on both little- and big-endian processors, including both endian reversals (+r option), plus translation of 0x7f-03 to RINEX with and without "smooth time tag" (-smtt and +smtt)

2004 Sep 23: old unofficial option +GPS_t has been eliminated and will be replaced with the new official option +smtt == "use smooth time tag", i.e. during translation to RINEX, the usual Berne-style of translation with smooth phase and code measurements with millisecond jumps in the time tag is replaced with an equivalent (and equally valid) translation with millisecond jumps in phase and code measurements with smooth time tag

2004 Sep 22: added an ad hoc receiver "channel number" assignment during decoding of certain remaining formats (e.g. Trimble DAT, RT17, TSIP; Leica DS, MDB; RTIGS; Soc; Rockwell Zodiac) using the SV ordering as the channel number

2004 Sep 20: translation of all formats for the RINEX 0-9 SNR flags are now set using snr_map() which will use the old Bernese method bernese_snr_0to9_map() if the SNR is not in dBHz and a Bernese mapping array for the SNR is specified

2004 Sep 16: fixed bug in obs_types() that correctly does merging of two RINEX OBS or MET files with the same observables but in a different order by not accidentally clobbering the curr.type array if it is co-using the same memory as the in.type array and not updating the index array

renamed the old unofficial option +RINEX_rx_clk_offset (to output the receiver clock offset in RINEX version 2.xx) to the new official +rx_clk_off[set] which will still apply for RINEX 2.xx and now certain BINEX records

added teq.tr.rx_ms_jump, teq.tr.rx_L1_offset, and teq.tr.rx.L2_offset (for future code)

2004 Sep 15: fixed bug in the calling of obs_phase_overflow() and obs_other_overflow() in obs_binex_out() during conversion to BINEX; this bug was introduced on 16 Apr 2004

2004 Sep 14: added a obs_splice boolean flag to out.c to correctly insert the RINEX FILE SPLICE part of a comment with the -phc option only when RINEX files are being spliced

2004 Sep 2: rewording of some usage text in usage() (e.g. output from `teqc +help`)

fix in g_arg() to correct the outputting of the RINEX OBS header comment for option +rds only (old code would output the comment for -rds as well)

2004 Sep 1: fixed RINEX OBS comments for translation of Leica LB2 and MDB formats to indicate correct mapping of SNR 0-9 flags on L1 and L2 (now calling dBHz_snr_comment()); the comments have been in error (reporting the older LB2 mapping) since 19 May 2003

2004 Aug 31: conversion of SNR from AOA receivers (all receivers, TurboBinary and ConanBinary formats) to dBHz using C/No dBHz = 10*log10(a*a/2) where a = volts/volt, introduction of AOA_snr() and AOA_rx_specifics(), modification of turbobinary_snr_0to9_map() and assignments for all RINEX S1 and S2, added test for teq.tr.dBHz_snr for AOA receivers in binary_OBS() to print appropriate RINEX header for dBHz; can switch back to SNR reporting in volts/volt by setting #define DBHZ_SNR 0 in aoa.c

cases for Trimble 5800, R7, R8, and NetRS receivers were added to Trimble_rx_specifics() for reporting SNR in dBHz in native (.dat and RT17) formats

renamed snr_comment() to dBHz_snr_comment() (to be a bit more clear)

2004 Aug 27: added an "else if" clause to flush_bs_buffer() for post-header line situation where all post-header lines are deemed unneeded and thus eliminated requiring a filler COMMENT line to be added (alternate solution would be allow an output value of 0 for the bs.hdr_fields_to_follow and no filler line, although it is not known how this would effect other RINEX readers for event flags 2-5, i.e. would they choke if the "lines to follow" value is zero?)

2004 Aug 16: added at call to correct_GPS_nav_times() in rinex_nav_GPS() so that reading of a RINEX NAV file will apply the same potential corrections to ToC, ToE, and/or ToW as during a translation; see 1999 Feb 9, except correct_nav_times() was renamed correct_GPS_nav_times() in the interim

2004 Aug 5: due to changes made on 6 Jan 2004, reading of Leica LB2 0x03 records during a GPS week transition causes the week to be incremented too many times when there is one or more LB2 0x85 record between the 0x03 record at the end of the week and the 0x03 record at the start of the next week (and same for Leica LB2 0x0c records if using the -week option to set the GPS week); the fix is to detect when any Leica LB2 records (0x03, 0x0c) has been read and set the new receiver specific flag teq.tr.rx.Leica.LB2_obs_read and then skip any setting of the GPS week during the decomposition of 0x85 if this flag has been set

added a new option +skip_init_LB2_03 which can be used to skip the first Leica LB2 0x03 record (due to fact that we are finding some daily LB2 files with some weird or old 0x03 record at the very beginning of the files)

2004 July 29: updated IGS receiver/antenna designations up through 16 June 2004 entry

2004 July 27: added additional logic in Trimble_17_m57h_wf_and_obs(), Trimble_17_m57h_constellation(), and Trimble_17_m57h_obs() for decomposing Trimble DAT (record 17) and RT17 (record 57h) when there appear to be some initial valid PRN values in the epoch prior to invalid PRN values

2004 July 26: added cases for JPL Soc and IGS RTigs format conversion to BINEX 0x7f-00 and 0x7f-02 in binex_observables_7f_00() and binex_observables_7f_02()

defined SNR storage for JPL Soc and IGS RTigs formats for BINEX 0x7f-00 in binex_observables_7f_00() and binex_7f_00_obs()

added a missing break in the switch for P1 decomposition in binex_7f_02_obs(); without the break, a decomposition requesting P1 when C1 is present leads to an incorrect output of P1 and P2 (though if only requesting C1 and P2, then C1 and P2 would be correct; or if C1 is not present, then P1 and P2 would be correct)

2004 July 15: modified the +diag dump in next_Ashtech_U_record() to distinguish between the two records BR\00\09 and BR\00\07

added a case in check_geo() (cartesian to geographic conversion) to update the geographic coordinates when the geographic height is essentially -1 x semi-major axis of WGS-84

2004 June 23: modified the test for the additional code for ConanBinary in nav_processing() that was introduced on 2002 Dec 5 to also make sure that ConanBinary time (from any record) is non-zero and that the GPS week hasn't been set with the -week option

2004 June 10: next_Javad_record() was modified to clean out any partial epoch messages if message [||] is encountered without a leading [~~] message at the start of the current epoch (see case JAVAD__p)

2004 May 27: Leica_LB2_0c_obs() was modified to not allow user_clock_time - channel_time_base to be negative (mainly to fix bogus times and therefore observables on Sunday at 00:00:00)

decompose_Leica_LB2_fa() was updated to include a few more known submessages; code fo submessages 0x02 and 0x07 still needs to be written to extract geodetic coordinates

2004 May 25: added an extra condition in the default case in new_position() so that a position calculation would not be attempted unless the workspace structure of the qc structure was non-null

2004 May 14: another modification to the parser in next_Ashtech_U_record(), to rewind 1, 2, or 3 bytes if reading a file and finding a record header mismatch with known records

2004 May 6: the initial part of the parser in next_Ashtech_U_record() for reading Ashtech U-files was enhanced to more definitely read and recognize the first four bytes of each U-file record with introducing a possible misread when unrecognized (e.g. new) U-file records are encountered (the new code is ugly and more difficult to add new records, but is fast and efficient and seems to be robust)

case for Ashtech micro-Z and ZXtreme receivers were added in Ashtech_rx_specifics() and Ashtech_snr() were added 1) to deal reading a B-file converted from a U-file from one of these receivers and 2) to deal with -O.rt "ASHTECH Z-X" translation of a U-file or B-file (assuming the data is really from a ZXtreme)

2004 Apr 27: decompose_Trimble_30() has now added to read part of Trimble dat record 30.1 to extract the receiver serial number, which takes precedence over the receiver serial number in record 5.2; for option +meta the number shown will be from 30.1, in RINEX translation the number from 30.1 will only be in the OBS header if 30.1 occurs before the first data epoch that is to be output

2004 Apr 16: eliminate_oversize_phase() has now been replaced with obs_phase_overflow() and occurs only before outputting RINEX or BINEX and after reading RINEX with the +reformat option (i.e. this is no longer done after reading the phases for the Ashtech formats), to eliminate phase overflow as now being seen in data from the Trimble NetRS when clock steering is enabled; a similar function obs_other_overflow() checks for large sizes for other observables and occurs in the same places

interestingly, the above does not remove NaN values

2004 Apr 12: updated IGS receiver and antenna designations through to 11 Feb 2004

2004 Apr 8: some changes in next_Ashtech_stream_record() so that $PASH records RCA and BPS could be identified

reading of Trimble .dat file having record 16.27 with extract_Trimble_ant_type() updated to include antenna types G4 (IGS TRM29659.00) and DT (IGS AOAD/M_T), though G4 also implies some type of (unspecified) radome in use as well

2004 Apr 5: Javad() contained a bug which incorrectly reset the value of the 4- and 8-byte NaN values on little-endian processors after reading the first Javad JPS/Topcon TPS file, possibly resulting in "NaN" values in the RINEX OBS

2004 Apr 2: clarification in usage() of use of -NaN_obs option

2004 Mar 31: deprecated IGS antenna name assignment for Trimble .dat record 16.27 for some 2-char codes replaced with newer (preferred) IGS names

2004 Mar 29: minor code cleanup for cleaner compile with Borland 5.0

removal of receiver clock offset argument from met_epoch() and related calls (since this has been zero for a while)

2004 Mar 25: same minor code change as on Mar 24, except for BINEX, Leica, NavCom, Rockwell, RTIGS, and Soc formats

2004 Mar 24: decoding of Ashtech U-files with decompose_Ashtech_U_V7() and decompose_Ashtech_U_V9() was changed slightly to allow -week to override the GPS week value in records BR\00\07 and BR\00\09 which, by known example, can be wrong

2004 Mar 19: updated binary_OBS() for printing out standard snr_comment() for records that use snr_map(); now, teq.tr.dBHz_snr should be set to FALSE unless the format is known to use SNR in dBHz — in which case this should be set in process_input() just prior to calling the function that processes that specific format — or if the format is mixed (e.g. Ashtech, Trimble, Soc, BINEX), then there is code in the reading of that format for setting teq.tr.dBHz_snr based on the specific receiver, subrecord type, or some other criterion

2004 Mar 16: new obs_system_check() which attempts to get the RINEX OBS system code correct, assuming system has not been set by user with -O.s[ystem], for translation of formats into RINEX given any SV filtering and the SVs present in the first observation epoch that is output; this eliminates the need to try to set the RINEX_SYSTEM flag (often incorrectly) at the various decoding points for Ashtech, Javad, Topcon, and BINEX formats

2004 Mar 12: typo in javad.h defining the hex value of Javad JPS/Topcon TPS message [rc] corrected (was 0x7273 instead of 0x7263; the typo prevented [rc] messages from being correctly identified and then decoded)

modification to obs_arg() so that -O.s[ystem] option accepts a lower-case argument, though if lower-case, the arg is converted to upper-case

modification to ephemeris_file_location() (and minor change to its call in qc_nav_files()) so that SV filtering (e.g. -G[list]) filters the qc ephemeris list, so that one gets a reasonable qc while doing SV filtering (without this the SV observations were filtered out, giving rise to missing observables on those SVs)

2004 Mar 9: first cut of a NavCom Technologies Inc. format translation, reading message 0xb0 for RINEX OBS, and 0x81 for RINEX NAV, though setting the A/S status of the SVs in the OBS file requires encountering an almanac 0x44 for subframe 4 page 25

2004 Mar 8: obs_epoch() modified so that millisecond resets are only accumulated if the observation epoch is within the time window

for reading of RINEX OBS and MET data and ARGO format, obs_data(), met_data(), and next_ARGO_epoch() were modified to better keep track of whether an epoch was in or out of the specified time window when decimating by controlling the arg to clock_jump_search()

option n_geos is now n_SBAS, and all codes references to "GEOS" are now "SBAS"

2004 Mar 5: update of extract_Trimble_rx_type() and extract_Trimble_ant_type() using Trimble DAT file format document, 30 June 2003 (most recent version just sent in by Brian Frohring @ Trimble)

including test in parsing of Trimble dat file for new records 25, 30, and 31 — though these are not yet decoded

2004 Mar 4: addition of a new option, +doy, which converts the date in metadata dumps and certain other reporting to year:day-of-year formatting instead of the usual year month day-of-month; related changes to date_stamp(), dump_metadata(), dump_metadata_date(), and dump_metadata_rinex()

indexing error for antenna height for Trimble DAT record 16.43 in decompose_Trimble_16()

added test for vertical only in extract_Trimble_antenna_height()

2004 Mar 3: should now be able to override the GPS week with -week on any input format except for RINEX

2004 Mar 2: any observation decoding function using lli_cleanup() now has lli_L1 and lli_L2 set to zero at the start of each call

2004 Feb 20: first cut of a JPL "Soc" format translation; remaining issues are whether to pursue a duplication of the "csp" smoothing of 30-sec phase and pseudorange, the derived loss-of-lock indicator, sorting of the receiver types for snr flags, and the discrepancy with soc2rnx on the broadcast message's "codes on L2 channel" value

2004 Feb 19: fixed limit in decompose_Ashtech_SNV() to sort between GPS and GLONASS SVs (original limit would have disallowed a GLONASS #1, and turned it into a GPS #33, which is wrong))

2004 Feb 11: in Leica_MDB_13_obs(), which decodes Leica MDB message 19 (compacted data), the RINEX LLI flag was incorrectly using bit 8 (A/S flag) of the 2-byte Chanstat word to set the L2 wavelength factor; now it is using bit 7 as it should

updated list of recognized Leica reciever and antenna types in decoding of MDB records 4, 8, and 11 based on Leica's "System 400 Measurement DB, Projekt GPS System 400", Version 4.00, 11 Feb 2004, in teqc functions decompose_Leica_MDB_04(), decompose_Leica_MDB_08(), and decompose_Leica_MDB_0b()

2004 Jan 13: as requested, a new -igs option was added to suppress RINEX or user-supplied receiver or antenna designation verification with the internal IGS designation list (default is +igs, which does the usual verification)

during the qc report, if there are no millisecond resets detected, the line reporting the average time between resets is now not skipped, but instead reports "Avg time between resets : Inf minute(s)"

2004 Jan 8: updated the IGS receiver/antenna/dome designations through to 30 Nov 2003

2004 Jan 6: added a few missing cases in check_interval() (maybe everything besides the FORMAT_IS_RINEX case should just be the "default" case, instead of being explicit)

the tail end of obs_epoch_no_gps_week() has been split off as obs_epoch(), with a small change in epoch_clock_to_date(), and is now also called in obs_epoch_with_gps_week() to detect and track millisecond resets in those formats that have GPS week info and also have millisecond receiver clock resets (Trimble 4700 BINEX, Topcon TPS/Javad JPS)

functions met_epoch_no_gps_week() and met_epoch_with_gps_week(), with new met_epoch(), were re-written to parallel the above — except that a few format translations that had included the receiver clock offset with the met_epoch_no_gps_week() (Trimble DAT, Leica LB2 and MDB) now use a fixed value of zero for the offset like used in the other formats using met_epoch_no_gps_week(); thus accumulated millisecond resets of the receiver clock will now not creep into any MET time tag

2004 Jan 5: modified decompose_Leica_MDB_02() because the user-supplied comment strings can have newlines in them; now calls new comment_w_newline()

2003 Dec 31: C/A pseudorange values for Topcon TPS/Javad JPS are now stored in a temporary buffer and in Javad_JPS_obs() the [RC] and [rc] messages are now forced to be read first, so if using message combinations where, for example, the phase values rely on the C/A code values, then translating with, say, -O.obs l1+l2 (i.e. RINEX C1 is not requested), then RINEX L1 and L2 are correctly extracted

added code in next_Trimble_RS_232_record() so that if not using stdin, the read of RT17 format is attempted byte by byte when there are read errors

2003 Dec 30: slight improvement in Topcon TPS/Javad JPS SNR decoding — snr_map() now called for L1 (or L2) when S1 (or S2) is not being requested; has now been collapsed into the single decompose_Javad_snr()

2003 Dec 23: more cleanup for using obs_epoch_with_gps_week() and obs_epoch_no_gps_week(), especially for the Topcon TPS and Javad JPS code

there are now only 6 instances of setting SET_GPS_WEEK outside of args.c, and these are in rockwell.c (2), ti.c (3), and trimble.c (1) — which hopefully should not cause any GPS week problems with the new code — but these should eventually be eliminated as well

2003 Dec 22: obs_epoch_clock_adjustment() has been replaced with obs_epoch_no_gps_week(), which essentially does the same thing but it written in a way that should be easier to maintain

a new complementary obs_epoch_with_gps_week() replaces a couple of function calls where the GPS week is part of the current epoch time stamp (format and/or record dependent) and the initial GPS week is not being overridden by the user with the -week option

met_epoch_clock_adjustment() has been renamed met_epoch_no_gps_week() to keep the parallelism with the new obs_epoch_no_gps_week()

a new complimentary met_epoch_with_gps_week() to handle the few cases where the week of the MET data is explicit (e.g. BINEX, Leica MDB record 0x0e)

all native formats with explicit GSP week information for the observation epoch should now be able to be overridden with -week (except for ConanBinary and TurboBinary, though this could be easily added if the need ever arises)

2003 Dec 16: added additional variables in teq.tr struct for use in obs_epoch_clock_adjustment() and binary_OBS() to reset the millisecond offset back to its last valid value if an epoch occurs with the same or earlier time as the last valid epoch; this epoch problem occurs most often in Trimble formats and has lead to bogus epochs and bogus sample intervals (with +meta)

Note: There could be some