Software Help with Software Data Processing TEQC Overview Publications Current OS Support Executables FAQs Development & Release Log Changes for Next Release 2019 Feb 25 Release 2019 Feb 12 Release 2018 Dec 12 Release 2018 Oct 15 Release Email Forum Documentation Tutorial [PDF] Original HTML Tutorial

TEQC Development & Release Log

2019 Feb 25 — Finis

2019 Feb 25: added detection of GPS L1C to binex_7f_05_signal_map() and SeptentrioBF_signal_map()

2019 Feb 21: slight changes to set_Galileo_sources_bits89(): initial masking on only bits 8-9 (instead of bits 8-15), and then testing of only bits 0-2 (instead of bits 0-7)

renamed reject_ephemeris_subframes() to reject_GPS_ephemeris_subframes()

2019 Feb 20: new set_Galileo_sources_bits89(), which sets bit 8 or 9 of the Galileo "data sources" field; after setting bits 0-2, this new function call was added to:

and after reading the data sources field, this new function call was added to:

slight correction to the filter mask value for the Galileo "data sources" field in binex_nav_message_01() when outputting BINEX 0x01-14

with the change of allocate() (see 19 Feb 2019 entry), the dynamic memory reallocation for any record buffer (buf) in next_SeptentrioBF_record() was changed back to the original value (see 24 Jan 2019 entry)

2019 Feb 19: in allocate(), the value of the input n is now increased by modulo 4 (using any unfilled 4-byte block) plus an additional two 4-byte blocks

2019 Feb 14: addition of input filename to variety of Notice, Warning, and Error messages still without it

2019 Feb 12

2019 Feb 12: in Trimble_27_57h_6_signal_map(), the addition of detection of block type 2/tracking type 11 for IRNSS S-band signal (although observables from this signal is not correctly output in any way)

2019 Feb 7: update of Trimble_27_57h_6_signal_map() with the addition of block type 0/tracking types 20-25 for Beidou III B1C signal (Galileo E1-like)

2019 Feb 6: correction to extract_Trimble_rx_type(): changes made on 1 Feb 2019 were missing the case for Trimble NetR9 name assignment

2019 Feb 5: the setting of teq.trans.set_X & SET_OBS_ALL bit by calling set_obs_all() when doing a qc on non-RINEX input (see entry for 20 Nov 2018) was moved from the beginning of set_obs_obs_normal() to the beginning of format_settings() — so that this case more cleanly takes effect for all non-RINEX formats

2019 Feb 4: addition of case for IRNSS constellation in Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() for reading Trimble .tgd record 27 or stream 0x57-6 — based on .tgd file from Trimble Alloy receiver that was tracking IRNSS and Beidou B2a

in Trimble_27_57h_6_signal_map(), the addition of block type 2/tracking type 0 for IRNSS L5 signal and the addition of Beidou B2a signal (GPS L5-like) for block type 2/tracking types 6, 7, or 8 — based on the same Trimble .tgd Alloy file

2019 Feb 1: correction to extract_Trimble_rx_type() when encountering Trimble receiver type IDs of 35, 154, 157 in Trimble formats; coding error made 24 Sep 2018 for these types led to a segmentation/memory fault if these IDs were encountered

bit 9 now set in addition to bit 0 for the RINEX data sources field when the Galileo nav source is I/NAV E1-B in Trimble_28_55h_ephemeris() for reading Trimble .dat/.tgd record 28 or stream record 0x55

2019 Jan 29: the "null" SV parsing of BINEX 0x7f-05 is now done in a new binex_7f_05_SV_advance(); the constellation and SV parsing of both binex_7f_05_constellation() and binex_7f_05_obs() were then redesigned a bit to use binex_7f_05_SV_advance()

bad_SV_number() was renamed to be bad_SV_id() and good_SV_number() was renamed to be good_SV_id()

2019 Jan 28: a single assignment line, in binex_7f_05_constellation(), to set the observed constellation total to the current SV count when an SV id outside of the allowed range for the given system, was commented out; this allows what would otherwise be SV id values out of the accepted range to be included when reading BINEX 0x7f-05

2019 Jan 24: to fix the segmentation/memory fault on Solaris 86 and Windows 32 when reading SBF with an initial set of 4075 ASCIIIn messages (as was being supplied by Xeos Resolute receivers attached to met packs) whenever the strings would get parsed for values by the standard C strtok() function, and then followed by a 4027 data record (which is typically larger than a 4075 record) needing a larger memory reallocation, the dynamic memory reallocation for any record buffer (buf) in next_SeptentrioBF_record() was increased by 2 bytes — the cause of the problem without the 2-byte increase appears to be some sort of under-the-hood conflict between what strtok() is doing to dynamically allocated memory for certain versions of the standard C library, i.e. the allocated memory for 4075 strings was being modified by strtok(), and then the attempt of dynamic reallocation memory for the first longer 4027 record is where the segmentation/memory fault was occurring

2019 Jan 23: for the parsing of a NMEA quadtuple string in NMEA_quadtuple() a change was made to final steps in the function, now testing for a non-null token for all cases, before proceeding to allow parsing (as complete as possible) of more cases of incomplete or faulty NMEA strings

in NMEA_quadtuple(), the main token loop before the final steps also needed an additional test for a non-null token

2019 Jan 22: the default maximum PRN for IRNSS was increased from 7 to 14

a small validation function, validate_SV_id(), made to check the detected value of (currently) an SBAS or QZSS PRN as a 1-byte unsigned integer and make sure the value is greater than 100 or 192, respectively, before subtracting the system-based offset; an Error message is output and the returned id is set to 0 — which will be detected and eliminated later on; validate_SV_id() added to:


2019 Jan 18: the return value of ephemeris_location() was changed to be a uint1 using a special set enum set

2019 Jan 17: in mp_obs(), a reset of the multipath DC bias was added after any time gap (default of 10 minutes) — to address cases where the DC bias value of a rising SV is similar to, but not sufficiently different from, the DC bias value of when the SV had set, thereby not triggering a possible multipath slip detection with its DC bias reset

modification to the return value of ephemeris_location() when a Galileo F/NAV navigation message is found and modification to the testing of its return value in qc_nav_files() so that a Notice message is not output when a Galileo F/NAV navigation message is found and rejected, even if +notice is in effect

2019 Jan 10: in psp_out(), the initial reference position for the incremental position changes of the +psp options, the initial reference position in XYZ is now rounded to the nearest 0.1 mm and output as initial part of the +psp output (so that all positions can be reconstructed by the user if desired)

2019 Jan 9: a change between 12 Oct 2018 and 1 Nov 2018 resulted in metadata options (e.g. +meta, +mds) not to work when reading RINEX met files (possibly due to simplifying changes in windowing logic); to correct this, a simple addition of unsetting RINEX_OUT in teq.edit.opt_X is now done if any metadata option is being used, i.e. teq.main.opt_X & METADATA, towards the end of out_settings()

2019 Jan 8: new option, +mepoe, mainly for SBF captured by Xeos software from the Resolute receivers when meteorological data is being logged in ASCIIIn (4075) SBF records, to not call any_initial_epoch() from within binary_MET() so that window.start does not get set with epoch of the first found meteorological record

2019 Jan 7: a call to compute_GLONASS_fcn_constants() was added after the test of nav_value_out_of_range() validates the range of ephemeris values in nav_filtering(), and calls to compute_GLONASS_fcn_constants() were removed from the following:

    decompose_Leica_LB2_d1() (for the bit 2 = ephemeris case)
so that only GLONASS navigation messages which do not have any values out of range end up populating frequency channel numbers (fcns) in the allocated teq.GLONASS array

2019 Jan 3: code changes to address five minor warnings when compiling for ARM 64-bit: switch() boolean usage in ephemeris_location() and ephemeris_extract(), an extraneous extra argument of sprintf() usage in decompose_binex_00() and of fprintf() usage in decompose_binex_01(), and a replacement of sprintf() with a memset() construct in initialize_bs_buffer()

2018 Dec 12

2018 Dec 12: cleanup of a few old preprocessor flags and a couple of OSX gcc warnings for two fprintf() usages

2018 Dec 11: continued with the same plan of having the filename present for all Notice, Warning, and Error messages for reading all formats (quite a bit of code touched)

2018 Dec 10: added output of the filename being read to several rare warning and error messages when reading Topcon TPS or Javad JPS format

change in the atof() argument in decompose_Topcon_PM() to deal with some supplied non-canonical firmware version strings (so that it can be tested to see if it is "earlier" than version "1.9" (i.e. having a value less than 1.9)

2018 Dec 7: cleaned up and reorganized parts of the +help output

2018 Dec 6 & 7: located more cases where the new safe_strncpy() could be used; some of these places had been using memcpy() (since the source was from a binary file) followed by a setting of the last byte with a null byte

2018 Dec 3: officially setting Galileo E6 pseudorange values not to be used during qc's point-position solution (boolean setting in code_data() for Galileo E6 pseudorange)

2018 Nov 29: partial_epoch_store() (for time masks) was modified into a boolean function with a check for each time parameter (i.e. year to second)

window_store(), which calls partial_epoch_store(), was modified to return FALSE if partial_epoch_store() returns FALSE

in g_arg() when window_store() returns FALSE the appropriate usage() call is now made

special case added to recent changes of window_next_epoch() (see 16 Nov 2018 entry): if qc and -ne used with a ±dX option, then the window start time is computed from the masked end time and the supplied delta time with a call to compute_window_point()

2018 Nov 28: added safety logic to qc_bin(): if the time difference between the window start and the test epoch is negative, then a value of 0 is returned

the primary test in obs_epoch_check() was changed so that if using the -ns windowing mask during qc and the window start is equal to the window end, then the window start is supplied to epoch_in_window(), which itself is comparing the supplied epoch to the window start

2018 Nov 27: standardized (to the degree possible) all of the "no routine" messages, part of which are now handled by new no_routine_for_format_type()

2018 Nov 26: added use of bits 0 and 1 of the trkStat byte of u-blox UBX-RXM-RAWX (0x1215) in ublox_UBX_rxm_rawx_obs()

2018 Nov 21: some optimization of ublox_UBX_rxm_rawx_constellation() (to eliminate unneeded memory allocation)

added detection of new signal IDs in ublox_UBX_rxm_rawx_signal_map()

additions to the u-blox UBX switch case in format_settings() to better allow the +C2 and/or +L7 options to set up the desired GNSS observables when reading u-blox UBX-RXM-RAWX (0x1215) "version 1" message

2018 Nov 20: preliminary overall of ublox_UBX_rxm_rawx_constellation() and ublox_UBX_rxm_rawx_obs(), as well as new ublox_UBX_rxm_rawx_signal_map(), to extract more than primary "L1" observables from UBX-RXM-RAWX (0x1215) "version 1" message

setting of new teq.trans.set_X & SET_OBS_ALL bit when +all is used or set_obs_all() is called when doing a qc on non-RINEX input

added immediate return from set_obs_obs() if teq.trans.set_X & SET_OBS_ALL or teq.misc.set_X & (USE_C2 | USE_L5 | USE_L6 | USE_L7 | USE_L8) is set — which allows the use of +all, +C2, +L5, +L6, +L7, and/or +L8 when reading any format, like u-blox UBX, which have a default preset list of observables using a hardwired call to set_obs_obs()

2018 Nov 16: changes for what looks like a workable (although not elegant) solution to allow the -ns and/or -ne windowing options to work during quality check operations (+qc, +qcq), in window_next_epoch() and any_initial_epoch()

2018 Nov 13: some recrafting of some parts of the code changes done on 8 & 9 Nov 2018

2018 Nov 8 & 9: introduction of new -eph option to eliminate certain navigation message types, and to implement: additional bit flag exclude_eph in the RINEX_NAV struct and its initialization in initialize(); new extract_exclude_eph() function (currently only coded for GPS, Galileo, and QZSS navigation types), with two new low-level functions remove_colons() and replace_char(); some tests for GPS and Galileo navigation message types added to ephemeris_valid() (renamed from ephemeris_times_make_sense()) — but no known way to do this yet for any QZSS nav message types; related modifications to TPS_JPS_GE_ephemeris() (renamed from Topcon_GE_ephemeris()), to identify and remove appropriate GPS nav message type if a JPS [GE] and the optional struct GpsEphOptData is present, plus what should be a reasonable backup strategy for eliminating GPS LNAV from either TPS or JPS [GE] based on the stored week value

modification of Topcon_QE_ephemeris() (analogous to change in TPS_JPS_GE_ephemeris()) to identify and remove appropriate QZSS nav message type if a JPS [QE] and the optional struct GpsEphOptData is present

new prototype functions decompose_Topcon_G2() and Topcon_G2_ephemeris() to read Topcon TPS [G2] message (for GPS CNAV/CNAV2) and decompose_Topcon_Q2() and Topcon_Q2_ephemeris() to read Topcon TPS [Q2] message (for QZSS CNAV/CNAV2), with exclude_eph filtering

2018 Nov 7: minor change to each of the check_*() functions (see 24, 29, 30 Oct 2018 entries): the Alert message now includes the "current" observation epoch time for each detected change in receiver type, number, or firmware, or antenna type or number, but whether this is the last epoch before the change or the first epoch after the change is somewhat problematic (i.e. the user will have to determine which)

2018 Nov 6: minor correction to changes is duplicate_ephemeris() (see 5 Nov 2018 entry): had to add case for when the Galileo I/NAV has both E1-B and E5b-I as the source

2018 Nov 5: in decompose_SeptentrioBF_5902(), switched back to using only RxVersion field for the firmware, as some PolaRx5 receivers appear to have something else in the GNSSFWVersion field (see 2 Nov 2018 entry)

slight correction in qc_landscape_out(): the last entered SV for each system was being left out of the bubble sort ordering, and thus would just end up being the last displayed SV for the system in the ASCII timeplot, regardless of its ordering index

duplicate_ephemeris() modified to allow both Galileo I/NAV and F/NAV with same ToC/ToE, assuming that the source of the navigation message has been correctly set

ephemeris_location() modified to reject any Galileo ephemeris where the "sources" field has bit 1 set, i.e. it is from E5a and therefore an F/NAV ephemeris

the qc fields for a point-position now also include a 'use' boolean, which is set to TRUE by default for most pseudoranges, but in code_data() the 'use' boolean is set to FALSE for Galileo E5a and E5a+b pseudoranges (with the jury still out for Galileo E6 pseudoranges, so still left as TRUE for the time being); also, find_position() modified to include a test for this new boolean before using any pseudorange

2018 Nov 2: added an initial call to de_pad() of the test string in each of check_rx_type(), check_rx_number(), check_rx_firmware(), check_ant_type(), and check_ant_number()

modifications to decompose_SeptentrioBF_5902(): setting the boolean to TRUE when the optional ProductName string is present, extracting the geographic position fields if present (and having usable values), extracting the optional GNSSFWVersion string when present, setting the receiver type to "AsteRx-m2 OEM" when the RxName is "SSRC12" (which appears to be the case for the Xeos Resolute)

modifications to decompose_Topcon_JP() (with the on-going goal to try to find a receiver type string, and nothing but a receiver type string): added an initial sanity checking: [JP] string length and whether there are non-printable ASCII character bytes or non-ASCII bytes; copy of possible rx type string into buffer now using safe_strncpy()

2018 Nov 1: recrafting of Ashtech_firmware(): using the new safe_strncpy() and check_rx_firmware() (see 23 & 24 Oct 2018 entries)

instead of the eliminated boolean (see 31 Oct 2018 entry), a more general boolean is now in place, currently only being set to TRUE in decompose_Topcon_PM() when a rcv/igs=" is found in a Javad JPS [PM] record, and tested for in the new check_rx_type(), and reset to FALSE at the beginning of each file input in process_input()

2018 Oct 31: similar to check_rx_firmware() (see 24 Oct 2018 entry): added new check_rx_type() to:

with associated changes in Topcon(), Topcon_Javad_rx_names(), and process_input() with elimination of the boolean (see 1 Aug 2017 entry)

2018 Oct 30: similar to check_rx_firmware() (see 24 Oct 2018 entry): new check_rx_type(); currently added to:

and new check_rx_number(); currently added to:
    decompose_Topcon_PM() (for reading both Javad JPS and Topcon TPS formats)

2018 Oct 29: similar to check_rx_firmware() (see 24 Oct 2018 entry): new check_ant_type(); currently added to:

    decompose_Topcon__e()() (for reading both Javad JPS and Topcon TPS formats)
and new check_ant_number(); currently added to:

in GLONASS_SV_geocentric_position() and SBAS_SV_geocentric_position(): changed the additional ToE to observation epoch tolerance from 0.1 second to 3/4-ths of the RK4 integration interval for the system

2018 Oct 26: correction in qc_satellite_nav_update() when doing qc of raw data (via file or stdin), prior to calling qc_orbit_fillin() (i.e. observation data was found prior to the first ephemeris) then for GLONASS and SBAS: a call to initialize_RK4(), assigning ToE from ToC, and then, respectively, a call to populate_GLONASS_RK4() or populate_SBAS_RK4() — so that the SV's RK4[ ] is initialized and populated prior to calling the respective later possible call *_SV_geocentric_position() for either of these two systems in find_SV_position()

continuation of new firmware checking changes (see 24 Oct 2018 entry) in:


2018 Oct 24: trying something new: a new function, check_rx_firmware(), to detect possible changes of the firmware in a single file or stdin stream, called after extracting the firmware from the input, and if a change in firmware is detected, an Alert message is output to stderr which +quiet does not suppress, and the last (rather than the first) firmware found in the file is the one reported in the +meta output; currently added to:

    decompose_Topcon_PM() (for reading both Javad JPS and Topcon TPS formats)

related changes to decompose_Trimble_5(), decompose_Trimble_6(), decompose_Trimble_12(), and NetRS_ize_firmware()

2018 Oct 23: all previous uses of strncpy() (except one, which is special case) now done with new safe_strncpy(), which calls strncpy() and then assigns the character at index n to be null (which had been done in almost all uses of strncpy(), but this approach cleans up the code)

2018 Oct 22: ee_position_geo() modified with extra parameter in call so that dec_pos(), rather than geo_pos(), can be called to output the solution latitude and longitude in decimal degrees

new option, +eepd, which is like the previous +eepg option, except that it outputs the latitude and longitude of the point position from every epoch in decimal degrees, instead of integer degrees and minutes and decimal seconds

function dec_pos() modified so that the desired number of decimal values to the right of the decimal place can be specified

2018 Oct 19: the special if() block at the beginning of qc_first_obs_epoch() (see 17 & 18 Oct 2018 entries) now generalized (I think) to also handle all cases, including using -ns and/or -ne options

a couple of changes for the metadata and/or teqc config else if block in window_OK(): (1) now applies to all file formats (not just non-RINEX) and (2) addition of a Notice message that any time windowing options being use are ignored in this case

2018 Oct 18: the special if() block at the beginning of qc_first_obs_epoch() (see 17 Oct 2018 entry) replaced with moving the elaborate if() block at the end of the raw data file cases in window_OK(), but now setting a default qc window length of 30 seconds when reading stdin and 1 day when reading files; also now includes a Notice message informing the user of the default qc window length being used

2018 Oct 17: a bit of code added as a special if() block at the beginning of qc_first_obs_epoch() to automatically set a qc window length if doing a qc on stdin and no window end time or window delta has been been specified; currently, the default window length in this case is 30 seconds

2018 Oct 16: window_OK() was slightly modified so that the address of the in struct is no longer passed by the function call (since there was really no need to have this slight complication) and in in now directly assessed within window_OK()

in main(), is now preliminarily assigned the same *argc used by file_id() — in case there are any error or warning messages using before the assignment in filename_loop()

a more informative set of error messages was added for the last default case for verifying the windowing strategy on raw data formats in window_OK()

in mesh_monument_code_name(), the last case using the first four characters of the filename is not done if the input is stdin, thus avoiding a false 4-character ID name of 'stdi' (see 8 Aug 2018 and related entries)

the initial if() block in window_OK() — needed up to this point for fully defining a time window if doing a qc on stdin — is now not needed

2018 Oct 15

2018 Oct 15: cleanup of a few preprocessor definitions

2018 Oct 12: a couple more minor tweaks to qc_landscape_out() (see 11 Oct 2018 entry)

2018 Oct 11: modifications to qc_landscape_out() to standardize the SV ordering when -svo (the default SV ordering) is in effect so that the SV ordering in the ASCII timeplot should be more or less the same when doing a qc on RINEX or on raw data

2018 Oct 8: modification to next_Trimble_BSTR_record() (for reading Trimble stream format): basically a complete overhaul of 0x57 page parsing (see 1, 2, and 5 Oct 2018 entries) based on a more complete understanding of what one previously unused counter field means via personal communication with Trimble

correction to Trimble_28_55h_ephemeris() for Galileo ephemeris: assignment of Trimble's "BGD1" and "BGD2" to BGD_L1E5a and/or BGD_L1E5b depend on the signal source, as described via personal communication with Trimble

2018 Oct 5: modification to next_Trimble_BSTR_record() (for reading Trimble stream format): another fine tuning of 0x57 page parsing (see 1 and 2 Oct 2018 entries) based on actual sample file from Trimble

2018 Oct 2: more modifications to next_Trimble_BSTR_record() (for reading Trimble stream format): fine tuning of 0x57 page parsing (see 1 Oct 2018 entry)

2018 Oct 1: update to next_Trimble_BSTR_record() (for reading Trimble stream format) to (hopefully) deal with the new firmware changes that allow 16-60 0x57 records to "paged" together in a single epoch (up from the original 1-15 0x57 records per epoch); tested on older stream data with <16 0x57 records per epoch

2018 Sep 28: minor change to Leica_Galileo_ephemeris(), for Galileo: the I/Nav SV clock parameters will use extracted and used, if valid, even if there are valid F/Nav SV clock parameters (which seems to be what other data formats are using)

added constraint of calling filter_system_in_nav() in bad_SV_number() for printing the notice that an invalid SV id is being rejected

2018 Sep 27: minor correction to ephemeris_location(): initialization of the SV id field of the generic ephemeris struct, so that a RINEX nav file can be listed with the -nav option, if desired, when attempting to qc raw data

some debugging code cleanup

correction to Leica_Galileo_ephemeris(): added missing offset increment when not extracting F/Nav E5a/E1 clock values (discovered when comparing Galileo BGD values between those collected with Leica GR50 in MDB format compared to results from other manufacturers formats)

2018 Sep 26: modification to ephemeris_advance() to remove any unneeded ephemeris that might be stored (since the qc epoch time has advanced beyond when an older ephemeris is not needed any more) which frees up a bit of allocated memory

new set_obs_all() which is now called when using the +all option and in set_obs_obs_normal() if doing a qc on a raw data file

2018 Sep 25: experimental (for doing qc directly on raw data file): at end of GNSS_nav_time(), call to ephemeris_location() with NULL file pointer if doing qc and the input format is not RINEX; struct qc_eph_list modified to include pointer to EPH_MODEL; ephemeris_location() modified to have separate storage behaviours depending on whether the call has a NULL file pointer or not; ephemeris_extract() modified to have separate extraction behaviours depending on whether the stored file pointer of the ephemeris list has a NULL file pointer or not; note: this appears to handle everything except GLONASS nav messages, which are not feed through GNSS_nav_time()

if() conditional and call to ephemeris_location() at end of GNSS_nav_time() split off as a new function, ephemeris_qc_raw(), which was also added to the end of each raw GLONASS translation in


renamed check_qc() to be setup_qc()

in qc_landscape_out(), another block added to order SVs by system if qc is done on raw data (instead of ordering by occurrence of SVs in any constellation of observation data or ephemerides), and +svo still can be used if desired

2018 Sep 24: using additional documentation supplied by Trimble, updated extract_Trimble_rx_type() for receiver type IDs greater than 255 (same caveats as for the 20 Sept 2018 entry) and updated decompose_Trimble_30() to extract the 2-type receiver type ID and call extract_Trimble_rx_type()

2018 Sep 20: using documentation supplied by Trimble, updated extract_Trimble_rx_type() for receiver type IDs up to type ID = 240; for receiver names not listed in the IGS file, the receiver names were entered as supplied by Trimble, to the degree that each name could fit into the 20-character receiver type field in a RINEX obs header

using documentation supplied by Trimble, updated extract_Trimble_ant_type() for antenna type IDs; for antenna names not listed in the IGS file, the antenna names were entered as supplied by Trimble and any name which is 16 characters or shorter (i.e. the name does not have a 4-character radome name for the last 4 characters of a 20-character name) has "NONE" appended to the end of the name

2018 Sep 18: in Trimble_27_57h_6_signal_map(): use of flags related to new ±SA_G1 and ±SA_G2 options for reading Trimble .tgd record 27 and 0x57-6

call to use_sa_g1() after use_ca_l1() in format_settings() for Javad JPS, Topcon TPS, and BINEX formats, and in decompose_Leica_MDB_77() and decompose_Trimble_27_57h_6()

in binex_7f_05_signal_map() and binex_7f_03_obs(): use of flags related to new ±SA_G1 and ±SA_G2 options for reading BINEX 0x7f-05 and 0x7f-03, respectively

in Ashtech_use_phase(): use of flags related to new ±SA_G1 and ±SA_G2 options

in Topcon_use(), TPS_rD_signal_map(), TPS_rM_signal_map(), JPS_signal_map(): use of flags related to new ±SA_G1 and ±SA_G2 options

2018 Sep 13: added output in symbol_codes() (for options +sym and ++sym) to clarify changes of 12 Sep 2018

2018 Sep 12: in set_data_indicator(), changes to require observables from legacy signals: (1) the observable requirements for GPS for the L1+C1+L5+C5 indicator ('s'), in addition to L5 and C5 from the L5 signal, now also requires L2 and P2, but allows C1 or P1; and (2) the observable requirements for GPS and GLONASS for the L1+C1+L7+C7 indicator ('n'), in addition to L7 and C7 from the GPS L1C or GLONASS G3 signal, now also requires L2 and P2, but allows C1 or P1

2018 Sep 11: next_Trimble_BSTR_record() modified to update switch for 0x55 subtypes with a few other subtype values used by Trimble but not needed by teqc (so that the user does not see a Notice message for these cases)

2018 Sep 4: Leica_MDB_77_signal_map() modified with a similar method for detecting new constellations and/or signals as used in Trimble_27_57h_6_signal_map()

SeptentrioBF_signal_map() also modified with a similar method for detecting new signal types as used in Trimble_27_57h_6_signal_map()

new summary line, SSN, added to qc output if +sn option in use (which is the default), which puts on one line the mean signal-to-noise values for the various frequency binnings

2018 Aug 30: Trimble_27_57h_6_signal_map() updated with the latest mapping of SV signals from Trimble for reading .tgd record 27 or Trimble stream 0x57

Leica_MDB_77_signal_map() modified with a few additional improvements related to IRNSS (with presumed values)

2018 Aug 29: in Leica_MDB_77_signal_map(), use of flags related to new ±SA_G1 and ±SA_G2 options; tested on MDB data from GR50

binex_to_rinex_hdr() modified to include a missing constraint on whether to append the 4-character radome designation to the RINEX antenna type field from the BINEX antenna type and radome type fields — needed for BINEX field ID 0x17 (= antenna type) and for BINEX field ID case 0x20 (= radome type)

2018 Aug 28: Leica_MDB_77_constellation(), Leica_MDB_77_obs(), and Leica_MDB_77_signal_map() updated to read Beidou and QZSS observable data in Leica MDB record 119 (0x77); Beidou data tested with MDB collected at Boulder, CO, with Leica GR50 receiver

2018 Aug 27: next_Leica_MDB_record() (for reading Leica MDB format) modified with a static bit buffer so that Notice messages are only printed once per run for any unknown MDB records that are encountered

Leica_MDB_77_signal_map() modified to report any unknown system ID and with with a static bit buffer so that Notice messages are only printed once per run for any unknown system ID in MDB that are encountered

decompose_Leica_MDB_0b_6f() and decompose_Leica_MDB_68() modified to include recognizing receiver ID 121 for the Leica GR50

extract_Trimble_rx_type() modified to include recognizing receiver ID 162 for the Trimble Alloy

2018 Aug 22: next_Trimble_BSTR_record() (for reading Trimble stream format) modified with a static bit buffer so that Notice messages are only printed once per run for any unknown or reserved 0x55 subrecords that are encountered

the same strategy using static bit buffers added to next_Trimble_dat_record() (for reading Trimble .dat/.tgd records) and to next_Trimble_BSTR_record() so that Notice messages are only printed once per run for any unknown .dat/.tgd or RT27 records that are encountered

2018 Aug 21: a new qc stats line added to qc_position_out() so that when the header or supplied antenna position is non-zero (i.e. XYZ != 0,0,0), then the vertical and horizontal offsets from the qc determined antenna position are shown

in Trimble_27_57h_6_constellation() and in Trimble_27_57h_6_obs(), added a print statement prior to the function return of the flag combination encountered in Trimble record 27 or 0x57 that have reserved bits as per the last documentation sent to UNAVCO (see 2017 Jan 13 entry)

2018 Aug 20: corrected qc counter dimensions of sn[ ], lli_bit0[ ], and L[ ] in struct qc_sv_count_obs and the initialization loop limit for these arrays in initialize_qc_obs()

2018 Aug 9: SeptentrioBF_4027_5944_obs() further modified the ObsInfo byte is only extracted for SBF 4027 and an explicit dummy value of 0x00 is used for the ObsInfo byte when reading the older 5944 mesage

2018 Aug 8: in mesh_monument_code_name(): modification of the fourth and final fifth case to exclude underscore or dash being the first character of the 4-character ID code, and another modification if the final fifth case to skip the first letter of the filename if the format is Ashtech BESD fileset, an Ashtech R-file, or an Ashtech U-file (see 9 May 2018 entry)

SeptentrioBF_4027_5944_obs() was modified so that if bit 2 of the ObsInfo byte is set, then the phase value of that ObsInfo is set to zero (i.e. an invalid phase); technically, the ObsInfo byte is only present in SBF 4027 messages, but the older SBF 5944 messages have reserved bytes in exactly the same positions and these reserved bytes in 5944 are assumed to contain zero bits

2018 Jul 26: addition of missing BINEX 0x01-14 case in current_nav_binex() (see 16 Jun 2018 entry); and better standardization of the various "no routine" messages in binex.c

2018 Jul 25: if() condition in nav_processing() for when not to read a navigation message has been modified to read all BINEX navigation messages for the single purpose of reading each GLONASS navigation message to extract the frequency channel number (fcn) so that, if needed later, the fcn is available to decode the GLONASS phase if stored in units of distance and the fcn is not otherwise available

the index (and its recasting) for scanning through the bytes in a single epoch of Javad JPS or Topcon TPS was changed from an unsigned 2-byte integer to an unsigned 4-byte integer in Topcon_TPS_obs(); the same was done for the index (and its recasting) for scanning through the bytes of accumulated navigation messages in spew_Topcon_nav_message()

2018 Jul 24: the same solution height conditions as were added to find_position() (see 23 Jul 2018 entry) added to qc_position_out() so that totally bogus position solutions are not output with the qc report

2018 Jul 23: (to further battle rare PP edge cases) new -pos_h_min and -pos_h_min options, with default values of -500 meters and 9000 meters respectively, the values of which are used in find_position() to eliminate physically unrealistic solutions based on the ellipsoid height of the solution

2018 Jul 19: the switch in new_position() on the return value of find_position() was changed so that now only the case of STATIC_POSITION_SOLUTION_OK is accepted and the default (all abnormal cases) are ignored (note: the previous logic had been the reverse, requiring all abnormal cases to be explicitly stated and the default was supposed to be solely for the case of STATIC_POSITION_SOLUTION_OK, but for rare edge situation — usually involving a partial set of GLONASS navigation messages — it was possible for no initial solution to be found, resulting in one or more cases of the default XYZ = (0,0,0) starting position for all solutions to be incorrectly averaged into the final mean position solution)

2018 Jul 16: decompose_binex_01() modified for new BINEX 0x01-14 (upgraded decoding of Galileo nav message), nav_processing() modified to call new binex_01_14_ephemeris()

modified binex_nav_message_01() for writing new BINEX 0x01-14, and modified nav_binex_out() so that the default for a Galileo nav message would be subrecord 0x14 (instead of 0x04)

modified binex_7f_05_signal_map() to address additions of Observation Code IDs of Beidou B1C and B2a (and elimination of obsolete Beidou B1-2/E1) in BINEX 0x7f-05

2018 Jul 10: BIT_MASK_BYTES increased to 3, allowing 96 SVs and rx channels per epoch (see 5 Oct 2010 entry)

2018 Jul 5: new use_sa_g1() (analogous to use_ca_l1()), used in format_settings() for SBF format

in SeptentrioBF_signal_map(), use of flags related to new ±SA_G1 and ±SA_G2 options; tested on SBF data

in binex_7f_00_obs(), use of flags related to new ±SA_G1 options

2018 Jun 27: before implementing the new ±SA_G1 and ±SA_G2 options for GLONASS, review and re-comment (for consistency) the following functions (which contain a majority of the usage of the original corresponding ±CA_L1 and ±L2C_L2 options for GPS): binex_7f_05_signal_map(), Leica_LB2_0d_signal_map(), Leica_MDB_77_signal_map(), SeptentrioBF_signal_map(), TPS_rD_signal_map(), TPS_rM_signal_map(), JPS_signal_map(), and Trimble_27_57h_6_signal_map()

2018 Jun 26: final elimination of the temporary +GIo option from the option list (i.e. the warning that this option is obsolete is now gone)

the define APPLY_USE_L2C_L2 renamed to define C2_SELECTED (because this is a more generalized descriptive term of the flag)

introduction of teq.use_HA_G2 and teq.use_SA_G2 flags for use with GLONASS (to be analogous to teq.use_P_L2 and teq.use_C_L2 flags for GPS), along with corresponding enums g_use_SA_G1 and g_use_SA_G2, and corresponding help enums HELP_USE_SA_G1 and HELP_USE_SA_G2, cases added to usage() and g_arg() (i.e. the boilerplate code should now be complete for implementing the new options ±SA_G1 and ±SA_G2 for GLONASS)

2018 Jun 8

2018 Jun 8: preliminary solution to the qc problem found by NGS using navigation messages from GPS weeks 1022 and 1023 (8 - 21 Aug 1999): in week_modulo(), return if teq.u.GPS_week is less than 0 (i.e. a real GPS week value has not been found yet) and included an additional conditional when testing teq.u.GPS_week − i

2018 Jun 7: the SV distance loop in find_position() was slightly rewritten — no real change in what it does, but the steps are now more obvious (since two unnecessary assignments have been eliminated)

2018 Jun 6: Leica_Beidou_ephemeris() modified to subtract 14 seconds from the GPST record proxy time for the ToW to convert to a ToW in BDT

2018 May 24: for builds on NanoPi NEO Core2-LTS, Allwinner H5 Arm 64 (4 cores) running Armbian for NanoPI 2: the logic in GNSS_nav_time() for the switch on set & time_from_GPST had to be rewritten (since builds on this system using the original type-casting approach simply did not do the correct adjustments); dynamically- and statically-linked ARM 64-bit builds successfully made and used to translate six-constellation SBF to RINEX and qc of that RINEX

2018 May 22: in set_data_indicator() there was a typo for the switch in the L1_C1P1_L2_C2 case which prevented the 'e' data indicator (L1 C1|P1 L2 C2) from being correctly identified in all situations; the typo crept in during GNSS qc changes made betweeen 2013 Oct 16 and 2014 Apr 1

2018 May 9: in mesh_monument_code_name(): expansion of the fourth case to include three other possible matching patterns, plus a final fallback to use the first four characters of the filename as the 4-character ID code if nothing else matches

2018 May 8: in mesh_monument_code_name(): the second case was clarified to be for TI-4100 raw data files and a fourth default case was added so that if, ignoring case, the first four characters of the monument name matches the first four characters of the filename, then these four characters are taken to be the 4-character ID code

2018 May 7: due to a code change sometime after 15 Aug 2016, any error messages in all_header_records() should have been written to err_buf (instead of tmp_buf); this has now been corrected

in mesh_monument_code_name() for when there is no 4-character ID code found, a third case has been added: if the monument name is more than 4 characters and the 5th character is a space and first four characters are possible 4-character ID characters, then the first four characters of the monument name is used as the proxy for the 4-character ID code

2018 May 4: added output of current SV minimum for qc PP to "Pos" 'S' indicator with +sym and ++sym options

2018 May 3: the default minimum number of SVs allowed for an attempt at a qc "full" point-position was increased from 5 to 6

2018 Apr 27: a couple of minor variable name changes

2018 Apr 16: use of FILE_INFO crtlM_termination variable in qc_file_reset() so that if reading a RINEX obs file with lines apparently terminating in only 0x0d (= '\r' = ctrl M = carriage return), then the small loop reading the file backwards will terminate on '\r' instead of the standard '\n' (note: crtlM_termination is set in get_next_rinex_line() when this rare condition is encountered)

2018 Apr 12: elimination of the system variable passed to initialize_qc_nav(), since this was redundant and could be replaced with qc->SV[n].sID.system

2018 Apr 9/10: setup to attempt to use the broadcast TGD (or equivalent) corrections on the SV times for GPS, Galileo, Beidou, and QZSS; the gamma factors are stored when computed in initialize_qc(), the gamma TGD terms are computed and stored in code_data() when populating each pseudorange, and the gamma TGD term for each pseudorange is used in find_position(); preliminary testing on a multi-GNSS dataset for CEDA does show a slight position improvement when run just without Beidou and when run GPS-only

2018 Apr 6: more fine-tuning in dump_metadata(), format_initialization(), and initialize() for initial unknown antenna position

2018 Mar 29: slight modification in dump_metadata(): for other obvious non-existent antenna positions or ones clearly out of reality, set the antenna latitude to 90°N and the height to -b_WGS84

2018 Mar 28: slight modification in read_Trimble_mes_file(): at the end, do not set obs.basic.rinex.set_X & RINEX_ANT_GEOCENTRIC when there is position metadata in the Trimble .mes file and a position setting option was used because there may be (and probably is) a position metadata record in the corresponding .dat/.tgd file

2018 Mar 26: slight modification in format_initialization(), for when a metadata option like +meta is being used, to set the antenna height to -b_WGS84, rather than -a_WSG84, (consistent with dump_metadata(); see 9 Nov 2017 entry), and unsetting RINEX_ANT_GEOCENTRIC and RINEX_ANT_TOPOCENTRIC_D — just in case metadata options to set either of these were used with the metadata option

2018 Mar 22: in window_OK() added the input filename to the error message related to needing a different windowing strategy prior to calling terminate(); somehow this message has missed being updated

2018 Mar 20: modified external_data_string() to detect and quietly skip any external data string with "|SDA|HPR," (from a polar external device)

modified event_logger() to only continue to the end if an +event option is being used

2018 Mar 19: based on a sample file (not Trimble documentation) updated extract_Trimble_rx_type() and extract_Trimble_ant_type() to map Trimble's R10 values to IGS names for the R10

modified set_data_indicator() so that it would set the L1_C1_L5_C5 (phase associated with the C5) or L1_C1_C5 (no phase associated with the C5) data indicators if the SV is Galileo and any combination phase and code observables of E2-L1-E1 w/ E5a, E5b, and/or E5a+b signals; also modified the corresponding output of ++sym in symbol_codes()

2018 Mar 15

2018 Mar 14: some cleanup of part of the +help output

2018 Mar 8: duplicate_ephemeris() was moved to be beginning of nav_filtering() (since it was only called from within nav_processing() just prior to the nav_filtering() function call)

the above change allows for a cleaner test of the various possible reasons why an ephemeris might be excluded, now with a preprocessor toggle (which would also be a teqc option) to identify the reason with a switch on nav_filtering() at the end of nav_processing() using a new set of define values in binary.h

duplicate_ephemeris() was corrected (or generalized, depending on one's point of view) to include testing of the ephemeris ToC down to the level of seconds (whereas previously it had only been testing to the level of integer minutes), although the only known cases of incorrect ephemeris elimination prior to this change would have been for a GPS SV with an LNAV backticked message following another LNAV backticked message but with a ToC earlier in the same minute (i.e. a pretty rare event)

2018 Feb 26/27: corrected a subtle error in qc_position_out() for the antenna mean position; old position_stats() code now replaced with updated version and put directly in qc_finish_obs_epoch(); statistically tested on the 1600+ normal-rate sites that UNAVCO archives daily

2018 Feb 16: removed unneeded variables in qc workspace structure

2018 Feb 15: in qc_finish_obs_epoch(), changed the second of the conditions of when to call new_position() (see 22 Jan 2018 entry) to be:

  • the total number of pseudorange values has increased since the last call of new_position()

relocated the array allocation (for the least-squares position) in find_position() so that it is done, at most, only once per call (merely an efficiency change)

2018 Feb 13: an addition in GNSS_nav_time() (which has been the master function for determining the human-readable ToE and ToC for RINEX navigation messages since late March/early April 2017) for non-preadjusted SBAS navigation messages: to deal with cases like the following:

        ToW= 259200 %86400=     0  ToD= 86336
        ToW= 259200 %86400=     0  ToD= 86336
        ToW= 259200 %86400=     0  ToD= 86336
        ToW= 259273 %86400=    73  ToD= 86336
        ToW= 259273 %86400=    73  ToD= 86336
        ToW= 259285 %86400=    85  ToD= 86336
where the message is clearly in the previous day than from what the ToW value would suggest, the (signed) ToD is decreased by 86400 (= seconds in a day) if 86144 < ToD && (ToW modulo 86400) < 256

2018 Feb 9: corrections to ephemeris_location() from the 15 Nov 2017 revamp: the stored ToEC was not getting stored correctly, resulting in an incomplete ephemeris list for non-GLONASS and non-SBAS SVs; also, a review of the algorithm showed that there was also now a slight error in the ephemeris insertion (when the ephemerides for an SV were out of order and the code has to "insert" the current one into the list, the old insert was putting the current ephemeris before, instead of after, the located spot in the list; see 2012 Jan 4 entry), which is now corrected (i.e. the old offset is now no longer needed)

2018 Feb 7: modified qc_finish_obs_epoch() from 22 Jan 2018 needed correction: adding test for qc full (i.e. teq.qc_full.opt_X & DO_POSITION is non-zero) for the qc switch() (for either output_orbits() if -orb option is being used or possible call of new_position()); i.e. the qc switch() should not be used in qc lite

in nav_filtering() a block of code was added so that if doing qc full on raw data, calls to initialize_RK4(), populate_GLONASS_RK4(), populate_SBAS_RK4(), plus some boilerplate housekeeping, are done for GLONASS and SBAS SVs, but some additional work remains so that GLONASS and SBAS ephemerides past the first one encountered are used in the qc

2018 Feb 5: modification to NMEA_quadtuple() to return (with a null sensorID) if the next token's first character is any ASCII value less than 0x20 (space), i.e. an incomplete comma-delimited NMEA quadtuple occurs (usually occurring, if it occurs, at the end of an external met string)

2018 Jan 31: slight modification in obs_scan() for the +relax option (involving an invalid value or character in the LLI (loss-of-lock) field of a RINEX observation)

2018 Jan 30: some minor editing of some of the +help output

2018 Jan 29: elimination of the long-obsolete -p[ortrait] qc option, along with the associated -min_per_bin option and qc_portrait_bin() (although a local computation of "minutes per time bin" is still needed in qc_landscape_time_axis())

elimination of the now obsolete IGS_designations(), IGS_receiver_designation(), and IGS_antenna_designation()

elimination of the now obsolete -reset option (which was only intended for qc debugging of RINEX obs many years ago)

added check for return value of sscanf() in NMEA_quadtuple() and ASCII_0R0() (for parsing NMEA and 0R0 ASCII met strings with a non-valid data field)

2018 Jan 26: removed user command line acces to the +smtt and -smtt options; operationally, the functionality remains exactly as the +smtt default has been since 2006 Oct 25

modification of the met_sensor_info struct, met_sensor_mod(), and met_out_sensor_mod() so that the initialized sensor model, type, and accuracy are not equated to blank fields in a RINEX met SENSOR MOD/TYPE/ACC header line for a given sensor type (note: fixing a bug going back to at least early 2007)

2018 Jan 25: using +binex with -tbin: broken between 2016 Aug 2 and Aug 15 (probably on Aug 10 or 11): change in out_settings() so when +binex is in use, the appropriate file pointers are artificially set (depending on the use of +obs, +nav, and/or +met with -tbin) so that obs_binex_out(), nav_binex_out(), or anc_binex_out() is called in obs_filtering(), nav_filtering(), or met_filtering(), respectively

in order to test a request from Trimble: Trimble_27_57h_6_obs() was modified so that when reading .tgd record 27 or stream 0x57-6 each phase value would be modified by calling phs_ms_adj() and each pseudorange would be modified by calling rng_adj(), with an additional forced setting of MSEC_PHS_ADJ in teq.trans.opt_X just before decompose_Trimble_27_57h_6() is called, all when the preprocessor define TGD_27_W_SMTT is set, so that option -smtt could be tested on a .tgd file collected on a Trimble receiver with the clock steering disabled; however, any GLONASS FDMA phase data in record 27 for an SV occurring before an ephemeris for that SV is found in record 28 will not be correct; therefore, this will only be left in place for test purposes with the preprocessor define TGD_27_W_SMTT unset

2018 Jan 24: missing ASCII time plot indicator 'N' (= "observation data present, but not able to do qc"), currently only due to missing slot-to-frequency channel number for GLONASS SV: due to code changes (enhancements, cleanup, etc.) between 10 Feb 2017 and 31 Mar 2017, this indicator stopped working; the better solution for the current code is move the location of 'N' in the symbol hierarchy — now just below 'L' (= "loss of lock"), so that 'N' is higher in the hierarchy than all the data indicators and lower in the hierarchy than all the problem indicators (which is probably where 'N' should have been when it was first introduced)

on ABOVE_ELEV_MASK_no_DATA (see 23 Jan 2018 entry): with some experimentation with different elevation masks, the optimal approach is to have no special conditions of when to set the ABOVE_ELEV_MASK_no_DATA indicator in qc_no_data_check() except the expected conditions for an SV of no data and the SV's elevation is more than the mask angle

2018 Jan 23: NMEA_quadtuple() modified to return the first letter of the sensor ID in the NMEA string

decompose_NMEA_tilt() modified: when the transducer type is 'A' (for a tilt component), the correct component is now assigned based on the returned sensor ID from NMEA_quadtuple() (rather than assuming North tilt will always be first)

a bit more cleanup of new_position() (getting rid of now unnecessary code)

qc of an SV with no usable observation data, but ephemerides, now needs special condition in qc_no_data_check() in order to show ASCII time plot indicator for missing data above elevation mask (ABOVE_ELEV_MASK_no_DATA)

2018 Jan 22: new_position() and output_orbits() now only called from qc_finish_obs_epoch(); now, one of the following conditions is needed for new_position() to be called:

  • +eep, +eepx, or +eepg is being used
  • the total number of pseudorange values has either increased or decreased since the last call of new_position()
  • the epoch delta time since the last call of new_position() is greater than the time bin minus the sample interval (thus giving at least one call for every time bin in the ASCII time plot)
when not outputting orbits (otherwise output_orbits() is called); thus the logic in new_position() could be reduced and the call to new_position() in qc_satellite_obs_update() upon increasing the total number of pseudorange values could be removed

doing an averaged position for the qc result, i.e. option +ap, is now the default

removed the code for the define SV_dt_iteration setting (see 22 Sep 2017 entry)

2018 Jan 19: fixed typo in x_tilt_out() (see 8 Dec 2017 entry) which was preventing all +x_tilt options from producing output

also fixed decompose_NMEA_tilt(), which was also broken due to the initial filling of values with -9999.9

2018 Jan 18: removal of options +GIo and +GIo, making the functionality of +GIo the only remaining functionality for calculating GLONASS orbital positions; removal of now unused functions (previously used for GLONASS polynomial fitting of GLONASS orbital positions and subsequent interpolation for intermediate times):


turning off the define SV_dt_iteration setting (see 22 Sep 2017 entry)

2018 Jan 17: SV_id() now modified so that any non-zero SV id is output modulo 100 (see related 4 May 2017 entry)

final cleanup modifications to ublox_UBX_rxm_rawx_constellation() (see related 16 Jan 2018 entry)

2018 Jan 16: ublox_UBX_rxm_rawx_constellation() and ublox_UBX_rxm_rawx_obs() modified, with new ublox_UBX_rxm_rawx_constellation() eliminating any RXM-RAWX measurement block corresponding to an SV id outside of the accepted range

hmm, apparently broken at least by 2016 Oct 7 (but working on 2016 Aug 15): modified next_Trimble_dat_record() (for parsing of Trimble .dat/.tgd format) so that after the rare "not a known record ID" (usually due to a corrupted file) there is now a return of the function, rather than trying to use the next byte as a potential length byte and proceeding to parse

2018 Jan 11

2018 Jan 11: in find_position(), the options +eep and +ap are automatically turned on when any position solution is found to be uncertain unless -eep or -ap, respectively, had been set by the user

in find_position(), the limit for the maximum number of iterations for a position solution is now just 5 (instead of the 8 if +eep were set)

2017 Dec 29: path_good() and path_not_good() renamed to be SV_bearing_found() and SV_bearing_not_found(), respectively

cleanup of most of the old Borland preprocessor code additions

2017 Dec 20: the overhaul of qc_nav_files() (28 Feb 2017 to 10 May 2017, and other related code) should have dropped the setting of RINEX_HEADER_START after reading a RINEX navigation file for any system, because setting this disallows reading subsequent RINEX navigation files for that system during +qc operations, as allowed with the -nav option; setting of RINEX_HEADER_START is now not done in qc_nav_files() after each RINEX navigation file

2017 Dec 18: the logic for the new ASCII time plot indicator, 'K', for an SV to indicate that the antenna position solution did not converge had to be changed in find_position() so that it would only show when the SV had data for that epoch and the condition had to set a boolean which is checked in find_SV_position() to meanly set "unknown" SV elevation and azimuth values for each SV when there's not convergence by calling path_not_good()

the ASCII time plot indicator for non-convergence of the antenna position solution in the 'Pos' line was changed from 'C' to 'K'

2017 Dec 15: the temporaty option +SIo (introduced 9 Nov 2017) has been removed; computing SBAS orbits, if the SBAS ephemerides are present, is now the default during qc; note: -no_orb S can be used to skip using SBAS orbits

to alert a user to a potential problem as we are seeing at P714 starting about 2017-335, a new indicator for the ASCII time plot is being tried to show where there is no convergence on the position solution for each SV with a nav message for that epoch; code changes in find_position() so far -- and it might beworthwhile to also count the number of epochs in which this occurs and give a percentge in the report

2017 Dec 14: BUFSIZ was replaced with __BUFSIZ and currently set to be 8192; this corrects problems with outputting BINEX 0x7f records on Windows builds where BUFSIZ is defined to be 512 — with the addition of Galileo, Beidou, QZSS, and IRNSS, the old buffer size on Windows builds was simply inadequate (leading to teqc crashing or outputting incorrect binary data when outputing BINEX 0x7f and when this threshold was reached for the record body length; also, this change completely standardizes buffer sizes across all builds

better checks for bytes exceeding __BUFSIZ added to: next_binex_00_field_basis(), next_binex_05_field_basis(), obs_binex_out(), and anc_binex_out()

2017 Dec 13: in obs_phase_offset_init(), added missing initial assignment of the set flag (which in MingW builds, when missing, was causing problems with correct bias assignment in binex_7f_03_phase() when writing out BINEX 0x7f-03)

2017 Dec 12: in find_position(), added an extra check in the SV position loop adjustment so that if the difference between the antenna and SV's current position loop adjustment is more than 1e9 (1 billion) meters, then that SV is skipped for the current iteration

2017 Dec 11: new mingw32_clock_gettime(), based on calling gettimeofday() — Mingw32 build appears to give reasonable results with the +latency options reading a BINEX file on 64-bit Windows (note: the +latency options now compile with all builds, and work with all those that have been tested)

added (previously missing): checks are now made in binex_observables_7f_00(), binex_observables_7f_01(), binex_observables_7f_02(), and binex_observables_7f_03() to make sure that the number of SVs in any of the BINEX 0x7f-00 - 0x7f-03 records, respectively, do not exceed 32, and if so, a warning is issued and data only the first 32 SVs are output in the record

following the same idea as on 7 Dec 2017, out_settings() was modified so that MingW32 and MingW64 builds now set

        _setmode(_fileno(stdout), O_BINARY);
when BINEX is being output, allowing shell redirection to the resultant BINEX file

set_soe_out() modified so that when it is called via set_auto_out() and the user is using +out to direct what would otherwise be stdout to a specific file, then the output of the affected special output parameter is assigned to be the same as that specified in +out rather than stdout

2017 Dec 8: missing conditionals were added in psp_binex_out() and ris_binex_out() so that position solution parameters as BINEX 0x05 and receiver internal state parameters as BINEX 0x7d would be output when the input was not BINEX

the same set of missing conditionals and missing return (as in psp_binex_out() and ris_binex_out()) were added to anc_binex_out() for ancillary site data as BINEX 0x05

actual output of +x_tilt option output moved from decompose_NMEA_tilt() to new x_tilt_out(), with associated additions to the teq.x_tilt struct (note: new x_tilt_out() is where setting up to call anc_binex_out() will occur)

2017 Dec 7: apparently the default of stdin in Windows is ASCII, treating non-ASCII as special characters; so

        _setmode(_fileno(stdin), O_BINARY);
was added to std_is_tty() for stdin for MS_DOS

2017 Dec 6: modified new latency_out() so that the incoming epoch (pointer to EPOCH) need not be a standard teqc-based epoch (starting 1.0 Jan 1980), but could instead be used for GPST (starting 6.0 Jan 1980), or other cases in the future if needed (this simplies some code when calling latency_out())

had to rename the original DATE (struct date_struct) to be tDATE (teqc "DATE") to avoid a conflict when including window.h for MingW64 (~70 occurrences, so not too bad)

new mingw64_clock_gettime(), based on calling MinGW64 GetSystemTimeAsFileTime() — Mingw64 build appears to give reasonable results with the +latency options reading a BINEX file on 64-bit Windows (note: one warning it thrown for the line converting the reduced nanosecond value, originally an 8-byte unsigned integer, to a 4-byte unsigned integer when compiling with MinGW64; no obvious workaround)

2017 Dec 5: new eds_out() to consolidate the teq.eds->file.fp handling in soe.c

missing fflush() of>file.fp added in leica.c, rdata_obs.c, and rhead_obs.c where needed

slip_print() renamed qc_slips_out() and moved to soe.c

fflush() of teq.raw_nav->file.fp permanently added to mfo_check() (instead of being dependent on a debugging preprocessor flag)

fflush() of teq.obs_summary->file.fp added to obs_out_summary() when teq.soe.opt_X & OBS_SUMMARY_OUT

fflush() of teq.x_tilt->file.fp added to decompose_NMEA_tilt()

renamed rx_state() to be rx_state_out() (to be analogous to the naming of other soe output functions)

renamed position_state_parameters() to be psp_out() (to be analogous to the naming of other soe output functions)

generalized latency output code to be new latency_out(), now called from decompose_binex_00(), decompose_binex_05(), decompose_binex_7d(), decompose_binex_7e(), and decompose_binex_7f() for BINEX records 0x00, 0x05, 0x7d, 0x7e, and 0x7f, respectively (note: 0x01 is currently excluded because there is no creation time of the 0x01 records)

2017 Dec 4: the problem with including time.h on Linux seems to be cured by moving time.h to be the last system include and by moving teqc's defines.h to be before all system includes, but this also required teqc's in-line round() function to be renamed (rnd() was selected)

clock_gettime() is not available on macOS before 10.12, but a solution from Stack Overflow shows a way to make a portable equivalent on macOS using host_get_clock_service(), mach_host_self(), clock_get_time(), and mach_port_deallocate(), and mach_task_self(); so, more include file fiddling and a new function, osx_clock_gettime() (calling the above functions), which is only called instead of clock_gettime() when __MACH__ is defined

the return of binex_00_field_basis() changed from void to bool1 and appropriate logic changes in binex_00() where called for subrecords 0x1d and 0x1e, and a return in binex_00_field_basis()of FALSE if the field length is larger than 1 million bytes (arbitrary, at this point), because if this occurs, there is almost certainly some problem with the BINEX 0x00 subrecord, as might occur when interpreting another format as BINEX

to get the +latency option code working for cases where (1) the real-time library in not present but will want the option to do something (e.g. OSX builds), (2) there's no know solution to make the option work (e.g. builds using Linux Mingw cross-compilers for Windows), and (3) proceed as expected (e.g. Solaris, Linux) changes were made to the teqc.rc script (for a '-lrt' option), to the Makefile, and to how INCLUDE_TIME is defined in defines.h

added missing fflush() of teq.latency->file.fp (for file output, when needed)

2017 Dec 1: addition of new +latency options using C function clock_gettime() with first parameter being CLOCK_REALTIME; currently in testing for BINEX 0x7f records only; works aok on Solaris Sparc and Solaris x86, but something is very wonky when just including the required time.h on Linux

2017 Nov 30: relocation of the K[ ] array in GLONASS_SV_geocentric_position() and SBAS_SV_geocentric_position() when the RK4[ ] dynamic array storage is being used (was causing occasional problems in original location — definitely for SBAS and probably for GLONASS as well)

changed SBAS binning parameters for the RK4 array to be ±256 seconds in 8 steps of 32 seconds

removed original non-dynamic RK4 code (i.e. no pre-storage)

removed all the old cubic-spline fitting code (and variables) for approximating an SV's elevation and azimuth; functions removed: path_estimate(), find_path_fit(), orbit_path_fit_update(), start_orbit_path(), spline_time_window(), start_orbit_paths(), qc_satellite_path(), qc_satellite_orbit(), ephemeris_retreat(), cubic_spline_4(), and cubic_spline_interpolation_4()

relocation of the RK4 t_inc and n_hb parameters in the struct QC_SV_NAV with their assignment, now per SV, in initialize_qc_nav() — currently only needed for extrapolating GLONASS and SBAS SV positions from the ToE of their broadcast ephemerides; this generalization allows for the possibility of using different t_inc and n_hb parameters on a per SV basis, if needed

2017 Nov 29: modified SBAS_SV_geocentric_position(), initialize_RK4(), and populate_SBAS_RK4() to use a separate set of SBAS binning parameters for the RK4 array — ±128 seconds in 4 steps of 32 seconds (and thus distinct from GLONASS with ±900 seconds in 9 steps of 100 seconds) — mainly as an initial SBAS test

2017 Nov 22: new qc_lite_alert() to consolidate all the alerts about GNSS constellations with data but with no orbit method currently coded into one function

use of new bin flag, qc->SV[n].nav->bin in find_position(), to capture when an SV's position code does not yield a valid position on the last iteration of finding the current antenna position

2017 Nov 21: new +svpr (in qc ASCII time plot, show any SV with position rejection during antenna position calculation) and -svpr (don't show these, as done previously), with -svpr currently being the default — +svpr is meant to be a debugging qc feature, mostly for multi-constellation qc operations

2017 Nov 20: new GNSS_SV_geocentric_position(), which allows a replacement of the complicated switches in find_position(), output_orbits(), and find_SV_position() (as well as in the hopefully soon-to-be obsolete qc_satellite_orbit(), find_path_fit(), and path_estimate()) to assign the appropriate *_SV_geocentric_position() function where needed

qc_counter_reset() renamed to qc_reset() (since it has long done more that just reset qc counters) and in it added what has been a missing piece of logic: if qc->SV[n].nav->use is greater than zero, then in addition to resetting this to zero for the given SV, a call to ephemeris_extract() for this SV should have been made (and now is) — the missing call had negligable impact on non-GLONASS SVs, but with GLONASS ephemerides only being valid for ±15 minutes from the ToE, the missing call had the effect of giving an out-of-bounds initial ephemeris for some GLONASS SVs for the for first epoch(s) in some time windows causing any such initial epochs to be treated as "orbit unknown" cases

2017 Nov 17: renamed SV_elevation() to qc_SV_elevation_flags() — which is more descriptive of what the function does

new find_SV_position(), replacing path_estimate(), which does a direct call to the pertinent *_SV_geocentric_position() instead of doing the cubic spline fitting; this eliminates quite a bit of bookkeeping (and quite a few functions, along with quite a bit of code complexity), but does end up taking about 10% more time in actual timed testing to do a qc of typical datasets; functions no longer needed: cubic_spline_4(), cubic_spline_interpolation_4(), spline_time_window(), path_estimate(), start_orbit_path(), start_orbit_paths(), orbit_path_fit_update(), orbit_path_fit_update(), qc_satellite_path(), and qc_satellite_orbit()

2017 Nov 15: revamp of ephemeris sorting and ordering in ephemeris_location(); the new code includes sorting by full ToE of the ephemerides (i.e. down to the second, and not just the minute, which is most relevant for GLONASS since each ToE needs to be converted from UTC to GPST, but also is relevant for GPS backtic ephemerides); and the new code is better at identifying and skipping duplicate messages

2017 Nov 14: cleanup of some of the unnecessary steps and assignments in GLONASS_SV_geocentric_position_SW() and interpolate_GLONASS_position() and in GLONASS_SV_geocentric_position_SW() corrected where GNSSt_to_UTC_At() is called to adjust the time between the epoch and the current GLONASS SV's ephemeris

renamed GLONASS_x_xdot_via_RK4() and GLONASS_eqs_motion() to GNSS_x_xdot_via_RK4() and GNSS_eqs_motion(), respectively

2017 Nov 13: generalized epoch_increment() to work with negative time increments; used this for setting the advance and retreat epochs for SBAS in ephemeris_location()

constellation_total() was modified so that if the SV count in a RINEX obs epoch line exceeds the expected SV count during qc, then a warning is issued via rinex_read_warning() with a reset of the expected SV count (instead of a failure message followed by program termination via rinex_read_failure())

2017 Nov 9: preliminary new functions SBAS_SV_geocentric_position() and populate_SBAS_RK4() now integrated into the rest of the code, using GLONASS_x_xdot_via_RK4() and GLONASS_eqs_motion() (which should probably now be renamed); associated changes in qc_satellite_nav_update(), qc_nav_files(), ephemeris_location(), ephemeris_extract(), qc_satellite_orbit(), find_path_fit(), and path_estimate() — the same as needed for the GLONASS ICD method

GLONASS_eqs_motion() toggled to use WGS84 parameters instead of PZ-90 parameters, with essentially no significant impact on position solutions with GPS plus GLONASS data

return values of the *_SV_geocentric_position() functions modified to return a new enum, ORBIT_NAV_UNHEALTHY_NOT_ALLOWED, when option -unhealthy in effect and an ephemeris with unhealthy status is found

use of return values of the *_SV_geocentric_position() functions modified to only use return values of ORBIT_OK and ORBIT_NAV_INDICATES_UNHEALTHY to indicate usable SV position solutions (this also involved reordering the enum values in qc.h)

flipped QC_ALLOW_UNHEALTHY_NAV_ON to FALSE, making the option -unhealthy the default instead of +unhealthy (which is a change since implemented 25 Sep 2015)

2017 Nov 8: correction (at long last) to rinex_met_data() so that a missing met observable value (i.e. all blanks) in a RINEX met data line will be detected and replaced with a value of -99999.9

corrected minor error in qc_SVs_present() for reporting the SV id (e.g. PRN) of any SV that is unhealthy, although the error only effected reporting of SBAS PRNs

2017 Nov 6: added new qc ASCII plot indicator (character '!') for showing when an SV's pseudorange data was rejected during an antenna position calculation, set with define SV_POSITION_REJECTION

an SV orbit which is not ok (more often than not a situation that arises with a GLONASS SV's orbit due either to the epoch time being too far from the ToE in the ICD methodology or for various reasons in the old polynomial fitting methodology) was not being marked as such for the qc ASCII plot; this was corrected in find_location() when the orbit status is found to be other than ORBIT_OK

2017 Nov 6: added new qc ASCII plot indicator (character '!') for showing when an SV's pseudorange data was rejected during an antenna position calculation, set with define SV_POSITION_REJECTION

2017 Nov 3: indexing simplifications and corrections for accessing the correct stored K[ ] array in GLONASS_SV_geocentric_position(); testing on the usual GPS + GLONASS cases

2017 Nov 2: in ephemeris_location(), needed to account for leap seconds to adjust the advance (and retreat) time of each GLONASS ephemeris (note that currently for GLONASS, the retreat times are not being used)

two new functions, initialize_RK4() and populate_GLONASS_RK4(), the former for any GNSS ephemeris needing Runge-Kutta integration and allocating space for a set of K[ ] arrays and the latter for populating the K[ ] arrays for a given GLONASS ephemeris; initial integration of these into the new GLONASS orbit code

code cleanup from initial testing the Runge-Kutta numerical integration of the GLONASS orbital equations of motions from the ICD GLONASS

2017 Nov 1: in the struct qc_eph_list, changed the ToEC, advance, and retreat from a 4-byte unsigned integer primitive (to hold only minutes since 1.0 Jan 1980) to an EPOCH struct (to hold minutes and seconds since 1.0 Jan 1980); this ultimately will provide better control for switching between GLONASS ephemerides during qc using the new ICD orbit position methodology due to the leap second offset between the native UTC GLONASS ToC/ToE epochs and GPS time used during qc; this also simplified the storage of the ToE in eph_list in ephemeris_location()

in path_estimate(), directly using GLONASS_SV_geocentric_position() instead of a cubic spline fit as with other constellations for the SV's azimuth and elevation estimates, seems to be the optimal approach, given that GLONASS_SV_geocentric_position() can be set to return a ORBIT_NOT_AVAILABLE status when the epoch is outside of the suggested ±15 minute window from the SV's ToE — thus accurately reflecting when there is not valid ephemeris data for the SV (as opposed to the equivalent to GLONASS_SV_geocentric_position() using the polynomial position fit, which has to bridge over small gaps of ephemerides in some cases in order to have enough time samples for a polynomial fit)

2017 Oct 26: new ephemeris_retreat(), using an estimate of when to use the previous ephemeris for an SV, and parallelizing with an improved ephemeris_advance() (using an estimate of when to use the next ephemeris for an SV); ephemeris_retreat() is only called when needed from within find_path_fit() (which sets up and finds the sky path for an SV using a cubic spline fit) when an ephemeris advance is needed)

ephemeris_extract(), which is called by ephemeris_advance() or ephemeris_retreat() if an ephemeris advance or retreat is needed, respectively, was modified so that qc_satellite_path() is only called for an ephemeris advance (otherwise, find_path_fit(), when called from within qc_satellite_path(), leads to an oscillatory behaviour between advancing and retreating ephemerides for an SV which eventually leads to a segmentation fault)

2017 Oct 24: the ephemeris continuity check in ephemeris_location() was changed to be entirely based on the ToE (time of ephemeris), instead of also based on the ToW (transmission time of week), because when using combined ephemeris files (e.g. from CDDIS), the ToW values, even for a single SV, are simply too erratic and many ToW values even appear to be in error (e.g. ToW values implying that the ephemeris was transmitted several days prior to the the ToE — which is highly unlikely — and having no logical relationship to other more likely ToW values)

removed duplicate code in orbit_path_fit_update() which, apparently, was added by SW long ago

2017 Oct 20: added new +x_tilt options for outputting external tilt data (2-axis tilt and sensor temperature); modified external_data_string() if detecting YXXDR string and a +x_tilt option in use to call new decompose_NMEA_tilt() (note: logic was added to out_settings(), calling soe_auto_arg() if BINEX is being output, in which case tilt should be in 0x7e, but this has not been implemented yet)

generalized NMEA_quadtuple() so that the function could be used in both NMEA_XDR_met() for met data and in decompose_NMEA_tilt() for tilt data (and calls in NMEA_XDR_met() needed to be accordingly modified)

2017 Oct 19: addition of continuing in met_processing() when an +eds option is in use: allows capturing of external data strings from BINEX 0x7e-01

addition of test for "$YXXDR," string in is_met_present() with call to event_logger(): allows capturing of external tilt data strings from BINEX 0x00 comments

addition of test for "*9900XY" string (a query string for certain tilt meters) in is_met_present(), to skip when found

2017 Sep 22: discovered that the relativistic SV eccentricity correction term was being applied twice in all *_SV_geocentric_position() functions (see entries for 2017 May 8 & 17) except new one for GLONASS (which has to be computed using the alternate method); corrected

addition of iterative SV clock correction (instead of one-pass, as has been used up to now) in each *_SV_geocentric_position*() function; can be turned off or on with the define SV_dt_iteration setting

of the test set of GLONASS qc cases saved (many oddballs), there were two that would result in a NaN location with GLONASS-only using the new GLONASS_SV_geocentric_position(), which was tracked down to an initial NaN solution using the starting XYZ of 0 0 0; a simple fix seems to be to detect this case in find_position() at the end of the first iteration and then set the solution to be on the order of a kilometer from 0 0 0 for the next iteration

2017 Sep 21: renamed ephemeris_file_location(), ephemeris_file_advance(), and ephemeris_file_extract() to ephemeris_location(), ephemeris_advance(), and ephemeris_extract()

added special case for setting ephemeris advance time for GLONASS in ephemeris_location()

added missing cases for setting ephemeris ToE to GPS time for SBAS and Beidou in ephemeris_extract()

2017 Sep 20: new temporary option, +GIo, that switches logic in multiple places for using the GLONASS ICD orbit methodology instead of the current GLONASS position interpolation orbit fitting methodology; preliminary testing

2017 Sep 19: new prototype functions for (hopefully) replacing the current GLONASS position interpolation orbit fitting code with Runge-Kutta numerical integration of the orbital equations of motions from the ICD GLONASS: GLONASS_x_xdot_via_RK4() and GLONASS_eqs_motion(), as well as the new calling function, GLONASS_SV_geocentric_position() (modeled after the other *_SV_geocentric_position() functions based on ICDs), with the original GLONASS_SV_geocentric_position() now renamed GLONASS_SV_geocentric_position_SW()

2017 Sep 18: removal of all remaining old non-dynamic memory allocation code from the translation modules (but, for backup reference, this is still in the frozen 20170915 code)

2017 Sep 15

2017 Sep 12: in decompose_Leica_MDB_71() the line of code for assigning obs.event.obs_is and obs.event.file and then calling rinex_out_event() was moved to be after the preprocessor if defined(EVENT_INFO) block (rather than before it), which corrects the output of event information from Leica MDB record 0x71 (113)

addition of logic condition of +event output to stdout, stderr, or a non-RINEX file to need_rinex_interval() so that this option plus +meta would work with one or more RINEX obs files (and see related 13 Oct 2016 entry)

2017 Sep 11: better solution in obs_epoch_check() to determine whether to set obs.session.end to the current observation epoch (see 6 Sep 2017 entry): a flag is set in implied_window_limit() if obs.session.end is assigned, usually from using +meta or +mds; if not, obs.session.end is assigned here; the flag is cleared immediately after this block

2017 Sep 7: in dump_metadata() a slight formatting change for the output of the antenna elevation (for +meta option), to increase the resolution shown from 1 mm to 0.1 mm

2017 Sep 6: extra conditions were added in obs_epoch_check() to determine whether to set obs.session.end to the current observation epoch: normally, obs_epoch_check() is not even used if +mds is being used, but if +mds is used with a +event option, it is, but any observation epoch might be an event epoch (given the current code before this), and in that case obs.session.end need not be set here; this change results in the same correct session end with +mds whether a +event option is also used or not

the text for the messages in binary_read_failure() and binary_read_warning() has been amended so that the value shown is clearly a record count (which starts at 0), rather than a record ID, in the specified file

in dump_metadata(), changed the assignment of "unknown" height (if height < -a_WGS84 or > 1e9) from -a_WGS84 to -b_WGS84

2017 Sep 5: the code block addition of 2017 Aug 18 in obs_data() accidentally had a break at the end of the block, resulting in an infinite loop when reading a RINEX obs file with event flag = 5 when also using the +meta option (but not the +mds option)

2017 Sep 1

2017 Sep 1: remove_separators() and extract_types_list() (which calls remove_separators()) was modified with an extra boolean argument so that 'T' and 't' would be skipped if the observable list is for met observables, which has 'TD' or 'td' for the dry air temperature

2017 Aug 31: in dump_metadata(), added length of "data" span in output of +mds: in hours unless longer than 72 hours (then in days), or less than 2 minutes (then in seconds), or less than 1 hour (then in minutes)

cases added in next_NavCom_record() to silently skip Navcom records 0x11 (serial port configuration) and 0x16 (port configuration)

2017 Aug 29: modification to decompose_Leica_MDB_10_74() so that the event descriptions of Leica MDB records 0x10 (16) and 0x74 (116) are only output when a +event option is used, to the specified output, and only when that output is not to RINEX obs

2017 Aug 18: to try to get the +event options to work when reading a RINEX obs file (which hasn't been a defined function up to this point), first include !(teq.soe.opt_X & EVENTS) for a positive return in fast_metadata_scan(), i.e. don't do a fast metadata scan if +event is being used when reading a RINEX obs file

if there are any extra lines besides the epoch line for an event flag = 5 in a RINEX obs file, they should be COMMENT lines, so a little block of code to extract and print each relevant field as it is encountered was added to the case for a comment header line in process_rinex_obs() — this will probably become a function in event.c

in obs_data() after the call to obs_epoch_check(), added a copy of a valid observation epoch to the event epoch, obs.event.epoch, when an an event flag = 5 occurs

2017 Aug 17: corrections and adjustments to the latter part of event_logger() to break up an unknown event ASCII string into pieces of 59 or fewer left-justified printable characters for one or more RINEX obs comments

also added to event_logger(): if after checking if the string is an XDR record or other possible string with met data and the string is not identified, then a return is done if there is no +eds or +event option set (since there is no need to proceed further)

2017 Aug 16: reading of Topcon TPS and Javad JPS [XA] and [XB] messages modified in Topcon_event() to allow for events recorded in GLONASS or UTC(SU) timebases (converted to GPS time for output)

2017 Aug 15: in flush_bs_buffer(), a check for whether the pointer to basic and, if so, also that basic->out.fp is non-null before calling any of the obs_out_epoch() cases; this allows a file be be examined with a +event option and a metadata option (e.g. +meta, +mds) without necessarily creating any RINEX obs output

2017 Aug 14: another minor improvement to rinex_out_event(): checking for any zero-length event message string and skipping an output if so; among other things, this eliminates a "null" message (valid construction, but pointless to output) immediately after the first output event when outputting event-only data when windowing the start of the events

2017 Aug 2: rather than having a return in rinex_out_event() (see 2017 Jul 28 entry), experimenting with calling obs_out_standard_header() and obs_out_start_end and setting RINEX_OBS_HEADER_DONE in obs.basic.rinex.out_X — allows output of the RINEX obs header followed by one or more events prior to any GNSS observations

2017 Aug 1: attempt at modifying decompose_Topcon_PM(): look for rcv/igs=" string and if the beginning of the string is JAVAD, call set_to_Javad() and extract IGS receiver type name if -O.rt option is not being used

rather than having a large static string buffer for the event string, it is now a dynamically-allocated buffer, obs.event.msg, built from the various possible pieces which are written into a static string buffer, obs.event.buf, in new build_event_msg() function

2017 Jul 31: reading of Topcon TPS and Javad JPS [XA] and [XB] messages modified in Topcon_event() to allow for events recorded in UTC(USNO) timebase (though converted to GPS time for output)

the bit manipulation for the flags byte for reading UBX-TIM-TP (to align the bit flags with those of UBX-TIM-TM2) was in error when calling UBX_event() — now corrected

2017 Jul 28: the third return in rinex_out_event() needed to be skipped if a metadata option (+meta or +mds), verify option (+v), or qc (+qc or +qcq) is also being used

2017 Jul 27: added check for a non-null record prior to calling Trimble_17_57h_0_wf_and_obs in binary_OBS() for the one case this now being called from rinex_out_event() for receiver events in Trimble .dat/.tgd

changed the "else if" to just "if" in the "do{ } while()" in rinex_out_event() (otherwise, the event comment in the RINEX obs file is not written when a +event option is being used)

2017 Jul 18: fix of rinex_version_type(): a modification to the switches for the various RINEX file type cases done for the 18 Apr 2017 overhaul had a bug in the second switch when reading a RINEX met file type (the order of two lines were reversed) which cases a segmentation fault — easily fixed once recognized; the other RINEX file types were aok

more clean-up: final elimination of the old, original, and long-unused code (since 26 Apr 2013, when week_rollover_check() was introduced) in met_epoch_no_gps_week()

2017 Jul 17: +mds option output slightly modified to also include the time difference between the first and last epoch in hours, to 0.001 hour (= 3.6 second) resolution

as part of on-going cleanup, removed the never-implemented -M.l[ast_epoch] option and associated flags

2017 Jul 13: further overhaul of +rx_clk_off option: introduced new flag, VALID_RX_CLK_OFFSET for teq.time.opt_X, which is now set only when a format (including RINEX obs) has a valid receiver clock offset provided for the current observation epoch; also removed erroneous attempt to guestimate the receiver clock offset from the various Leica format records; also now using this flag to determine whether or not to output the receiver clock offset value in obs_out_data_epoch_termination() for RINEX obs

2017 Jul 12: for the now seldom used +rx_clk_off option: this appears to not have been working for some situations after 10 Feb 2017 and problematic by 31 March 2017 (although not working for the same situations going back many, many years); a simple inclusion at the beginning of obs_epoch() of an assignment of the current receiver clock offset value to obs.receiver.clk_offset seems to be a comprehensive fix

(related to above) in obs_out_data_epoch_termination(), the requirement that the current receiver clock offset value obs.receiver.clk_offset be non-zero for output when +rx_clk_off is used has been removed

2017 Jul 3

2017 Jul 3: the assignment of the GPS and GLONASS RINEX navigation version in binary_NAV() was changed to be CURR_RINEX_GPS_NAV_VERSION and CURR_RINEX_GLONASS_NAV_VERSION, respectively (rather than the minimum of LAST_RINEX_G*_NAV_VERSION and CURR_RINEX_G*_NAV_VERSION, as before)

the special consideration code at the end of Leica_GPS_ephemeris() for sometimes setting the GPS ToW value to zero appears to no longer be necessary, given the new GNSS_nav_time() and using the GPS ToW proxy for Leica data, and using this can lead to a few missettings of the GPS ToW to zero when it need not be

2017 Jun 29: in phase_data() and code_data(), added a switch and case to skip IRNSS when calling phase() with L1 and code() with C1, respectively (given that IRNSS does not have an L1 signal); note: this same switch and case to skip IRNSS had already been done in snr_data() when calling snr() with S1

added missing note for GLONASS G3 in the L7/C7 output of the ++sym option

2017 Jun 27: in decompose_binex_7e() (for reading BINEX 0x7e) the call to met_epoch_with_gps_week() now sets and uses a local GPS week value (rather than setting and using the global teq.u.GPS_week)

2017 Jun 26: added assignment of teq.u.GPS_week from the stored "week" value in Trimble record 27 and stream 0x57-6 prior to the call to obs_epoch_with_gps_week() (i.e. when -week is not used) in decompose_Trimble_27_57h_6(); this optimizes user work flow when navigation records are present and is necessary when reading records 27 or stream 0x57-6 and no navigation records are present and -week is not used

2017 Jun 22: (minor) included IRNSS in teqc +help output description of -no_orb[it] and -no_pos[ition] options (in usage())

2017 Jun 16: replacement of "no data" for met observables with D_NO_MET_DATA (currently defined as -1e5) in set_met_obs_null(), met_no_data(), met_filtering(), trimble_9_met(), NMEA_quadtuple(), and ASCII_0R0() — which means that any observable requested but not found in the data will now show up as "-9999.9" in a RINEX met file

in met_native_to_RINEX_out() an initial test was added to see if all the met observables are D_NO_MET_DATA and, if so, there is an immediate function return — thus avoiding outputting a met epoch with no data whatsoever

in external_data_string() an extra test for a "$VXDR" string was added, skipped if found, which seems to be a possible failure mode of a faulty tilt meter outputting NMEA strings for tilt

2017 Jun 15: (back to the 2017 Jun 1 and May 19 & 31 entries): the next attempted solution was to increase, by a factor of 2, the delta increment for the record buffer in next_Ashtech_stream_record() with the initial seed size back to just 4 bytes for all builds; this was tested and worked successfully on a wide suite of Linux 32- and 64-bit systems, plus Solaris Sparc and x86 32- and 64-bit builds using the 4 problematic sets of 96 15-minutes Ashtech stream files supplied by JPL

2017 Jun 14: to correct mislabeled delta times in .ele and .azi compact3 files for epochs with no data, i.e. "missing epochs", an epoch parameter was added to the functions plot_compact_current_epoch() and qc_plot_compact_data() (the latter called by the former) and then the missing epoch is passed when plot_compact_current_epoch() is called by qc_missing_epochs() for elevation and azimuth

2017 Jun 13: added missing case line for SBAS L5 in SeptentrioBF_signal_map()

2017 Jun 1: after trying some other possible solutions for this reallocation mystery of gcc on Linux, now doing the same trick for all Linux builds as done on 19 May 2017 in next_Ashtech_stream_record() — tested on 32-bit and 64-bit Linux systems, including running the 32-bit statically linked build on 64-bit Linux

2017 May 31: same trick for 32-bit build of Linux on Red Hat Linux release 9 (Shrike) as done on 19 May 2017 in next_Ashtech_stream_record() — tested on 32-bit and 64-bit Linux systems

2017 May 30: correction in JPS_signal_map(): observables for Beidou B1-2 (1589.742 MHz carrier) changed to go into C2, L2, D2, S2 of extended RINEX 2.11 (incorrectly added 19 Aug 2016 as C5, L5, D5, S5 — which at Javad fw 3.7.0 and later correspond to observables for Beidou B2a (1176.45 MHz carrier)); luckily, there doesn't seem to be much data for the Beidou Phase III B1-2 signal yet

the edit of extract_position() of 22 May 2017 accidentally removed a key piece of the initial part of the function: this piece has been restored

external_data_string() modified to not report any error message when the met string contains '|0XU,' or '|0RU,'

frequency(), initialize_qc(), qc_satellite_obs_update(), and symbol_codes() updated to include cases for Beidou B2a (1176.45 MHz carrier) and B1C (1575.42 MHz carrier)

added qc observable symbol 'u' for B1/E2+B2/E5b+B3/E6 Beidou data: new L1_C1_L7_C7_L6_C6 enum, 'u' symbol in qc_SVs_symbol[ ], and L1_C1_L7_C7_L6_C6 switch case in set_data_indicator() and symbol_codes(); tested on Javad JPS data tracking Beidou C32, C33, and C34

2017 May 25: re-wrote the old way of automatically constructing the alternate RINEX navigation filenames (based on any .obs or .OBS suffixes on the supplied RINEX navigation filename) in the second block of qc_auto_find_nav_files() — more compact, more readable, and less prone to future errors; added .bds or .BDS as the primary convention to search for Beidou, leaving .cmp or .CMP as the alternate convention

struck by inspiration after doing the above, simplified the first block of qc_auto_find_nav_files(), although the details rely on the system enum ordering in system.h — but again the result is more compact, more readable, and less prone to future errors

2017 May 24: added qc observable symbol 'i' for L5-only observables for L-band only IRNSS data: new L5C_C5 enum, 'i' symbol in qc_SVs_symbol[ ], and L5C_C5 switch case in set_data_indicator() and symbol_codes(); tested on Javad JPS data tracking IRNSS

2017 May 23: added switch case for IRNSS L5 observables in JPS_signal_map() (for reading Javad JPS with IRNSS tracking on)

modification to Javad_EN_ephemeris() (for reading the decoded Galileo navigation message in Javad JPS [EN] message) to account for new JPS scheme of encoding the navType starting at firmware v3.5.5 (needed for populating the data sources in the Galileo RINEX navigation message

new option +extend to replace previous overload of +relax to allow for extended RINEX version 2 with Beidou, QZSS, and IRNSS; (temporarily, +relax will continue to do the same thing)

2017 May 22: added changes for new +O.px - and - options which forces a fixed antenna position during qc (like the previous +O.px and usages), but having the single minus sign argument will use the antenna position from the RINEX observation header, or if quality checking raw data, use the antenna position found as metadata; associated changes in obs_arg(), bnx_arg(), obs_approx_position(), and extract_position()

2017 May 19: yet another change in the precise logic of return condition at the start of nav_processing(); see 16 May 2017 entry

the define _64BIT_BUILD seems to have gone missing in action for the 64-bit Linux build using the Opteron, so this was restored

the problem that JPL ran into using the 2017Nov7 Opteron 64-bit Linux build (which is being compiled with an old 64-bit gcc and associated libraries on Red Hat Enterprise Linux WS release 3 update 4 system) appears to be due to a flaw in that gcc version of realloc() — in that after some number of memory reallocations, pointers to certain memory locations will simply stop increasing memory when asked to do so, but there is no indication of a failure via the return value of realloc() and no associated memory or segmentation faults; the attempted workaround is that in next_Ashtech_stream_record() — for this build only — the seed value for the initial realloc() for the record buffer is set to be 2048 bytes rather than the 4 bytes used for all other builds

2017 May 18: removal of all old, obsolete RINEX editing option notices and code (i.e. originally for editing any of the date and program in the headers, for editing the system designator in a RINEX navigation file header, and for editing the end time in a RINEX observation file header) and the old, long-obsolete option for engaging dynamic changes of the observations in a RINEX observation file

increase in the default number of allowed SBAS SVs from 23 to 39 (corresponding to an increase in the default SBAS PRNs from 120-142 to 120-158) in array SVs_in_system[ ] (given that SBAS PRN 147 is now popping up)

updated all the build lines to account for the 32-bit Linux from our old Linux machine to a VM, new builds that will be done on a 64-bit Linux VM, and an ARM Arietta G25 build; tested compilations and fixed a few minor warnings

2017 May 17: final modification when using new ECEF_to_ECI() in find_position() — definitely improved point positions when the relativistic SV eccentricity correction on SV system time on each system is also included; the eccentricity correction for GLONASS still needs to be included, but neglecting this correction for GLONASS is at least aided by the fact that the eccentricity of GLONASS orbits tends to be very low for most GLONASS SVs

2017 May 16: change of return condition at the start of nav_processing() to continue reading and not skip an ephemeris if extracting metadata (e.g. options +meta or +mds) and also extracting delta UTC parameters (options +dUTC_p) since some delta UTC parameters are in some decoded navigation messages (e.g. tauC in GLONASS)

nav_out_dUTC() was modified so that when extracting delta UTC parameters using the +dUTC_p options, the D-UTC A0,A1,T,W,S,U style format (defined for SBAS RINEX 2.11) is used for all systems for a consistent output (which means that the epoch times for the A0 and A1 parameters are expressed in a GPS week and seconds into that GPS week)

GNSSt_to_UTC_At() modified to directly use a supplied epoch at which to return the -A(t) correction to convert the indicated system time to UTC (rather than computing a delta time externally), and all signs have been checked — so I think this is correct now

addition of new ECEF_to_ECI() to correct SV position for time-of-flight of each signal's pseudorange

2017 May 15: now that all dUTC.ref_epoch values are in teqc "epoch" representation, an addition of code to switch the ref_epoch back to UTC(SU) was added in nav_out_dUTC() for GLONASS for the CORR TO SYSTEM TIME output (which applies to both a GLONASS RINEX header line or for +dUTC_p output)

2017 May 12: new dUTC_GLONASS_ref_epoch() which converts the GLONASS reference date for each tauC (UTC offset parameter) into a GPS week and time of week equivalent; use in nav_arg() when using -N.dUTC R option, in nav_dUTC() after reading the CORR TO SYSTEM TIME header line in a GLONASS RINEX navigation file, and in decompose_Topcon_UO_NU_WU_EU_CU_QU_IU() after reading the Topcon TPS or Javad JPS [NU] message

2017 May 11: completed normalizing the name space for flags, variables, structures, etc. related to all system time offset parameters from (their respective) UTC, e.g. the -N.dUTC and +dUTC_p options (the latter previously having been +utc_p) and other related cleanup

2017 May 10: had two minor bugs in the overhaul done to qc_nav_files() on 4 May 2017 (which took a bit to figure and correct)

2017 May 8: addition of relativistic SV eccentricity correction on SV system time on each system according to the first formulation in the IS-GPS-200 except GLONASS (which will need to be treated according to the second formulation)

2017 May 4: change of SV_id() to only show system ID character if the SV's id is zero (i.e. unknown)

modification to process_rinex_nav() to return the flag ID of the header line found

modification (and considerable simplification) to the beginning of qc_nav_files(), using modified process_rinex_nav(), to search each RINEX nav file for any system time to UTC offset parameters (replacing the old code that was hard-wired just for GLONASS) during +qc

finally: system time to UTC corrections, using the stored system time to UTC parameters for A(t) for each GNSS system, now in new function, GNSSt_to_UTC_At(); this is in place for all SV time corrections (i.e. the delta t for each SV, dt_SV, in the QC_SV_NAV structs) — so that at least A(t) is now controlled from one function for all GNSS systems

2017 May 2: addition of call to filter_system_in_nav() in nav_out_delta_UTC(), nav_out_ion_alpha(), and nav_out_ion_beta() (although doing this in each function is not the most efficient way to achieve SV filtering, but it works)

associated slight change in filter_system_in_nav() to allow filtering on a system if the SV id is zero (i.e. unknown)

in ephemeris_file_location() (for GLONASS ephemeris case) and initialize_GLONASS_orbit_fit(), replaced SV nav filtering with call to filter_system_in_nav() instead of nav_filtering() (the latter not really being the correct function in these cases)

new GNSS options -N.dUTC, -N.ionA, and -N.ionB for user setting of delta UTC parameters, ionospheric alpha parameters, and ionospheric beta parameters; associated setting of original related options (for GPS, GLONASS, and SBAS) as obsolete

re-wrote the nav option configuration dump in dump_config() for all GNSS systems

2017 May 1: normalized calling of nav_out_delta_UTC() for each record or message in each format that uses it for the +utc_p option, including adding this for each location where delta UTC parameters are obtained for SBAS and GLONASS; this includes re-doing the parsing of Leica LB2 0xd1 and MDB record 142 in decompose_Leica_LB2_d1() and decompose_Leica_MDB_8e(), respectively

re-write of the end of rinex_out_pgm_agency_date() dealing with the various optional RINEX header field in all GNSS navigation files — including eliminating (for now) calling nav_out_leap_seconds() (for outputting LEAP SECONDS line)

change in window_O() so that the uninitialized global value of the GPS week, teq.u.GPS_week, is not set based on system time if the input format is RINEX or BINEX

2017 Apr 28: insertion of D-UTC A0,A1,T,W,S,U label in rinex_header_label[ ][ ] array, corresponding changes in the *_index[ ] arrays, and new RINEX_dUTC_SBAS flag — all to properly include the delta UTC parameters in SBAS RINEX navigation file header

change of UTC_ref_epoch() to dUTC_GLONASS() and corresponding changes in parameter list and internally since this is now only to be used for the delta UTC parameter for GLONASS

overhaul of decompose_Topcon_WO() to disambiguate between Topcon TPS and Javad JPS, and properly parse TPS [WO] for SBAS delta UTC parameters

nav_out_delta_UTC() now generalized for writing all systems' delta UTC to RINEX nav headers or +utc_p option output; nav_out_corr_to_system_time() now can be eliminated

nav_delta_UTC() now generalized for reading all systems' delta UTC from RINEX nav headers except SBAS; nav_corr_to_system_time() now can be eliminated

2017 Apr 27: a fairly complete sweep of print statements to reword prior statements about "no code" or "code error" (and other variations) — since these were sometimes incorrectly interpreted by users to refer to SV's pseudorange code — to now say "no routine" or "software error"

overhauled nav_corr_to_system_time() and nav_out_corr_to_system_time() (for, respectively, reading and writing of GLONASS and pre-RINEX-2.11 SBAS navigation files) to account for new struct UTC_model (part of navigation structure overhaul that was mostly finished 18 Apr 2017) and modified qc_nav_files() for initial reading of GLONASS RINEX nav file header to use modified nav_corr_to_system_time()

2017 Apr 26: code expansion of decompose_Trimble_32() for extraction of QZSS and Beidou ionospheric alpha and beta parameters and QZSS UTC delta parameters; tested on data from ab49 with data from Galileo, Beidou, and QZSS

small code modification in tbin_file() that enforces the correct "modulo" pattern on the hourly part of created filename when using the -tbin option with an hourly increment of 2, 3, 4, 6, 8, or 12 hours (for tbin-created RINEX navigation files; previous behaviour was always increments of 1 hour, as needed by input)

2017 Apr 25: fixed two indexing bugs related to correctly using Javad JPS [SX] message, which is an GNSS-upgrade to the original [SI] message for a satellite listing: one error was in decompose_Javad_SX() for setting the current number of potential SVs being tracked from the length of [SX], and the other was in Javad_SX_NN_validation() setting the index of the validation bit array after with validating (or not) each SV of [SX]

2017 Apr 24: GLONASS_time_to_epoch() was modified to include the GLONASS N4, the 4-year interval number (which started to be broadcast with GLONASS-M), if known; otherwise, zero is supplied and the GPS week number is used as before to determine the epoch

code was added to SeptentrioBF_4004_ephemeris(), SeptentrioBF_4095_ephemeris(), and SeptentrioBF_5891_ephemeris() for using the WNc, week value of the SIS time stamp, in SBF messages 4004, 4095, and 5891, respectively, to adjust the WN_toe value which is modulo 1024, if need be, for GLONASS, QZSS, and GPS decoded ephemerides

decompose_Topcon_UO() replaced with decompose_Topcon_UO_NU_WU_EU_CU_QU_IU() which deals with all the Topcon TPS/Javad JPS system time to UTC messages for GPS ([U0]), GLONASS ([NU]), SBAS ([WU]), Galileo ([EU]), Beidou ([CU]), QZSS ([QU]), and IRNSS ([IU])

2017 Apr 21: added reading of Beidou clock and ionospheric parameters from Leica MBD records 150 and 151 in decompose_Leica_MDB_96() and decompose_Leica_MDB_97(), respectively; both need testing

nav_out_standard_header() modified to include output of ionospheric model parameters and UTC offset parameters for Galileo, Beidou, and QZSS (when any are known)

new UTC_delta_epoch() to simplify code where reading values (e.g. GLONASS TauC) in formats for output to RINEX header line CORR TO SYSTEM TIME

in nav_out_standard_header(), rinex_out_pgm_agency_date(), and nav_out_corr_to_system_time(): eliminated any chance of outputting RINEX header line CORR TO SYSTEM TIME for anything but GLONASS RINEX since this header line is strictly no longer valid for SBAS in RINEX 2.11

new decompose_SeptentrioBF_4036() to obtain the GLONASS UTC offset from SBF record 4036

2017 Apr 20: added reading of Galileo ionospheric parameters in Javad_EN_ephemeris() from Javad JPS [EN] message

cleaned up and fixed a couple of bugs in rinex_out_pgm_agency_date() related to non-GPS system optional RINEX nav header lines

roughed out changing nav_out_ion_alpha(), nav_out_ion_beta(), and nav_out_delta_UTC() to be generalized for multiple GNSS systems, but have only put in prototype non-GPS code for Galileo in nav_out_ion_alpha(); all need testing

new decompose_Leica_MDB_91(), decompose_Leica_MDB_92(), and decompose_Leica_MDB_9b() to read Leica MDB records 145, 146, and 155 for Galileo and QZSS UTC offset parameters and ionospheric model parameters

2017 Apr 19: fixes needed for modified nav_out_ion_alpha(), nav_out_ion_beta(), and nav_out_delta_UTC() (and these functions still need to be fully generalized for non-GPS systems)

code completion of decompose_Trimble_32() for extraction of Galileo ionospheric alpha parameters and UTC delta parameters; needs full testing

added missing Galileo "data sources" value extraction for Galileo navigation message for Topcon TPS [LE] and Javad JPS [EN] messages in Topcon_LE_ephemeris() and Javad_EN_ephemeris(), respectively

fixed Galileo "health" value extraction for Galileo navigation message for Topcon TPS [LE] message Topcon_LE_ephemeris(); for Javad JPS [EN] in Javad_EN_ephemeris() continuing to use "health" value as supplied

2017 Apr 18: next major phase of GNSS navigation overhaul is now complete enough for testing; this separated out the nav structure space for each constellation, normalized the name space, eliminated padding variables and the now unneeded zero_nav_union_overflow() and unused raw_iono_alpha(), raw_iono_beta(), and nav_epoch_check(), and many other changes (4743 lines of code changed to 4168 lines of replacement code)

2017 Apr 7: the QZSS case in GNSS_nav_time() was modified to be, by default, in GPS system time (which QZSST is), and calls to GNSS_nav_time() for BINEX 0x01-06, RINEX IRNSS nav, Leica MDB 154, SBF 4095, JPS/TPS [QE], and Trimble .dat 28/0x55 were simplified to not explicitly have the time_in_GPST bit flag

changed offset in seconds between UTC and UTC(SU) into a #define UTCsu_SEC_OFFSET (for readability)

2017 Apr 6: last_ToW is now a static EPOCH in nav.c with a reset controlled by teq.u.reset_last_ToW; same change for last_nav_GPS_week and last_met_GPS_week in nav.c and met.c, respectively, with resets controlled by teq.u.reset_last_nav_GPS_week and teq.u.reset_last_met_GPS_week, respectively

2017 Apr 5: initial test build of teqc on Arietta G25 Ubuntu Linux board with ARM processor

2017 Apr 4: modified decompose_Topcon_rD(), decompose_Topcon_rE(), and decompose_Topcon_rM() to use the -RD option to allow for a missing [RD] message by calling decompose_Topcon_RD() and thereby correctly setting the GPS week value in these functions (since the default call to week_modulo() using the supplied week modulo 1024 value in [rD], [rE], or [rM] will not return the correct week value with a missing initial [RD] message); tested on NetG5 data with a missing initial [RD] message

modified spew_Topcon_TPS_epoch() so that the -RD option to allow for a missing [RD] message by calling decompose_Topcon_RD() for non-[rD]/[rE]/[rM] JPS/TPS data messages will be used even if the data is after 1 Jan 1988; see 30 Jun 2016 entry

2017 Apr 3: based on feedback from Javad, the call to GNSS_nav_time() in Topcon_GE_ephemeris() was modified so that it handles all current cases of the way the QZSS week value occurs in the JPS/TPS [QE] message (and should be good for all foreseeable future cases)

reorganized the variables holding the last GPS week value for met data (now teq.u.last_met_GPS_week) and for navigation messages (now teq.u.last_nav_GPS_week), made these a signed 4-byte integer, and now using an initial non-valid value of -1

2017 Mar 31: implemented week_modulo() to replace adjust_week() used in reading of Topcon TPS/Javad JPS [rD], [rE], and [rM] messages

implemented week_modulo() to replace adjust_week() used in reading week value of undecoded GPS navigation messages (when using +raw_nav option) for BINEX 0x01-41, SBF 4017, JPS/TPS [GD], Trimble .dat record 26 and 0x57-5 (and eliminated adjust_week() from the code)

modification to function call of filter_system_in_nav() so that it could be called from qc_nav_files() (and it's more general this way in case it also needs to be used elsewhere for similar reasons)

replacement of the 4 remaining cases of BDT_nav_adjust() with analogous calls to GNSS_nav_week() (and eliminated BDT_nav_adjust() from the code)

logic for possible adjustment of the time of transmission (ToW) in 3rd part RINEX navigation file that had been in correct_ToW() put into the preadjusted case of GNSS_nav_week()

2017 Mar 30: reading of GPS, GLONASS, SBAS, Galileo, Beidou, QZSS, and IRNSS ephemeris parameters from a RINEX navigation file merged into new rinex_nav_parameters() (replacing the original rinex_nav_GPS(), rinex_nav_GLONASS(), rinex_nav_SBAS(), rinex_nav_Galileo(), rinex_nav_Beidou(), rinex_nav_QZSS(), and rinex_nav_IRNSS()); all cases except GLONASS now uses new GNSS_nav_time(); note: will probably have to include logic from correct_ToW() and ephemeris_times_make_sense() either in GNSS_nav_time() for all non-GLONASS ephemerides or in rinex_nav_parameters() for reading non-GLONASS RINEX navigation files (to catch translation errors in old files), but temporarily correct_ToW() has been eliminated

week_check() renamed week_modulo() (closer descriptive name)

implemented week_modulo() to replace the few cases of adjust_week() used for GLONASS navigation messages (where the GLONASS ToE is presented in GPS time)

implemented week_modulo() to replace the all (12) cases of adjust_week() used to set the week value for the GPS time - UTC model parameters

2017 Mar 29: GNSS_nav_time() integrated into reading of SBAS navigation messages in Ashtech E-file, stream, R-file, and U-file formats, Septentrio SBF 5896 record; Topcon TPS/Javad JPS [WE] message; and Trimble .dat/.tgd record 28 and 0x55; tested on a variety of all of these, some with a week rollover

earlier functions GST_nav_adjust(), adjust_SBAS_ToW_ToC(), and Trimble_week_check() now no longer needed and have been eliminated

correction of previously undetected typo in rinex_nav_SBAS() which prevented the IODN (Issue of Data, Navigation) value from being read in any SBAS navigation message in a RINEX SBAS navigation file

GNSS_nav_time() integrated into reading of SBAS navigation messages in RINEX SBAS navigation file in rinex_nav_SBAS()

2017 Mar 28: GNSS_nav_time() modified to include SBAS navigation message case (with no changes needed for GPS, Galileo, Beidou, QZSS, or IRNSS cases)

2017 Mar 27: collapsed_raw_ephemeris() renamed to collapsed_raw_GPS_ephemeris() and collapse_ephemeris_subframes() renamed to collapse_GPS_ephemeris_subframes() — since these functions only apply to GPS (L1C/A, actually)

functionality of reverse_collapsed_raw_ephemeris() moved to collapsed_raw_GPS_ephemeris() and the various separate calls to reverse_collapsed_raw_ephemeris() were eliminated

GNSS_nav_time() integrated into collapsed_raw_GPS_ephemeris() — for reading of records of CMC 22, TurboBinary 0x65, reconstructed ConanBinary EPH, BINEX 0x01-00, Motorola Oncore Bf and Cc, NavCom 81, RTIGS 300, TI-4100 GESAR 09, and UBX rmx-eph; tested and compared to past translations using CMC, TurboBinary, and ConanBinary filesets on both a big-endian processor and a little-endian processor, both with all records same week and records spanning week rollovers

2017 Mar 24: new GNSS_week() integrated into reading of Trimble .dat/.tgd, RT17 and RT27 stream, and TSIP navigation messages; tested and compared to past using .tgd and stream data containing GPS, Galileo, Beidou, and QZSS navigation messages in the same week and all but QZSS for a week rollover

GNSS_week() renamed to be GNSS_nav_time() (since it adjusts more than just the navigation week value), a couple of changes in the input parameter types, and the middle part that checks the adjusted (GPS) week value against teq.u.GPS_week (supplied GPS week value via -week or best guess so far) made its own function: week_check()

GNSS_nav_time() integrated into reading of Ashtech E-file, stream, R-file, and U-file GPS navigation messages; tested and compared to past using BES filesets in the same week and at week rollovers

2017 Mar 23: ephemeris_times_make_sense() modified to allow GPS time of ephemeris (ToE) values which are 30m00s and 25m00s (GPS system time), which seems to be needed for GPS L2C navigation messages (note: easily expanded if other valid L2C ToE values become known)

new GNSS_week() integrated into reading of Javad JPS and Topcon TPS GNSS navigation messages; tested and compared to past using JPS data containing GPS, Galileo, Beidou, QZSS, and IRNSS navigation messages in the same week and most of these for a week rollover; tested and compared to past using TPS data containing GPS, Galileo, Beidou, and QZSS navigation message in the same week and tested GPS for a week rollover

2017 Mar 22: second cut of of new GNSS_week(), making changes for flag settings needed for Leica MDB navigation records; tested and compared to past translations using MDB data containing GPS, Galileo, Beidou, and QZSS navigation messages in the same week and GPS navigation messages for a week rollover

2017 Mar 21: first cut of of new GNSS_week(), correctly dealing with the week rollover adjustments (based on current understanding) to the week value and ToW of all constellations, to replace functionality of current adjust_week(), correct_ToW(), GST_nav_adjust(), BDT_nav_adjust(), and calls to GPS_to_epoch() (which needed to be done for ToE, ToC, and ToW) for each constellation use; tested and compared to past translations using SBF data containing GPS, Galileo, Beidou, and QZSS navigation messages during a week rollover: more Galileo ephemerides were recovered and the ToW of Beidou nav messages in RINEX is now corrected

2017 Feb 28: a better solution to the temporary fix of 17 Feb 2017 in ephemeris_file_location() that makes use of the rinex_nav_*() functions (which requires storing each entire ephemeris instead of just the time portions, as had been done up until now, but storing each entire ephemeris allows any check to be done now to potentially eliminate an ephemeris)

some unrelated and overdue simplification in qc_nav_files() (which calls ephemeris_file_location())

2017 Feb 27: modification to qc_satellite_obs_update() so that a GLONASS SV with no frequency channel number (fcn) would have the qc of any signal-to-noise (SNR) done (including entry into compact3 plot files) by changing the "special system indicators" area by masking out all bits except those for SNR in qc->doable and not returning immediately

2017 Feb 17: addition to ephemeris_file_location() so that a GPS RINEX file can be listed and successfully used in qc after listing one or more initial GLONASS RINEX files with the -nav option during qc (note: the small block of code added is temporary until a more complete solution can be found)

2017 Feb 16: modification to SeptentrioBF_5891_ephemeris() and SeptentrioBF_4081_ephemeris() (for reading SBF GPS and Beidou ephemeris records, respectively) to read the adjusted week value for the ToE (time of ephemeris) for the needed ephemeris week value

the SBAS_ephemeris struct was modified to explicitly include the week for the SBAS ephemeris (even though a week value is not broadcast by SBAS; see Table A-18 in RTCA/DO-229C), but this makes handling of ephemeris times more symmetrical across all constellations except for GLONASS; associated modifications or additions in Ashtech_SNV_ephemeris(), binex_01_03_ephemeris(), binex_nav_message_01(), rinex_nav_SBAS(), SeptentrioBF_5896_ephemeris(), Topcon_WE_ephemeris(), and Trimble_28_55h_ephemeris()

2017 Feb 10: modification to next_Topcon_Javad_record() to ignore Javad JPS message [LO]

implemented a boolean to indicate when a JPS/TPS RT [~~] message is found, cleared when a "broken epoch" is found and skipped, to avoid problems when calling spew_Topcon_TPS_epoch() at the end of a JPS/TPS file when no RT [~~] messages are present

2017 Feb 9: modification to binex_7f_05_constellation() to stop at the previous SV (if any) when an unrecognized constellation system ID or invalid SV ID is found for any known system in a BINEX 0x7f-05 record (which has already passed the CRC/checksum validation) (this should not be allowed in the generation of 0x7f-05 but we've found cases of it in files coming from PBO's real time system that uses Trimble's PIVOT software)

2017 Feb 2: (based on information from Leica): Leica MDB 154 really does store the QZSS ephemeris semi-major axis value, rather than the square root of the semi-major axis, so Leica_QZSS_ephemeris() was modified to take the square root to get the correct value into nav.satellite.ephemeris.type.QZSS.sqrt_a; tested on file supplied by Leica engineering

correction for ToW proxy in Leica_Beidou_ephemeris() for reading Leica MDB 148

2017 Feb 1: modification to next_Topcon_Javad_record() for reading Topcon TPS or Javad JPS formats to increase the secondary buffer allocation from current record +6 bytes to +10 bytes

2017 Jan 31: modification to next_Topcon_Javad_record() for reading Topcon TPS or Javad JPS formats (related to 12 Feb 2016 modification): if the next receiver time [~~] message is encountered without the preceding block of epoch messages starting with a [~~] message, the preceding block of epoch messages is skipped (by resetting the storage buffer)

2017 Jan 27: with some real data (from ac48), debugging and correction of SeptentrioBF_4095_ephemeris() for reading SBF 4095 message (decoded QZSS ephemeris)

2017 Jan 24: modification to next_Topcon_Javad_record() to recognize and quietly skip the Topcon TPS or Javad JPS [QS] QZSS status message

calls to new GST_nav_adjust() have been tested for Javad JPS, Leica MDB, Septentrio Binary Format (SBF), Topcon TPS, and Trimble .tgd/RT27 and adjusted as needed

2017 Jan 23: the new block of code put into nav_filtering() (see 17 Jan 2017) has been made its own function, GST_nav_adjust(), plus some enhancements analogous to those in BDT_nav_adjust(); calls to this new function added for Galileo ephemeris reading for Leica MDB, Septentrio Binary Format (SBF), Javad JPS, Topcon TPS, and Trimble .tgd/RT27 formats

2017 Jan 19: fixed typo in globals.c for ++raw_nav append option name

2017 Jan 18: due to a misunderstanding of the meaning of that the Galileo week value in a Galileo ephemeris (or almanac) corresponds to the ToW (time of transmission), rather than the ToE (time of ephemeris) as with a GPS ephemeris, a new block of code needed to be added to nav_filtering() (which is used by all raw formats) that adjusts the Galileo week value, if needed, at week rollovers given that the week value in a RINEX navigation message does need to correspond to the ToE (even for Galileo); related: the call to correct_ToW() has been disabled in each function reading the Galileo ephemeris parameters from a raw format since this is now needed to be done in the aforementioned code block for Galileo added to nav_filtering()

2017 Jan 17: decompose_Trimble_firmware() modified so that it will not do a modulo 1000 of Trimble firmware 2-byte integer if the fw is 40.96 or higher (thus allowing the new — and unusually numbered — 48.01 firmware of NetR3, NetR5, and NetR8 receivers to be correctly extracted (and hopefully this will not muck up the extraction of other receiver firmware values)

2017 Jan 13: in Trimble_27_57h_6_constellation() and in Trimble_27_57h_6_obs(), experimenting with replacing all terminate() with just a return where there are unknown bit flags; this allows teqc to get through Trimble RT27 data where there appears to be random bit errors

2017 Jan 12: consolidated all *_SESSION_INFO structs into a single SESSION_INFO struct

start of restructuring of the navigation structure space for GNSS (inside the top-level nav struct)

2017 Jan 11: change in binary_NAV() so that a questionable ephemeris (unknown system or SV id outside of specified values) is reported with +diag (thus, for any input format); associated +diag message in decompose_binex_01() removed

the allocate() call in obs_out_summary() for the column count array was corrected for the number of bytes to be allocated; the error, introduced with new code on 2 Sep 2016, would cause a memory fault in some builds when using -O.sum to stdout, stderr, or a non-RINEX observation file when the number of observables being counted was greater than the number of SVs

2017 Jan 9: preliminary code for reading GNSS ephemeris data from Leica MDB records 144 (Galileo), 148 (Beidou), and 154 (QZSS); tested on some sample data containing records 144 and 148

corrections of non-GPS GNSS modulo week wrap-around value in all adjust_week() calls

2017 Jan 6: update to recognized receiver types in Leica MDB records 104 and 111 and to antenna types in Leica MDB record 108

2017 Jan 4: to skip unnecessary calls, a conditional return was added to the beginning of nav_processing() and met_processing() so that the rest of the function is skipped if using any metadata option (e.g. +meta or +mds) or if using -O.sum to a non-RINEX observation file output

renaming of Leica_GLONASS_nav() to Leica_GLONASS_ephemeris()

2017 Jan 3: NMEA_quadtuple() modified to not report any error message when the NMEA met unit is '#' (indicating a faulty sensor)

external_data_string() modified to not report any error message when the met string contains '|$WITXT'

2016 Nov 22: functionality of old +igs and ++igs options eliminated with preprocessor logic; related code abandoned in place

2016 Nov 18: various miscellaneous comment cleanup and a few misspellings in print statements

2016 Nov 17: change in decompose_Topcon_Rn() and decompose_Topcon_rn() so that filling of the[ ] and[ ] and[ ] array buffers, respectively, are filled when the functions are called with the fill_buffer flag set (note: this allows cases like -O.obs l1+l2 to be done and get the expected phase values when using [*P] or [*p] relative carrier phase JPS/TPS messages)

a preprocessor directive had to be added to Topcon_pr_rn() for Linux gcc builds because the trunc() function when modifying JPS/TPS [RC] or JPS [RX] values to get back to an [rc]-like (or [rx]-like) integer value for decomping [*p] relative carrier value messages was not returning anything sensbile for our current Linux enviroments; Linux gcc builds now use ceil() for negative values and floor() for positive values instead of trunc()

2016 Nov 16: change of initial buffer size in next_Topcon_Javad_record() from 5 to 6 (so that buf[5] can later always safely be set to 0x00 on the first buffered record)

in next_Topcon_Javad_record(), increase in the allocated size of buf from JPS/TPS message length plus 5 bytes to plus 6 bytes

2016 Nov 14: correction in build.h of Apple OS X gcc 4.2 and 4.3 builds

2016 Nov 7

2016 Nov 4: #if 0 blocking out of the deallocate() calls at the end of Topcon() for the various ancillary arrays for Javad JPS and Topcon TPS parsing so that multiple input files can be done (note: there's another approach which will take some time to do and test)

2016 Nov 3: change in extract_binex_00_field() so that if for pure text fields of BINEX 0x00 and the text length exceeds the remainder of the 0x00 record message body length, then the length is truncatated in an attempt to read to the end of the 0x00 message body (rather than entirely skipping the field in question); note: the same thing could be done in extract_binex_05_field() for record 0x05 when encountering field IDs 0x00 (comment) or 0x7f (notes)

2016 Nov 2: change of reading the GPS, Beidou, QZSS, and IRNSS URA indices and the Galileo SISA index in Javad JPS and Topcon TPS messages [GE], [EN], [CN], [QE], [IE] from implicitly signed char using extract_sint1() to a unsigned char using extract_uint1()

2016 Nov 1: change of reading the GPS URA index in SBF message 5891 from implicitly signed char using extract_sint1() to a unsigned char using extract_uint1()

2016 Oct 31: because some compilers do not understand a char type to be a signed char: replacement of extract_sint1() with extract_esint1() in decompose_Leica_LB2_fa(), decompose_Leica_MDB_05(), decompose_Leica_MDB_69(), decompose_NavCom_83(), and decompose_binex_7d() and replacement of append_uint1() with append_esint1() in binex_ris_message_7d()

2016 Oct 28: changed namespace for all things having "Compass" to "Beidou"

2016 Oct 27: the new skip_out() is working out nicely (see 17 Oct 2016 entry), so all the #if-ed out older code in obs_out(), nav_out(), and met_out() has been removed

2016 Oct 26: updated IGS receiver/antenna designations up through 26 Oct 2016 entry

2016 Oct 21: the long-redundant data_stream switch for each general group of data formats has been removed

the code for turning off the qc obs file reset has been moved from the start of each data format function (e.g. AOA()) to process_input() prior to calling any data format function

2016 Oct 17: in compute_window_point(), for some qc situations, in order to have computed correctly, a call to epoch_date() with the template epoch needs to be made before the call to the new clean_epoch() with the template epoch (note: the original adjustment code is still correct, but does not clean sub-second noise, as found 6 Oct 2016)

error found in obs_out(): if using explicit windowing and -tbin on RINEX obs file(s), then the call to tbin_from_rinex() needs to follows the if condition using epoch_in_window() (as in nav_out() and met_out())

the above correction now allows the beginning of obs_out(), nav_out(), and met_out() to be split off in a new boolean skip_out() function call (so that if related changes need to be made in the future, there is now just the one function)

2016 Oct 14: usual scan of code to upgrade select #if PREFERRED logic to permanent and then upgrade select #if 1 logic to #if PREFERRED, plus cleaning of notices, warnings, etc.

removal (and thus simplification) of all code behind attempting -O.sum s; this now defaults to -O.sum e if used

2016 Oct 13: addition of logic condition of +O.sum out to stdout, stderr, or a non-RINEX file to need_rinex_interval() so that this option plus +meta would work with one or more RINEX obs files

added reinitialization of all *.basic*.rinex_set_X and *.basic*.rinex.in_X to metadata reset case in filename_loop() so that +meta would work with more than one RINEX obs files and not lead to a fault with other RINEX file types

2016 Oct 12: decoupling of metadata options (e.g. +meta, +mds, all using teq.main.opt_X & METADATA) from the configuration output options (+config, ++config, +bcf, all using teq.main.opt_X & OUTPUT_CONFIG_NEW), and removing call to dump_metadata() from dump_config(), but adding at call to dump_metadata() where needed in dump_any_final_result(), rinex_end_of_header(), and main()

recrafting of the beginning cases in rinex_end_of_header() and then end of rinex_obs() so that the -O.sum options on stdout, stderr, or a non-RINEX file will work with RINEX files when metadata options are being used

correction to the interval metadata portion of process_rinex_obs_end() (option +meta on a RINEX obs file was missing the value for the sampling interval)

change to end of filename_loop() to include -O.sum options on stdout, stderr, or a non-RINEX file

2016 Oct 11: more code cleanup in the GLONASS orbit fitting code

slight change in obs_out_summary() when outputting a summary to stdout, stderr, or a non-RINEX file and there are no observables, to skip the message that there appears to be no observables if a metadata option is also being used

2016 Oct 10: most Error messages in binex.c downgraded to Warning messages

added calls to binex_record_init() for BINEX records 0x05 and 0x7d in binex_init() which had been missing

added buffering of each CRCed/checksummed BINEX record when both input and output is BINEX format in next_BINEX_record(); currently used in obs_binex_out() for 0x7f-04 (null GNSS observation) and 0x7f-05 (full GNSS observables)

2016 Oct 7: changed GLONASS orbit fitting code to use QR() instead of singular value decomposition (since all the extra stuff for svd was not being used) and all related arrays needed for the inversion are now dynamically allocated — substantial reduction in time needed to perform the orbital fits

2016 Oct 6: added a bit of detailed parsing results in binex_7f_05_constellation() which can be turned by setting #define DEBUG_7f_05_ObsFlags to non-zero and using +diag option; helpful for comparing teqc's parsing of BINEX 0x7f-05 compared to other parsers

to (hopefully) fix 8-byte floating point fuzziness in how the second value of epochs are obtained from various sources, a new clean_epoch() function was created which rounds the seconds value to the nearest 0.1 nanosecond and then, if needed, calls epoch_minutes() and epoch_date(); also epoch_date() was modified to also include a rounding of its final seconds value to the nearest 0.1 nanosecond; finally, a call to clean_epoch() was added to the end of epoch_store() (replacing its own almost identical clean up of the seconds value), added to window_store() at the end of the WINDOW_START and WINDOW_END switch cases, and added to the end of compute_window_point() (replacing its own adjustment of the seconds and minutes values) which takes care of all other cases of windowing set points; this combination of changes appears to produce the most consistent set of seconds values in all epochs

increased test delta between GLONASS ephemerides from 1.5 normal interval to 2.5 normal interval in initialize_GLONASS_orbit_interpolation(); tested on all stored test cases, with some portions of some orbits now qc-ed with no negative side-effects for any case

2016 Oct 5: updated IGS receiver/antenna designations up through 5 Oct 2016 entry

normalized some +diag messages when reading BINEX and strange conditions occur

2016 Oct 4: finished first phase of normalizing the name space of the GLONASS position interpolation code and removing unneeded variables

minor correction to next_Topcon_Javad_record(): reset message buffer to all zero bytes prior to reading each message with dynamic memory allocation code

modifications to +help output for -tbin and -ast options

2016 Sep 29: all remaining cases of Ashtech stream files with new dynamic allocation scheme resolved

modified dynamic allocation scheme for reading Ashtech U-file format is successful for all test cases

2016 Sep 28: modified dynamic allocation scheme for reading Ashtech stream format appears to be successful in most cases — and, in fact, works better than the original code for many cases were the data file is corrupted or in some other way not formatted correctly — but there remain a couple of isolated cases to investigate

2016 Sep 27: dynamic allocation scheme for reading Ashtech BESD and R-file formats appears to be successful, but for reading Ashtech U-file and MBEN stream formats only partially successful

notices, warnings, and errors in ashtech.c cleaned up and standardized

2016 Sep 26: made conditional if() of Sep 22 its own small boolean function, fast_metadata_scan()

correction to met_epoch_check() to include the optional time offset available via the -M.dec new_interval[:offset] option

correction to extract_modulo_decimation() so that an offset can be used with a letter time unit (e.g. 's', 'm, 'h) on the interval with -O.dec new_interval[:offset] and -M.dec new_interval[:offset]

updated +help for the -O.dec and -M.dec options

minor change to rinex_version_type() so that the +mds option can be used on a list different types of RINEX files

minor correction to need_rinex_interval() which further restricts the condition for returning TRUE to only be a RINEX observation file for output, thus allowing +meta option to be used on all types of RINEX files (not just RINEX observation file, as before)

started normalizing some variable names in the GLONASS orbit interpolation code

2016 Sep 22: small addition to obs_out_summary() to explicitly report no apparent data when -O.sum option output is to stdout, stderr, or a non-RINEX file and all columns are zero

standardized the handling of returns from binary_OBS() and binary_MET() for all calls

change of if() conditional logic in the first test in obs_processing() so that an observation record/message is processed when doing a metadata extraction and "soe" observation summary to stdout, stderr, or a non-RINEX file to handle all cases except ConanBinary, similar if() conditional logic for ConanBinary after calling AOA_CB_obs(), obs_epoch_check(), and obs_last_epoch() in subsequent switch; this if() conditional logic might want to be expanded to other or all "soe" outputs

dynamic allocation scheme for reading AOA/JPL ConanBinary and TurboBinary formats appears to be successful

2016 Sep 15: to ready reading of Trimble formats for the dynamic allocation scheme, Trimble() and read_Trimble_mes_file() have been slightly recrafted, as well as merging next_Trimble_dat_record() and Trimble_dat() (eliminating Trimble_dat()); also eliminated Trimble_unknown_dat(), Trimble_unknown_BSTR(), and Trimble_unknown_TSIP()

disabling of decoding Trimble TSIP format and obsolete .dat records 0 and 7 (which was never correct anyway)

dynamic allocation scheme for reading Trimble .dat/.tgd and stream formats appears to be successful

2016 Sep 14: new functions decompose_Javad_IE() and Javad_IE_ephemeris() for reading JPS message [IE], decoded IRNSS ephemeris; added detection for all other known IRNSS JPS messages

updated the +help output for the -O.s[ystem] option (the old usage still listed Transit!)

dynamic allocation scheme (now fixed) for reading Navcom Tech. binary format appears to be successful

dynamic allocation scheme for reading Leica DS fileset, LB2, and MDB appears to be successful

2016 Sep 13: dynamic allocation scheme for reading Javad JPS and Topcon TPS appears to be successful

2016 Sep 12: final modified version of Topcon_pr_rn() to replace previous Topcon_prRef() (and older Topcon_rc()) for best decoding of [*p] integer relative carrier phase messages of Javad JPS and Topcon TPS, including new [rx] of 3.6.0 JPS and new [RX] of 3.7.0 JPS

new decompose_ublox_UBX_nav_pvt() for reading u-blox UBX NAV-PVT record, with +psp option — needs testing

added +psp option to decompose_ublox_UBX_nav_sol() for reading u-blox UBX NAV-SOL record

dynamic allocation scheme (now fixed) for reading Septentrio SBF appears to be successful

2016 Sep 8: new decompose_ublox_UBX_rxm_rawx(), ublox_UBX_rxm_rawx_constellation(), and ublox_UBX_rxm_rawx_obs() for reading u-blox UBX RMX-RAWX message (generalized GNSS observation data)

next_ublox_UBX_record() slightly modified to silently ignore all u-blox UBX message classes:

    0x04 INF (information)
    0x05 ACK (acknowledge/reject)
    0x06 CFG (configuration)
    0x0a MON (monitoring)
    0x13 MGA (multiple GNSS assistance)
    0x21 LOG (logs)
    0x27 SEC (security)

2016 Sep 7: what, hopefully, is the last (or at least penultimate) formulation of Topcon_prRef(), used to reset reference pseudoranges back to a JPS/TPS [rc]-like (or JPS [rx]-like) integer value, based on current input from both Javad and Topcon engineers

error message added to decompose_Topcon_nP() such that if JPS/TPS [*P] relative carrier phase messages are being used and if JPS [RC] and [RX] or TPS [RC] are not present, then the user is informed that the phase values will not be correct (because having [*P] without [RC] or [RX] is deemed an invalid format configuration)

2016 Sep 6: as per recommendation from Javad, new algorithm in Topcon_TPS_obs() for dealing with new JPS [RX] and/or [rx] messages and the legacy TPS/JPS [RC] and [rc] messages into two reference array buffers, and/or, which are filled during an initial population loop (along with any* array buffers) with calls to modified decompose_Topcon_Rn() and decompose_Topcon_rn(); related change to Topcon_prRef(); analogous algorithm for dealing with new [DX] message and legacy TPS/JPS [DC] message into reference array buffer which is filled during a population loop with call to modified decompose_Topcon_Dn(); note: these changes are not yet in Javad's GREIS and are based on Javad firmware changes, communicated by email from Javad engineers, that will take place at fw 3.7.0

2016 Sep 2: added logic to constellation_total() to exclude the following formats from the maximum SV limit check since each of these formats has a record/message structure that has a checksum or CRC per record or message:

    Ashtech MBEN stream, R-file, and U-file
    CMC binary
    Javad JPS
    Leica LB2 and MDB
    Motorola Oncore
    NavCom SF 2050 and 3050
    Rockwell Zodiac
    Septentrio Binary Format (SBF)
    Topcon TPS
    Trimble RT17 and RT27 stream format
    u-blox UBX

slight modification to obs_out_summary() and obs_out_summary() so that with the output of ±O.sum option to other than a RINEX observation file (i.e. stdout, stderr, or an arbitrary file), then columns with zero total observables are not output

generalized extract_week_msec_to_epoch() for accepting bit flags; bit 0 reverses the order of the uint2 week and the uint4 milliseconds value

now extract_week_msec_to_epoch() also in decompose_Trimble_29_57h_7(), decompose_Trimble_40(), and decompose_SeptentrioBF_4006_4007_5903_5904()

2016 Sep 1: split out duplicate code at the end of Topcon_SI_NN_validation() and Javad_SX_NN_validation() as new reset_TPS_JPS_array_buffers(), which is now called from spew_Topcon_TPS_epoch() after either Topcon_SI_NN_validation() or Javad_SX_NN_validation() might be called

added global logic to topcon.c so that Topcon_SI_NN_validation() or Javad_SX_NN_validation() are now only called from spew_Topcon_TPS_epoch() when a TPS/JPS [SI] and/or JPS [SX] occurs for an new epoch

2016 Aug 31: modified JPS_signal_map() to account for Beidou B2a observables in the JPS format from the [-5] and [5-] messages starting at fw 3.7.0 — although for completeness this will require the addition of a Beidou/Compass C5, L5, S5, and D5 for the extended RINEX 2.11

because of I/O detection changes between 2 and 11 Aug 2016, setting all tbin file pointers to an initial non-zero state in save_filename() to now necessary for -tbin to work correctly

modification to "Topcon_SI_NN_validation() to populate the array with the system id as per the JPS [SX] message

new array which is populated in Topcon_SI_NN_validation() (if TPS/JPS [SI] message is used and Javad_SX_NN_validation() (if JPS [SX] message is used) for each valid SV id

Topcon_TPS_constellation() totally rewritten to use and new — needs testing for all constellations

renaming of Topcon_TPS_constellation() to TPS_JPS_constellation()

2016 Aug 30: new decompose_Javad_sn() for Javad JPS messages C/No messages [s0], [s1], [s2], [s3], [s5], and [sl] (will be available at fw 3.7.0) — not tested yet

JPS USI for IRNSS removed (since it had not been used yet anyway) — consistent with JPS fw 3.7.0

JPS USI for Beidou increased from a maximum of 240 to 247 (allowing for 37 Beidou PRNs) — consistent with JPS fw 3.7.0

added call to decompose_Topcon_nR() in Topcon_TPS_obs() for new JPS message [CR] (L1C/A relative pseudorange) for JPS fw 3.7.0

modified decompose_Topcon_Rn() for call from Topcon_TPS_obs() for new JPS message [RX] (virtual reference pseudorange) for JPS fw 3.7.0 — but precedence if [rx] were also present is as yet unknown

modified JPS_signal_map() to account for the move of the Beidou B2/E5b observables in the JPS format from the [-5] and [5-] messages to the [-2] and [2-] messages starting at fw 3.7.0

new decompose_Javad_SX() (analogous to decompose_Topcon_SI()) to store the "extended SV indexes" (ESI, analogous to the "universal SV indexes" or USI) of the JPS [SX] message (starting at fw 3.7.0) in new

2016 Aug 29: new extract_week_msec_to_epoch() — to reduce some of the code replication in the functions for reading Leica MDB records, but can be used elsewhere when the time is stored as a uint2 GPS week plus uint4 milliseconds into the week; now in decompose_Leica_MDB_0a_6e(), decompose_Leica_MDB_0b_6f(), decompose_Leica_MDB_0c_70(), decompose_Leica_MDB_0d(), decompose_Leica_MDB_71(), decompose_Leica_MDB_11(), decompose_Leica_MDB_1b_7f(), decompose_Leica_MDB_05(), decompose_Leica_MDB_69(), and decompose_Leica_MDB_82(),

added +psp reading from decompose_Leica_MDB_0d() (reading of Leica MDB record 13)

removed +psp reading from decompose_Leica_LB2_05_06() (reading of Leica LB2 event records 5 and 6) and from decompose_Leica_MDB_11() (reading of Leica MDB record 17), as per Leica's recommendation

updated leap_seconds() for the leap second insertion into UTC scheduled at the end of 2016 Dec 31

2016 Aug 26: function name change of Topcon_8192_bug() to TPS_JPS_fw_based_flags() which now handles the previous detection of the firmware for the old "8192" bug (in both TPS and JPS) and changes to Asys and Ksys values (only in JPS so far)

removed +psp option handling from decompose_Leica_MDB_11() (as per Leica's recommendation)

updated decompose_Leica_MDB_0c_70() for +psp option, Leica MDB records 12 and 112, position only

updated decompose_Leica_MDB_0a_6e() for +psp option, Leica MDB records 10 and 110, position only

updated decompose_Leica_MDB_0b_6f() for +psp option, Leica MDB records 11 and 111, position only

2016 Aug 25: updated IGS receiver/antenna designations up through 25 Aug 2016 entry

the ±O.sum[mary] options were made part of the "special output elements" menagerie, however to maintain backwards compatibility +O.sum[mary] options are identical to the -O.sum[mary] options and all require an argument to follow the option name

2016 Aug 24: moved flag handling for the -O.sum option from the teq.edit struct to the teq.soe struct

2016 Aug 23: updated IGS receiver/antenna designations up through 23 Aug 2016 entry

for JPS format, added detection of firmware before 3.6.0 in Topcon() (for user supplied firmware version) and in decompose_Topcon_PM() (for firmware in a [PM] message) and switch to different Asys values for SBAS and Galileo in A_sys() based on this

slight correction of the message composed in constellation_total() for printing by rejection_due_to()

2016 Aug 22: reversal of order of latitude and longitude values when writing and reading BINEX 0x05 field ID 2 in binex_psp_message_05_field() and extract_binex_05_field(), respectively, to match the order in the proposed specification

in Topcon_TPS_obs(): splitting out of reading of JPS/TPS message [RC] in the first loop (to set prRef and pr_RC buffers, if found), followed by reading of JPS/TPS message [rc] in second loop (to reset prRef buffer and set pr_rc buffers, if found), followed by reading of JPS [rx] in third loop (to reset prRef buffer, if found)

functions decompose_Topcon_RC(), decompose_Topcon_rc(), and decompose_Topcon_rx() now eliminated

correction to rejection_due_to() after +diag option overhaul: output should go to err.fp (see 12 Aug 2016 entry)

2016 Aug 19: wrote a artificial_psp() that generates a short set of offset positions from a specified reference position for testing BINEX 0x05 field ID 2 and tested this with a mid-latitude point and a point at the exact South Pole

for Javad JPS with new [RX] and [rx] messages, recrafting of decompose_Topcon_Rn() and decompose_Topcon_rn() (analogous to current decompose_Topcon_Dn() for [DX] and [DC]) — which eliminates the need for the functions decompose_Topcon_RC(), decompose_Topcon_rc(), and decompose_Topcon_rx()

modification of Topcon_use() and JPS_signal_map() to handle the new 'x' and 'X' cases

in Topcon_TPS_obs(): replacement of call to decompose_Topcon_RC() with decompose_Topcon_Rn() for [RC], replacement of call to decompose_Topcon_rc() with decompose_Topcon_rn() for [rc], replacement of call to decompose_Topcon_rx() with decompose_Topcon_rn() for [rx]; and addition of new loop for dealing with Javad [DX] (if present) with call to decompose_Topcon_Dn()

2016 Aug 18: because of the way WGS84_geo_to_xyz() was originally written long ago (to skip conversion to cartesian coordinates if the longitude, latitude, and height are all exactly zero) and this feature might be relied upon somewhere in the code, a test for all zeros when reading BINEX 0x05 field ID 2 or when using is done and if so, an offset of 1e-16 degree is assigned to the latitude to make one value slightly non-zero

at least for now (until there is some explanation), in decompose_Trimble_29_57h_7() the initial test for the GPS bit of the "positioning systems flags" byte of Trimble .tgd record 29 or 0x57-7 is now ignored because we certainly can collect record 29 from a NetR9 where this bit is not set and yet the record has perfectly valid positioning information

2016 Aug 17: for writing and reading of BINEX 0x05 field ID 0x02 latitude and longitude values, correction of binex_psp_message_05_field() to convert from internal storage in radians to degrees and correction of extract_binex_05_field() to convert degrees to internal storage in radians

2016 Aug 15: correction of typo in spew_Topcon_TPS_epoch() for detection and reporting no SVs that was introduced on 5 Aug 2016 (related to changes for +psp)

renamed Topcon_rc() to be Topcon_prRef() (since with new Javad JPS [rx] the reference value might be from [rc] or [rx], but either way the current "pseudorange reference")

new pointer, PR_REF, for the [RC] reference pseudorange values for the Javad and Topcon receiver struct, set in decompose_Topcon_RC(), and used in decompose_Topcon_nP() (for [CP], [1P], [2P], [3P], [5P], and [lP] relative carrier phases)

in Topcon_TPS_obs(), added another parsing loop for Javad JPS new [rx] message (no impact if used with Topcon TPS since [rx] is not present), and changed assignment of CA pseudorange to be from either the pr_CA ([rc]) buffer or from the PR_CA ([RC]) buffer

2016 Aug 12: URAi() expanded for GPS, SBAS, QZSS, and Galileo (for the defined SISA indexes up to 125)

correction to binex_01_03_ephemeris() for reading URA index field of BINEX 0x01-03 (SBAS navigation message) and to binex_nav_message_01() for writing out URA index field of 0x01-03

the ±diag[nostics] options were made part of the "special output elements" menagerie

2016 Aug 11: updated IGS receiver/antenna designations up through 11 Aug 2016 entry

new soe_auto_arg() which can be used programmatically to turn on a "special output element" option

addition of conditional block in out_settings(), just before the conditional block added on 10 Aug 2016, which, if BINEX is being output, calls soe_auto_arg() for +rx_state and/or +psp if ±rx_state and/or ±psp have not been set via command line; this allows an automatic conversion and output of receiver state information and/or position solution parameters to BINEX records 0x7d and 0x05, respectively

2016 Aug 10: addition of new conditional block at the end of out_settings() which unsets any "special output element" output flag if the output file pointer is equivalent to a RINEX or BINEX output file pointer

addition of the "special output element" output flag for print outputs in position_solution_parameters() for +psp options, in rx_state() for +rx_state options

set_out() renamed set_soe_out() (since it only handles the "special output element" cases) and the shutting off of RINEX output is now done there for all soe cases

2016 Aug 9: addition in +binex case of g_arg(): explicitly set IS_RNX off

2016 Aug 5: redesign of decompose_binex_7d() (to be more parallel to decompose_binex_05(), and fixes the 5 day offset problem between teqc epoch and GPS time used in these BINEX records)

renaming of options ±dump_i[on] and ±dump_u[tc] to ±ion_p[aram] and ±utc_p[aram], respectively

reorganization of code involving flags, structures, name space, functions, etc. for the options ±utc_p[aram], ±ion_p[aram], ±rx_state, ±psp, ±eds, ±event, and ±slips (all "special output elements") and putting any specialized functions in new soe.c

the ±raw_nav options were made part of the "special output elements" menagerie

2016 Aug 4: for outputting BINEX 0x7d: new ris_binex_out(), binex_7d_alloc(), and binex_ris_message_7d() functions, plus new bnx_7d pointer

dump_rx_state() was renamed rx_state() and a new block was added to create a bnx_7d struct, populate it, and call ris_binex_out() when +binex is being used

removed RX_STATE case from special_stdout() returning TRUE

2016 Aug 3: all BINEX 0x05 I/O function tweaking seems to be complete (for the imagined cases so far)

new current_ris_binex() function

2016 Aug 2: correction to decompose_binex_05() (to store the length of the current record); test read of at least one type of BINEX 0x05 now successful with the +psp options

2016 Jul 29: new epoch_to_binex_epoch() (reverse of binex_epoch_to_epoch())

2016 Jul 27: new current_psp_binex(), called by psp_binex_out() (renamed from epp_binex_out(), along with all other existing "epp" functions and structs)

change of option: +psp ("position solution parameters") to replace earlier +epp option, and associated name change to position_solution_parameters() (renamed from extended_position_parameters())

2016 Jul 22: change of limits of one part of the coarse SBF message id filter in next_SeptentrioBF_record() from [4000, 4081] to [4000, 4105]

correction to teqc's epoch time in decompose_SeptentrioBF_4014(), decompose_SeptentrioBF_4101(), decompose_Leica_MDB_05(), and decompose_Leica_MDB_69()

added case for SBF message 4095 (decoded QZSS ephemeris) in nav_processing() with call to SeptentrioBF_4095_ephemeris()

2016 Jul 21: roughed out binex_epp_message_05_field() (for writing each BINEX 0x05 subfield)

2016 Jul 20: addition of decompose_Leica_MDB_69() for use with +rx_state options with Leica MDB record 105

modification of dump_rx_state() to allow for voltage representation as percentages (as per Leica MDB 105)

addition of decompose_Leica_MDB_05() for use with +rx_state options with (the older) Leica MDB record 5

added decoding of Leica LB2 0xfa submessage 0x05 in decompose_Leica_LB2_fa() for use with +rx_state options; using the last observation epoch as a proxy for the receiver state epoch

2016 Jul 19: in set_out(), initialization of the epoch to 1.0 Jan 1980 and the fields variable to zero in the rx_state and epp structs

new decompose_SeptentrioBF_4014() and decompose_SeptentrioBF_4101() for use with +rx_state options

addition of test for unemptied rx_state struct at end of dump_any_final_result() and call to dump_rx_state() if so

2016 Jul 15: modification to binex_01_03_ephemeris() for reading BINEX 0x01-03 (decoded SBAS ephemeris) so that:

  • any value > 1 in the real4 field after the real8 aGf0 is set to zero, nullifying any non-aGf1 value
  • the uint4 field after the real4 field is adjusted in 1440-minute increments using the ToW to get the seconds in the week for the ToE to account for Javad's interpretation of storing the seconds in the day for the ToE
tested on a sample file supplied by Javad with SBAS ephemerides for 11 July 2016

debugged the reciprocal functionality in binex_nav_message_01() for writing a decoded SBAS ephemeris as BINEX 0x01-03;

2016 Jul 14: correction to decompose_Trimble_29_57h_7() (bug unintentionally added when including +epp option capabilities); plus generalized reading of record 29 and 0x57-7 if there are ever more than two flags bytes present

correction to Ashtech_IGS_rx_type_recast() to exclude name recast if the original name contains "UZ-12" (Ashtech micro-Z); see 12 Apr 2012 entry

2016 Jul 13: new initialize_file_comment_counters() to consolidate initialization of comment counters in one place; used in initialize_file() and process_input()

changes in structure design to disambiguate comment counters and pointers when using -tbin so that there is a separate set for each possible RINEX output type (needed to keep comments independent when creating RINEX with -tbin)

associated changes for -tbin in initialize_file_comment_counters(), tbin_file(), tbin_rinex_comment(), and tbin_rinex_comment_load()

updated IGS receiver/antenna designations up through 13 Jul 2016 entry

2016 Jul 12: added return case in obs_out_interval() when using -tbin to create RINEX but not using or O.dec (or met equivalents or -M.dec) so that an INTERVAL header line is never added to the second RINEX observation file (or met file) that is created

2016 Jul 11: correction to binex_01_03_ephemeris() for reading fields of BINEX 0x01-03 (SBAS navigation message) and to binex_nav_message_01() for writing out fields of 0x01-03 — based on current definition (which might not be as intended)

2016 Jul 6: updated IGS receiver/antenna designations up through 6 Jul 2016 entry

correction to binex_01_04_ephemeris(): the code previously did not handle the possible case where the Galileo SISA index, as -(SISA index +1), was being stored; also, if the SISA is in distance then the SISA value is now rounded to the nearest 0.01 meter

2016 Jul 1: in spew_Topcon_TPS_epoch() for +epp output with JPS/TPS [ST] solution message group, now changing solution time to use that from [ST] message in the epoch

2016 Jun 30: modifications to decompose_Topcon_RD() and spew_Topcon_TPS_epoch() (which now might call the former) so that the -RD option now works when there is no JPS/TPS [RD] message

2016 Jun 29: added cases to silently skip JPS messages [bL] and [mR]

new use_ca_l1() to handle testing of whether +CA_L1 or -CA_L1 has been used and to switch to a +CA_L1 condition if not; now called by JPS, TPS, Septentrio Binary Format (SBF), and BINEX (see relate 28 Jun 2016 entry for BINEX) in format_settings() and by Leica MDB record 119 in decompose_Leica_MDB_77(); modified text for +help for the +CA_L1 and -CA_L1 options

modification of decompose_Topcon_PG(), decompose_Topcon_PO(), decompose_Topcon_PV(), and decompose_Topcon_TO() and new decompose_Topcon_VE(), decompose_Topcon_VG(), decompose_Topcon_ST() and decompose_Topcon_DO() (for reading JPS/TPS [VE], [VG], [ST], and [DO] messages) for use with +epp options; initial modification of spew_Topcon_TPS_epoch() to call extended_position_parameters() for the [ST] solution message group

2016 Jun 28: finally have JPS/TPS messages [rE], [rM], [rV], and [rT] working with +epp and should be independent of order of occurrence, and should work with either [rE] or [rM] or both to supply the time tag of the solution, although decompose_Topcon_rT() could use some streamlining to remove duplicate code with decompose_Topcon_rM() for obtaining the epoch

switched preprocessor DISTINGUISH_L1 in binex.c so that options +CA_L1 and -CA_L1 take effect in binex_7f_05_signal_map() when reading BINEX 0x7f-05; otherwise GPS observables L1, D1, and S1 refer to whichever of GPS L1C/A or L1P(Y) occurs last in each 0x7f-05 record

2016 Jun 17: initial attempt to include JPS [DX] message and disambiguate with [DC], and still have [DC] work as before for older JPS files without [DX] and work as before for TPS files, and include new JPS [0d] message; most changes in decompose_Topcon_Dn() and JPS_signal_map()

2016 Jun 16: initial attempt to include JPS [rx] message and disambiguate with [rc], and still have [rc] work as before for older JPS files without [rx] and work as before for TPS files

2016 Jun 15: initial attempt to include JPS [cr] message by calling decompose_Topcon_nr() with 'c' key

2016 Jun 14: added IRNSS value in K_sys() and A_sys() for Javad JPS; changed values for SBAS and Galileo in A_sys() for Javad JPS to match their firmware changes on 6 Mar 2014

new decompose_Javad_rx() for Javad JPS transition from setting reference pseudorange in [rc] message to the newer [rx] message (for now which is used depends on the specific SV)

renamed the pointers for the reference pseudorange and doppler values for the Javad and Topcon receiver struct to be prRef and dpRef (replacing the earlier CA and DC, which had been referenced to the pseudorange and doppler values of L1C/A)

temporary recognition (but no decoding yet) of new Javad JPS [DX], [cr], and [0d] messages

2016 Jun 13: readying decompose_Topcon_rV() for +epp options, but still needs solution epoch completion from JPS/TPS messages [rM] or [rE]; reading of JPS/TPS [rV] now allows extraction of position in geodetic coordinates (where previously it did not) in addition to cartesian XYZ

2016 Jun 8: correction to binex_7f_05_obs(): selection of bytes from which to obtain the 2-bit CNo +/-0.1 dBHz adjustments when the BINEX 0x7f-05 record is little-endian; also, correction of location of 2-bit CNo +/-0.1 dBHz adjustment extraction in the Range block for both little- and big-endian 0x7f-05 (note: the 2-bit CNo +/-0.1 dBHz adjustment extraction in the Phase block for big-endian 0x7f-05 has been correct when the ExtendedDelta was not being used, as in normal Trimble-produced 0x7f-05)

2016 Jun 6: correction in binex_01_06_ephemeris() to convert the QZSS accuracy from decimeters to meters and correction in binex_nav_message_01() to convert the QZSS accuracy from meters back to decimeters

in binex_01_03_ephemeris() explicit zeroing of the aGf1 frequency bias value when reading BINEX 0x01-03 (SBAS ephemeris) because this is not part of the 0x01-03 definition

teq.epp->fields introduced and extended_position_parameters() modified so that output is dependent on which fields are actually present in the source; calls via decompose_Trimble_29_57h_7() and decompose_SeptentrioBF_4006_4007_5903_5904() appropriately modified

added +epp logic to decompose_Leica_MDB_71() and decompose_Leica_MDB_11() (reading of Leica MDB record 113 and the older record 11); cannot find a good sequence example to test (but the first position consistently and correctly shows up as 0 0 0)

added +epp logic to decompose_Leica_LB2_05_06() (reading of Leica LB2 records 5 and 6); cannot find a good sequence example to test

2016 Jun 3: changed ObsFlags() handling in binex_7f_05_constellation() to match that in binex_7f_05_obs() (see entry for 19 Apr 2016)

2016 Jun 2: correction to decompose_SeptentrioBF_4006_4007_5903_5904() (previously was not storing positions after the first valid position)

correction to decompose_binex_7d(): was missing storage of observable types field in new teq.rx_state struct (broken since 24-27 Jul 2015)

correction to is_met_present(): was missing test for possible null test string when called from binex_7e_01_met()

2016 Jun 1: updated IGS receiver/antenna designations up through 1 Jun 2016 entry

corrected extended_position_parameters() to rotate cartesian velocity parameters into local coordinates (needed for SBF 4006 and 5903)

2016 May 27: improvement in having loss-of-lock detected and reported when reading SBF 4027 (and 5944?) messages — at least for sampling intervals >= 1 second, but still not an identical implementation to what Septentrio uses (which may be impractical to code into teqc); changes to Septentrio() and SeptentrioBF_4027_5944_obs()

2016 May 26: in ephemeris_times_make_sense(), added an exclusion case for SBF in the final switch and moved the exclusion for BINEX from the if() clause around the switch to also being an exclusion case in the final switch

in nav_filtering(), move of cases for Galileo, Beidou, QZSS, an IRNSS ToE testing via ToE_in_window() from the "broad net" allowing a 21-day lookback to the standard teq.ToE_dm controlled with the -ToE_dt option (like GPS, GLONASS, and SBAS)

2016 May 25: for new new +epp options, added missing initialization in initialize() and correction of file pointer output in extended_position_parameters()

updated IGS receiver/antenna designations up through 25 May 2016 entry

several enhancements in decompose_Trimble_29_57h_7() to make the parsing of Trimble record 29 and 0x57-7 a little more robust (for use with +epp options)

add fflush() of file pointer in extended_position_parameters(), dump_rx_state(), event_logger(), slip_print(), nav_out_delta_UTC(), nav_out_ion_alpha() and nav_out_ion_beta() for +epp, +rx_state, +eds, +slips, +dump_u, and +dump_i options, respectively

2016 May 24: due to the now numerous coding similarities, decompose_SeptentrioBF_4006_5903() and decompose_SeptentrioBF_4007_5904() were combined into a single decompose_SeptentrioBF_4006_4007_5903_5904(), plus final details to convert clock bias and drift of SBF 5903 and 5904 into the same units of SBF 4006 and 4007 before calling extended_position_parameters()

the detection of loss-of-lock in SeptentrioBF_4027_5944_obs(), for reading of SBF 4027 and 5944, was changed to more correctly flag all cases where the sample interval is 1 second or greater (though, for the time being, with the correct interval must be used for intervals greater than 1 second); for intervals less than 1 second, correct flagging of only those epochs with loss-of-lock is problematic

2016 May 23: corrections and code improvements to the original decompose_SeptentrioBF_4006_5903() and decompose_SeptentrioBF_4007_5904()

removal of +epp processing from decompose_Trimble_29_57h_7() into new extended_position_parameters(); decoded values now stored in new teq.epp struct

extension of decompose_SeptentrioBF_4006_5903() and decompose_SeptentrioBF_4007_5904() to also extract velocity and clock parameters and call extended_position_parameters()

2016 May 20: updated IGS receiver/antenna designations up through 20 May 2016 entry

change of option +dep to revamped +epp (plus related cases) using the set_out() function

2016 May 16: initial tests for dynamic allocation scheme for reading Septentrio SBF and NavCom binary formats (not completed yet)

2016 May 13: first step in removing fixed buffer sizes for reading of raw data formats: test of dynamic allocation scheme in next_ublox_UBX_record() — all tests of reading UBX files successful

for the time being, fixed buffer retained in read_Ashtech_D_file() (reading of Ashtech D-file), but size is now defined locally — tested successfully on reading of Ashtech BESD fileset

next for dynamic allocation scheme: next_CMC_Allstar_record() — tested successfully on reading of CMC Allstar binary format files

next for dynamic allocation scheme: next_Rockwell_Zodiac_record() — tested successfully on reading of Rockwell Zodiac binary format files

next for dynamic allocation scheme: next_rtigs_record() — tested successfully on reading of RTIGS format files

next for dynamic allocation scheme: next_Soc_record() — tested successfully on reading of JPL Soc format files

next for dynamic allocation scheme: next_TI_4100_GESAR_record() and next_TI_4100_ROM_record() — tested successfully on reading of TI-4100 GESAT and ROM format files

a little recrafting of allocate()

2016 May 11: some recrafting of decompose_binex_01_raw() to get the reading of BINEX 0x01-41 to 0x01-47 better aligned with the current proposal, but final work will require details on the bit storage to be resolved

associated changes in frame_id(), decompose_SeptentrioBF_4017_et_al(), GPS_nav_data() (for Javad JPS and Topcon TPS), decompose_Trimble_57h_5() for change in primitive specification of the frame/message ID field

2016 May 6: Trimble 0x55 subtype ID correction for Beidou/Compass and SBAS ephemerides in next_Trimble_BSTR_record() and decompose_Trimble_28_55h()

offset correction in Trimble_28_55h_ephemeris() for reading decoded Galileo, Beidou/Compass, SBAS, and QZSS ephemerides in Trimble 0x55 in their streaming (i.e. "RT27") format; tested on all except QZSS from NetN9 data collected in Boulder, CO

2016 May 3: updated IGS receiver/antenna designations up through 3 May 2016 entry

2016 Apr 26: change in decoding of SBF 4044 — QZSS L1C/A 300-bit nav message — to match that of SBF 4017 (and deprecated 5895) — GPS L1C/A 3000bit nav message — with +raw_nav option

2016 Apr 25: detection of BINEX 0x01-41 to 0x01-47 added to decompose_binex_01() with call to new preliminary decompose_binex_01_raw() for handling

2016 Apr 22: extension of reading SBF format for IRNSS PRNs in SeptentrioBF_SV_map(), IRNSS L5 SeptentrioBF_signal_map() and for Beidou/Compass B3/E6 in SeptentrioBF_signal_map()

modification in SeptentrioBF_SV_map() and decompose_SeptentrioBF_5896() for detecting SBAS PRNs in reading SBF format to account for PRNs 141 — 158 (when allowed globally in teqc, although the current upper limit is still set to be 142; only the value in SVs_in_system[ ] for SBAS needs to be increased)

2016 Apr 21: the final round of retooling for IRNSS, mainly for deep handling of IRNSS navigation messages (like for the -tbin option) and qc, and checking of some details with the June 2014 IRNSS ICD (ISRO-IRNSS-ICD-SPS-1.0); now just need some actual IRNSS nav messages to test

final treatment of IRNSS health when reading BINEX 0x01-07 in binex_01_07_ephemeris() and when writing 0x01-07 in binex_nav_message_01()

corrected the combining GLONASS Bn health bit with Cn operability bits when writing BINEX 0x01-02 in binex_nav_message_01()

added IRNSS case to URAi() (i.e. back-computing IRNSS URA index from URA)

2016 Apr 20: yet more retooling for IRNSS, including prototype binex_01_07_ephemeris() for reading BINEX 0x01-07 and (IRNSS decoded nav message) and adding write case for 0x01-07 in binex_nav_message_01()

new binex_7e_01_met() for reading proposed BINEX 0x7e-01 (external device ASCII string) by calling is_met_present() (which was is_met_in_00_comment() prior to this change)

2016 Apr 19: new decompose_SeptentrioBF_4095() and SeptentrioBF_4095_ephemeris() for reading SBF message 4095 (QZSS decoded ephemeris); not tested yet

some minor code changes in binex_7f_05_obs() dealing with parsing of the optional ObsFlags() bytes

filled in most of the IRNSS stubs

2016 Apr 18: IRNSS: system.h and associated arrays in globals.c extended to allow IRNSS; binex_7f_05_constellation(), binex_7f_05_obs(), and binex_7f_05_signal_map() extended also extended for reading BINEX 0x7f-05 with IRNSS (L5 signals)

elsewhere, a start at the usual boiler-plate stubs for dealing with IRNSS

binex_7f_05_obs() modified to read and use ObsFlags(2) in BINEX 0x7f-05 for GLONASS frequency channel number (if present)

modification to next_SeptentrioBF_record() to ignore all other known SBF messages that are not used

2016 Apr 14: modification to next_SeptentrioBF_record() to ignore SBF messages 4053 and 4059

2016 Apr 13: modification to decompose_SeptentrioBF_5902() to override the receiver type using the ProductName field if Rev 3 or higher

extension of Septentrio_rx_specifics() to Septentrio PolaRx4, PolaRx5, and PolaRxS receivers

correction of ++igs for Septentrio PolaRx5 entry

updated IGS receiver/antenna designations up through 13 Apr 2016 entry

2016 Apr 12: modification to decompose_SeptentrioBF_5902() to change the Septentrio internal receiver name field, RxName of message 5902, into the IGS name for several receivers; a more complete mapping will require information on past receivers from Septentrio

for option +raw_nav and reading of SBF GNSS raw navigation messages, an update of decompose_SeptentrioBF_4017_et_al() to detect the source signal of SBF 4047 and 4093 and call mfo_stage2(), plus associated change in mfo_signal_code(), which is called by mfo_stage1(), to output an appropriate ASCII designation for these signal sources; note: no internal way to test this yet

2016 Apr 8: added 'NET-G3' and 'NET-G5' to the if() statement in the switch case in Topcon_Javad_rx_names() so that these are reported as a receiver type name starting with 'TPS' instead of 'TOPCON' — as per the suggested IGS naming convention; tested with a file from a Net-G5

2016 Apr 5: with the code correction on 25 & 28 Mar 2016, another error was exposed which does not correctly trap navigation messages output early in the week, typically Sunday, which were logged by the receiver a little over 7 days earlier, typically late on Saturday in the week two weeks prior; e.g. this is noted to occur, for example, with Topcon GB-1000 receivers using fw R3.1p2/C3.02U and R3.4p2/C3.02U; this means that using the +meta or +mds option with such a file may result in a incorrect termination with "week: ####" to stdout suggesting a value one week too early; the proposed fix is to introduce a new set of cases in the switch with in the first_valid_ephemeris_check block in ephemeris_times_make_sense() to ignore ToW - (supposed) observation epoch of -164 to -172 hours for selected format types, currently restricted to Topcon TPS and Javad JPS

2016 Apr 1

2016 Apr 1: in build.h added #define noPWD for statically-linked Viper build; otherwise, a problem with the getpwnam() and getpwuid() calls, i.e. "statically linked applications requires at runtime the shared libraries from the glibc version used for linking"

2016 Mar 29: in command_parse() a check was added to inform the user of a command line or configuration file syntax error, probably involving double-quotes to delimit a string, and then exit

2016 Mar 28: same corrected call to GPS_to_epoch() for the ToW as done on 25 Mar 2016 in Leica_GPS_ephemeris() (reading of GPS navigation message in Leica formats) and collapsed_raw_ephemeris() (reading of raw GPS navigation message in various formats, e.g. UBX, NavCom, ConanBinary, TurboBinary)

based on the 2015 Apr 15, version 3.6.2, Javad GREIS, a correction to JPS_signal_map() for the signals in JPS [.5] or [5.] messages (key == '5') for a GLONASS SV to represent the GLONASS-K CDMA signal G3 I+Q at 1202.025 MHz, or L7/C7/D7/S7 in extended RINEX 2.11 (see teqc version 2015 Mar 15)

correction of GLONASS CDMA G3 case in frequency() from L5 to L7

2016 Mar 25: recasting of variables to compute the minutes in GPS_to_epoch() corrected to allow for negative "seconds of week"; note: the previous recasting (going back to 1996) would not be correct for navigation messages for the past GPS week, i.e. a negative ToW in the current GPS week

corrected call to GPS_to_epoch() in SeptentrioBF_5891_ephemeris() for the GPS navigation message ToW to use the corrected ToW rather than the raw ToW in SBF message 5891

same corrected call to GPS_to_epoch() for the ToW in SeptentrioBF_4002_ephemeris() (reading of Galileo navigation message in SBF message 4002), SeptentrioBF_4081_ephemeris() (reading of Beidou navigation message in SBF message 4081), Trimble_3_ephemeris() (reading of GPS navigation message in Trimble .dat record 3), Trimble_21_55h_1_ephemeris() (reading of GPS navigation message in Trimble .dat recrod 21 and 0x55), Trimble_28_55h_ephemeris() (reading of Galileo, Beidou, and QZSS navigation messages in Trimble .tdg record 28 and 0x55), Trimble_TSIP_58_ephemeris() (reading of GPS navigation message in Trimble TSIP record 58), Ashtech_SNV_ephemeris() (reading of GPS navigation message in Ashtech SNV record), binex_01_01_ephemeris() (reading of GPS navigation message in BINEX 0x01-01), binex_01_04_ephemeris() (reading of Galileo navigation message in BINEX 0x01-04), binex_01_05_ephemeris() (reading of Beidou navigation message in BINEX 0x01-05), binex_01_06_ephemeris() (reading of QZSS navigation message in BINEX 0x01-06), Topcon_GE_ephemeris() (reading of GPS navigation message in Topcon TPS/Javad JPS message [GE]), Topcon_EN_ephemeris() (reading of Galileo navigation message in Topcon TPS/Javad JPS message [EN]), Topcon_LE_ephemeris() (reading of Galileo navigation message in Topcon TPS/Javad JPS message [LE]), Topcon_DE_ephemeris() (reading of Beidou navigation message in Topcon TPS [DE]), Javad_CN_ephemeris() (reading of Beidou navigation message in Javad JPS message [CN]), and Topcon_QE_ephemeris() (reading of QZSS navigation message in Topcon JPS/Javad JPS message [QE])

2016 Mar 17: updated IGS receiver/antenna designations up through 17 Mar 2016 entry

2016 Mar 2: revamped +dump_u[tc] and +dump_i[on] options using set_out() function; modified nav_out_delta_UTC(), nav_out_ion_alpha(), and nav_out_ion_beta(); the new output results show the SV id — although currently this is only available from SBF messages — showing a PRN of '00' when the SV id is unknown

2016 Feb 12: in next_Topcon_Javad_record(), change of location of JPS/TPS message [::] (ET, "epoch time", TOPCON__c) from being treated when found the same as [||] (EE, "epoch end", TOPCON__p) to merely being ignored (since, otherwise, nothing is being done with it)

2016 Jan 20: updated IGS receiver/antenna designations up through 20 Jan 2016 entry

2016 Jan 8: reading of TurboBinary and ConanBinary was changed a bit in spew_any_CB_OBS(), AOA_CB_obs(), spew_AOA_TB_68(), spew_AOA_TB_HR_L1(), spew_AOA_TB_LC(), and AOA_TB_68_obs() so that if the -week option is not used (which should be the normal state of affairs when reading TurboBinary or ConanBinary), then the GPS week value teq.u.GPS_week is set upon finding the first observation epoch, so that with the current adjust_week() this change allows raw GPS ephemeris records to be correctly read for GPS weeks > 1023 since the raw GPS ephemerides only have the broadcast 10-bit GPS week values (i.e. 0 - 1023) — otherwise such raw GPS ephemerides are not read and used at all; note: there may be use cases where one would want to reset teq.u.GPS_week at every observation epoch in these functions and not just the first observation epoch found

2016 Jan 7: next_Topcon_Javad_record() modified so that only one stderr message is output for any unknown or unused TPS or JPS message type that is encountered

taken care of the few remaining places in reading Topcon TPS and Javad JPS where an unknown GLONASS slot number is assigned 255 to avoid a bad slot number when calling bad_SV_number(slot, GLONASS)

2016 Jan 5: several functions related to reading TurboBinary and ConanBinary modified so that all error and warning messages are suppressed with the -warn or +quiet options (i.e. there were some messages that were not being suppressed)

2016 Jan 4: change to Topcon_SI_NN_validation() to merely report and skip uncoded USI values rather than terminating execution of the program

2015 Dec 30: straightened out the differences in the USI ("Universal Satellite Identifier") indices between Topcon TPS and Javad JPS that have developed over time; new set_to_Topcon() and set_to_Javad() to define the different end point values for various constellations, with appropriate changes in Topcon(), next_Topcon_Javad_record(), decompose_Topcon_JP(), decompose_Topcon_PM(), Topcon_SI_NN_validation(), Topcon_TPS_constellation(), Topcon_TPS_rD_constellation(), Topcon_TPS_rD_obs(), Topcon_TPS_rM_constellation(), and Topcon_TPS_rM_obs()

2015 Dec 22: updated IGS receiver/antenna designations up through 22 Dec 2015 entry

2015 Dec 10: updated IGS receiver/antenna designations up through 10 Dec 2015 entry

2015 Dec 8: code change on 11 Sep 2015 does not call obs_phase_offset_init() via format_initialization() when the input is RINEX format and can (but not necessarily) result in a segmentation or memory fault when both reading and outputting RINEX; the correction for this was to add a call to format_initialization() in main() when the input format is not binary or other non-RINEX formats

2015 Nov 17: updated IGS receiver/antenna designations up through 17 Nov 2015 entry

2015 Nov 6

2015 Nov 6: final compilations for next official release

2015 Nov 5: test compilations on everything except Solaris Sparc 5.9 and HP-UX 11.00; besides strange new warnings with gcc 4.2 on OSX 10.10.3 (which don't seem to have any effect on the executable), the cross-compiler for Viper/ARM is complaining about one primitive type in list2mask() which will be investigated

the complaint from the Viper/ARM cross-compiler was solved by changing the one primitive type in list2mask() from a sint1 (char) to an esint1 (signed char) — and this is a fine solution for the other compilers

2015 Oct 14: increased TRIMBLE_MAX_REC_SIZE from 4096 to 8192 to accommodate the increase in signal types and SVs possible in .tdg record 27 with the NetR9

2015 Oct 7: code modifications for allowing the user to fix the antenna position during qc using +O.px or, mostly summarized by:

  • new set_fixed_position() that is called when either of the above two options are used; this function sets new FIXED_POSITION state and establishes the now fixed geocentric to topocentric rotation
  • modification to qc_satellite_nav_update() so that start_orbit_path() is now not called unless an ephemeris if found during qc (e.g. on raw data vi file or stdin)
  • find_position() now returns new FIXED_POINT_POSITION when FIXED_POSITION state in on which is handled by new_position() as a new qc position or "Pos" indicator, ".", which was added to the qc_pos_symbol string at the FIXED_POINT_POSITION location
  • update of +help

2015 Oct 1: the qc code for testing SV health in the "current" navigation message has been split off as a separate function, SV_health_test() and is now being called with the data qc tests and with the "above cutoff elevation, but no data" test; this change means that if there is no data above the elevation mask, the ASCII time plot goes from, e.g.:


2015 Sep 30: with the new "unhealthy" qc indicator, the orbit_info_case variable of the QC_SV_NAV struct needed to be initialized in initialize_qc_nav() to prevent spurious mis-assignments of the unhealthy indicator for random SVs in the ASCII time plot

switching to a different strategy for detecting unhealthy navigation messages and setting the ASCII time plot "unhealthy" indicator, i.e. now directly in qc_satellite_obs_update() by examining the "current" navigation message for each SV; however, the earlier code by which each *_SV_geocentric_position() function returns an unhealthy status remains in place in case it is decided to base the unhealthy indicator via find_path_fit() which would then test for the unhealthy indicator across the entire time span of ASCII time plot, at the interval used in find_path_fit(), rather than were observation data occurs which is how things are now

2015 Sep 29: updated IGS receiver/antenna designations up through 29 Sep 2015 entry; correction of 'JAV_RINGANT_G3T' entry (had been 'JAV_RINGANT-G3T')

added check in initialize_GLONASS_orbit_interpolation() to skip orbit initialization for any GLONASS SV which does not have at least one navigation message; otherwise, any GLONASS SV that does not have a navigation message shows up — correctly, but empty (and therefore somewhat misleading or confusing) — in the ASCII time plot and could be incorrectly identified as being "unhealthy"

2015 Sep 28: correction in qc_satellite_obs_update() (which, currently, is where the test for unhealthy status is being done to set the indicator for the ASCII time plot): needed to test for whether space for the SV's current navigation message has been allocated or not

2015 Sep 25: implementation of allowing the ignoring of navigation messages in orbit determination when an unhealthy navigation message is found is now ready for testing; this includes a new (non-data) indicator for the ASCII time plot, i.e. ' (a single-quote) to indicate that the navigation message in this time range is showing an unhealthy status for the SV; note: a double-quote is being reserved for a worse navigation message indicator

2015 Sep 24: initial implementation of allowing the ignoring of navigation messages in orbit determination when an unhealthy navigation message is found, with main test in each *_SV_geocentric_position() function for GPS, GLONASS, Galileo, Beidou/Compass, and QZSS:

  • default behaviour is to use the navigation messages from all SVs regardless of health
  • a Notice message is output if any SV is were detected to be unhealthy (based on the health value in navigation messages)
  • likewise, one or more lines in the short report of the qc summary list any SVs with unhealthy nav messages
  • a new option, -unhealthy, can be used to exclude any navigation message for an SV when the health value indicates any unhealthy state

2015 Sep 23: some minor recrafting of notice, warning, and error messages in binex.c to standardize them a bit more

updated IGS receiver/antenna designations up through 23 Sep 2015 entry

test of compilation on Raspberry Pi, statically and dynamically linked; no issues

2015 Sep 22: test of out-of-range BINEX record ID (i.e. record ID not defined yet) added to hdr_binex_out() to solve case of reading BINEX from stdin and also outputting BINEX

the additional C switch in next_BINEX_record() added 21 Sep 2015 is now activated by using the new +skrIDs option (= "screen for known record IDs") which is currently only for reading BINEX and then should only be used if the input BINEX is highly corrupted

2015 Sep 21: experimenting with an additional C switch in next_BINEX_record() to help deal with severely corrupted BINEX input; the switch only "allows" certain BINEX message IDs; the idea is that this test would be activated with a new option

additional check added to default case in extract_binex_00_field() to make sure that the extracted field length in a BINEX 0x00 record does not exceed the end of the 0x00 record (again, to get through corrupted data); required storing BINEX 0x00 record length as an additional quantity in the BINEX_0x00 struct and making the assignment in decompose_binex_00()

2015 Sep 14: some further modifications for the -O.def_wf option: obs_wavelength_factor() changed so that value from input RINEX observation file is now only considered when -O.def_wf is not used, the L2 wavelength factor is now constrained to be only 1 or 0 when -O.def_wf is used (consistent with previous logic elsewhere anyway), and the +help output for -O.def_wf and -O.mod_wf options is now more explicit

updated IGS receiver/antenna designations up through 14 Sep 2015 entry

initialize_GLONASS_orbit_interpolation() had to be changed with a special preprocessor case for all DOS/Windows builds to reduce the size of several multi-dimensional arrays from values established for UNIX/Linux builds between 14-26 May 2015 for larger GLONASS ephemerides datasets; otherwise, attempting qc full on GLONASS data results in Windows builds simply terminating with no messages as soon as initialize_GLONASS_orbit_interpolation() is called or, depending on the dataset involved, giving a memory fault

2015 Sep 11: the initialization of the L*_off pointers (for phase overflow and BINEX 0x7f-03 output) was split out of obs_phase_overflow() on a per satellite basis into obs_phase_offset_init() which does the initialization for all satellites for all systems, called from format_initialization()

the initialization of specific SV wavelength factors moved from when the -O.def_wf option is parsed in obs_arg() to initialize_systems() (a segmentation fault bug since 1 Nov 2013; see log entry)

2015 Sep 10: the assignment of basic->version from version was moved following the if block of the type/system check instead of following the entire if/else block; this prevents the RINEX version for a navigation file to remain as the current latest version instead of resetting to the file's version when using as a RINEX-to-RINEX filter

2015 Sep 4: added block of code near end of qc_first_obs_epoch() so that qc compact plot files would be output if the user is filtering on a small number of SVs which are insufficient to determine an antenna position when navigation messages are being read (i.e. qc full is assumed); new n_opt() being used

demonstrated that with a simple code change in each *_SV_geocentric_position() function (by testing on GPS_SV_geocentric_position() and GPS-only data) that navigation messages with unhealthy settings could easily be excluded; need to discuss with D&T group if this meshes with their suggested use case

2015 Sep 3: changed similar stderr messages in a few other places

2015 Sep 2: changed stderr messages for unknown message IDs for the Navcom binary, RTIGS, and (JPL) Soc formats to be "Notice" messages and a little more explicitly stating what the situation is

2015 Sep 1: updated IGS receiver/antenna designations up through 31 Aug 2015 entry

2015 Aug 18: decompose_Topcon_XAB() modified to alert the user if the +event option is in use and the reference time scale of [XA] or [XB] events in Topcon TPS or Javad JPS formats is not in GPS system time then event information will not be output as expected

Topcon_event() modified so that the event epoch is now written directly to the obs.event.epoch structure and each event string is now explicitly written to the beginning of obs.event.buf

2015 Aug 6: added stronger warning about using the old +reformat option in the +help usage output

2015 Jul 29: revamped +eds option with new ++eds option using new set_out() function; slightly modified event_logger()

2015 Jul 28: revamped +events option with new ++events option using new set_out() function; modified rinex_out_event()

2015 Jul 27: new set_out(), adapted from set_rx_state(), to set up output of a variety of options, including +rx_state

revamped +slips option with new ++slips option using new set_out() function

2015 Jul 24: new dump_rx_state() to write out formatted receivers metadata, currently internal temperature and voltages for primary and secondary (external and internal sources)

completed decompose_Trimble_40(), now using new dump_rx_state(), to read Trimble record 40

modified decompose_binex_7d() (for reading of BINEX 0x7d) to use dump_rx_state()

revamped +rx_state option with new ++rx_state option; new set_rx_state() function for setting output mode of these options

2015 Jul 22: new decompose_Trimble_40() (not yet completed) to report that record 40 messages are being found in the Trimble .tgd input

addition to code in next_Trimble_dat_record() for a newly-detected record in Trimble .dat/.tgd: the record is assumed to have a 1-byte length field and the file pointer is advanced to the presumed end of the record, via a call to Trimble_dat(), based on this value

2015 Jul 21: in window_OK(), a misplaced else if block was not allowing the correct default window end time to be set when the input was stdin and the output was BINEX (using option +binex); the extra conditionals for BINEX output have been moved to be part of the else if block for stdin window setup

2015 Jul 15: updated IGS receiver/antenna designations up through 15 Jul 2015 entry

2015 Jun 25: updated IGS receiver/antenna designations up through 25 Jun 2015 entry

2015 Jun 23

2015 Jun 23: compiling of next official version for all currently available builds

2015 Jun 19: a minor recrafting of the modification to NMEA_quadtuple() done on 16 June 2015 due to inconsistencies in the way strncpy() works (noted on the Solaris x86 build)

same as done on 16 Apr 2015, elimination of nav.last_GPS_week assignment in Trimble_28_55h_ephemeris() when using a navigation message from GLONASS, Galileo, SBAS, or QZSS (a real mystery as to what is going on because the original code works with Solaris Sparc builds but not Solaris x86 builds)

2015 Jun 18: updated IGS receiver/antenna designations up through 18 Jun 2015 entry

split off duplicated code in out_settings() for opening the various RINEX navigation files for writing (as specified with +nav) as a separate function: set_RINEX_nav()

new function any_SVs_to_do_in_system() to determine cases in set_RINEX_nav() where, due to global constellation filtering that has been set by the user, it makes no sense to open a specific constellation's RINEX navigation file

2015 Jun 16: modification to NMEA_quadtuple() to only test the first character of what should be the unit field in a NMEA met string — to try to eke out one more met observable when the NMEA string is corrupted — however, this limits a valid met unit to be only one character, which is fine for the currently defined NMEA met fields

2015 Jun 10: corrected default number of Beidou/Compass SVs in fully built-out constellation in SVs_in_system[ ] from 35 to 37

2015 Jun 9: compiler test for all builds; only one minor warning (now corrected) using the Borland compiler; final production burn-in proceeding smoothly for a official teqc release June 16-19

2015 Jun 4: some minor code changes to eliminate all but the irrelevant "parentheses" warnings from compiling with gcc 4.3 on OSX 10.10 (Yosemite)

2015 Jun 3: updated all UNAVCO web links (hadn't been done for the UNAVCO web site rollout in mid-May 2014)

fixed typo in Topcon_TPS_rM_obs() that was introduced 27 Apr 2015 preventing extraction of L2 phase from TPS/JPS [rM] messages and incorrect L1 phase if L2 is present

2015 May 26: returning to fixed array scheme of 14 May 2015 in initialize_GLONASS_orbit_interpolation()

2015 May 22: back to a slightly modified scheme of 14 May 2015 in initialize_GLONASS_orbit_interpolation() to have dynamic memory allocation and tests for the two remaining fixed arrays limits

2015 May 20: temporarily returning to fixed array scheme in initialize_GLONASS_orbit_interpolation() (to sort out memory overwrite problem in dynamic array scheme that occurs with some datasets)

additional logic in nav_value_out_of_range() to reject any GPS, Galileo, Beidou/Compass, or QZSS nav message where delta n, M, OMEGA, OMEGA dot, sqrt a, i, or i dot are zero or to reject any GLONASS or SBAS nav message where both the x and y positions are zero

2015 May 19: added GLONASS filtering to initialize_GLONASS_orbit_interpolation() (to avoid math of GLONASS SVs that might be requested to be eliminated)

modified scheme of 14 May 2015 in initialize_GLONASS_orbit_interpolation() to have dynamic memory allocation and included tests for the two remaining fixed arrays limits

2015 May 18: added another two cases in rinex_string_to_date() (the function which has always been a fool's errand) to look for "YYYY-MM-DD hh:mm" and "YYYY-MM-DD hh:mm:ss" in RINEX header DATE field

2015 May 14: modified initialize_GLONASS_orbit_interpolation() to deal with longer sets of broadcast GLONASS orbital positions (SW)

2015 May 12: added another case in rinex_string_to_date() to look for Leica's Spider "YYYY MM DD hh:mm" date format in RINEX header DATE field

2015 May 11: in rinex_nav_GLONASS(), currently only for the Borland 32-bit build, the GLONASS navigation parameter tk (seconds of the day) is being limited to less than 1e6 and being reset to zero if found to be larger

added an equivalent array to months[ ][ ]mois[ ][ ] — for 3-letter French abbreviations for the month names that show up in RINEX headers

2015 May 5: initial code for reading Topcon TPS [QE] message (QZSS ephemeris); initial testing of translated navigation messages from new GNSS messages in TPS for Galileo, Beidou/Compass, and QZSS completed — normal qc results

modifications to id() to auto-identify the Topcon TPS files that UNAVCO's D&T group has obtained via Topcon NetG5 testing for the GNSS receiver RFP

2015 May 1: corrected call of adjust_week() in ephemeris_file_location() for Beidou/Compass, i.e. week rollover is modulo 8192 (not important until 2 Jan 2163, but, hey, it never hurts to be consistent and correct)

initial code for reading Topcon TPS [DE] message (Beidou/Compass ephemeris), but results need to be reviewed

2015 Apr 30: updated IGS receiver/antenna designations up through 30 Apr 2015 entry

decoupling of Topcon TPS [QS] and Javad JPS [QS] based on input format type (even though neither is used at this time, but this avoids checksum error messages)

initial code for reading Topcon TPS [LE] message (Galileo ephemeris), but results need to be reviewed

2015 Apr 29: changed pointer increment in constellation_array() for each SV's data array from sint4 to sintp — important for systems/compilers where a long is >4 bytes

changed and correctly logic in TPS_rD_signal_map(), TPS_rM_signal_map(), and JPS_signal_map()

2015 Apr 28: decompose_SeptentrioBF_5894() corrected to read the leap second value from the DEL_t_LS field of SBF message 5894 (rather than the DEL_t_LSF field)

2015 Apr 27: updated IGS receiver/antenna designations up through 27 Apr 2015 entry

initial code for reading Topcon TPS [rD] message (which is similar to the older [rM] message, except more generalized for GNSS), but the code is definitely not generalized for all possible cases that might arise

slight refactoring of Topcon_TPS_rM_obs(), including new TPS_rM_signal_map(), for reading Topcon TPS [rM] messages, to make it more similar to the new code for reading [rD] messages

2015 Apr 24: updated IGS receiver/antenna designations up through 24 Apr 2015 entry

2015 Apr 16: added missing case for testing for Beidou/Compass RINEX-like navigation filename extension .YYC or .YYc in qc_auto_find_nav_files()

elimination of nav.last_GPS_week assignment in Trimble_28_55h_ephemeris() when using a navigation message from Beidou/Compass (even though the BDT vs. GPS week offset was correctly being dealt with) — eliminating this assignment seems to cure the occasional wrong end time being found with the +meta and +mds options for some Trimble .tdg files when Beidou/Compass navigation data is present which started to occur in versions after 2013Nov15 (good) and at or before versions 2013Dec11 and later (problematic)

2015 Apr 15: added reading of SBF message ID 4075 (ASCII string data from external devices); new decompose_SeptentrioBF_4075()

2015 Mar 25: updated IGS receiver/antenna/radome designations up through 25 Mar 2015 entry

2015 Feb 24: modified Trimble_week_check() to include an initialization of the week_value[ ] array (probably not ever needed, but it doesn't hurt)

2015 Feb 13: updated IGS receiver/antenna designations up through 13 Feb 2015 entry

2015 Feb 4: Leica_LB2_0d_obs() modified a bit more to detect and report use of what are currently reserved bit flags in LB2 0x0d

2015 Feb 3: new Leica_LB2_0d_signal_map() to simplify sorting out signals to observbles in Leica_LB2_0d_obs() (reading of LB2 ID 0x0d messages)

refactoring of Leica_LB2_0d_obs() to use Leica_LB2_0d_signal_map() and identify in LB2 ID 0x0d channel data type = 3 and corresponding extended data types for GPS L2C and GPS/SBAS L5

Leica_LB2_0d_obs() modified to include, if available, the extended CN0 resolution to +/-0.05 dBHz resolution in LB2 ID 0x0d

2015 Jan 29: updated IGS receiver/antenna designations up through 29 Jan 2015 entry

2015 Jan 26: updated IGS receiver/antenna designations up through 26 Jan 2015 entry

2015 Jan 22: addition of system_known boolean check in Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs()

as per new information from Trimble, addition of SV system type 10 in Trimble_27_57h_6_constellation(), Trimble_27_57h_6_obs(), and Trimble_27_57h_6_signal_map() for Beidou GEO SVs with 1/2 phase correction on B1

returning to .azi and .ele compact plot file issues from Jan 12: commenting out the mysterious resetting of the last.have counters for these two files in new_position() because with the resets identical SV lists in sequential epochs in the .azi and .ele compact plot files are fully printed instead of being detected as identical in same_compact_plot_list() and represented as "-1" in the SV list; the exact reason why these resets were in new_position() is not clear; if the reason for these resets resurfaces, the commented out code can be reactivated and another solution for same_compact_plot_list() can be found

2015 Jan 12: in qc_missing_epoch() the calls of open_qc_compact_plot_file() and init_compact_plot() for the .azi and .ele compact3 plot files needed to be tested for whether or not these compact3 plot files had already been opened; otherwise when a data gap is encountered, the initial results for these two plots files are lost

2015 Jan 7: update of leap_seconds() for upcoming positive leap second insertion into UTC at the end of 30 June 2015

2014 Dec 10: updated IGS receiver/antenna designations up through 10 Dec 2014 entry

2014 Dec 1: addition of if() clause prior to new code block in initialize_qc_SV()

2014 Nov 18: initialize_qc_plot() renamed initialize_qc_plots(); all compact plot initialization consolidated from initialize_qc_plots() and open_qc_compact_plot_file() to new initialize_qc_compact_plot() which is called from initialize_qc_plots()

new block of code in initialize_qc_SV() to update the compact plot array allocations whenever the number of SVs increases after the initial plot array allocations

updated IGS receiver/antenna designations up through 18 Nov 2014 entry

2014 Oct 29: logic addition to obs_out_end() to prevent more than one TIME OF LAST OBS header lines from being output to RINEX observation output when the -O.e option is used (note: to correct a bug that was introduced after 16 Nov 2009 but by 14 Dec 2009, probably on 10 Dec)

2014 Oct 20: correction to -tbin situation to new code in any_initial_epoch() (to account for explicitly window end being specified)

2014 Oct 17: in order to get the -tbin option working with streamed BINEX input and create time-binned BINEX:

  • added initial return in tbin_file() for when the output is BINEX and the date is still 1 Jan 1980, i.e. no data yet to establish a date for the file but there is some metadata
  • added a condition in hdr_binex_out so that if the observation date is still 1 Jan 1980, then return
  • a repeated block of code in binex_OBS() and binary_MET() was moved to the end of any_initial_epoch(), which is called by both functions
  • new block of code in any_initial_epoch() was modified to deal with setting the window end time in this case

fixed typo in SV_edit_comment() which was putting in the wrong upper limit for excluded SVs in the RINEX comment field when any of -G, -R, -E, -S, -C, or -J where used with a specific SV list (typo has been around since at least 18 May 2007)

with the move of the code block from binex_OBS() and binary_MET() (see above) some further cleanup of these two functions was possible and was done

2014 Oct 16: a couple of further improvements to the new list2mask(); tested with the same case as yesterday

2014 Oct 15: improvements to the new list2mask() and splitting out part of this as new list_limit_check() which is now needed at least twice; tested using -G33-64, -S43-83, -G33-65, and -S43-84 (the first two are allowed and the last two are not because currently the code only uses two 4-byte integers (64 bits) for SV flags per constellation)

2014 Oct 14: added additional tests to rinex_read_failure() to try to inform the user when non-printable ASCII or non-ISO Latin characters (e.g. multi-byte UTF-8 characters) are being used in a RINEX header field causing a formatting misalignment and to try to inform the user when a line exceeds the printable 80-character limit of RINEX 1 or 2.xx

list2mask() was modified so that if it is being used to read an SV filter list (e.g. +R25-27) and a specified SV exceeds the current set limit, then the corresponding -n_system_name option (e.g. -n_GLONASS 27) need not be used to set the new upper limit

2014 Oct 13: changed the Topcon TPS and Javad JPS SBAS health array WA_health[ ] (for storing the health from [WA] messages) from a fixed array of 19 (appropriate for the old limit of PRNs 120 — 138) to a dynamically allocated array based on the current number of SBAS SVs; initial allocation is done in format_settings()

2014 Sep 30 & Oct 1: corrected some typos in various comments in various modules

2014 Sep 26: updated IGS receiver/antenna designations up through 25 Sep 2014 entry

2014 Sep 23: updated IGS receiver/antenna designations up through 22 Sep 2014 entry

2014 Aug 14: added new case for PZ90 to WGS84 transformation in initialize_PZ90_to_WGS84() for PZ90 after 2014 Apr 8; for now, the parameters are all zero, meaning PZ90 identical to WGS84; the parameters will be updated later if we want to get picky

2014 Aug 8: corrected decompose_SeptentrioBF_5914(), which apparently has had a typo since it was written in April or May 2007: it was incorrectly reading the UTCsec byte instead of the DeltaLS byte that immediately follows leading to outputting the UTCsec value as the leap second offset between UTC and GPS time instead of the correct leap second offset

2014 Aug 4: updated IGS receiver/antenna designations up through 4 Aug 2014 entry

2014 Jul 25: updated IGS receiver/antenna designations up through 24 Jul 2014 entry

2014 Jul 9: required correction to qc_missing_epochs() to call open_qc_compact_plot_file() prior to init_compact_plot() for the compact elevation .ele and azimuth .azi files (probably needed since 2013 Oct 28 when moving over to the 'compact3' plot files, but this case would only be encountered if the antenna position is found after the initial data epoch)

2014 Jun 25: modified call to and code of extract_binex_00_field() to set bits of bnx->flg1.in_X and bnx->flg2.in_X for the various BINEX 0x00 fields that are being read

2014 Jun 24: improved code layout to changes in all_header_records() on 23 June

2014 Jun 23: correction to all_header_records() to detect user editing of any field in a missing multi-field RINEX obs header lines of OBSERVER / AGENCY, ANT # / TYPE, and/or REC # / TYPE / VERS and output the line(s) (as originally intended) and not issue an error message for the line if any field has been user-specified

2014 May 30: moved the memory assignment of definition of months[ ][ ] from time.c to globals.c and moved the extern definition from several specific functions to externs.h; this did not change the behaviour of the problem of 27 May 2014 on Solaris x86 5.01 when month[ ] and dayname[ ] in rinex_string_to_date() are reduced to 10 bytes each

2014 May 28: logic changes in Ashtech_BEN_constellation(), Ashtech_BEN_obs(), Ashtech_MBN_constellation(), and Ashtech_MBN_obs() to better deal with invalid SV ids which are supposed to be GPS PRNs or GLONASS slot numbers (note: the same general improvements really should be done to the other seven Ashtech *_constellation() functions and all associated *_obs() functions)

2014 May 27: increased the size of the two buffer strings, month[ ] and dayname[ ] in rinex_string_to_date() to 12 bytes each (up from 10 and 9, respectively) in order to fix Solaris x86 5.10 inability to correctly sscanf() a string like "%02hu-%3s-%04hu" (a real mystery as to why the original code stopped working on this compilation); also a few cosmetic changes to rinex_string_to_date()

addition of some warning and error message text in a few functions when reading Ashtech stream format and missing PBEN or MBEN records occurs

2014 Apr 21: updated IGS receiver/antenna designations up through 16 Apr 2014 entry

2014 Apr 1: added recognition and skipping of Topcon message [rS] in next_Topcon_Javad_record()

2014 Mar 31: updated IGS receiver/antenna designations up through 21 Mar 2014 entry

2014 Jan 16: added missing initial value to ok boolean in Trimble_21_55h_1_ephemeris() needed for call to new ToE_ToW_bounds_ok() (see 6 Jan 2014 entry)

added call to epoch_date() in ToE_ToW_bounds_ok() to update the ToW data stamp after resetting the ToW value for an offset week

2014 Jan 6: call to ephemeris_times_make_sense() in nav_filtering() changed so that the ToW adjust argument is back to FALSE (necessary, e.g., for reading Ashtech R- and B-file data with ephemerides from previous week)

split off ToW adjustment in ephemeris_times_make_sense() to new boolean function, ToE_ToW_bounds_ok()

ToE_ToW_bounds_ok() also added to Trimble_21_55h_1_ephemeris() after correct_ToW() is called (note: this corrects all the problem Trimble .tgd cases identified by NGS/CORS, but moving the call to ToE_ToW_bounds_ok() at the end of correct_ToW() might be considered for all formats)

2014 Jan 2: call to ephemeris_times_make_sense() in nav_filtering() changed so that the ToW adjustment argument is TRUE

2013 Dec 30: for reading of Ashtech BESD filesets, the order of reading the E-file (containing the ephemerides) has been changed so that if qc mode is not being used (which is the normal situation), then the E-file is not read until after reading the B-file in Ashtech() so that the default observation can be determined from the B-file epochs for filtering out older ephemerides (depending on the value of the ToE lookback; see -ToE_dt option)

latest in the battle to determine the correct initial GPS week in Trimble .tgd files given the variety of issues that have been observed (ephemerides from the previous or even earlier weeks, incorrect week values in one or more ephemerides, incorrect week value in initial record 27): extra logic added to decompose_Trimble_27_57h_6() for the first read record 27 (or 0x57-6) and the GPS week has been set so that if the set GPS week is one less than that in the initial record 27, then the set GPS week value is set to the value in this record — thus if the GPS week is being set by the presence of numerous ephemerides from the previous week for observations that are early in the current week, then this extra logic self-corrects the week value; but if the week value in this initial record is wrong by +1, then the user is now really stuck because using -week will have no effect in correcting the week value for the data

2013 Dec 11: some code cleanup for compiling with Borland on Windows and K&C on HPUX

2013 Dec 10: change of the coarse SBF message ID filter in next_SeptentrioBF_record() to continue with IDs 4000-4081 (previously had been 4000-4032)

addition of case in nav_processing() to call SeptentrioBF_4081_ephemeris()

default ToE lookback increased to 140 minutes to allow any GLONASS navigation messages that might be 2h15h prior to the start of data at 0 or 30 minutes of any hour (note: has been 120 minutes since 17 Feb 2009; still changeable with -ToE_dt)

addition of call to Trimble_week_check() in SBAS case of Trimble_28_55h_ephemeris() (which had accidentally been left out in June 2013)

small change to the logic of Trimble_week_check() to not validate a week value going backward (e.g it could be from a navigation message late in the previous week with data early in the current week)

change in qc_satellite_obs_update(): requirement of a complete observation for an SBAS SV now only requires L1C/A code pseudorange and phase values (instead of also requiring L5 code pseudorange and phase values for a dual-frequency set of measurement)

2013 Dec 9: after a couple of minor corrections in binex_01_05_ephemeris() and binex_nav_message_01() (for Beidou/Compass case), the reading and writing of BINEX 0x01-05 for Beidou/Compass navigation messages now looks aok

tried to make next_Topcon_Javad_record() a little better at detecting when Javad JPS is being read (from detection of new GNSS messages) and setting file_format if the input format has not been specified so that the correct case in A_sys() and K_sys() are used

2013 Dec 6: the Beidou/Compass value in A_sys() for Javad JPS needed to be change to 0.105 (according to the latest GREIS, 10 Oct 2013)

tested reading of Javad JPS [CN] — times are in Beidou time

new URAi(): the reverse of URA(); outputs the most likely user range accuracy index from the user range accuracy; currently, only completed and needed for Beidou/Compass as needed for outputting Beidou/Compass ephemeris for BINEX 0x01-05

2013 Dec 5: added detection and reading of Javad JPS [CN] (Beidou/Compass ephemeris) and decoding with new decompose_Javad_CN() and Javad_CN_ephemeris() — needs testing, and also not clear from Javad GREIS on [CN] whether the times are in Beidou time or GPS time

2013 Nov 25: new SeptentrioBF_SIS_time_stamp() to check validity of ToW and week values (SIS time stamp) in various SBF messages and put into all SBF functions needing this check

binex_01_05_ephemeris() for reading BINEX 0x01-05 — Beidou/Compass ephemeris; needs test data

added case in binex_nav_message_01() for writing BINEX 0x01-05 — Beidou/Compass ephemeris; needs testing and component to convert URA back to URA index

2013 Nov 24: de-provincialization of adjust_week() from a purely GPS week function to also deal with the Beidou/Compass BDT week system

2013 Nov 22: new BDT_nav_adjust() to convert Beidou/Compass navigation ephemeris times from BDT to GPST or from GPST to BDT, depending on how it's called, so that internally navigation times can be in GPST (qc, for example) but output to RINEX or BINEX will be in BDT as per specification

convert_ToW() refactored from earlier convert_GPS_nav_times() and generalized so that it would apply to the ToW of GPS, Galileo, Beidou/Compass, or QZSS nav message depending on how it is called, i.e. same rules apply for the ToW for each of these in RINEX specification (note: the earlier convert_GPS_nav_times() was hardwired to deal with the GPS navigation message ToW and would not be doing the ToW of Galileo, Beidou/Compass, or QZSS navigation messages even when that was the context)

2013 Nov 21: extra condition added to ephemeris_times_make_sense(), currently only for Leica formats: because Leica does not supply a ToW value for ephemerides, the last observation time (if any) is used as a proxy for the ToW (floored to 30-sec granularity); however, if the last observation time is late in the week and the receiver happens to log a ephemeris where the ToE/ToC is in the next week then the proxy ToW needs to be decreased by 604800 seconds

stubbed out SeptentrioBF_4081_ephemeris() to read SBF beta 4081 message block for decoded Beidou/Compass navigation message, but needs to be tested

2013 Nov 14: hopefully, the final correct interpretation for the navigation data source field for the decoded Galileo navigation message from Trimble .dat/.tgd record 28-4 and stream 0x55-11 in Trimble_28_55h_ephemeris()

2013 Nov 13: defuzzing of new GNSS qc code (e.g. eliminating unused variables)

creating 'compact3' plot files during qc is now not the default, i.e. -plot is the default; in other words +plot needs to be used in order to create 'compact3' plot files when +qc is used

2013 Nov 12: completed second pass of refactoring functions in qc_obs.c and qc_out.c for new GNSS qc; reset minimum 0-9 snr flag for good SNR from 0 to 4, i.e. if SNR in dBHz and using the Estey/Gurtner scaling of min(max(int(SNR/6), 0), 9) then 4 is equivalent to 24 dBHz

2013 Nov 5: added some logic to reduce stderr chatter reporting unknown record types when parsing Trimble .dat/.tgd and parsing of the records gets out of step with actual record identification

2013 Nov 1: refactoring of qc SNR observable data structures for qc and associated changes in qc_satellite_obs_update(), snr_data(), sn_histogram_bins(), and store_compact_snr_plots() for function calls parallel to the other qc observable data structures (i.e. ion, iod, multipath, pseudorange - phase)

call to initialize_systems() moved from inside initialize() (done before the command-line arguments are processed) to immediately after all command-line arguments are processed because increasing the number of SVs in a system by command-line argument was not being done in the earlier location of of initialize_systems() sometimes leading to a segmentation/memory fault

2013 Oct 31: some refactoring of observable combinations and function calls in qc_satellite_obs_update() (ion_obs(), mp_obs(), pl_obs()); also now explicit restriction of use of -mp_CA_AS rms change to only GPS L1 and L2 observables

2013 Oct 30: test builds of teqc for the Raspberry Pi using gcc 4.6.3-14+rpi1, both statically and dynamically linked (note: the main issue was to include the gcc compiler option '-fsigned-char' because for some reason the default 'char' in this compiler is unsigned)

2013 Oct 29: some minor bugs on the reports of the new GNSS qc spotted and fixed

2013 Oct 28: have the majority of the new GNSS qc roughed out, including the new 'compact3' plot files which create only the ones needed depending on the GNSS data being qc-ed

2013 Oct 25: for Javad JPS and Topcon TPS, spew_Topcon_TPS_epoch() was changed so that a backwards change in consecutive epoch times from [~~] messages without an associated [RD] message now only increments the day if the change in time of the day is greater than half a day

2013 Oct 18: for generalized GNSS qc, more work on qc_satellite_obs_update() and all functions for "COMPACT" plot files

2013 Oct 17: Trimble_27_57h_6_obs(): clarification from Trimble on the range overflow bits, if present, are now codified

for generalized GNSS qc, more work on qc_satellite_obs_update()

2013 Oct 16: for better or worse, this was the real push to include the full qc of L1/L6, L1/L7, and L1/L8 combinations for Galileo (for E6, E5b, and E5a+b), Beidou/Compass (for B3/E6 and B2/E5b), QZSS (LEX), and GLONASS (G3); addition of data slip indicators '6', '7', '8', 'Q', 'T', and 'S'; tested on GPS+GLONASS+SBAS+Galileo+Beidou/Compass+QZSS Trimble NetR9 data collected near Perth, Australia

2013 Oct 15: initial expansion of qc parameters to include L6/C6, L7/C7, and L8/C8; addition of data indicators 'n' and 'r' to indicate 'L1 C1 L7 C7' and 'L1 C1 C7', respectively (e.g. mainly for Beidou/Compass data of B1/E2 and B2/E5b, but might also show up for Galileo E5b or QZSS L1C); tested on GPS+GLONASS+SBAS+Galileo+Beidou/Compass+QZSS Trimble NetR9 data collected near Perth, Australia

2013 Oct 11: updated IGS receiver/antenna designations up through 10 Oct 2013 entry

2013 Oct 10: modification to Compass_SV_geocentric_position() for the GEO SVs (i.e. first cut of the function was only for MEO and IGSO navigation messages)

2013 Oct 7: total revamp of set_data_indicator(); the new methodology should make it much easier to reliably add new ASCII time plot data indicators for observation combinations involving Galileo E5b, E5a+b, and/or E6 and Beidou/Compass B2/E5b and/or B3/E6

2013 Oct 4: discovered and fixed missing logic case in revamped set_data_indicator() (see 4-11 Mar 2013 entry): indicator for L1+P1+L2+P2 not being checked for when there was L5+C5 data

2013 Oct 3: definition and handling of Septentrio SBF messages 4021, 4047, 4066, 4067, and 4068 (raw navigation messages for SBAS L5, Beidou/Compass B1I, QZSS L1CA, QZSS L2C, and QZSS L5, respectively) in next_SeptentrioBF_record() and decompose_SeptentrioBF_4017_et_al(); definition of Septentrio SBF 4032 (Galileo GST-GPS time) but being skipped for now in next_SeptentrioBF_record()

2013 Sep 27: moved setting of SBAS health bit 5 (used to be bit 4) when the SBAS URA index is 15 to URA() and adjusted logic in Trimble_28_55h_ephemeris(), Topcon_WE_ephemeris(), and SeptentrioBF_5896_ephemeris()

cleanup and correction of several parts of reading Trimble .dat record 28 or stream 0x55 for decoded navigation messages of SBAS, Galileo, and Beidou/Compass in Trimble_28_55h_ephemeris()

2013 Sep 26: addition to rinex_comment(): added a test to eliminate earlier RINEX obs comments from teqc concerning time windowing when the input is RINEX obs and any new time windowing option is being used

2013 Sep 25: correction to rinex_comment(): added test for non-null comment structure before checking to eliminate duplicate comment lines in following post-header comments in a RINEX obs file

2013 Sep 16: additional code extension for Beidou/Compass in qc_auto_find_nav_files(), ephemeris_file_location(), qc_satellite_nav_update(), qc_satellite_orbit(), path_estimate(), and find_path_fit()

2013 Sep 11: renaming of decompose_Trimble_28_55h_9() to decompose_Trimble_28_55h() and Trimble_28_55h_9_ephemeris() to Trimble_28_55h_ephemeris() because they handle (or will handle) more than just the Trimble stream 0x55 subtype 9 (GLONASS) navigation message

URA() now returns a value of -1 for index values that are undefined/unknown/out-of-range (previously, a value of 32767 had been returned in order to be consistent with the original Bernese translators of Werner Gurtner)

split off part of obs_filtering() to be new special_RINEX_cases(), now called by obs_filtering() and nav_filtering(), to control what may or may not be created officially as RINEX without using +relax — but this really needs to have two independent sets of filtering masks, i.e. one for GNSS observations and one for GNSS nav messages

have now filled in all (or most) stubs to read Trimble .dat record 28 subtype 11 for Beidou/Compass navigation messages and create a Beidou/Compass pseudo-RINEX nav file (i.e. left in GPS time frame for now rather than converting to Beidou/Compass time frame)

new Compass_SV_geocentric_position() to use the parameters in the Beidou/Compass pseudo-RINEX nav file; now being called by output_orbits() and find_position() — ready for some qc testing ...

2013 Sep 10: collapse of GPS_URA() and Galileo_SISA() into generalize URA() and added case for Beidou/Compass URA

correction (reversal) of extraction of Galileo af0 and af2 in Trimble_28_55h_9_ephemeris() from Trimble record 28 subtype 4 or stream 0x55 subtype 11

2013 Aug 30: change in binex_7f_03_obs_setting() to set the meter-to-cycle L1 and L2 conversions for each GLONASS slot number to zero until the slot-to-frequency channel number is confirmed to be known — this change eliminates rare settings of the meter-to-cycle L1 or L2 value to NaN (and then the GLONASS L1 or L2 phase value in RINEX to NaN) that was being seen with reading of BINEX 0x7f-03 from some Javad receivers (e.g. known to sometimes occur in BINEX from fw 3.5.1 and 3.5.2)

2013 Aug 26: correction of unit label in qc_long_report() for 'Multipath slip sigma threshold': this is just a number (of sigmas), not centimeters

addition of identification of Javad JPS [lD] message (raw GLONASS navigation bits, analogous to Topcon TPS [LD] message)

2013 Aug 22: updated IGS receiver/antenna designations up through 22 Aug 2013 entry

2013 Aug 13: added tests for quietly detecting Javad JPS with the following new Beidou/Compass messages: [cp], [CA], [CI], [CN], [CO], and [CU] (currently all are ignored)

2013 Aug 8: increasing allowed SBAS upper PRN to 142 in Topcon_SI_NN_validation(), Topcon_TPS_constellation(), Topcon_TPS_rM_constellation(), Topcon_TPS_rM_obs() for reading Javad JPS or Topcon TPS; increased default allowed number of SBAS in SVs_in_system[ ] from 19 to 23

2013 Jul 29: updated IGS receiver/antenna designations up through 24 Jul 2013 entry

2013 Jul 24: a few minor code cleanups so that Borland would compile cleanly (e.g. removing two test variables, adding a return in one function, etc.)

2013 Jun 28: new height sanity check in dump_metadata(), used with +meta option (see also 17 Jun 2013 entry)

2013 Jun 27: currently for the new experimental +dep option, a reference point was added as an extension of the obs struct which is now populated via the new reference_position() function, which is called after obtaining a position from Trimble records 10, 11, 29, 5.0, or 5.3 or via the user options or -O.px; the calls to reference_position() are done in the respective parsing functions and the call to reference_position() when using or -O.px is done in main() after parsing all the command options; the hierarchy for precedence of which position is finally used as reference is set as enum values in enums.h

2013 Jun 25: another small modification to the new Trimble_week_check() so that assigning the GPS week works better with the new .dat/.tgd for when the Trimble .dat/.tgd data is corrupted

2013 Jun 24: implemented another sanity check for parsing of Trimble .dat/.tgd:

  • if good data in a record 7 is discovered, don't accept any apparent record 17 or 27
  • if good data in a record 17 is discovered, don't accept any apparent record 7 or 27
  • if good data in a record 27 is discovered, don't accept any apparent record 7 or 17
a good record is set in decompose_Trimble_0_7(), decompose_Trimble_17_57h_0(), or decompose_Trimble_27_57h_6() and exclusion is done in Trimble_dat(); initial success with problematic .tgd hourly data from one site in a VRSNet; needs more testing ...

modified the new Trimble_week_check(); also requires possible reset of the nav.last_GPS_week value as set in adjust_week() if Trimble_week_check() returns FALSE after calling adjust_week(); tested on Trimble NetR9 .tgd with old GPS nav message and a GLONASS nav message with a bogus week value (well in the future from the actual data)

2013 Jun 19: had to deactivate the new code using nominal_sampling_interval() (see 14 Jun 2013 entry) because this does not yet correctly handle data gaps (i.e. missing epochs) during qc

introduction of a new non-optimal binary data record condition: UNKNOWN_BINARY_RECORD, which will be used in parsing Trimble .dat/.tgd data in certain return cases where previously SKIP_BINARY_RECORD was used; new code to set this in next_Trimble_dat_record() (unknown record ID) and decompose_Trimble_16() (unknown subtype ID), and new code to deal with this state at the end of next_Trimble_dat_record()

2013 Jun 17: new longitude range sanity check in dump_metadata(), used with +meta option: longitude values being read from some Trimble .tgd files are numerical junk (more bit errors?), so the code to reset the longitude bounds between -pi and +pi radians now has a limit as to how far off the longitude can be

attempt to deal with bogus GPS week values in Trimble .dat/.tgd data with new Trimble_week_check(), but not yet working as desired; needs more thought ...

2013 Jun 14: new nominal_sampling_interval() and new logic using it in obs_epoch_check() — to hopefully reduce the number of non-canonical sample intervals being reported using +meta from Trimble Net* receivers due to non-canonical sampling (e.g. 0.199 to 0.201 and 0.196 to 0.204 seconds for 5-Hz, 0.990 to 0.010 seconds for 1-Hz); needs more testing ...

2013 Jun 7: [National Donut Day! Rejoice!] removed special case logic for Ashtech firmware 1F50 in Ashtech_rx_specifics() (see 15 Mar 2007 entry); apparently, the cases examined in late 2007 and early 2007 were R-files from site VNDP using record 23 (which by design does not have receiver clock offset information to help adjust phase and code pseudorange measurements at millisecond clock resets) where the receiver was being steered; removing the special 1F50 case logic helps improve the translation of B-file data collected with 1F50 (e.g site CORV), consistent with other B-file firmware translations

l1_adj() and l2_adj() modified to use the opposite sign receiver clock offset with +smtt for old Ashtech firmware (condition identified and set in newly modified Ashtech_rx_specifics()), although this should only occur with old Ashtech R-file data using ("ztinytype") record 9 for data

2013 Jun 3: included new option, +rM_0.1dBHz, to add in the N*0.1 dBHz increments from Topcon TPS or Javad TPS [rM] data to the SNR measurements, the case switch being in Topcon_TPS_rM_obs() (see also 2012 Feb 24 entry)

2013 May 31: determined that certain old data cases, e.g. Ashtech Z-12 R-file with record 9 from fw 1D00 or 1E24, require the opposite sign to the phase offset upon receiver millisecond resets to correct the phase values for RINEX in l1_adj() and l2_adj(); not implemented yet because it is not clear what the scope of the exceptions are yet; will examine old Ashtech raw data files with fw starting with '1' for as many fw and format combinations as possible

2013 May 30: new option -RD to override — if absolutely necessary! — the initial [RD] message(s) of Javad JPS or Topcon TPS data with a user-specified date (as year month day); tested on current data from a Javad TRE G2T fw 3.3.12 which had several initial [RD] messages with an incorrect date of 1 Jan 2000 (which was due to a TRE G2T firmware bug in 3.3.12, and later corrected in version 3.4.0)

included "Notice" in Ashtech_rx_specifics() for when Ashtech firmware needing (as far as is known) a reversed phase adjustment upon detection of a receiver millisecond clock offset

2013 May 29: minor correction to valid_day_of_month(): disallow a calendar day value less than 1

2013 May 28: updated IGS receiver/antenna designations up through 28 May 2013 entry

(see 1 May 2013 entry) back to original non-adjustment of nav.satellite.ephemeris.ToW.minutes for both possible decrease or increase of nav.satellite.ephemeris.type.GPS.ToW in correct_GPS_nav_times() (note: the latter does need to be adjusted to make the ToW value in the GPS RINEX representation meet the RINEX specification)

2013 May 23: due to the recent changes for GPS week identification between 26 Apr and 2 May 2013, (at least) certain Topcon TPS files with week-old GPS ephemerides do not give the correct week with the metadata options (e.g. +meta, +mds); a possible fix is to restrict the potential ephermis ToW and potential observation time in ephemeris_times_make_sense() to between 12 and 168 hours before calling possible_wrong_GPS_week() (i.e. the prior test was only used a restriction of more than 12 hours)

no, there can't be any restriction beyond the 12 hour limit test because this definitely causes other common cases to fail where the potential observation weed is based on the current system time (i.e. there is no valid GPS week information for the observation time at this point in reading the data file); so back to square 1 ...

2013 May 22: change to external_data_string() to quietly just ignore empty (possible met) strings with "|0R0|"

rolling back to pre-3 May 2013 logic for next_Trimble_dat_record() for handling Trimble's .dat/.tgd record 33 because the 3 May 2013 code does not work correctly for normal NetR9 fw 4.70 data from PBO; however, added some additional safety logic (static flag set in next_Trimble_dat_record() for code in Trimble_dat()) to skip any byte combinations which could be interpreted as .dat record 0 or 7 after a record 33 has been encountered

2013 May 21: correction (or better consistency) to ToC_in_window() to temporarily adjust the window end time by the ToE allowance (default currently = 120 minutes); the code up to this point was only temporarily adjusting the window start time and therefore would reject any emphemeris with a ToC later than the window end time — though the ephemeris rejection really could only occur when setting an explicit window end time with -e or -st with +dX

2013 May 14: change in qc_end_mp() so that the total average multipath rms requires that each SV included have a non-zero multipath rms; this eliminates any GLONASS SV that might be present with no slot-to-fcn mapping and thus have a zero multipath rms (note: there is probably a better way to do this, but this was an easy solution)

2013 May 13: correction to qc_sv_line() for code changes of 4,13 Mar 2013: initialization of the maximum table value to NO_INDICATOR when doing the initial run (i.e. when binary_image is true) (note: without the initialization, the maximum is undefined and may result in a blank line showing up)

2013 May 3: introduced new flag in the qc_SV struct, nav_status, to help detect an SV which has no valid navigation message (see 4,13 Mar 2013 entries), which helps but still having some issue in certain cases

change to next_Trimble_dat_record() for handling Trimble's .dat/.tgd record 33: treat record 33 as a unknown record type and silently move on (i.e. no reliable record length or other content)

2013 May 2: addition of another special condition in the new week_rollover_check() for initial met data which is close to end of the GPS week but there has not been any GNSS observation data and the specified GPS week is for the observation data which is in the week after this initial met data; the current code allows the met data to be 15 minutes prior to the end of the GPS week

2013 May 1: correction to correct_GPS_nav_times(): if the GPS ToW needs to be reset to the previous week by reducing the value by 604800 (seconds), then nav.satellite.ephemeris.ToW.minutes also needs to be reduced by 10080 (minutes)

algorithm extension to correct_GPS_nav_times() (probably rarely needed): if the ToW is early in the week and the ToE and ToC are late in the week, then the GPS ToW is reset to be in the the following week by increasing the value by 604800 (seconds) and nav.satellite.ephemeris.ToW.minutes is increased by 10080 (minutes); this allows the receiver to download and store an ephemeris which is up two days old and be handled correctly near the week rollover

2013 Apr 29: change to first if() test in GPS_week_check(): the test is now not performed if the GPS week is being set with +week

decompose_Leica_MDB_82(): no resetting of the GPS week using Leica MDB record 130 internal week value if the GPS week is being set with +week

new week rollover handling (26 Apr 2013) tested on various GPS week rollover situations and no problems discovered so far (even testing Aug 2003 Leica LB2 data) after Leica MDB record 130 correction was made

removal of remaining (now obsolete) for Leica LB2 translation

2013 Apr 26: updated IGS receiver/antenna designations up through 26 Apr 2013 entry

latest attempt to overhaul GPS week rollover (both increment and decrement) issues with GNSS observation times, met times, and event times: new week_rollover_check() and week_adjust() to replace the previous majority of the logic guts of obs_epoch_no_gps_week(), met_epoch_no_gps_week(), and event_epoch_no_gps_week() (expect for special mystery logic in obs_epoch_no_gps_week() and event_epoch_no_gps_week() for Leica LB2 format — which has not yet been reintegrated); new "last" time array and initialization of this array in init_last_times(); tested with GNSS obs and met data with week rollovers and looking for event test cases

refactoring of event code, including modifying the event struct used in the observation struct and the call to rinex_out_event(), return in rinex_out_event() if the RINEX obs header has not been output yet, and test for presence of event info to output with rinex_out_event() after rinex_out_end_of_header() in obs_out_start_end() to capture any event info prior to the first observation epoch

2013 Apr 24: the exit() calls in initialize_GLONASS_orbit_interpolation(), compute_GLONASS_orbit_trig_interpolation_coefficients(), and interp_GLONASS_SV_orbit_position_from_coefficients() were either replaced by a call to terminate() or removed altogether removed if the exit involved a call to allocate() (which has its own call to terminate())

in get_next_rinex_line(), reduced by 1 the length of the loop of checking each RINEX line with +relax when looking for non-printable ASCII characters (the original code would reach the C string termination of 0x00 = null character and incorrectly report a warning of a non-printable ASCII character being present)

also in get_next_rinex_line(), added a test for +relax to make sure that the last non-null character read from the RINEX line is a newline; otherwise read one character of input at a time until a newline is found or the end of file occurs (note: without this, using +meta and +relax on what should be RINEX input with a line with spaces beyond the 82 character would result in an infinite loop while reading)

2013 Apr 23: initialize_GLONASS_orbit_interpolation() corrected to handle rare case of more than nine sequential GLONASS ephemerides for one SV with an ordering which gave an error message like "R5 has ephem index range backwards" (previous code also could result in segmentation fault when this case arose) (SW)

2013 Apr 17: alpha version of new +dep option (== "dump embedded positions") with Trimble .tgd record 29 and stream 0x57-7; in testing ...

located remaining rogue conversion of degrees to radians and radians to degrees and changed to using the long-time global variables deg_to_rad and rad_to_deg respectively (the few remaining cases were mainly in debugging print lines)

2013 Apr 12: the in-line functions created for GNSS observable index assignment created for reading BINEX in mid-Apr 2012 were also used in binex_7e_00_met() — where they should not have been — resulting in teqc versions since mid-Apr 2012 not being able to correctly read ancillary (e.g. met data) from BINEX 0x7e records; new in-line functions were created for met observables and now used in binex_7e_00_met()

2013 Mar 18: addition of a test and GPS week reset after the call to unequal_ToE_ToC() in ephemeris_times_make_sense() for GPS, Galileo, and QZSS nav messages: Trimble NetR9 firmware 4.70 still has the problem where (infrequently and at random) low order bits of the GPS week are flipped or at least wrong and can give rise to an ephemeris which is after the majority of the other navigation messages, which could lead to an erroneous +meta or +mds result; hopefully this code change eliminates most of cases of this

2013 Mar 15

2013 Mar 15: some more preprocessor flag cleanup (various *.[ch] files)

removal of all memory cleanup in terminate() for all builds

2013 Mar 14: some preprocessor flag cleanup (various *.[ch] files)

added input filename to Notice message (when ToE is outside of the expected window) in ToE_in_window()

added restriction in constellation_total() to message when there might be a problem to not output the message when extracting metadata or using the +v[erify] or +rx_state options; input filename also now included in the message

2013 Mar 13: needed to add new data structure in typedef struct qc_info, (sint1*)obs_table_max, and associated changes in initialization and allocation, plus a change to the function call of qc_sv_line() and the new logic of that function added 4 Mar 2013 so that the maximum of each SV line of the ASCII time plot is persistent and the SV line is written to the qc summary file when needed (i.e. the test to return is not true)

2013 Mar 11: set_data_indicator() refactored a bit more to make sure there is a default in each switch, and many earlier switches were found to be unnecessary because this function is not called unless there is L1 phase data and either C1 or P1 pseudorange data

minor change in check_qc() so that if the horizon coelevation is less than the mask coelevation (i.e. horizon is above the mask), then the horizon coelevation is now set to be the mask coelevation (rather than swapping the two values as has been the case previously); this eliminates the need to use the -set_horizon option to set the horizon value when the -set_mask is being used to set a mask below the default horizon value of 0 degrees

2013 Mar 7: all remaining if/else logic in set_data_indicator() replaced by equivalent but simplier (and faster) switch/case logic which should be easier to maintain in the future

2013 Mar 6: special definition of sintp in types.h for Mingw64 and slight recrafting of the if statement in extract_root() to allow clean compiling of this function with Mingw64

updated IGS receiver/antenna designations up through 5 Mar 2013 entry

2013 Mar 4: enhancement to qc to correctly identify the GLONASS tracking case of only L1SA, L1HA, and L2SA (i.e no tracking of L2HA) in the ASCII time plot; associated changes in code_data() and set_data_indicator(), plus the various needed #define quantities

associated remove of new option +L2SA_L2 (see entry for 1 Mar 2013)

generalization of the ++sym SV indicator short descriptions to make them less GPS-centric

a simple modification to qc_sv_line() to not output a line for an SV if the qc has found a position and there's navigation information for the SV but the line contains no indicators for the SV

2013 Mar 1: added new option +L2SA_L2 for GLONASS — analogous to +L2C_L2, although the latter is now GPS-only (these options now separate the L2 functionality of GPS and GLONASS); related code modifications for reading GLONASS in BINEX 0x7f-05, Leica MDB record 119 (0x77), Septentrio Binary Format message 4027 and 5944, pertinent Topcon TPS and Javad JPS messages, Trimble .tgd record 27 and stream 0x57-6, and Ashtech B-file w/ "capability" 8

2013 Feb 27: new missing_GLONASS_fcn() to consistently report missing frequency channel number for a specific GLONASS SV, now used in binex_7f_05_obs(), frequency(), GLONASS_slot_2_fcn(), and obs_eliminated()

2013 Feb 26: addition to binex_7f_05_obs() to report missing fcn for any GLONASS SV with an unknown fcn (thus preventing conversion of GLONASS phase to units of cycles for RINEX)

2013 Feb 22: yesterday's correction to obs_data() restricted even more: now also only applies to event flags 2-5, and output must be RINEX, and qc not in effect

2013 Feb 21: update to Trimble_27_57h_6_obs() to integrate reading of .tgd record 27 with stream 0x57 subtype 6; testing on various NetR9 firmware files, including 4.70

correction in obs_data() to only set the observation epoch to the session start time on a non-dated metadata block which is after a RINEX obs header end but before the first data epoch when a RINEX obs header has been started on output

2013 Feb 20: change to ublox_UBX_rxm_raw_obs() that only bit 0 of the LLI bit in the UBX RXM-RAW message is used (and hopefully this does indeed indicate a possible loss-of-lock as suggested by the comment in the RXM-RAW documentation)

update to Trimble_27_57h_6_obs() based on improved understanding of Trimble's documentation of 0x57 subtype 6; now works for stream data for both NetR9 and BD960

update to Trimble_27_57h_6_obs() to include use of the new optional 1-byte range differential overflow

2013 Feb 13: update to Trimble_27_57h_6_signal_map() removing SV type = 6 as designating Beidou/Compass (consistent with Trimble 8 Feb 2013 documentation)

added 0x55 subtype 13 to be quietly ignored in next_Trimble_BSTR_record() (seen in NetR9 stream, but not in Trimble 8 Feb 2013 documentation)

relocated setting of max SVs to 32 and to be for both Trimble .dat record 27 and 0x57-6 in decompose_Trimble_27_57h_6() (instead of just for 0x57-6)

2013 Feb 12: update to next_Trimble_BSTR_record() to account for all known but not currently decoded Trimble 0x57 subtype records (e.g. mostly non-GPS navigation messages) using 8 Feb 2013 documentation from Trimble

2013 Feb 4: modification to Ashtech_SNV_ephemeris() for SBAS nav unpacking so that the time of day is extracted and adjust_SBAS_ToW_ToC() is now used to set the ToW value using the time of day and the stored ToW

2013 Feb 1: correction to logic in setting the ToW of SBAS nav messages: ToW modulo 86400 is now done in adjust_SBAS_ToW_ToC() after a preliminary setting of the full value, rather than prior to the call to adjust_SBAS_ToW_ToC() (as had been done in SeptentrioBF_5896_ephemeris() and Topcon_WE_ephemeris() since adjust_SBAS_ToW_ToC() was introduced 30 July 2008)

2013 Jan 31: added defines for SV offsets for SBF codes

changed SeptentrioBF_SV_map() to use the new defines and to return a boolean, and now used in decompose_SeptentrioBF_4017_et_al(), SeptentrioBF_4027_5889_5890_5944_constellation(), and SeptentrioBF_4027_5944_obs(); also generalized logic of SeptentrioBF_SV_map() to include the maximum SV ids (that can be set by users) but not exceed the values allowed in SBF

changed decompose_SeptentrioBF_4002(), decompose_SeptentrioBF_4004(), decompose_SeptentrioBF_5891(), decompose_SeptentrioBF_5896(), and SeptentrioBF_4027_5944_obs() to also use the new defines

2013 Jan 30: rewrite of the switches in decompose_Trimble_28_55h_9() to seperate the subtypes in .tgd record 28 and 0x55-9 (which could have the same value for different purposes) and to more easily allow addition of new constellation ephemeris types in the future in either record 28 or 0x55-9

Trimble_27_57h_6_signal_map() extended for GLONASS CDMA G3 signal components (assuming SV id to be used is the same as for GLONASS FDMA)

2013 Jan 29: SeptentrioBF_signal_map() extended for QZSS L1-CA, L2C, and L5; GLONASS G3; and Beidou/Compass B1 and B2 (Beidou/Compass is tentative)

extended allowable SV id values in SeptentrioBF_4027_5944_obs() and SeptentrioBF_SV_map() to allow for QZSS and Beidou/Compass

change to decompose_Trimble_28_55h_9() to allow Trimble stream 0x55-9 to be translated as a GLONASS ephemeris record

2013 Jan 10: new minimum_records_for_event_flag_3() to handle cases where the minimum header records (e.g. MARKER NAME) for RINEX obs file event flag = 3

correction to boolean filter construction in filter_system_in_nav() so that the test would be correct when using the negative SV filter options with SV values greater than 8, e.g. -G9 (only pertinent for filtering out SV navigation messages)

2013 Jan 9: change to +kphc code in flush_bs_buffer() so that event flags 2, 3, and 5 are also correctly handled

2013 Jan 8: mods to rinex_mid_header_start(), obs_out_data(), and flush_bs_buffer() for the +kphc option

2012 Dec 18: updated IGS receiver/antenna designations up through 12 Dec 2012 entry

2012 Dec 13: the calls to raw_GPS_health() in both Trimble_21_55h_1_ephemeris() and Trimble_28_55h_9_ephemeris() (for reading .dat records 21 and 28 and the stream records 0x55-1 and 0x55-9) were corrected to account for the fact that the two MSB of the GPS SV health bits were not in the lowest byte of Trimble's flags

2012 Nov 26: useage() was updated to correct a couple of typos for the options +C2 and -C2 and to include a usage note for them

2012 Nov 20: updated IGS receiver/antenna designations up through 19 Nov 2012 entry

2012 Nov 19: added 'T' and 't' to the list of possible separators in remove_separators() (note mainly for the -st and -e options, and no conflict where this is used elsewhere)

2012 Nov 7: updated extract_Trimble_ant_type() to id Trimble's Zephyr Geodetic 2 RoHS chokering antenna, TRM57971.00 without any radome, as antenna code 'GE'

2012 Oct 31: updated IGS receiver/antenna designations up through 30 Oct 2012 entry

2012 Oct 25: put the functional body of obs_out_start_end() in a switch/case wrapper requiring obs.basic.rinex.out_X & RINEX_HEADER_START to be set (doing this eliminates the odd case where there are no epochs to be output and this tail-end of a RINEX header should then not be output)

a real piece of experimental code: added a reset of obs.basic.mod_dec->rx_clock_reset.first_msec at the end of the first pass block in obs_epoch_check() when decimation (i.e. -O.dec) is used to try to detect and correct a one millisecond offset due to old-style millisecond time jumps in time tags when -st is used to specify a start time after the first epoch and before the first time tag with a millisecond offset

2012 Oct 24: addition of a call in format_initialization(), which is called in filename_loop(), to binex_00_alloc() which does a reset any non-null BINEX metadata when +meta is used with multiple BINEX files as input

2012 Oct 19: added switch to the condition added in obs_out() on 18 Apr 2012 (to return when there were no SVs in the epoch) which is now limited to cases where the RINEX epoch flag has a value of 0, 1, or 6

2012 Oct 18: added logic to qc_nav_files() to ignore a filename of '-' (minus sign) or '_' (underscore), needed to skip those placeholders instead of RINEX filenames in the -nav option

2012 Oct 17: update of Trimble_27_57h_6_signal_map() to make it consistent with the other updates made on 13 Sept 2012 (see below) for reading Trimble RT27

2012 Sep 28: added a test in decompose_binex_00() to require that the BINEX 0x00 field 0x0f (= 4-char code ID for the site) is made up of the expected ASCII characters, i.e. numbers, lower- or upper-case letter, and underscore (note: this might have to become a separate function to check 4chIDs elsewhere)

2012 Sep 27: better solution for GLONASS Bn health bit problem of 2012 Sep 25 is to change the ephemeris data structure to explicitly have a location for Bn, Cn and whether Cn is valid; therefore the filter in nav_out_data() is no longer needed and now explicitly writes only Bn for the GLONASS RINEX nav message, but this also required going back to all the formats handling GLONASS ephemerides, checking the format documentations, and making the necessary changes:

    Ashtech (Ashtech_SNV_ephemeris() and Ashtech_SNG_ephemeris())
    BINEX (binex_01_02_ephemeris() and binex_nav_message_01())
    Leica (Leica_GLONASS_nav())
    RINEX (rinex_nav_GLONASS())
    Septentrio (SeptentrioBF_4004_ephemeris())
    Topcon and Javad (Topcon_NE_ephemeris())
    Trimble (Trimble_28_55h_9_ephemeris())

cleanup of binex_01_01_ephemeris() (i.e. now GPS-only, as per current BINEX 0x01-01 specification)

added extraction of GLONASS L1/L2 group delay in Leica_GLONASS_nav() and binex_01_02_ephemeris()

added extraction of leap seconds in binex_01_02_ephemeris()

overhaul of the reading of BINEX SBAS ephemeris 0x01-03 in binex_01_03_ephemeris()

overhaul of the writing of BINEX GLONASS ephemeris 0x01-02 and SBAS ephemeris 0x01-03 in binex_nav_message_01()

2012 Sep 26: better solution for decimation problem of 2012 Sep 25 is to keep obs_epoch_check() as it was, and change the tolerance in dec_fmod() to be 1.2e-7 == 1/2^23, where 23 is the number of mantissa bits in a 4-byte IEEE 754 float

2012 Sep 25: small filter added to nav_out_data() to limit GLONASS health for RINEX nav to Bn bit (note: although klunky, this looks like the best location for the filter)

addition of a small test and occasional reset of the dec_fmod_value variable in obs_epoch_check(), which is needed when using both -st and -O.dec on 64-bit architectures in certain cases (note: oddly enough, the test and occasional reset of dec_fmod_value does not appear to be needed on 32-bit architectures)

2012 Sep 19: change to extract_2cNb() to allow for "invalid/unknown" setting (as requested by Trimble); corresponding change in binex_7f_05_obs() when reading the the receiver clock offset in BINEX 0x7f-05 (note: no code changes needed elsewhere where the function was used)

2012 Sep 13: update/correction of SV constellation assignment in Trimble RT27 parsing in Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() (changes previous interpretation of Beidou-2/Compass and GIOVE SVs)

2012 Aug 30: changed assignment of GLONASS tk (seconds of day) to use new UTC_SU_to_tk() in Ashtech_SNV_ephemeris(), Ashtech_SNG_ephemeris(), Leica_GLONASS_nav(), Topcon_NE_ephemeris(), and Trimble_28_55h_9_ephemeris(); no change in SeptentrioBF_4004_ephemeris() because here the tk value is derived from the ToW which is in GPS time (not UTC(SU)); also there is now no alteration of the tk value in binex_01_02_ephemeris() (reading of BINEX 0x01-02 GLONASS nav message) because tk is assumed to be in the same unit as in RINEX GLONASS nav message by definition

2012 Aug 21: updated IGS receiver/antenna designations up through 20 Aug 2012 entry

2012 July 9: oops: change to the limit test in decompose_Topcon_SI() to allow up to 96 SVs in[ ]; the data structure had been changed some time ago to allow this many SVs; this limit is now set by the define TOPCON_SI_LIMIT in teqc.h

correction to SeptentrioBF_4004_ephemeris(): compute_GLONASS_fcn_constants() was being called with the wrong argument for the GLONASS slot number which would sometimes lead to a segmentation fault later in some other function

improved test in compute_GLONASS_fcn_constants() for out-of-range GLONASS slot number using bad_SV_number()

2012 July 6: changes to accept RINEX nav for GPS and GLONASS labeled as 2.11 (as per pending 2.11 specification): addition of LAST_RINEX_GPS_NAV_VERSION and LAST_RINEX_GLONASS_NAV_VERSION in defines.h and both set to 2.10, setting of CURR_RINEX_GPS_NAV_VERSION and CURR_RINEX_GLONASS_NAV_VERSION in defines.h to 2.11, use of the LAST_RINEX_* in binary_NAV() and rinex_out_version_type(), and a little logic tweaking in rinex_version_type() in the test for calling rinex_comment()

2012 June 28: corrections to obs_out_summary(), obs_out_data(), and qc_landscape_out() to account for offset PRN ids for SBAS using the SV_b_offset[ ] array when using the +svo option

2012 June 27: minor correction to Topcon_cks08(): it was correctly computing the 1-byte checksum for JPS/TPS messages and returning the correct boolean return value, but it was not returning the correct computed checksum value itself to be used in the message for an incorrect checksum when there was a valid checksum mismatch

2012 June 25: extra test added to decompose_Trimble_firmware() so that the old Trimble 4000 series firmware string is only used if the 'np' and the 'sp' fields are different (e.g. NetR9 4.60 firmware is now supplying an identical entry in the 'sp' field to that of the 'np' field)

2012 June 22: added an extra block at the start of met_processing() so that if TBIN_SPECIFIED (i.e. using -tbin option) then a tbin met file is initiated

2012 June 21: expanded the conditional test in is_met_in_00_comment() to include TBIN_SPECIFIED (i.e. using -tbin option) for deciding whether to look for possible met data in BINEX 0x00 comments (e.g. as used by Trimble)

2012 June 20: since ephemeris messages from all constellations are now run through ephemeris_times_make_sense(), this function needed a little tweaking to get it to ignore ToE/ToC differences for GLONASS and SBAS (since these time are implicitly identical for ephemerides for these two constellations) and to exit for any constellation other than GPS or QZSS in the IODE/IODC inequality check switch

2012 June 06

2012 June 5: correction to JPS_signal_map() (a subset of which is also used with Topcon TPS messages) so that the conditional flags for the -CA_L1 and +CA_L1 options are applied to the GPS L1C/A and L1P(Y) messages, i.e without these conditional flags the RINEX L1, S1, and D1 will represent GPS L1P(Y) data (because it occurs after the GPS L1C/A data in an epoch) regardless of the use of these options

2012 June 4: case added to rinex_string_to_date() to read the date field from RINEX generated by Septentrio's sbf2rin (which puts in a pair of parentheses for some reason)

2012 June 1: modified obs_eliminated() to not output a notice when a GLONASS phase value is from an SV with an unknown frequency channel number

correction to K&C function argument declaration in binex_7f_03_obs_setting()

correction to the "else if" clause for GLONASS fcn checking in binex_7f_03_obs_setting() to detect unknown fcn cases (i.e. did not previously test for a null teq.GLONASS pointer, but should have)

added tests for zero "meters-per-cycle" in binex_7f_03_obs() prior to conversion of phase from distance to cycles (needed to avoid division by zero in the case of GLONASS phase value with an unknown fcn value)

2012 May 31: updated extract_Trimble_ant_type() to id Trimble's GNSS-Ti chokering antenna, TRM59900.00, as antenna code 'GH'

2012 May 29: minor cleanup of one of the help items

2012 May 25: same last minute preprocessor flag housekeeping in a couple of files

2012 May 24: corrections to a couple of K&C function argument declarations so that the code with complile with the HP-UX K&C native compiler (i.e. pointer to a variable, rather than the variable, required)

2012 May 22: change to decompose_Topcon_GA() to only use the GPS anti-spoofing bit in TPS/JPS [GA] if the 'config' byte is non-zero (note: this appears to be a firmware bug in at least some Javad firmware, but is generally safe; the a/s bit of [GE] does not have this issue, and checking [GE] is also done anyway)

2012 May 21: update of SV tracking capability of Septentrio receivers in igs_rx_designation[ ][ ], Septentrio_rx_specifics(), and new default upper-limit of 70 for Septentrio receivers in format_settings()

removal of incorrect resetting of GPS anti-spoofing flags in Topcon_EN_ephemeris() and Javad_QE_ephemeris()

removal of check of GPS anti-spoofing flag from the TPS/JPS [GA] GPS almanac message

2012 May 18: addition of GLONASS L3 to frequency() and other minor tweaks

2012 May 17: slight simplification of the Topcon_lli() function call

2012 May 16: satellite system name switch now in Topcon_lli() (instead of being a condition for its call in all locations)

extension of Topcon_TPS_rM_constellation() and Topcon_TPS_rM_obs() for Beidou-2/Compass and QZSS

a bit of code refactoring of good_SV_number() and bad_SV_number()

all code refactoring to account for Beidou-2/Compass and QZSS measurements (and fully account for Galileo/GIOVE measurements) in Javad JPS is done and appears to be working to first order based on a 1-hour JPS file with observations from all six constellations

2012 May 15: changed from a single 4-byte unsigned integer to an array of three 4-byte unsigned integers to handle up to 96 simultaneous GNSS SVs in any one epoch (which should do the trick for a few more months at least ...)

JPS_signal_map() refactored so that it passes back the observable value and index based on type (pseudorange, phase, doppler, or SNR), and return false if either is not set for the particular message, the particular SV, or the particular observable index

extension of Topcon_TPS_constellation() for Beidou-2/Compass and QZSS from Javad JPS

2012 May 14: extra code at end of list2mask() to force the given mask->set_X[ ] array to be the bit flip of the mask->opt_X[ ] array: necessary so that options like +G30 are equivalent to -G1-29,31-32 for RINEX nav filtering in filter_system_in_nav()

extension of decompose_Topcon_nd() (relative doppler messages [1d], [2d], [3d], [5d], and [ld] in Javad JPS) for GLONASS L3, Galileo, Beidou-2/Compass, QZSS, and the future GPS L1C

2012 May 11: all those JPS messages for L1C changed to: [Rl], [rl], [lR], [lr], [Cl], [cl], [Pl], [pl], [lP], [lp], [Dl], [ld], [El], [lE], [Fl]

initial prototype of JPS_signal_map(), planned to be added to all functions for decoding the JPS measurement messages

2012 May 10: initial, untested code extension for Javad JPS L1C messages (e.g. for measurements of QZSS L1C and future GPS III L1C) — [RI], [rI], [IR], [Ir], [CI], [cI], [PI], [pI], [IP], [Ip], [DI], [Id], [EI], [IE], [FI] — related data structures and functions too numerous to list; biggest unknown is mapping of Compass and some Galileo and QZSS signal measurements to which JPS message groups

2012 May 9: additional test for non-null buffer added before call to spew_Topcon_nav_message() in Topcon() (see 4 May 2012 entry)

test for Beidou-2/Compass B1-2/E1 (1589.742 MHz) added to binex_7f_05_signal_map() for reading BINEX 0x7f-05 — just in case any signals on this are ever logged

code extension of Topcon_SI_NN_validation() for identifying QZSS and Beidou-2/Compass SVs from [SI] message of (at least) Javad JPS format

function rc_ref_offset() renamed A_sys() to match current documentation in Javad GREIS documentation and is extended for Galileo, Beidou-2/Compass, and QZSS return values for JPS; new corresponding K_sys() function for JPS; functions decompose_Topcon_rc() (for [rc]), decompose_Topcon_rn() (for [r1], [r2], [r3], [r5], and [rl]), and Topcon_rc() (for converting C/A pseudorange from [rc] or [RC] back to [rc]-like integer quantity) refactored to use A_sys() and K_sys()

partial extension of decompose_Topcon_nd() for QZSS in Javad JPS for relative doppler L2C [3d] and L5 [5d] messages (but not for L1C [Id] message)

the three QZSS L1 signals now straightened out in Trimble_27_57h_6_signal_map() using the top-secret decoder ring from Trimble (available via NDA today only!)

2012 May 8: yet another overhaul of Trimble_27_57h_6_signal_map() — now coded so that each signal combination must be matched explicitly to a satellite constellation, and if not then that signal combination and constellation is detected and reported; doing this revealed six QZSS signals being stored in Trimble's RT27 .tgd record 27 from a NetR9 instead of the two indicated by Trimble's current documentation

2012 May 7: code cleanup to get a warning-free compilation on OSX 10.6 gcc 4.2 -m64 (except for the one required warning from gcc in the_details())

additional code extension for Galileo and QZSS in qc_auto_find_nav_files()

slight sint1 ("char") array expansion in file_id() and file_location()

2012 May 4: the ToE window check in nav_filtering() split off into new ToE_in_window() so that it can be called differently for different constellations; call to ToE_in_window() currently set for 21-day acceptance before start of the observation window for QZSS and Galileo navigation messages until a reasonable bound is determined, and the acceptance for GPS, GLONASS, and SBAS navigation messages remains the default of 120 minutes (although still user-configurable with -ToE_dt)

call to spew_Topcon_nav_message() with stored nav message buffer added towards end of Topcon() if the window start time corresponds to 1.0 Jan 1980, i.e. Topcon TPS or Javad JPS being read without the GPS week being set and no [RD] message was found, but the input contained one or more nav messages that can be output

2012 May 3: renaming and generalization of GPS_NAV_times_make_sense() to ephemeris_times_make_sense(), unequal_GPS_NAV_ToE_ToC() to unequal_ToE_ToC(), nonmatching_GPS_IODC_IODE() to nonmatching_IODC_IODE(), nonsequential_GPS_NAV_ToW() to nonsequential_ToW(), invalid_GPS_NAV_ToW() to invalid_ToW(), large_GPS_NAV_ToE_minus_ToW() to large_ToE_minus_ToW(), and earlier_GPS_NAV_ToW_week() to earlier_ToW_week() as these functions are being generalized for more than just GPS navigation messages (e.g. pushed into use for Galileo and QZSS navigation messages)

new Galileo_SV_geocentric_position(), and corresponding calls for Galileo in output_orbits(), find_position(), qc_satellite_orbit(), and find_path_fit(); other new code for Galileo in existing functions: find_path_fit(), qc_auto_find_nav_files(), qc_satellite_nav_update(), and ephemeris_file_location()

2012 May 2: the qc indicator 'N' in the ASCII time plot has been generalized to mean "data present, but not able to do qc analysis" — which holds for the past case of GLONASS data with no slot-to-fcn (frequency channel number) information for the SV as required for phase conversion from units of cycles to distance — and will apply for Beidou-2/Compass data until an appropriate qc can be researched

change to the parsing of SV_id byte in BINEX 0x01 for the various subrecords in decompose_binex_01(); test of 0x01-06 (QZSS ephemeris)

new decompose_Topcon_EN() and Topcon_EN_ephemeris() for reading Topcon TPS and Javad JPS [EN] message (decoded Galileo navigation message) and new decompose_Javad_QE() and Javad_QE_ephemeris() for reading Javad JPS [QE] message (decoded QZSS navigation message)

2012 Apr 30: find_path_fit() and path_estimate() extended for QZSS

modified output_orbits() and syntax of option -orbit so that the output can be in geographic coordinates if desired

2012 Apr 28: qc_satellite_nav_update() and qc_satellite_orbit() extended for QZSS

2012 Apr 27: nav_value_out_of_range() extended for QZSS, notice for Compass, and warning for any other new constellation nav message

binex_nav_message_01_01() renamed binex_nav_message_01() and modified to handle subrecords 0x01 — 0x06 (decoded GPS — decoded QZSS)

nav_binex_out() modified to set subrecord type based on SV constellation and call binex_nav_message_01() for subrecords 0x01 — 0x06; also modified for full GNSS -tbin beyond original GPS-only code

frequency() extended for QZSS and Compass signals

ephemeris_file_location() extended for QZSS

new QZSS_SV_geocentric_position() (exactly analogous to GPS_SV_geocentric_position()) and its call for QZSS SVs in output_orbits() and find_position()

QZSS test added to qc_auto_find_nav_files()

2012 Apr 26: extension of zero_nav_union_overflow() for Galileo, Beidou-2/Compass, and QZSS

new binex_01_03_ephemeris(), binex_01_04_ephemeris(), and binex_01_06_ephemeris() for reading BINEX 0x01-03, 0x01-04, and 0x01-06 respectively for SBAS, Galileo, and QZSS navigation messages respectively; added calls to these in nav_processing() and the settings for the its switch set in decompose_binex_01()

2012 Apr 25: update of leap_seconds() for upcoming positive leap second insertion into UTC at the end of 30 June 2012

update of comments concerning ICD-GPS-200 to IS-GPS-200

new rinex_nav_QZSS(), and added call to it in nav_processing()

refactored Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() a bit, now making use of SV_id_offset[ ] array

generalized Trimble_28_55h_9_ephemeris() for extracting Galileo and QZSS ephemerides from record 28, but needs to be tested and generalized for 0x55-9 (no documentation for on that yet)

from running test files of Trimble .tgd from Australia, was able to include cases in Trimble_27_57h_6_signal_map() for QZSS L1C (in addition to QZSS L1 C/A) at 1575.42 MHz (which is not listed in the latest documentation from Trimble) and Beidou-2/Compass B2/E5b at 1207.14 MHz (which is not given a block type in the latest documentation from Trimble)

had to add special case for "GB1000" in Topcon_Javad_rx_names() for TPS format, and moved the rename of "GB1000" to "GB-1000" from decompose_Topcon_JP() to Topcon_Javad_rx_names()

2012 Apr 24: added initial boilerplate code for dealing with RINEX 2.xx-style navigation files for Beidou-2/Compass and QZSS, if the topic ever comes up

2012 Apr 23: some preprocessor code cleanup, mainly to eliminate old code which has been update or replaced

2012 Apr 20: slight modification to the new ToE epoch check in GPS_NAV_times_make_sense() to correctly account for possible, but extremely unlikely, ToE epochs at 00m16s, 00m32s, and 00m48s (N = 224, 223, 222)

after a bit of code tweaking, a validity check for decoding and encoding of BINEX 0x7f-03 (binex_7f_02_obs() and binex_observables_7f_03() respectively) on dual-frequency data for GPS, GLONASS, Galileo(GIOVE), Compass, and QZSS and on single-frequency data for SBAS

2012 Apr 19: the reading and decoding of the obs_present byte(s) in BINEX 0x7f-02 and 0x7f-03 was split out in a new function, binex_7f_obs_present_decode(), and used in binex_7f_02_obs() and binex_7f_03_obs()

binex_7f_03_obs_present() was renamed binex_7f_03_obs_present_encode() (currently, just for the encoding of the obs_present byte(s) in BINEX 0x7f-03)

modification to the GPS ToE test in GPS_NAV_times_make_sense() so that ToE epochs of N*16 seconds at or before the hour, N = 0, 1, 2, 3, ..., 224, are now allowed; the previous logic introduced 2010 Mar 29 would only allow epochs at 00m00s or 59m44s (equivalent to N = 0 or 1)

2012 Apr 18: functionality of binex_7f_03_obs_indices() and binex_7f_03_codes_mpc() merged into new binex_7f_03_obs_settings() and this is now called by both binex_7f_03_obs() (for decoding 0x7f-03) and binex_observables_7f_03() (for encoding 0x7f-03); the original two functions are no longer needed and were removed

added test in obs_out() to return when calling to output observation data and there are no SVs in the epoch, i.e. no epoch with zero SVs is output

2012 Apr 17: separated observable index assignment of binex_7f_03_obs_present() into new binex_7f_03_obs_indices() and continued code refactoring of binex_observables_7f_03() to generalize it

2012 Apr 16: introduction of new functions binex_7f_03_obs_present_epoch(), binex_7f_03_obs_present(), and binex_7f_03_preference_bit() for generalizing output of BINEX 0x7f-03 in binex_observables_7f_03() for all supported constellations

2012 Apr 13: expansion of cases and SV_signal[ ][ ][ ] in Trimble_27_57h_6_signal_map() to allow for Beidou-2/Compass and QZSS signals, to the degree specified in the latest documentation from Trimble (Nov 2011, it appears to be)

Trimble_27_57h_6_constellation() also modified to now allow Beidou-2/Compass and QZSS

2012 Apr 12: removed setting of GPS anti-spoofing BIT 2 in LLI flag of RINEX C1 and C2 in lli_cleanup() (as part of a continued effort to remove anti-spoofing BIT 2 from observables that can never have anti-spoofing)

also split off setting of GPS anti-spoofing BIT 2 in LLI flag of RINEX P1 and P2 in lli_cleanup(), and this change is implemented in Ashtech_dld_3_obs() and Ashtech_R_9_obs() only for the time being (for reading of Ashtech version 3 B-file and R-file record 9, respectively)

the above change for calling lli_cleanup() also necessitated a few code changes of Ashtech_dld_3_obs()

correction to Ashtech_R_9_obs() (for decoding of Ashtech R-file record 9) to correctly deal with anti-spoofing flags for each data block and to correctly handle +CA_L1 and -CA_L1 for the L1 SNR (so that Ashtech_snr(), which for the Z-12 does conversion of the Ashtech SNR ireg value to dBHz, will be called with the correct parameters for each situation)

slight change to Ashtech_snr() so that Ashtech ireg values converted to dBHz will not return negative dBHz values; any such case is forced to be zero

new Ashtech_IGS_rx_type_recast() which is called after any receiver type name is found in any Ashtech format to see if the name should be recast to the current IGS receiver name type; the initial case in this function is to change "Z-12" or "Z12" to "Z-XII3"

2012 Apr 10: re-crafted set_obs_obs_normal() and set_obs_obs_default() to recognize the new +L6, +L7, and +L8 options; this required completely changing the way set_obs_obs_normal() was written in order to avoid absurd code complexity, so the new methodology will alter the observable order when reading some raw formats when -O.obs is not used to set the GNSS observable list

creation of qzss.h and associated global variables for known QZSS signals

completed binex_7f_05_signal_map() for Beidou-2/Compass and QZSS signals (except for provisional Compass B1-2/E1 signal, at 1589.742 MHz)

replaced *_index variables in binex_observables_7f_00(), binex_observables_7f_01(), binex_observables_7f_02(), and binex_observables_7f_03() with an in-line define function for better code readability

2012 Apr 9: new binex_7f_03_codes_mpc() for use in binex_7f_03_obs() and binex_observables_7f_03() for sorting out the observable list and meters/cycle scaling for each phase for each SV when decoding and encoding BINEX 0x7f-03

added stubs for options +L6, +L7, +L8 — to be analogous to current +L5 — although the current intent is to output GNSS observable counts using the -O.sum option

decompose_binex_7f() now calls set_obs_obs_normal() (rather than having its own logic for setting the default GNSS observables as before)

2012 Apr 6: some re-crafting of decompose_Topcon_JP() to call new Topcon_Javad_rx_names() to help sort out the correct IGS receiver name from the Topcon or Javad [JP] message, given the various possibilities of "JPS ...", "TPS ...", "JAVAD ...", and "TOPCON ..." for the receiver type names and whether or not the user is explicitly using the options -topcon tps or -javad jps

added detection of JPS [PM] "rcv/vendor=" in decompose_Topcon_PM(), and upon detection of "JAVAD GNSS", setting of format to be Javad JPS and calling new Topcon_Javad_rx_names()

change to id() upon finding Topcon TPS or Javad JPS [JP] message: will now look to see if 'JAVAD' is present and then immediately identify this as Javad JPS format

corrected sign of extraction of -TauN from BINEX 0x01-02, decoded GLONASS FDMA navigation message, in binex_01_02_ephemeris()

2012 Apr 5: major correction to binex_7f_03_obs() for reading BINEX 0x7f-03; this function was originally written for the initial definition of 0x7f-03 which was mainly for support of observations of GPS L1 and L2 signals and SBAS L1 signals (for Trimble's NetRS receiver) — even though 0x7f-03 was also initially defined for GLONASS — and binex_7f_03_obs() was also not updated to fully include the extension of 0x7f-03 to Galileo, Compass, and QZSS signals (see 1 Mar 2011 entry in BINEX log); any previous reading of 0x7f-03 by teqc before this fix would then only be valid for GPS L1 and L2 signals, SBAS L1 signals, Galileo E1 signals, and QZSS L1 signals — the latter three because the carrier frequencies are identical to that of the GPS L1 carrier frequency

creation of compass.h and associated global variables for known Beidou-2/Compass signals

2012 Apr 4: the SV_n_offset[ ] array was renamed to be SV_b_offset[ ] given that it represents offsets for bit flag or other 0—n indexed arrays

introduction of SV_id_offset[ ] array, for consistent use of converting SV IDs (e.g. PRNs) down to two digits for RINEX or other related uses (mainly for SBAS and QZSS at this time)

corrected +help output for the -n_SBAS and -n_QZSS options using SV_id_offset[ ] and SV_n_offset[ ]

2012 Apr 3: fixed two typos in teqc.rc (which is called to compile the teqc code for all UNIX/Linux platforms) which were assigning the wrong build string for Solaris x86 builds

slight reordering of tests for receiver name matching in Leica_rx_specifics()

clarification in +help on current syntax of -nav option

eliminated two old Jstream metadata options used in the Suominet project in dump_config() (function called when using the options +config or ++config)

a bit of code recrafting in obs_data() and rinex_constellation() to try to correctly identify and inform the user about invalid RINEX EPOCH/SV continuation lines with more than 12 SVs on them in the various mode of operation (qc, metadata extraction, RINEX filtering)

2012 Mar 30: decompose_ublox_UBX_tim_tm2() was modified to output the rising and falling edges of UBX message TIM TM2 (0x0d03) in chronological time order, depending on the times of the rising and falling edges

2012 Mar 29: code correction in GLONASS_SV_geocentric_position() in the loop for the assignment of the GLONASS ephemeris time, tauN, and gammaN nearest to the epoch time of interest; the original code had a small error in the initial assignment of the nearest gammaN would would occasionally cause a floating point exception fault when using the Borland build for Windows (but no problem with the Mingw32 build for Windows, just as there was no problem with other UNIX/Linux builds)

more tuning of reading u-blox UBX to ignore certain messages

2012 Mar 26: updated IGS receiver/antenna designations up through 23 Mar 2012 entry

2012 Mar 21: special code section added to the start of obs_filtering() just prior to calls to filter_SVs() (i.e. filtering SVs by constellation) to enforce specific SVs be silently eliminated from RINEX obs output; e.g. QZSS and Compass are eliminated from RINEX obs 2.11 (because these are not defined in the 2.11 specification)

2012 Mar 20: added options for ±J and ±C for QZSS and Compass SV filtering, and necessary internal boilerplate for functionality (in various functions)

2012 Mar 15: significant rewrite of Ashtech_dld_3_constellation(), to accommodate the SV IDs stored in a version 3 B-file from a GPS+SBAS Ashtech receiver like the Z-Max, and continue to work with Ashtech receivers that are GPS-only, GPS+GLONASS, or GPS+GLONASS+SBAS, and continue to work with the Z-Xtreme (and other rxs?) firmware bug (found in mid-2009) that was logging GPS PRN 1 as SV ID = 33

2012 Mar 14: updated IGS receiver/antenna designations up through 12 Mar 2012 entry

2012 Mar 12: correction to extract_constellation_list() — original code did not work correctly with gcc compiliation

2012 Feb 24: due to a long-standing error in Topcon firmware for storing the SNR in their [rM] messages just now identified, the fractional part of the SNR is being set to zero in Topcon_TPS_rM_obs() so that the SNR upon output is at least the correct rounded value to the nearest integer dBHz; this will be changed when Topcon releases new firmware and documentation for the [rM] message so that correct SNR to 0.1 dBHz resolution can be obtained

2012 Feb 21: obs_out_summary() (used with option -O.sum) was modified to work with option +svo; the output of each SV line for obs_out_summary() was split off into the new obs_out_summary_line()

2012 Feb 14: updated IGS receiver/antenna designations up through 14 Feb 2012 entry

2012 Feb 9: updated IGS receiver/antenna designations up through 2 Feb 2012 entry

2012 Jan 4: alloc_scopy() and dealloc_scopy() used with de_pad_right() call in g_arg() (to further combat the accused non-rewritable string restriction imposed in gcc 4.x)

extract_types_list() and extract_constellation_list() now also using the new alloc_scopy() and dealloc_scopy() functions

the functions that have been examined, and fixed if necessary or code fixed prior to its being called, for the gcc 4.x non-rewritable string restriction are: remove_seperators(), uppercase(), de_fuzz(), strrstr(), stuff(), de_pad(), de_pad_left(), and de_pad_right()

a correction to ephemeris_file_location() when inserting a GPS nav message into the ordered list and the message should be the first one in the list

2012 Jan 3: two new functions, alloc_scopy() and dealloc_scopy(), used with remove_separators() calls in g_arg() (to further combat the accused non-rewritable string restriction imposed in gcc 4.x)

2011 Dec 30: the following functions have been modified to allow for the accused non-rewritable string restriction imposed in gcc 4.x: extract_types_list(), extract_constellation_list(), system_time(), and epoch_order() — which is just the beginning of hunting these down

2011 Dec 29: slight change in the ToW test of ordering the GPS nav messages for an SV in ephemeris_file_location() so that sequential messages with the ToW in the same minute are correctly sorted

correction in computing the file list ToW value (from 6.0 Jan 1980) from the extract GPS nav message ToW (from the beginning of the GPS week of the message) in ephemeris_file_location() to account for the fact that the GPS nav message ToW (in RINEX) can sometime be negative

2011 Dec 28: code renormalization: new ephemeris_file_advance(), which calls ephemeris_file_extract(), is used in qc_start_obs_epoch() and output_orbits()

new algorithm for determining the time of when to advance to the next GPS nav message in ephemeris_file_location()

change in reading Topcon TPS/Javad JPS in decompose_Topcon_PM() for extracting the receiver serial number so any second field with "OEM" present is ignored and the first have of the string (up to the space) is used

2011 Dec 27: updated IGS receiver/antenna designations up through 22 Dec 2011 entry

binex_01_02_ephemeris(): correction of extraction of GLONASS xyz position, velocity, and acceleration terms (should be stored and extracted in kilometers, not meters — same as RINEX), and removed SV system check in the function

2011 Dec 6: several improvements to ephemeris_file_location() (which builds the GPS nav message list for qc mode) to arrive an improved sequential GPS nav message listing, especially when dealing with any newly uploaded XXh:59m:44s message which supersedes the previous (XX+1)h:00m:00s message

2011 Nov 28: calls to compute_GLONASS_fcn_constants() were added to binex_01_01_ephemeris() and binex_01_02_ephemeris() for any GLONASS broadcast message (note: if present, these aid in allowing GLONASS phase values in BINEX 0x7f-03 and 0x7f-05 to be converted from unit of distance to cycles)

binex_7f_05_constellation() and binex_7f_05_obs() were provisionally expanded to deal with Beidou-2/Compass and QZSS

binex_7f_05_signal_map() expanded for Galileo signals

2011 Nov 8: updated IGS receiver/antenna designations up through 26 Oct 2011 entry

2011 Nov 3: addition of new option gttl (whether or not to use GPS ToE-ToW limits for filtering GPS navigation messages during qc), which is set to +gttl by default (i.e. use the limits) which is how the code has been since teqc started

re-crafted the structure of GPS_NAV_times_make_sense() a bit, and included logic for the new gttl option

additional test added to Leica_GPS_ephemeris() to set the GPS ToW value to zero (which even though is a valid value, means that the ToW is unknown) if ToE-ToW using the ToW proxy is unacceptably large

Leica ToW proxy setting removed from decompose_Leica_MDB_15_79() for MDB ids 0x15 (21) and 0x79 (121) (because time of almanac is not related to current GPS time); currently there is nothing being extracted from MDB ids 0x15 (21) and 0x79 (121) in decompose_Leica_MDB_15_79()

2011 Nov 2: added cases to ignore a few more minor UBX messages types in next_ublox_UBX_record() and added new function decompose_ublox_UBX_nav_sol() to extract the geocentric receiver position from the NAV-SOL (0x0106) message

2011 Nov 1: the frequency() function was modified for GLONASS L1 and L2 so that if the frequency channel number (fcn) is unknown for the SV slot number (fcn set to "unknown" value of -127) then the function will return the "no data" value, which currently is just zero

modification to Topcon_SI_NN_validation(), for checking and using either Topcon TPS or Javad JPS [SI] and [NN] metadata, to extract the GLONASS frequency channel number from valid [SI] GLONASS entries; checked against 1998 JPS containing GLONASS and modern files

additional logic condition in nav_filtering() to skip time window filtering is a qc is being done; e.g. this keeps all GLONASS navigation messages upon input in memory for doing a qc of shortened time windows of GLONASS plus other GNSS observation data

2011 Oct 31: reading of TPS/JPS message [UO] now does a modulo 256 of the extracted value of WNt before calling adjust_week() in the function decompose_Topcon_UO() (note: even though Topcon says that the value for WNt in [UO] is modulo 1024, this change makes the extraction consistent with other formats where WNt is modulo 256, i.e. 8-bit, consistent with the past ICD-GPS or current IS-GPS-200 for subframe no. 4 page no. 18)

the same modulo 256 addition was made to the function nav_out_delta_UTC() for the same possible problem from other formats, or when reading and writing GPS nav RINEX with the optional DELTA-UTC: A0,A1,T,W header line

improved logic in initialize_GLONASS_orbit_interpolation() to handle use of GLONASS ephemerides for cases where the ephemerides are not in chronological order in the input, such as where the latest ephemeris for some particular GLONASS SV is listed first in the GLONASS RINEX nav file being read for qc (SW)

2011 Oct 28: removal of added logic code to obs_out_start_end() (bad idea), and, instead, change to obs_data() so that the last epoch flag of a RINEX obs data epoch (epoch flag 0, 1, or 6) is tracked and only these are considered for new data epochs to decide whether the time tags would be exclusive

2011 Oct 25: additional logic code to obs_data(), obs_out_start_end() and obs_out_data() to deal with RINEX event flags 2, 3, 4, and 5 which immediately follow the obs header but precede the first data epoch with flags 0, 1, or 6

change in process_rinex_obs() to now call obs_start() to capture the TIME OF FIRST OBS in obs.session.start for use later in obs_data() for the case above when the event block (i.e. event flag 2, 3, 4, and 5) does not have a time stamp (note: this is the only known case where one needs to use the time stored in TIME OF FIRST OBS — which is hopefully correct — in order to know the approximate time of the untimed event for possible time windowing)

2011 Oct 21: logic additions to rinex_out_marker_name(), rinex_out_marker_number(), and obs_out_approx_position() to suppress the output of the RINEX obs post-header fields MARKER NAME, MARKER NUMBER, and APPROX POSITION XYZ when using the monument editing options +/-win_mo and/or +/-win_mn and the currently detected monument name or number is different than the desired windowed monument name or number

additional logic to obs_out_approx_position() to zero out the values of RINEX obs header field APPROX POSITION XYZ when using the monument editing options +/-win_mo and/or +/-win_mn and the currently detected monument name or number (in the header) is different than the desired windowed monument name or number

2011 Oct 20: bug fix in binex_build_SV_id(): the bug, introduced 2 May 2011, does not allow GPS PRN 01 to be written to BINEX 0x7f-00 — 0x7f-03 and the program terminates

2011 Oct 18: code cleanup of several obsolete #define settings

2011 Oct 17: change of first_epoch flag in decompose_Ashtech_dld_B_rawnav() to be part of Ashtech_details struct, rather than a static variable in the function, which is reset to be TRUE in read_Ashtech_B_header() at the start of each Ashtech B-file, so that the test for the possible decrement to the GPS week found in the corresponding S-file is done for each B+S-file combination in multi-B+S-file readings — necessary because of the GPS week in the S-file is for the end of data, not the beginning of the data, as needed for initial reading of the epochs

2011 Oct 14: change of following function names to better reflect their functionality, and relocation of all to binary.c:

    set_obs_obs_default() to set_obs_obs_normal()
    set_met_obs_default() to set_met_obs_null()
    set_obs_obs_out() to set_obs_obs_default()
    set_met_obs_out() to set_met_obs_default()
    obs_drop() to drop_obs()

logic changes to set_obs_obs_default() to fix non-functionality of -O.-obs option when the default observables list is used (e.g. for certain translation cases) — to fix problem that was introduced on 9 Dec 2010 for -O.-obs

same logic change to set_met_obs_default() to fix non-functionality of -M.-obs option when the default observables list is used (e.g. for certain translation cases)

2011 Oct 12: calls to set_obs() for either GNSS observables or met observables have now been simplified by using new set_obs_obs() and set_met_obs(), respectively, which now call set_obs(), and with an additional set_obs_obs_default() for some formats or situations

the function set_obs_obs_out() was refactored so that using option +L5 would additionally include the observables L5, C5, and S5 (and D5 if compiling with DOPP_OUT_DEFAULT defined); tested on Trimble NetR9 GPS+GLONASS+GIOVE data

2011 Oct 11

2011 Oct 11: minor variable changes in GLONASS_SV_geocentric_position(), and some minor preprocessor flag cleanup elsewhere

2011 Oct 7: decompose_SeptentrioBF_5895_4017() renamed decompose_SeptentrioBF_4017_et_al() since, when finished, it will handle all SBF raw navigation messages

completed code refactoring for +raw_nav option for full granularity on GNSS constellation and signal type, to the degree possible at this time, which means that the code is poised to start looking at the raw GLONASS CA nav messages from Trimble and Septentrio, and all other messages that the Septentrio is logging; the latest changes should take into account the different lengths of the raw nav messages from the various constellation/signal combinations

2011 Oct 6: completed code refactoring of decompose_Trimble_26() for +raw_nav option for full granularity on GNSS, though found that what our test NetR9 unit is writing to .dat record 26 for L2C and L5 messages is inconsistent with the IS-GPS and what is being reported by our Septentrio PolarRx3ePRO and Javad Sigma; reported problem to Trimble

2011 Oct 4: started code refactoring for +raw_nav option for full granularity on GNSS constellation and signal type

implemented CRC-24Q check on the 276-bit navigation information strings for GPS L2C and L5; tested on Septentrio logging of L2C and L5 nav messages

2011 Oct 3: small bybe offset correction to decompose_Trimble_57h_5() for reading GPS L1C/A navigation subframes from Trimble's 0x57-5 with +raw_nav

fine-tuning of output for +raw_nav; the output of anything except the legacy GPS L1C/A navigation messages (300-bit subframes as 10 words, each ending in 6 parity bits) is provisional

2011 Sep 28: added constraints in decompose_Topcon_UO() and decompose_Topcon_WO() that leap seconds value from Topcon TPS/Javad JPS [UO] and [WO] messages must be positive (technically correct since 1.0 July 1981 — well before any possible TPS/JPS data); this is to prevent incorrectly assigning a zero value to leap seconds, as has been found in some [WO] messages

and, more globally, added constraint in rinex_out_leap_seconds() to not output the LEAP SECONDS header line to any RINEX file if the leap second value is less than 1

2011 Sep 27: overhaul of replace_D_with_e() function, and how it is called, and related format strings for C printf() %X.Yle scientific notation output (e.g. needed for certain fields in RINEX nav files), so that a new #define THREE_DIGIT_EXPONENT can be used if the compiler outputs three digits in the exponent which needs to be reduced to two digits for the RINEX specification

cleanup of unused variables

2011 Sep 23: split out the main functionality of decompose_Topcon_GD() to new GPS_nav_data(), and generalized both for reading TPS/JPS [GD] or the new JPS [gd] message

added silent detection (but no decoding) of Javad JPS messages [QA], [QE], [QU], [cl], [lE] (named for me, obviously!), [ld], [lp], and [lr]

2011 Sep 22: SBF messages 4018 (GPS L2C raw navigation) and 4019 (GPS L5 raw navigation) and deprecated 5847 (GPS L2 raw navigation) are now passed to decompose_SeptentrioBF_5895_4017() (along with related logic changes inside the function) — needs testing

reading of Topcon TPS and Javad JPS [GD] in decompose_Topcon_GD() modified to distinguish between L1C/A and L2C (and other) GPS subframes

2011 Sep 21: added silent detection (but no decoding) of Javad JPS messages [LD] (GLONASS raw navigation), [WD] (WAAS/SBAS raw navigation), and [ED] (Galileo/GIOVE raw navigation)

2011 Sep 20: for option +raw_nav the functions decompose_Trimble_57h_5(), decompose_Trimble_26(), decompose_Topcon_GD(), and decompose_SeptentrioBF_5895_4017() (for reading Trimble 0x57-5 and .dat record 26, Topcon TPS/Javad JPS [GD], and Septentrio SBF messages 4017 and 5895 respectively) have been modified to use mfo_stage1(), mfo_stage2(), and mfo_stage3() and tested to compare with previous results; these changes result in correct time tags for certain subframes which were in the wrong GPS week with the earlier implementation

option +flip_nav was removed after consensus by users that this output is not needed

2011 Sep 19: for option +raw_nav, GPS subframes are now handled with the new mfo ("message_frame_organizer") struct which are used by the new functions mfo_stage1(), mfo_stage2(), and mfo_stage3() — which now require at least one subframe 1 with valid parity on word 3 for determining the GPS week before outputting anything; this also buffers subframes showing up before a valid subframe 1; tested in decompose_Topcon_GD() with problematic TPS files collected at the GPS week rollover

2011 Sep 13: reading of Topcon TPS/Javad JPS modified to ignore message [PI] in next_Topcon_record()

2011 Sep 12: format of +raw_nav and +flip_nav changed to include a final short hexadecimal showing which words in each GPS subframe has a bad parity checksum; output from decompose_Trimble_57h_5(), decompose_Trimble_26(), decompose_Topcon_GD(), and decompose_SeptentrioBF_5895_4017() (for reading Trimble 0x57-5 and .dat record 26, Topcon TPS/Javad JPS [GD], and Septentrio SBF messages 4017 and 5895 respectively) modified, and tests with more or less co-collected Trimble .tgd, TPS, and SBF now show consistent results for GPS CA subframes and zero parity checksum errors

2011 Sep 7: clarification from Leica indicates that the documentation for decoding the doppler in MDB record 119 is correct, but that there was an earlier firmware bug that requires correcting this by a factor of -1/carrier_wavelength if the stored doppler values for L1 and L2 are equal; this has been implemented in Leica_MDB_77_obs() for GPS and GLONASS L1 and L2 (although this implies that the doppler on L2 is not an independent measurement of the doppler on L1 in record 119)

2011 Sep 6: now back to a case where the original documentation for Leica MDB record 119 for the units of doppler is correct (see 16 Jan 2009 and 31 Dec 2008 entries), so Leica_MDB_77_obs() for decoding doppler is now back to match the documentation (one decoding is right for some Leica rxs and firmwares, the other decoding is right for others)

2011 Aug 24: updated IGS receiver/antenna designations up through 12 Aug 2011 entry

2011 Aug 19: format of +raw_nav and +flip_nav changed to include subframe number and constellation designation on SV id (e.g. 'G' for Navstar GPS)

testing of +raw_nav and +flip_nav with data overlap on three receivers (Trimble NetR9 beta fw 4.43:b85, Topcon Net-G3A fw 3.5, Septrentrio PolarRx3ePRO beta fw 2.0-tst091013r25046) collecting raw GPS navigation messages in Trimble record 26, Topcon TPS [GD], and SBF 4107; some common decoding for Trimble record 26 and TPS [GD] (but only on subframes 2 and 4), and no common decoding for SBF 4017, but decoding of SBF 4107 agrees with GFZ decoding; I'm stumped

2011 Aug 17: added a conditional test in is_met_in_00_comment() so that if characters 11-17 of a BINEX 0x00 comment are "$YXXDR," (assuming the first 10 characters of the comment starts with "Met Data: " — as done by Trimble firmware) then the NMEA string is assumed to be X-Y tilt and possible temperature of the tilt meter, and thus skipped

added another set of conditional logic in met_filtering() so that if the input format is BINEX and all met observables are zero, then the epoch is not output (this could extended to all input formats, but for the moment, this is to solve a problem being introduced by Trimble firmware for GSI)

added detection and preliminary reading capability for Trimble .dat record 26 (raw navigation messages) for GPS messages with new decompose_Trimble_26(), based on same methodology as in decompose_Trimble_57h_5() for 0x57-5; ready for comparison testing with Topcon/Javad [GD] and Septentrio 5895/4017

corrected time of raw GPS nav messages (for use with +raw_nav and +flip_nav options) by +30 seconds (due to misplaced right-handed parenthesis) in decompose_SeptentrioBF_5895_4017(), decompose_Topcon_GD(), decompose_Trimble_57h_5(), and decompose_Trimble_26() — so now the time of the GPS subframe is the ToW of subframe - 6 seconds as intended in 18 Sept 2008

2011 Aug 16: removed change in obs_interval() from 15 Apr 2011 because that change results in a metadata end time with +meta (but not +mds) when reading a RINEX observation file of teqc's starting epoch (i.e. 1980 Jan 1 00:00:00)

2011 Aug 15: from 11 Feb 2010 until now, there was a missing "else" on a "else if" clause in rx_OK() for the RX_IS_NCT case, i.e. reading Navcom binary format, which would incorrectly result in trying to read this format as big-endian instead of correctly as little-endian

2011 Aug 5: for use of English units for the Climatronics AIO ("all-in-one") met pack, i.e. command string of 'CTAIOE', the conversion of inches of mercury to millibars changed to not depend on temperature and use 1/0.02953 mbar/inHg (the temperature dependent version of the code was #if-ed out so that this can be revisited if needed; see 1 Aug 2011)

2011 Aug 4: some minor preprocessor flag cleanup

2011 Aug 1: detection and parsing of met data from Climatronics AIO ("all-in-one") met pack modified to to included detection of a command string of 'CTAIOE' for English units (wind speed in mph, temperature in Fahrenheit, and pressure in inches of Hg) which all get converted to the usual SI units for RINEX met in modified Climatronics_AIO_met() (note: need to verify temperature dependence of conversion of inches of Hg to millibars)

correction to filter_system_in_nav() so that +G* and +R* work in the same way as the reverse -G* and -R* options (e.g. +G2,3 and -G1,4-32) for nav message functionality (related to code changes involving BIT_MASK_BYTES on 5 Oct 2010)

functionality of -no_orbit option changed to new -no_position option; new related -no_orbit option added to suppress all orbit calculations during qc for the listed constellation(s)

2011 Jul 29: reading of Trimble .dat/.tgd by next_Trimble_dat_record() set to temporarily skip record 33 (— because no idea what it is!)

initial code for detection and parsing of met data from Climatronics AIO ("all-in-one") met pack; added new decompose_Climatronics_AIO() and Climatronics_AIO_met() and related detection and case in external_data_string() and met_processing(); detection of SI met measurements in default units requires a command string of 'CTAIOS'

2011 Jul 28: the default list of observables for reading of a Ashtech U- or R-file was expanded to include RINEX S1 and S2 in format_settings() (note: because neither the U- or R-file can hold GPS L2C or L5 data, the options +C2 and +L5 will continue to have no affect on the default list of observables for these two formats)

2011 Jul 26: next_SeptentrioBF_record() modified to ignore SBF messages 4028 and 5938

2011 Jul 22: decompose_SeptentrioBF_5895_4017(), decompose_Topcon_GD(), and decompose_Trimble_57h_5() were modified so that the option +raw_nav would output the same GPS ToW value as the option +flip_nav when reading, respectively, the GPS 50-bps 300-bit subframe nav messages from SBF message IDs 5895 and 4017, Topcon TPS/Javad JPS message [GD], and Trimble 0x57-5

2011 Jul 19: next_SeptentrioBF_record() modified to ignore SBF message ID 4014; and decompose_SeptentrioBF_5902() corrected to extract antenna type string (this had been overwriting the antenna number string)

2011 Jul 15: Septrentrio Binary Format message ID identification was amended in next_SeptentrioBF_record() and where using twobyte_id() in septentrio.c (for all other functions handling SBF); this corrects a long-standing error where the 3-bit block revision number has not been stripped off the 2-byte block ID

2011 Jul 13: added reset of to the end of Trimble_27_57h_6_constellation() for reading Trimble record 27/0x57-6; otherwise, the constellation total is one too many if there any SVs present which are not yet accounted for in the code (e.g. QZSS, Beidou-2/Compass), leading to a satellite count in RINEX obs which is one too many and a bogus "G00" at the end of the RINEX SV list

decompose_Trimble_firmware() modified to (hopefully) report Trimble beta firmware in post-NetRS receivers in a %.2lf:b%02d format where the first field is the targeted firmware version and the second field is the the beta build number — though correct extraction of this metadata requires that .dat record 12 be present in the file being read ( ... and it should be noted that the latest Trimble runpkr00, version 5.31, with the -q option only reports the build number of beta firwware as the firmware, and that the menu screens of these receivers report the firmware as %.2lf-%.2lf where the build number is first and the targeted firmware version is second)

2011 Jul 8: added -orbit option, calling output_orbits(), for dumping calculated orbital positions for code debugging

2011 Jun 28: setting of epoch.minutes (from obs.observation.epoch) in find_position() moved from outside to inside the SV travel-time loop prior to calling any *_SV_geocentric_position(), so that epoch_date() (and then epoch_stamp()) can be safely called at any time on this epoch struct for debugging print statements

2011 Jun 17: changed the several "bad condition" returns in GPS_SV_geocentric_position() to return ORBIT_NOT_AVAILABLE — which is now consistent with Stu's returns in GLONASS_SV_geocentric_position()

2011 Jun 16: small formatting change to geo_pos() so that the integer part of the seconds of the geographical position is always two digits (nicer output when using +qc ++epg and the position is close to 0 second of latitude or longitude)

2011 Jun 3: removed BINEX in and out conditional return from external_data_string() and put it at start of is_met_in_00_comment() (see 2 June 2011 entry) — this is a better location for it

2011 Jun 2: added conditional return to external_data_string() to fix bug of 0x00 with met data string introduced in June 2007: if both input and output format are BINEX, then the function is terminated without proceeding to try to decompose the NMEA or other ASCII met strings, since, if decomposition is done, this leads to calling met_processing() and then and_binex_out() with undefined BINEX record and subrecord IDs (note: these could be reset to 0x7f-00, but then the resultant output BINEX would have two "versions" of the met data: one in the original 0x00 comment field and one in a new 0x7e record)

moved logical conditions for special stdout situations to new special_stdout() (now used in out_settings() and rinex_out()) (note: but someday should develop a cleaner approach)

added condition in RINEX() if at the end of a RINEX obs output if the END OF HEADER has not yet been output (e.g. time-windowing a RINEX obs file and there are no data epochs within the window), then new obs_out_start_end() is called (note: need for this is to fix a bug introduced with code changes on 10 Nov 2009 for RINEX-to-RINEX obs filtering)

new obs_out_start_end() also now replaces block of code in obs_out_data()

refactored GPS_SV_geocentric_position() so that it also returns a boolean like Stu's GLONASS_SV_geocentric_position()

2011 May 27: updated IGS receiver/antenna designations up through 17 May 2011 entry

added a condition in rinex_mid_header_start() so that the event flag "4" line is only output if the RINEX END OF HEADER has already been output (i.e. basic->rinex.out_X & RINEX_HEADER_END is set) — this allows correct merging of RINEX obs files where the first file only has a header and no data, now needed following code changes made on 10 Nov 2009 for RINEX-to-RINEX obs filtering

2011 May 13: change as to how -no_orb[it] works (generalized for all SV systems)

2011 May 2: correction of binex_build_SV_id() to allow encoding of SBAS SV # in BINEX 0x7f-00 — 0x7f-03

2011 Apr 29: updated IGS receiver/antenna designations up through 21 Apr 2011 entry

2011 Apr 26: in obs_data(), added resetting of flag_2 to zero when NEED_INTERVAL_METADATA flag is set and flag_2 equals FLAG_2_EMPTY (i.e. the RINEX is technically invalid because there is no flag_2 value present); this is to enforce (as is done elsewhere) that a non-existent flag_2 is equivalent to its value being zero

2011 Apr 15: added unsetting of NEED_INTERVAL_METADATA flag in obs_interval() if the interval is successfully read in the RINEX obs header

2011 Apr 14: -no_orb[it] R fixed (SW)

2011 Apr 8: added new option -no_orb[it] so that a user can easily select not to include orbit calculations from one or more constellations (currently only applies to GPS = 'G' and GLONASS = 'R'); some debugging needed for -no_orb[it] R ...

2011 Mar 29: updated IGS receiver/antenna designations up through 28 Mar 2011 entry

2011 Mar 2: binex_extract_SV_id() and binex_build_SV_id() (for reading/writing BINEX 0x7f-00 — 0x7f-03) were modified to include Beidou-2/Compass

binex_7f_05_constellation() (for reading BINEX 0x7f-05) was modified to include QZSS and Beidou-2/Compass

2011 Mar 1: the formatting of the START_TIME_MJD line in open_qc_compact_plot_file() was changed from %14.6lf to %17.9lf to adequately represent the start time to the equivalent of 0.0001 second (see 18 Feb 2011 entry)

2011 Feb 22: Leica_rx_specifics() was updated to cover setting the expected maximum SV tracking limit of modern Leica receivers

2011 Feb 18: the formatting of the T_SAMP line in open_qc_compact_plot_file() was changed from %8.1lf to %11.4lf to match the formatting precision in RINEX and elsewhere (e.g. qc summary information)

2011 Feb 17: added capability to read the deprecated Septentrio Binary Format message 5895; changed decompose_SeptentrioBF_4017() to now be decompose_SeptentrioBF_5895_4017() and made the necessary modifications internally

2011 Feb 2: correction to Topcon_TPS_rM_obs() (reading of TPS/JPS [rM] messages) so that the RINEX obs bit 2 for GPS antispoofing is unset if the phase data is from GPS L2C see also related entries for 3 Aug 2009 and 5 Aug 2009 (and Happy Groundhog Day!)

2011 Jan 18: change to rinex_version_type(): function call to allocate() for RINEX filename now set to not terminate if space for name cannot be allocated, which allows for accidental multiple RINEX VERSION / TYPE lines in the input RINEX file

addition change to rinex_version_type() to call terminate() if multiple RINEX VERSION / TYPE lines in the input RINEX file are detected, unless +relax is being used in which case a notice message output

change in rinex_read_failure() so that message for case BAD_RINEX_VERSION_TYPE may also apply for multiple RINEX VERSION / TYPE lines in the input RINEX file

2011 Jan 7: correction to Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() to account for different storage size of the optional "GPS-GLONASS time offset" field in 0x57-6 compared to the same optional field in .tgd record 27

modification to decompose_Trimble_28_55h_9() to minimize output upon detection of any SV "type 9" in .tgd record 28 or stream 0x55, and make output slightly more pertinent to input format type

2011 Jan 6: correction to list2mask() for dealing with -G, -R, -S, and -E (coding error goes back to 24 Nov 2010)

2010 Dec 17: the four system arrays in globals.c and enum sequence in system.h expanded to allow for JAXA's QZSS and PRC's Compass (Beidou-2)

binex_extract_SV_id() and binex_build_SV_id() modified to use SV_n_offset[ ] array and allow QZSS (for testing BINEX from Javad with QZSS data)

2010 Dec 15: binex_7f_00_obs(), binex_7f_01_obs(), binex_7f_02_obs(), and binex_7f_03_obs() corrected to adjust final constellation total if unknown SV ids are found in BINEX 0x7f-00 — 0x7f-03 records

binex_extract_SV_id() and binex_build_SV_id() corrected to account for offset in SBAS id representation between BINEX (e.g. 0x7f-00 — 0x7f-04) and RINEX

binex_extract_SV_id() and binex_build_SV_id() modified to allow Galileo/GIOVE SV, as long as the PRN is 1—32 (following request from Javad to extend 0x7f-03 to allow Galileo/GIOVE data)

2010 Dec 13: Ashtech_dld_block() modified to correctly handle options ±CA_L1 and ±L2C_L2 for GPS, GLONASS, and SBAS SVs; new companion function Ashtech_use_phase() that is called by Ashtech_dld_block()

#define function valid_Ashtech_phase() was eliminated because this has been set to always be true since 8 June 1999, i.e. personal communication from Ashtech at the time stated that the phase data present is always valid

2010 Dec 10: obs_summary() modified so that program execution now terminates with an appropriate message if there is a missing SV id (PRN or GLONASS slot #) or if there is no observable list

addition to Ashtech_SNV_ephemeris() that allows extraction of SBAS nav info from Ashtech E-file and Ashtech stream SNV records; may contain one or two small errors, but main ToE/ToC, clock parameters, and XYZ orbit parameters look reasonable

2010 Dec 9: Ashtech_dld_block() modified to include a 'C2' case for L2C data blocks and "number of obs types" = 4 in Ashtech version 3 B-file (very experimental at this point)

first cut in modifying Ashtech_dld_3_obs() for reading Ashtech version 3 B-file using the 'capability' value as the primary metric for how to slice and dice the thing

added conditional in format_settings() so that if a default observable list is not set at the end and -O.sum is being used, then a reasonable default set of observables are assigned (including whether options +C2 and/or +L5 are being used)

2010 Dec 8: qc_SVs_present() was corrected so that duplicate lines reporting SVs without obs or nav in the +qc report are eliminated; split off part of old code for new qc_SV_flags()

2010 Dec 2: added detection of Topcon TPS message [LD] — GLONASS ephemeris raw bits — but this is not decoded

2010 Nov 24: correction of two typos in list2mask() that would incorrectly map "32" to the wrong byte (e.g. called for options like -G32 or +G32); see 5 Oct 2010

2010 Nov 22: rinex_to_binex_hdr_field() modified so that if the input RINEX string is the default _unknown_ (== "-Unknown-" currently), then the function is aborted

the normal case in window_OK() now checks if the input is BINEX and the output is RINEX, then rinex_to_binex_hdr(-1) is called (which, e.g., will map all set -O.* options to the equivalent -B.* options); note: it is probably possible to improve where this is done in window_OK()

the checking of bnx->flg1.set_X for bnx->antenna_xyz and bnx->antenna_geo in binex_00() were in error and has been corrected

2010 Nov 19: in binex_00() (internal creation of BINEX 0x00 metadata record), computation of cartesian radius has to be computed prior to calling WGS84_xyz_to_geo() (e.g. using option -B.px)

changed dump_config_string() back to surrounding string fields with double-quotes (somewhere/somewhen/somehow was changed to using single-quotes, which will not work upon reading); same for optional ellipsoid field in dump_binex_comments() (and might be a few more of these similarly needed fixes lingering about)

2010 Nov 10: update of read_Ashtech_B_header() for telling whether the L2 phase data is full-cycle or half-cycle in an Ashtech B-file (based on personal communication from Igor Artushkin at Ashtech)

updated IGS receiver/antenna designations up through 9 Nov 2010 entry

update of igs_rx_designation[ ] and extract_Trimble_rx_type() for the max SV limit on the Trimble NetR9 receiver

2010 Nov 8: update of igs_rx_designation[ ], IGS_receiver_designation(), decompose_Topcon_JP(), and Topcon_rx_specifics() for the current max SV limit on the Topcon Net-G3A receiver

2010 Nov 4: minor format change in rejection_due_to(), and change to constellation_total() so that the reporting of a suspected new SV max is now not dependent on running with +diag and a message will only occur at new individual suspected maximum values (instead of at each epoch) if used without +diag (e.g. during normal translation filtering)

2010 Nov 3: added switch in rinex_obs() so that if in non-post header comment mode (i.e. -phc) and the next observation epoch is after the data window end time specified with -e, then internally the code is switched to post-header comment mode for the duration of the run; this eliminates spurious incomplete splicing comments in RINEX-to-RINEX filtering if doing both time windowing with -e and RINEX splicing where the specified window end time is prior to any file end time

2010 Nov 2: decompose_binex_01() modified to now not subtract 1 from the stored GLONASS slot value, as was needed earlier for early Trimble NetR8 firmware (e.g. NetR8 4.17 yields the correct slot number)

2010 Nov 1: decompose_binex_01() modified to detect, report, and reject any BINEX 0x01-02 record with invalid GLONASS slot number

2010 Oct 21

2010 Oct 21: a couple of last minute function prototype cleanups for HP-UX cc compiling

2010 Oct 18: read_Ashtech_B_header() was modified to read the code tracking capability field from version 3 B-file and, for the time being, report an error message and terminate if the capability does not conform to what has been traditionally expected: a maximum of three data blocks with L1(C/A) data in the first data block, L1(P) data in the second data block, and L2(P) data in the third data block

provisional change made to Ashtech_R_23_obs() (decoding of Ashtech R-file record 23): skipping of phase data if all magnitude bits are set, and skipping of range data if all bits set or all bits unset (though it's not clear whether this will lead to an overall improvement in the usability of the final RINEX from R-files have this condition)

2010 Oct 11: decompose_Leica_DS_obs() was corrected to not include the receiver clock offset when computing the rounded epoch time for the RINEX time tag

2010 Oct 8: increase in size of TRIMBLE_MAX_REC_SIZE to 4096 to accommodate GNSS data from NetR9 (note: due to rapid increase in record sizes with GNSS data, the old buffer methodology needs to be changed to dynamic allocation)

change in Trimble_dat() to better deal with Trimble .dat records exceeding TRIMBLE_MAX_REC_SIZE in size (needed until dynamic memory allocation is implemented)

function stub decompose_Trimble_32() added (for Trimble .dat record 32, Galileo ion/UTC model parameters)

change in next_Trimble_dat_record() to call Trimble_dat() when .dat record 32 detected, and change in Trimble_dat() to call new decompose_Trimble_32()

moved the USE_C2 and USE_L5 bit flags from the teq.main to the teq.misc integers (to make room for new USE_L6, USE_L7, USE_L8 bit flags for GIOVE/Galileo data)

the detection algorithm in Trimble_27_57h_6_signal_map() to detect and report undocumented combinations of SV/frequency/signal types in Trimble's record 27/0x57-6 data was scaled back so that it now only requires 1600 bytes of memory (not quite as detailed as the first version, but sufficient to detect and report problems)

2010 Oct 7: Trimble_27_57h_6_signal_map() updated for GIOVE/Galileo signals and tracking modes — for reading Trimble record 27/0x57-6 with GIOVE/Galileo data

decompose_Trimble_28_55h_9() modified to detect Galileo ephemeris — for reading Trimble record 28/0x55-9 with GIOVE/Galileo data (although these are temporarily skipped until decoding in a RINEX Galileo nav 2.xx specification is completed)

the maximum PRN for GIOVE was increased from 52 to 53 (in the SVs_in_system[ ] array) based on a report from Dr. André Hauschild that the Septentrio GeNeRx1, with later generation firmware, will report the GIOVE-B PRN as 52 or 53 depending on whether set to track a subset of signals or full signal capabilities

2010 Oct 6: correction to obs_drop() (called when options -O.-obs or -M.-obs are used) so that the code to collapse the current array is done even when none of the specified observables to drop are in the input list so that the index array is correctly populated

Trimble_27_57h_6_signal_map() to detect and report undocumented combinations of SV/frequency/signal types in Trimble's record 27/0x57-6 data that occur from use of new firmware or new receivers — this might have to evolve into an option to turn on to reduce memory

2010 Oct 5: extensive code modifications to allow options +/-G, +/-R, +/-E, +/-S, +/-ch, and +/-NaN_obs to be used with more than 32 elements, by now allowing an array of 4-byte unsigned ints (instead of just a single 4-byte unsigned int, as has been how the code was written up until now); currently, the masks are set to allow up to 64 elements (array of 2 4-byte unsigned ints), but this can now be changed by modifying the value of BIT_MASK_BYTES and recompiling; the maximum allowable value for any option, though, may still be controlled elsewhere, e.g. for +/-G, +/-R, +/-E, and +/-S the upper-bound is controlled by -n_GPS, -n_GLONASS, -n_Galileo, and -n_SBAS although these still cannot exceed a value of 64 without first changing the value of BIT_MASK_BYTES and recompiling; the number of functions that were modified to accomplish this change is so extensive they will not be listed here

what should be ASCII antenna serial number strings from Trimble .dat 5.2 and 16.27 are now processed by the new crap_to_ascii() routine to filter out all non-ASCII bytes (which are very prominent in data files from the NetR9 fw 4.15)

2010 Oct 4: decompose_Trimble_28_55h_9() modified to only proceed with Trimble record 29/0x55-9 if the subtype field has a value of 2 with the rest of the record appearing to be consistent with storing a GLONASS ephemeris as per the Trimble Aug 2008 documentation — other subtype values appear to be for storing GIOVE/Galileo ephemeris

2010 Sep 27: in obs_out_preheader(), obs.antenna.change_state is now only toggled to false if obs.antenna.moving is false — thus if a kinematic survey starts, obs.antenna.change_state will now stay set for detection in obs_out_data(); also making use of setting the new obs.antenna.new_site_occupation when Trimble records 16.1, 16.41, 16.48, or 8.x (x > 0) occur in decompose_Trimble_16() and decompose_Trimble_8()

2010 Sep 22: updated IGS receiver/antenna designations up through 21 Sep 2010 entry

2010 Aug 26: updated IGS receiver/antenna designations up through 25 Aug 2010 entry

2010 Aug 23: reading of Javad JPS message [EO] (Galileo to receiver time offset) is set to be recognized but ignored for the time being in next_Topcon_record()

(oops) replaced missing return after calling decompose_Topcon_RD() in case for Topcon TPS/Javad JPS message [RD] in switch in next_Topcon_record() (error introduced between 21 Apr 2009 and 29 Apr 2009) — the hallmark of the coding mistake is that the [RD] message and possibly random bytes after it in memory would then be interpreted as an [SI] message leading to a very incorrect satellite listing for the subsequent epochs

2010 Aug 6: a conditional was added to binex_7e_00_met() so that if the mGFZi pressure value stored in BINEX 0x7e is greater than 2e6, the pressure is assumed to have been incorrectly stored as microbars instead correctly stored as millibars (see BINEX Record 0x7e) and is rescaled by dividing by 1000 to, hopefully, get the value into millibars

an "else" clause was added to is_met_in_00_comment() to report any uncoded string matches found in BINEX 0x00 comment fields which may be met data; note: putting ASCII met strings in 0x00 comments seems to be only be done by Trimble firmware

an "else if" clause was added to is_met_in_00_comment() to detect old-style "$PASHS,XDR" ASCII met strings stored in the BINEX 0x00 comment field

2010 Jul 30: a conditional was added to Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() for detecting the presence of an optional reserved byte for reading of Trimble record 27 and 0x57-6 (needed change due to a documentation error for these records; see 11 June 2010)

2010 Jul 27: the condition for auto-decrement of the GPS week in met_epoch_no_gps_week() based on use of the -week option was removed

2010 Jul 16: the new qc "Missed obs" (see 7 Mar 2009 entry) has been relabeled as "Masked obs", i.e. these are complete observations below the current elevation mask that are not being included in the qc other diagnostics, along with related internal changes for the variable name

2010 Jun 11: modifications in Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() that appear to yield the desired intentions of Trimble's latest documentation for record 27 and 0x57-6 — although the current documentation is worded in such a way that it's either misleading or confusing

2010 Jun 9: added condition to Trimble_27_57h_6_constellation() so that if a "SV flags2" byte is detected and any of its 7 most-significant bits are set then a message is issued and teqc aborts — it's impossible to know now what these reserved bits may mean if they are put into use by Trimble at a future date

change to Trimble_27_57h_6_signal_map() to allow differentiation of RINEX L1/S1/D1 GLONASS observables from GLONASS L1C/A or L1P signals using CA_L1 option settings (same as GPS differentiation) and differentiation of RINEX L2/S2/D2 GLONASS observables from GLONASS L2C/A or L2P signals using L2C_L2 option which varies from current GPS differentiation which is based on the 3 Aug 2009 plan; note: L2C_L2 option name is a misnomer for the GLONASS L2C/A signal

2010 Jun 8: change to Trimble_27_57h_6_obs() to only output data from primary antenna from Trimble record 27 and 0x57-6 for NetR9, and issue notices for secondary antenna or reserved antenna ids

changes to Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() to account for optional system time offset block

changes to Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() to account for optional reserved block

correction to Trimble_27_57h_6_obs() for decoding doppler values in 0x57-6 (error in original 0x57-6 documentation from Trimble)

correction to Trimble_27_57h_6_signal_map() to detect GLONASS L2C/A signal observables

2010 Jun 4: changes to Trimble_27_57h_6_constellation() and Trimble_27_57h_6_obs() to account for new scheme of determining SV type in Trimble record 27 and 0x57-6 for NetR9, and account for GIOVE-A, GIOVE-B, or full Galileo SV type ids

2010 Jun 2: corrected SeptentrioBF_4027_5944_obs() to detect invalid pseudorange values in the "type-1 sub-block" and, if invalid, setting to invalid any subsequent observable for that SV in the epoch that relies on the type-1 sub-block pseudorange

2010 Jun 1: corrected SeptentrioBF_signal_map() to switch on signal type of 4, rather than 5, to extract GPS L5 observables from SBF (see 17 Nov 2008 entry — hey, I'll get this right someday)

modification to SeptentrioBF_4027_5889_5890_5944_constellation() to reduce the number of the "observed" SVs if the SV id returned by SeptentrioBF_SV_map() falls out of range, mainly to detect and ignore GLONASS SVs with unknown slot numbers

2010 May 22: modified binex_7f_05_constellation() and binex_7f_05_obs() for reading of BINEX 0x7f-05 to more correctly accommodate various ObsFlags(n) scenarios preceding the data blocks for each SV

2010 May 14: added notice message to Trimble_17_57h_0_obs() to inform user of Trimble RT17 containing L2C data but where the user is not using option +C2 or -O.obs with C2 in the observable list to extract the L2C code pseudorange

2010 May 11: updated IGS receiver/antenna designations up through 7 May 2010 entry

2010 Mar 30: update of igs_rx_designation[ ], IGS_receiver_designation(), format_settings(), and Septentrio_rx_specifics() for the current max SV limit on Septentrio receivers from the AsteRx1 through to the PolaRx3* and AsteRx3* series

2010 Mar 29: added check for valid GPS nav message ToE at 00m 00s or 59m 44s in GPS_NAV_times_make_sense() and corresponding simplification for its return in qc_satellite_nav_update() when GPS nav message has ToW == 0

2010 Mar 26: updated IGS receiver/antenna designations up through 26 Mar 2010 entry

2010 Mar 23: the declaration of opt in functions calling rinex_hl() in out.c has been changed from a static uint4 non-zero value to just a uint4 non-zero value — because gcc executables on occasion with the static declaration change the value of opt to zero (i.e undefined) causing rinex_hl() to detect an invalid value and abort

2010 Mar 17

2010 Mar 17: change of compiler notation for Solaris Sparc 5.10 builds, which are now compiled with SunStudio 12.1 compilers

2010 Mar 15: modification of code in NetRS_ize_firmware() for parsing user-supplied firmware version for NetRS via -O.rv with non-RINEX input

2010 Mar 13: changes to obs_receiver_clock_offset() (reading of RINEX obs header line RCV CLOCK OFFS APPL): change to reading of applied flag to %hd from %d (%d was not working on Solaris Sparc and other big-endian builds), and better exit message when an applied value of 1 is encountered when using qc mode (e.g. +qc)

2010 Mar 4: modification of decompose_Trimble_0_7() to allow metadata extraction of old Trimble .dat with records 0 or 7 (+meta or +mds options), but still no reading capability for the observables

2010 Mar 2: update of igs_rx_designation[ ], IGS_receiver_designation(), extract_Trimble_rx_type(), and Trimble_rx_specifics() for the max SV limit on modern Trimble receivers from the 7400MSI through to the NetR8

2010 Feb 26: some minor code improvements to changes made to binex_observables_7f_03() (see 25 Feb 2010 entry)

2010 Feb 25: due to the changes introduced in recording anti-spoofing information on observables for L2C (see 3 Aug 2009 entry), the logic in binex_observables_7f_03() (outputting BINEX 0x7f-03) became problematical, e.g. leading to no C/A or P2 pseudoranges being stored when there is no anti-spoofing flag on the L1C/A phase; changes were made to make the logic more robust

check for DO_SNR in qc_satellite_obs_update() for whether to call store_compact_plot_data() for sn1, sn2, or sn5 (to prevent segmentation fault/bus error if using -sn option with +qc +plot)

2010 Feb 11: code additions to detect new Navcom Sapphire SF-3050 binary format (assuming the file or stream starts at the beginning of a valid SF-3050 message) and inform the user that this format cannot (yet) be read by teqc

addition of cases in window_OK() for Navman SiRF and NovAtel binary formats to also inform the user that these formats cannot (yet) be read by teqc

2010 Feb 10: (hopefully this doesn't cause too many problems:) new function radome() is now called in dump_metadata() (i.e. using +meta option) and obs_out_antenna_id() (RINEX obs out) to put the IGS radome code of "NONE" at the end of the antenna type field if all four of the following conditions occur: the option -O.rt is not being used, the antenna type field is less than 16 characters (i.e. there is no radome specified at the end), the input format is not RINEX (i.e. this is a translation operation), and teqc has not labeled the antenna type as "-Unknown-"

2010 Feb 9: added logic to shut off use of option -phc if input is not RINEX in process_input(); allowing -phc with non-RINEX is not a defined operation and may cause a segmentation fault

2010 Feb 8: a few more entries to extract_Trimble_ant_type()

2010 Feb 5: quite a bit of updating extract_Trimble_ant_type() (reading of Trimble 2-char antenna codes in .dat/.tgd records), mostly for antennae combinations with various radomes

2010 Feb 4: updated IGS receiver/antenna designations up through 3 Feb 2010 entry

2010 Feb 1: for reading Leica MDB format, the measurement engine version is now included when decoding record 4 (0x04) and 104 (0x68) as part of the receiver's firmware version; change to decompose_Leica_MDB_04() and decompose_Leica_MDB_68()

2010 Jan 29: decimation option -O.dec in now overloaded to allow, if needed, a decimation offset, i.e. -O.dec <new interval>[:<offset>]; this is mainly for use where the user wants something unusual, say, the original sampling interval is 0.01 seconds and the user want to decimate to every 0.07 seconds (which will not always lead to an epoch on the integer second), and the user wants flexibility as to which epoch starts the output and uses e.g. 0.01 -O.dec 0.07:-0.01; changes to struct modulo_decimation_info and the functions extract_modulo_decimation() and obs_epoch_check(); note: this can be extended to decimation in met epochs with -M.dec with analogous changes to met_epoch_check()

2010 Jan 28: updated IGS receiver/antenna designations up through 19 Jan 2010 entry

2010 Jan 27: increased the test value in dec_fmod() on fabs(f-y) for sample intervals < 1 second down to 5e-6 (from previous value of 1e-7) for correct decimation of 100-Hz data

2010 Jan 19: bug fix in Trimble_17_57h_0_obs() that resets the tracked SV constellation total to a reduced value when an invalid GPS or SBAS PRN is encountered (e.g. as with corrupted Trimble binary stream data)

reading of the optional 22-bit receiver clock offset value in BINEX 0x7f-05 in binex_7f_05_obs() changed from the incorrect extract_xNb() to extract_2cNb()

2010 Jan 11: update to Topcon_TPS_rM_obs() (for reading TPS/JPS [rM] message) to include the fractional (0.1 dBHz) part of the signal-to-noise now included in [rM]

correction to Topcon_TPS_rM_obs() (for reading TPS/JPS [rM] message) to correctly store the doppler values (which had not previously been stored in the obs struct correctly due to a coding error)

2010 Jan 6: correction to binex_7f_05_constellation() (for reading BINEX 0x7f-05) so that the SBAS PRN is adjusted by 100 for RINEX

2009 Dec 18: additional check added to obs_system_check(): if -O.s is not being used and no system filtering is being used (i.e. not using ±G, ±R, ±S or ±E) and if the current input specifies that that data is mixed ('M' in RINEX obs), then this is assumed to be correct and obs_system_check() is aborted

2009 Dec 14: -O.-obs and -M.-obs now work for raw-to-RINEX translation, requiring splitting off the new code in obs_types() to a new function called obs_drop() and additional logic in set_obs() and set_met_obs_out()

2009 Dec 11: when using the -tbin option, the tbin increment is now forced to be positive in tbin_init()

two new options, -O.-obs and -M.-obs for listing observables to be excluded on output, which should be used for only for RINEX-to-RINEX and in place of the usual -O.obs and -M.obs; the input observable list is modified at the end of non-renaming switch block in obs_types()

2009 Dec 10: call to obs_system_check() is now included in obs_out_standard_header() (rather than just prior to calling obs_out_standard_header() in a few locations)

for RINEX-to-RINEX obs filtering with changes made on 10 Nov 2009, the calls to obs_out_start(), rinex_out_end_of_header(), and (if the obs header start has not occurred) obs_out_standard_header() have to be suppressed in obs_out() — otherwise the reported start time in the obs header is set to be the default of 1 Jan 1980

2009 Dec 9: binary_OBS() modified so that a RINEX obs header comment is added if use TPS/JPS formats and using option -sv_reset

2009 Dec 7: cleanup of some old preprocessor blocks in trimble.c

2009 Dec 4: the standard deviation calculation in find_position() was changed to avoid taking the sqrt() of negative numbers — which can (though rarely) occur on little-endian processors (i.e. should be sqrt() of zero) but is handled gracefully on all little-endian compilations except with Borland for Windows; this change eliminates the rare, but possible, sqrt() of negative number cases showing up in certain qc full runs on Windows

2009 Dec 2: binex_7e_00_met() was modified to allow reading of BINEX 0x7e records with more than 1 byte of observables listed

as per suggestion by Topcon, GLONASS SVs with slot numbers duplicated in [NN] should be dropped; this required minor changes to decompose_Topcon_NN() and Topcon_TPS_constellation() and a major overhaul of Topcon_SI_NN_validation(), and sets duplicated slot numbers to 255 which are later rejected

2009 Nov 23: GPS_week_check() was modified to accept the test week value as a 4-byte signed integer (instead of the previous 2-byte unsigned integer)

2009 Nov 19: the state change of the boolean teq.any_initial_epoch is now managed from any_initial_epoch() instead of where any_initial_epoch() is called from

2009 Nov 18: cleanup of some test preprocessor logic blocks

start of code modifications for I/O normalization: stdout.h redone with associated changes in the code

2009 Nov 16: addition of Ashtech Z-max (GPS-only receiver) to Ashtech_rx_specifics() and Ashtech_snr()

finished with changes to -tbin functions — mainly tbin_init(), tbin_file(), and new tbin_set() started 27 Oct 2009 — to correctly reopen time-binned BINEX files with sorted nav messages which have time of clock which can jump around combined with GNSS and/or met observables which tend to have epochs that are time sequential

2009 Nov 13: slight change in the conditional logic of window_OK() (12 Nov 2009) so that +dX can be used alone with +qc

2009 Nov 12: addition of completion of window end by calling window_next_epoch() in any_initial_epoch() when -ne mask is in use

overhaul of conditional logic in window_OK() for the switch cases of non-ASCII formats in the "else if" block for not qc mode and/or files present: better conditions when using -ns, -ne, and/or +qc, in addition to the previous use of -st, -e, and/or ±dX; e.g. the new conditional logic allows +qc to be used with -ns and ±dX or with -ns and -ne on binary formats

the static int in adjust_week() to hold the GPS week in the last nav message was moved to the nav struct in rinex.h; this is now reset to zero in initialize() and in filename_loop() for second and subsequent files when extracting metadata

2009 Nov 10: changes to obs_out_standard_header(), obs_out_start(), obs_out_data(), process_rinex_obs(), and filename_loop() so that the RINEX obs header lines TIME OF FIRST OBS and END OF HEADER are not written out until the first data epoch of output is ready and the session start time is automatically forced to be equal to that epoch; tested for all combinations of raw and RINEX input with time windowing, file splicing, and data decimation, plus options +v and +mds

2009 Nov 9: addition of all BINEX 0x00 editing options to usage() for +help option

2009 Nov 6: function to convert string to uppercase, uppercase() now used at the start of all *_rx_specifics() functions

2009 Nov 5: modification to binex_to_rinex_hdr() so that BINEX 0x00 antenna type (field ID 0x17) and radome type (field ID 0x20) — if both are present — are merged for the 20-character RINEX antenna type field in ANT # / TYPE

modification to rinex_to_binex_hdr() to split a RINEX antenna type field in ANT # / TYPE into BINEX 0x00 antenna type (field ID 0x17) and, if the string is 20-characters in length, the radome type (field ID 0x20)

2009 Nov 4: addition of ProFlex 500 to list of receivers handled by Ashtech_rx_specifics() (same conditions as ProMark 500 for this function, as far as I know)

gross mean SNR on S1, S2, and S5 (if present) added to +qc stats: new sn_sum() called in qc_satellite_obs_update() and results are output in qc_short_report() also showing the total number of measurements used; for qc full, only measurements above or equal to the cutoff mask are used; for qc lite, all measurements are used

2009 Nov 3: reading of version 2 or 3 B-file in decompose_Ashtech_dld_B23_record() now reports a warning if the SV total in an epoch exceeds the current maximum channel setting and suggests to the user to use option -max_rx_ch to override

change to Ashtech_rx_specifics() to explicitly recast the receiver type name (regardless of source) to uppercase for IGS rx type consistency

addition of ProMark 500 to list of receivers handled by Ashtech_rx_specifics() (because it outputs "Ashtech" formats like the B/E/S filesets)

GNSS update for SBAS SV id handling in Ashtech_dld_3_constellation() (e.g.needed for ProMark 500 B-file)

case addition to external_data_string() to ignore certain strings in Ashtech D-file

decompose_Ashtech_SNV() modified to allow for restricted range of GLONASS slot numbers and allow for SBAS nav messages (for reading Ashtech E-file, R-file record 3, or U-file EREC record)

updated extract_Trimble_ant_type() to id Trimble's GNSS chokering antenna, TRM59800.80, as antenna code 'GQ'

2009 Oct 27: input format switch in binex_observables_7f_00() expanded to allow Trimble .dat/.tgd as input for BINEX 0x7f-00 as format ID = 2 — as could any other native format where SNR is in dBHz

additional logic in hdr_binex_out(), obs_binex_out(), nav_binex_out(), and anc_binex_out() for creating time-binned BINEX with -tbin so that BINEX output goes to files rather than stdout (note: nav_binex_out() still needs to be generalized to handle more than GPS nav messages)

first cut at changes to tbin_file() to have it reopen previously created files for appending when outputting BINEX

2009 Oct 26: with -tbin option, modifications to tbin_file() so that creation of RINEX nav files (for NAVSTAR GPS, GLONASS, SBAS, and potentially Galileo) and population of the nav messages in them are not restricted to the nav messages occurring in strict "time of clock" order in the input, i.e. if the time of clock goes back to a nav file already opened and closed, the file is reopened in append mode and the nav message is written into that RINEX nav file

rename of do_mask_decomp() function to list2mask(); removal of old unused code

new SV_limit() to handle setting of all -n_<system> options

2009 Oct 23: correction to met_out_obs_types() to correctly construct the second and subsequent # / TYPES OF OBSERV lines in RINEX met header when there are more than 9 met observables, as per the RINEX 2.11 specification

modification to met_out_data() to limit the number of met observables to 8 for the first RINEX met data line and to 10 on subsequent RINEX met data lines, as per the RINEX 2.11 specification

modification to rinex_met_data() so that it will correctly read RINEX met files with 9 or more met observables per epoch, as per the RINEX 2.11 specification

2009 Oct 22: more checks for null file pointers added to nav_native_to_RINEX_out() so that -tbin command line constructs like teqc -tbin 1d xxx +nav -,+ input will work

simplification of the master output switch in obs_filtering(), nav_filtering(), and met_filtering()

switch added to fp_settings() (which currently is for BINEX output only) to set file pointer to NULL if -tbin is being used

if/else if/else blocks for RINEX/BINEX/other file creation in tbin_file() changed to a switch construction

new epoch_decrement() function — the opposite of epoch_increment()

2009 Oct 21: function name change: tbin_file() was previously new_tbin_file()

in out_settings() there is now a conditional before setting any of the default RINEX outputs that time-binning (i.e. option -tbin) is not in use; e.g. this allows one to create time-binned GPS RINEX nav files or time-binned RINEX met files without time-binned RINEX obs files and without RINEX obs going to stdout

2009 Oct 20: change in Ashtech_rx_specifics() so that set_obs_obs_out() is only called if the input format is an Ashtech format (rather than the previous logic of "not RINEX") because Ashtech_rx_specifics() is called from BINEX() to set any necessary metadata fields if the input BINEX is from an Ashtech receiver

change in main() so that format_settings() is called if the input format is also BINEX

addition of BINEX format to first switch in format_settings()

setting of APPLY_USE_L2C_L2 when C2 observable is detected in obs_obs_type()

2009 Oct 19

2009 Oct 19: cleanup of test preprocessor logic

fix in bug in binex_7f_05_signal_map(): due to non-closure of comment on case 13 for L2C(M), case 14 for L2C(L) would not have been detected

2009 Oct 16: continuation of yesterday's cleanup on file pointer logic

minor cleanup in initialize() for Galileo nav message struct (essentially not used yet)

minor addition to implied_window_limit(): setting of Galileo nav message struct session start and end if input is a Galileo RINEX nav file(s) (not yet used)

2009 Oct 15: cleanup on file pointer logic to remove cases of testing of pointer as zero or non-zero integer and replace with explicit testing of (FILE *)NULL

2009 Oct 14: changes to usage() to improve some of the option descriptions with +help

2009 Oct 13: mod to epoch_order() so that case 1 output (obs or met epochs out of order) is suppressed by -warn or +quiet

2009 Oct 12: added more verbose error messaging to binex_7f_03_phase() when there appears to be a phase delta overflow in BINEX 0x7f-03

2009 Oct 9: addition of a new option, sv_reset, currently on by default (i.e. +sv_reset), that controls whether the resetting of the current SV count to zero will occur — as when encountering any 8-bit checksum error when reading Topcon TPS/Javad JPS formats in next_Topcon_record(); use -sv_reset to suppress the reset

removal of old null met file output FILE pointer tests at the beginning of decompose_NMEA_XDR(), decompose_Vaisala_0R0(), decompose_Vaisala_020c(), and decompose_NOAA_GSOS() — which appear to be no longer necessary and were preventing RINEX met file creation using the -tbin option when the met data is in various ASCII strings (SW)

2009 Oct 8: (at least temporarily) removing the resetting of the current SV count to zero when encountering any 8-bit checksum error when reading Topcon TPS/Javad JPS formats in next_Topcon_record()

2009 Oct 7: all failures to fopen() a specified filename for reading (i.e. 'r' mode), writing (i.e. 'w' or 'wt' mode), and appending (i.e. 'a' or 'at' mode) are now directed to fopen_failure() which reports the filename and mode; all cases immediately terminate teqc except for failures upon attempt to fopen for writing certain qc related files

when doing a metadata search (e.g. +mds, +meta), filename_loop() now calls implied_window_limit() at the beginning of the loop to obtain the end time limit of the file if the input is RINEX and it calls format_initialization() at the end of the loop

2009 Oct 6: change to the case in window_OK() for supplied file lists so that if metadata is being requested (e.g. options +meta, +mds) then implied ending window limits will be based are the first file in the supplied filename list (rather than the last file in the list as is needed with options such as RINEX file merging, +qc, etc.)

2009 Oct 2: change to allow update of last handled met epoch for all cases at the end of met_native_to_RINEX_out(); this eliminates earlier met epochs from showing up in RINEX met output

2009 Oct 1: change to obs_out_receiver_id() so that the a RINEX comment is output with the receiver serial number if the receiver ID number is supplied (i.e. -O.rn is used) or a RINEX comment is output with the receiver ID number if not supplied (in which case the serial number automatically becomes the receiver ID number in the RINEX obs header as before)

for reading external data ports in Topcon TPS/Javad JPS message [>>]: the allocation and memory coy of the NMEA data string in decompose_Topcon__g() into[ ] was reduced in size to eliminate the DOS end-of-line ASCII characters

for reading draft proposal of BINEX 0x7f-05, change to binex_7f_05_obs() and binex_7f_05_signal_map() requiring explicit knowledge of the GLONASS slot # to FCN mapping; if the FCN is unknown, the GLONASS phase for that SV cannot be recovered

suppression of output of unknown IGS designations for receiver and antenna/radome in IGS_receiver_designation() and IGS_antenna_designation() expanded to include +v (readability verification) and +mds (short metadata extraction)

2009 Sep 30: for reading Topcon TPS/Javad JPS format, a change to spew_Topcon_TPS_epoch() (resetting of the days static variable to zero when there is a current [RD] message) to deal with more irregular occurrences of [RD] messages in a sequence of data epochs

the switch that handles resets at the end of the main file loop in filename_loop() was expanded to handle the +v option; the navigation ToW epochs are also now reset in this switch

2009 Sep 29: correction to logic in binex_7f_05_obs() for reading data from the draft proposal of BINEX 0x7f-05; tested successfully on sample data from a Trimble NetR8 and a Topcon receiver

in obs_out_receiver_id(), suppression of rewriting of the receiver ID number with the receiver serial number if option -O.rn is used to set the receiver ID number

2009 Sep 28: updated IGS receiver/antenna designations up through 15 Sept 2009 entry

2009 Sep 11: all Notice and Error messages in rhead_all.c (e.g. rinex_version_type()) now have the offending filename included in the stderr output

experimental code added to rinex_end_of_header() (now blocked by preprocessor logic) which gets things a bit closer to having metadata extraction work on a list of RINEX files (does not have the last epoch time for the files after the first file in the list)

2009 Sep 10: updated IGS receiver/antenna designations up through 9 Sept 2009 entry

2009 Sep 9: correction to extract_2cNb(): zeroing out unwanted bits > N

for reading of draft BINEX 0x7f-05 in binex_7f_05_obs() added missing extraction of CNo LSBs from 5-byte reference range and corrected reading of wrong bit for detection of the 3-byte receiver clock offset value

2009 Sep 1: August 3 plan for L2 from L2C or P2: slight mod to binex_7f_05_obs() to bring reading of Trimble's draft proposal of BINEX 0x7f-05 into alignment with bit 2 of the loss-of-lock flag on L2

2009 Aug 31: updated extract_Trimble_ant_type() to id Trimble's GNSS chokering antenna, TRM59800.00, as antenna code 'G9'

modification to obs_epoch_check(): observation session interval is not computed unless the last epoch date is after the default of start of GPS time of 1 Jan 1980 (to fix new problem of the last epoch being set to 1 Jan 1980, but interval in RINEX header was based on that value and first valid epoch when time windowing — problem probably related to change made on 25 Apr 2009)

correction to qc ASCII timeplot bin calculation in qc_bin(), for example, to not yield empty columns if qc-ing N epochs and using N-1 columns in the timeplot (SW)

2009 Aug 28: clarified +help to differentiate between the 'compact' or 'compact2' plot files (which are in ASCII) and the qc ASCII "timeplot" (the quick overview of SV data and various statistics as a function of time) which shows up at the start of the qc short or full report

added in missing loss-of-lock (lli) detection to binex_7f_05_obs()

new l_7f05() for dealing with +smtt option for BINEX 0x7f-05 in binex_7f_05_obs() — but code needs to be generalized for GLONASS phase modification if -smtt is used and millisecond receiver offset are occurring (and the same is true for the older l1_adj(), l2_adj(), l1_7f02(), l2_7f02(), l1_7f03(), and l2_7f03() functions long in use) — yet another good argument as to why using -smtt to create RINEX is a bad idea

2009 Aug 27: debugging of extract_2cNb() for N > 32 (more than 4 bytes); tested for N= 39, 40, 41 and tested on big- and little-endian processors

some fine-tuning of binex_7f_05_obs(): GPS antispoofing flags, inclusion of the 2 LSBs of each SNR for signal-to-noise to 0.1 dBHz resolution, inclusion of the 0-9 SNR flag on phase value fields

2009 Aug 26: renamed set_obs_types() to be set_obs() (original name was redundant)

in set_obs_obs_out() default RINEX obs observables are now not locked down if the input format is BINEX (by setting RINEX_TYPES_OF_OBS bit) which allows call to set_obs() in decompose_binex_7f() to take effect (coding note: BINEX format as input is the exception to the rule as other native formats have their default observables list set in format_settings())

first pass of reading any BINEX 0x7f records in decompose_binex_7f() now has default set of observables set by set_obs() according to use (or not) of options +C2 and/or +L5

new extract_2cNb() for reading a 2-52 bit two's complement integer

new binex_7f_05_constellation(), binex_7f_05_obs(), and binex_7f_05_signal_map() for reading Trimble's draft BINEX 0x7f-05 record proposal for GNSS data

2009 Aug 25: binex_01_02_ephemeris() for reading Trimble's draft BINEX 0x01-02 record proposal for a GLONASS nav message

2009 Aug 21: August 3 plan for L2 from L2C or P2: new test data from Topcon and improved logic control by including new switching function Topcon_use() in decompose_Topcon_Pn(), decompose_Topcon_pn(), decompose_Topcon_nP(), decompose_Topcon_np(), decompose_Topcon_Dn(), decompose_Topcon_nd(), and decompose_Topcon_snr(); Topcon TPS/Javad JPS set up for both GPS and GLONASS

2009 Aug 20: August 3 plan for L2 from L2C or P2 now implemented for reading Topcon TPS/Javad JPS, but needs to be tested on a wide variety of message types; final code tested on all test samples of L2C data for BINEX 0x7f-03, Leica MDB record 0x77 (119), Topcon TPS with [3R], Trimble RT17 and RT27, and Septentrio SBF record 5944

2009 Aug 18: August 3 plan for L2 from L2C or P2 now fully implemented for reading Septentrio SBF records 4027 and 5944 with call to new SeptentrioBF_lli() from SeptentrioBF_4027_5944_obs() for handling bit 2 on the "loss-of-lock" flag

2009 Aug 17: for reading Ashtech B-file format, Ashtech_dld_3_constellation() was modified so that SV ids in the B-file of a receiver that is not capable of tracking GLONASS with an id value greater than 32 and converted to a GPS PRN value of id-32; this was found to fix data from an Z-Xtreme receiver reporting an id of "33" to be from GPS PRN#1

2009 Aug 6: August 3 plan for L2 from L2C or P2 implemented for reading BINEX 0x7f-03 in binex_7f_03_obs()

2009 Aug 5: cleanup: now unneeded variable in function call of extract_Trimble_antenna_height() was removed

some minor rewording of some +help options

expansion of reading Topcon TPS/Javad JPS [rM] for L5 in Topcon_TPS_rM_obs()

August 3 plan for L2 from L2C or P2 implemented for reading Topcon TPS/Javad JPS [rM] in Topcon_TPS_rM_obs(), reading Trimble RT17 (either .dat record 17 or stream 0x57-0) in Trimble_17_57h_0_obs(), and reading Septentrio SBF records 4027 and 5944 in SeptentrioBF_signal_map() (though bit 2 on L2(L2C) using +C2 is set and should not be)

modification in logic for detecting bad PRNs for GPS and SBAS SVs in reading Trimble RT17 records in Trimble_17_57h_0_constellation()

2009 Aug 4: August 3 plan for L2 from L2C or P2 implemented for reading Leica MDB 0x78 (120) in Leica_MDB_78_obs() and for reading Trimble RT27 (either .dat record 27 or stream 0x57-6) in Trimble_27_57h_6_signal_map() and removal of autosetting of +L2C_L2 in decompose_Trimble_27_57h_6()

updated IGS receiver/antenna designations up through 29 Jul 2009 entry

2009 Aug 3: current plan for implementing L2 from L2C:

  • using +C2 or -O.obs with C2: +L2C_L2 and -L2C_L2 are ignored; the L2 (and S2, D2) are based on L2(L2C) if present, based on L2(P2) otherwise
  • using -C2 and -O.obs w/o C2: +L2C_L2 or -L2C_L2 takes effect, allowing pure L2(L2C) or pure L2(P2), respectively; default would continue to be -L2C_L2, i.e. RINEX L2 (and S2, D2) based on L2(P2)
implemented for reading Leica MDB record 0x77 (119)

2009 July 29: for reading BINEX 0x00, added a test in decompose_binex_00() when encountering field ID = 0x0f for a 4-character ID that if the required length byte = 0x04 is missing, then it is inserted prior to calling extract_binex_00_field() to extract the 4-character ID ASCII string

modification to binex_to_rinex_hdr() — for population of BINEX metadata struct to nearest equivalent in RINEX metadata struct — so that the station name, monument name, or reference point name if present are used to populate the RINEX marker name if the BINEX marker name is not present; likewise, the station number, monument number, or reference point number if present are used to populate the RINEX marker number if the BINEX marker number is not present

2009 July 27: slightly modified the rejection criterion for Trimble .dat record 12 in decompose_Trimble_12()

modified extract_Trimble_antenna_height() (currently used for reading Trimble .dat record 16.3, 16.30, and 16.43) so that height codes of 'V', 'R', and '0' are used to extract the vertical antenna height, overriding any previous value unless the user is using or, and then if the code is '0' locking the antenna height at that value unless the antenna type is of an old Trimble antenna (with best effect to identify such)

2009 July 17: due to improvement changes started around 28 July 2008 to correctly capture the first epoch in the qc stats, the first epoch of the qc ASCII plots files has been the first epoch of data for a while now; this has been noted and the output value of START_TIME_MJD in all the plot files has been corrected with a change to open_qc_compact_plot_file()

2009 July 15: updated IGS receiver/antenna designations up through 13 Jul 2009 entry

2009 July 14: call to obs_allocate_summary('t') when using -O.sum option: after each set_obs_types() set of calls for GNSS observables in decompose_binex_7f() when reading BINEX as input and in binex_out_settings() when writing BINEX as output (not yet available with -O.sum ., but is planned for the future)

modification of rinex_header_element_check() and defines RINEX_ALL_OBS_HEADER, RINEX_MUST_HAVE_OBS_HEADER, and RINEX_OBS_HEADER_DONE in flags.h so that the RINEX obs header line WAVELENGTH FACT L1/2 is optional as specified in RINEX 2.11 (a change from 2.10)

2009 July 7: process_input() modified so that use of -O.sum s automatically switches to -O.sum e (i.e. output is assumed to be RINEX and summary will be at the end of the obs file) if the input is stdin or a native format

2009 July 6: dump_binary_config() renamed dump_any_final_result()

switch added to dump_any_final_result() to call obs_out_summary() when using -O.sum . with target file(s) input in a native format

added call to obs_allocate_summary() for observable type array index at end of format_settings() when using -O.sum . with target file(s) input in a native format

correction in obs_acquire_summary(): skip call to obs_summary() when there is no data for current observable and current SV

2009 July 2: re-arranging of various calls to obs_allocate_summary() and obs_summary(), plus introduction of new obs_acquire_summary(), so that any filtering is done before the observable counts are done; introduction of new -O.obs . which sends the observable summary to stdout or target file of +out

fixed two places in qc_satellite_obs_update() that were missing a test for whether the +L5 option was set (without one of these, if doing qc with +plot on L5 data and -L5, then a segmentation fault would result)

2009 July 1: finished overhaul of the SV summary struct for RINEX obs when using options -O.sum s or -O.sum e, plus associated changes in initialize(), obs_allocate_summary(), obs_summary(), and obs_out_summary() (and possibly where these were called from if there was a function prototype change); the changes now correctly deal with multiple satellite constellations and when there is more than 9 observables

updated IGS receiver/antenna designations up through 1 Jun 2009 entry

2009 June 29: skipping the SV sanity check in decompose_Ashtech_dld_B23_record() when reading Ashtech B-file (version 2 or 3): now finds repeated SVs in an epoch, but does not skip the epoch

2009 June 22: added the current filename to the terminate() calls in time.c

2009 June 19: at end of obs_out_start() a check was added to see if -O.e is being used and TIME OF LAST OBS not output yet in the RINEX obs header, and if both conditions are met then obs_out_end() is called

2009 June 15: some minor tweaking of the code that reads Trimble Standard Interface Protocol (TSIP) format, and adding an overload in rx_OK() so that -tr tsip_6f reads 0x6f data packets and ignores any 0x5a data packets

2009 June 9: removal of +CA_L1, -CA_L1, +L2C_L2, -L2C_L2 dependence in Trimble_27_57h_6_signal_map() so that translation of Trimble RT27 occurs like translation of Trimble RT17 and Trimble-produced BINEX; can easily go back to 20 May 2009 functionality by changing preprocessor definitions

2009 June 2: addition of counter in sampling_interval_increase() to report the possible number of missing epochs (assuming a correct and constant sampling interval is detected) reported with +meta output in dump_metadata(); may not yet work correctly on a RINEX obs file if the sampling interval is known (either in the header or using

2009 May 29: repositioning of the call for initialization of the current obs epoch in qc_file_reset() to after start_orbit_paths() (see 27 May 2009 entry)

addition of file name for the two error conditions in epoch_clock_sanity()

2009 May 28: added a switch case in obs_out() to reset certain flags to allow completion of -O.sum s option for input of a normal RINEX obs file with no additional operations (splicing, time windowing, decimation, SV or channel filtering, …) (see 26 May 2009 entry)

addition of tests for receiver type starting with "JPS" or "JNS" (i.e. Javad receiver) in auto-setting of receiver millisecond adjustment off in decompose_binex_7f() when reading BINEX 0x7f-00, 0x7f-02, or 0x7f-03; these are additions to the original list of checking for receiver type starting with "TPS", "Topcon", or "TOPCON" (i.e. Topcon receivers); specific receiver types may be added in the future

2009 May 27: added an initialization of the current obs epoch in qc_file_reset() — which seems to be necessary now when qc-ing certain data files where qc_file_reset() is getting called by qc_satellite_obs_update() when new_position() returns NEW_POSITION (i.e. a new position compared to what the qc started off with)

2009 May 26: addition of call to initialize_epoch() for the last observation epoch (which here would be the last observation epoch of the input after the first reading of the input) in special_processing() for the case of RINEX observation summary requested at the start of the RINEX obs (-O.sum s)

2009 May 20: fix of Trimble_27_57h_6_signal_map() so the options -CA_L1, +CA_L1, -L2C_L2, and +L2C_L2 work correctly for Trimble RT27 (.dat record 27 and stream 0x57-6) for extracting the appropriate doppler and SNR (see 11 June 2007 entry)

2009 May 19: differentiation between Topcon TPS and Javad JPS handling of SBAS in [rc] messages

code in next_BINEX_record() for mismatching checksums/CRCs now parallels that in cks_mismatch() for other formats with checksums/CRCs (see 8 May 2009 entry)

2009 May 18: a little preprocessor cleanup

2009 May 8: new cks_mismatch() to present a more unified message for checksum errors in various formats; now used for Ashtech R-file, U-file, and binary stream format; CMC binary; Leica MDB and LB2; Javad JPS; Motorola Oncore binary; NavCom binary; Rockwell Zodiac format; Septentrio SBF; Topcon TPS; Trimble binary stream format; u-blox binary format

correction to Trimble_27_57h_6_signal_map() for detected L5 data in Trimble's record 27/0x57-6 data (change of "block type" index for L5)

2009 May 7: reading of Topcon TPS/Javad JPS [==] event message in decompose_Topcon__e() was overhauled and the handling of event messages for internal [==] messages and external [XA] and [XB] messages is now handled by a new Topcon_event() function

2009 May 6: yet more overhaul of open_qc_compact_plot_file() and qc_plot_compact_data() so that only the traditional "COMPACT" format occurs with pure GPS data and a newer "COMPACT2" format occurs with any other GNSS combination

SV_id() modified so that it explicitly pads left with zero for an SV id number 1-9

added initialization of the new last and current plot list elements in qc_compact_file_allocation()

new +plot2 option to force "COMPACT2" plot file format if GPS-only data (this kicks in by default if the data is GNSS)

2009 May 5: added initialization of current plot list in plot_compact_current_epoch() after setting last plot list

added initialization of the new last and current plot list elements in qc_compact_file_allocation()

with these changes, only the few calls to init_compact_plot() in qc_missing_epochs() are now needed (i.e. a lot of code chaff has been removed, and the qc plot files are far more consistent between various builds)

overhaul of open_qc_compact_plot_file() for GNSS and to make it compatible with the new GNSS functionality in qc_plot_compact_data()

2009 May 4: changes to logic in same_compact_plot_list() for determining whether the full SV list should be printed in a given COMPACT plot file or whether to use -1 to mean "same as the last list"

scheme added to qc_plot_compact_data() for dealing with the SV id numbers of Galileo and SBAS SVs

2009 May 3: initialization of specific COMPACT plot files (+qc with +plot) now done with call to new function init_compact_plot() in qc_start_obs_epoch() and qc_missing_epochs(); new function does not reinitialize the current "have" and "max" variables when called from qc_start_obs_epoch()

initialization the current "have" and "max" variables for each COMPACT plot file now done in open_qc_compact_plot_file() when the file is started

2009 May 1: due to changes on 25 Apr, a call to obs_last_data() needed to be added to obs_processing() when using a metadata extraction option (+mds, +meta, …) prior to the return when in the metadata test block

2009 Apr 29: introduction of a new boolean, teq.tbin.rinex_in, and a new function, tbin_autoset_out(), which is called by tbin_from_rinex(), so that the options +obs, +nav, or +met do not have to be used with the -tbin option if the input target files are RINEX (but if the input is more than one file, the the input files still all have to be of the same type)

reading of Topcon TPS/Javad JPS in next_Topcon_record() is now set to ignore [NO] and [NT] messages (for the time being)

2009 Apr 28: error corrected in decompose_Topcon_XAB() calling obs_epoch_with_gps_week() instead of event_epoch_with_gps_week() when there is a valid [RD] message

new Topcon_TPS_UTC_epoch() for when TPS/JPS [RD] message is in a UTC time base requiring a leap second adjustment to get GPS time; used in spew_Topcon_TPS_epoch() for [~~] observation epoch times and in and decompose_Topcon_XAB() for [XA] [XB] event epoch times

2009 Apr 27: more testing of the changes made on 25 Apr 2009 and some overdue code cleanup in obs_data()

identification of an unknown BINEX 0x00 field ID in decompose_binex_00() is now treated as a notice (suppressed with options -notice or +quiet)

leap_seconds() was modified so that the test epoch could be in GPS time or in UTC

2009 Apr 25: name change of qc_constellation() to qc_epoch() (more descriptive of what its function is) and change of internal conditionals to where it is called in obs_filtering()

change in where obs_last_epoch() is called for most data (now following obs_filtering()) so that the last epoch field is updated for all binary activities including qc of binary data

2009 Apr 24: move of p buffer creation for reading of Topcon TPS/Javad JPS [pc] [p1] [p2] [p3] [p5] messages from decompose_Topcon_pn() to first detection in Topcon_TPS_obs()

for reading of Topcon TPS/Javad JPS, added detection of receiver reference timebase of [RD] message in decompose_Topcon_RD(), to be applied in converting epoch time of [~~] message in spew_Topcon_TPS_epoch() or event time in [XA] or [XB] messages in decompose_Topcon_XAB(); e.g. this converts GLONASS or UTC(SU) time of those messages to GPS time which is the standard in teqc input/output

2009 Apr 23: completion of code refactoring to read Topcon TPS/Javad JPS, for reading of the following data messages:

    [RC] [R1] [R2] [R3] [R5]
    [rc] [r1] [r2] [r3] [r5]
         [1R] [2R] [3R] [5R]
         [1r] [2r] [3r] [5r]
    [CC] [C1] [C2] [C3] [C5]
    [cc] [c1] [c2] [c3] [c5]
    [PC] [P1] [P2] [P3] [P5]
    [pc] [p1] [p2] [p3] [p5]
    [CP] [1P] [2P] [3P] [5P]
    [cp] [1p] [2p] [3p] [5p]
    [DC] [D1] [D2] [D3] [D5]
         [1d] [2d] [3d] [5d]
    [EC] [E1] [E2] [E3] [E5]
    [CE] [1E] [2E] [3E] [5E]
    [FC] [F1] [F2] [F3] [F5]
all of these are in JPS, a lot are in TPS — obviously needs a lot of testing

change to ASCII_0R0() for reading Vaisala 0R0 ASCII met strings, to detect the "invalid data" indicator and substitute a large negative value if this occurs (will show up as -9999.9 in RINEX met)

2009 Apr 22: mod to decompose_Topcon_MF() to allow reading of Topcon TPS/Javad JPS format version "01.00" and "01.01"

mod to Topcon_SI_NN_validation(), Topcon_TPS_constellation(), Topcon_TPS_rM_constellation(), and Topcon_TPS_rM_obs() to recognize Galileo SV PRNs (definitely now needed for JPS [SI], hopefully not wrong for TPS [rM])

temporarily ignoring new JPS messages [EU], [NU], [WU], [EA], and [EN]

2009 Apr 21: fix of faulty formatting of error messages in decompose_Topcon_MF() (reading of Topcon TPS/Javad JPS) — never encountered before now because the format version has always been "01.00" until now

2009 Apr 15: better solution for GPS week rollover problem for Trimble record 27/0x57-6 data: decompose_Trimble_27_57h_6() back to original code, which calls obs_epoch_with_gps_week(), and then added cases for Trimble formats in switch of obs_epoch_with_gps_week() so that these formats are not routed to obs_epoch_no_gps_week(), i.e. if -week is not used, then we are trusting the GPS week value in epochs of record 27/0x57-6 data

2009 Apr 13: mod to decompose_Trimble_firmware() such that if the NP major number >= 10, then reported NP major number is modulo 10 and SP is set to zero (a guess based on actual case from a R7 GNSS)

mod to decompose_Trimble_27_57h_6() to suppress using the GPS week in Trimble's record 27/0x57-6 on the first epoch after a GPS week rollover so that the auto-increment of the GPS week in obs_epoch_no_gps_week(), event_epoch_no_gps_week(), and met_epoch_no_gps_week() all continue to work correctly together (when the -week option is not being used) as with past record 17/0x57-0 data which had no GPS week per epoch

2009 Apr 3: multipath rms results from a qc are now all output through a new function, qc_mp_sigma(), which reports the rms as usual if if it non-zero or reports "n/a" if it is exactly zero, the latter being consistent with no multipath rms for that particular combination

introduction of another counter during qc to keep track of SVs with no calculated orbits (currently all constellations except GPS), used in SV_discrepancies(), that more correctly shows the '+' indicator on the -dn and +dn lines when there is data from GPS plus other constellations (though the discrepancy counts and/or '+' are still only for GPS SVs for the time being)

addition in qc_SVs_present() to list all GLONASS SVs that were encountered in the qc run without frequency channel numbers

2009 Apr 2: all references to GLONASS FDMA frequency channel number now use a "fcn" as a variable, struct, or part of a function name (to make it easier to find them in the code)

old option -glonass_n — for inputting a filename that contain GLONASS SV slot to frequency channel numbers — is now -glonass_s2fcn

cleaned up +help, and added more explicit information about options for SV filtering

GLONASS_slot_vs_freq() renamed GLONASS_slot_2_fcn() and now takes a GLONASS slot # as an argument; a valid frequency channel number is now required for each requested slot #

a new ASCII time plot indicator, 'N', introduced == unknown GLONASS frequency channel number for this slot #

for GLONASS SVs, GLONASS_slot_2_fcn() is now called before doing any qc combination and if the current slot # has an unknown frequency number then this is reported and the new ASCII time plot indicator is set

2009 Mar 23

2009 Mar 23: Leica_GLONASS_nav() changed to explicitly use the leap second offset in any stored GLONASS nav message; sample MDB data from a 1200GG Pro since the start of 2009 is showing that the first GLONASS nav message in a file is a pre-1 Jan 2009 message with a GPS - UTC offset of 14 seconds (rather than post-31 Dec 2008 value of 15 seconds) and the current offset of 15 seconds for messages after the first

2009 Mar 20: new qc counter in filter_SV_duplicates_in_obs() that counts the number of duplicated SVs in non-repeated epochs; shown in the qc output as 'Obs w/ SV duplication'; ideally this count should be zero

2009 Mar 18: NetRS_ize_firmware() modified so that if a NetRS receiver type is found, then a firmware version specified with -O.rv or extracted from a RINEX obs input header is passed through unaffected (though this should try to reformat the input, if possible, to the preferred "A.B-C" firmware format)

slight correction to event_logger(): reset input string length — since the string length is now needed later — after eliminating non-ASCII and non-printable ASCII characters from the input string (see 14 Mar 2009 entry)

fix in qc_missing_epochs() to the conditions for qc lite code change (see 25 Feb 2009 entry) for when one or more navigation messages for an SV are present in the input, but are eliminated for some reason (e.g. ToE - ToW is too large) and there is no observation data for the SV

2009 Mar 17: a couple of additional message length checks in next_Ashtech_R_record() for reading an Ashtech R-file to better deal with corrupted data or (the equivalent) two or more R-files cat-ed together when false positives (i.e. valid message id, apparent message body, and valid checksum) occur — since reading the 8170-byte header in a cat-ed file after last improved parsing change (14 Mar 2009) but this lead to occasional false positives on very short pseudo-records (mainly 6, 9, and 23) leading to false week jumps

2009 Mar 16: new option sv_dup (by default, set to be -sv_dup == remove SV duplicates before RINEX obs output), with accompanying function filter_SV_duplicates_in_obs()

2009 Mar 14: for parsing of a corrupted Ashtech R-file, next_Ashtech_R_record() was modified to apply a single byte advance when a problem is detected and reading from a file input (i.e. not stdin)

event_logger() modified so that the function would work if passed a zero-length string

2009 Mar 12: a few small changes of where qc_indicator() is called and a small change to the qc_indicator() function itself for termination

2009 Mar 10: reading of an external ASCII string by decompose_ext_string() (currently only used for reading external ASCII strings from Trimble formats) was modified to look for a leading event time in seconds (in the GPS week) if (as usual) the supplied millisecond pointer is null (e.g. dat record 16.254) or (the new functionality) the supplied millisecond value is zero (stream record 0x57-3 from NetRS); reason for change: one case of NetRS firmware found where the event time is not logged in the 0x57-3 header as is had been in previous receivers, but the external event time is now showing up in ASCII prior to the event string (as in dat record 16.254); this change is needed in order to read met data logged by the NetRS in the Trimble stream format

for qc full, the addition of "Possible windowed obs" above the horizon and elevation mask to supplement the information in the alternate SWN summary line when windowing

2009 Mar 9: implementation of an old qc full indicator in SV_discrepancies() that will show in the -dn and +dn lines as a '+' where there is additional data below the elevation mask from one or more SVs (assuming no SV data discrepancies)

qc_final_obs_epoch() was modified to deal with the edge case where windowing is being used with qc, and the end of the window coincides with end of one or more missing epochs, but at least one valid epoch is after the window

2009 Mar 7: addition of new qc full counter in SV_discrepancies() that sums up the discrepancies for all epochs with any sort of data and shows this as "Missed observations" in the qc full report

2009 Mar 6: small fix to qc_missing_epochs() for the case where a position will be attempted but the requested missing epochs are at the beginning of a window with no data epochs yet, the "qc lite" block added 25 Feb 2009 needs to be skipped (since this is handled later in a "qc full" run)

2009 Mar 5: during a qc, repeated data epochs are now accounted for and counted with a new counter; this corrects the "Epochs w/ observations" value and the "hrs" value in the SUM line if there are any repeated epochs, and the count of repeated epochs is now reported in a new "Epochs repeated" value (which ideally should always be zero)

2009 Mar 4: correct (or at least much better) determination of the epoch of ephemeris in Trimble_28_55h_9_ephemeris() when reading Trimble dat record 28 or stream 0x55-9 for GLONASS nav message; values in translated RINEX GLONASS nav compared against the same messages collected locally by Trimble NetR8, Topcon Net-G3, and Ashtech GG24 and globally in the combined brdc GLONASS nav file from CDDIS

modified next_Topcon_record() to ignore the new TPS/JPS [RN] message, i.e. can be ignored for RINEX

for Trimble .dat/.tgd file, extract_Trimble_ant_type() was modified to recognize antenna "KG" as a Trimble GA510 antenna based on the entry in Trimble's antenna.ini file

2009 Mar 3: final memory deallocation in terminate() is now skipped for the Mac OSX gcc builds as well (see 5 Apr 2006 entry)

because it is optional in any RINEX 2.xx nav file, the outputting of the LEAP SECONDS header line in nav_out_standard_header() — used when creating any nav file during a translation — is now eliminated

2009 Mar 2: for qc full, a counter to sum up all SVs with complete data but below the elevation mask was added to qc_satellite_obs_update() (initialized at the beginning of qc_constellation() for each observation epoch) to correct the discrepancy counts in SV_discrepancies() that show up in the -dn and +dn lines; the qc reports for all previous teqc versions where not adjusting the counts for SVs with complete data and also below the elevation mask in these two qc full lines

2009 Feb 26: small addition to qc_missing_epochs() to cover the case when the antenna position has been found but there is are no nav messages for a specific SV so that the presentation in the qc ASCII time plot is identical to the situation when there is no antenna position found (25 Feb 2009)

new option, rx_ms_adjust, which, if on (e.g. +rx_ms_adjust, which is the default) proceeds with the millisecond adjustment of clock, phase, and/or pseudorange values depending on various manufacturers' formats to arrive at RINEX either with smooth time tags and jumpy phase/pseudoranges (+smtt, which is the current default) or with jumpy time tags and smooth phase/pseudoranges (-smtt); why needed: Topcon BINEX is already is in a form equivalent to +smtt, so no further millisecond adjustment is needed by teqc, so the state set by -rx_ms_adjust is needed, although this will automatically occur if the BINEX being read is determined to be from a Topcon receiver

2009 Feb 25: new logic in qc_missing_epochs() to emulate the qc ASCII time plot symbol for "SV above elev mask, but no data" for when the antenna position cannot be found (e.g. no navigation messages); corresponding new enum and symbol in qc.h

2009 Feb 17: default ToE lookback allowance in time from first observation epoch in nav_filtering() is changed from 1 hour (see 24 July 2008 entry) to 2 hours by default, and is now changeable using a new -ToE_dt option

2009 Feb 12: went back to the original conditional logic in Leica_MDB_77_obs() (for reading Leica MDB record 119), but: changed initial values in Leica_MDB_77_signal_map(), SeptentrioBF_signal_map(), and Trimble_27_57h_6_signal_map(), and switched to using the same conditional logic in SeptentrioBF_4027_5944_obs() (for reading SBF 4027 and 5944 records) and in Trimble_27_57h_6_obs() (for reading Trimble's RT27 data structure) as in Leica_MDB_77_obs()

2009 Feb 11: small change to NetRS_ize_firmware() to deal with a floating point issue when the firmware designation is being reformatted for a Trimble NetRS

fixed some conditional errors in Leica_MDB_77_obs() for reading Leica MDB record 119 (0x77) when compiled on (all or most) x86 platforms

using Leica MDB 119 sets the equivalent of the +CA_L1 option unless the -CA_L1 option is set by the user; the wording in the +help option was updated to reflect this

2009 Feb 4: a little re-crafting of the code in read_Ashtech_E_file() for reading an Ashtech E-file

2009 Jan 30: the portion of decompose_Trimble_firmware() that tries to reformat the receiver firmware notation for a Trimble NetRS in the "A.B-C" format has been stripped out and put into a new function, NetRS_ize_firmware(), which is called before the firmware metadata dump in dump_metadata() when using +meta and before outputting the firmware to a RINEX obs header in obs_out_receiver_id()

2009 Jan 28: decompose_Trimble_firmware() modified so the "A.B-C" format for displaying Trimble firmware versions is only used if the receiver type has "NETRS" in its name

2009 Jan 26: for reading of Topcon TPS/Javad JPS, modified next_Topcon_record() to ignore messages [GT], [SG], [VG], and [PS]

2009 Jan 23: for reading of Topcon TPS/Javad JPS, modified Topcon_SI_NN_validation() so that a request for memory allocation is skipped if the total number of satellites (nSats) is zero so that teqc does not prematurely terminate

2009 Jan 20: new set_rinex_set_X() for setting a flag across all RINEX header structs

consistent testing of whether the current leap second has been set by the user (using either -O.leap or -N.leap; see 2003 Mar 4) and, if not, setting with "found" value in a format and then calling set_rinex_set_X() with RINEX_LEAP_SECONDS

leap_seconds() modified so that a user set value from either -O.leap or -N.leap takes priority over the built-in table (which gets out of date any time a new leap second is inserted into UTC without a table update)

2009 Jan 16: original documentation for Leica MDB record 119 had a error for the units of doppler (see 31 Dec 2008 entry), but guess as to what the doppler unit really was was correct, so no change needed to Leica_MDB_77_obs(); reading of Leica MDB record 119 ready for beta testing

an absolute value limit of 1e4 lightseconds is now imposed on any pseudorange using rng_s_adj(), and a value of zero is returned if so, to eliminate totally off-scale values (as recently seen in a few Topcon TPS [RC] messages)

2009 Jan 12: cleaned up some termination messages (elimination of double program name prints)

updated IGS receiver/antenna designations up through 12 Jan 2009 entry

2009 Jan 8: moved extract_int(), extract_sub, and extract_real into general.c

2008 Dec 31: code added for reading Leica's new MDB record 119 for compact GNSS data — decompose_Leica_MDB_77(), Leica_MDB_77_constellation(), Leica_MDB_77_obs(), and Leica_MDB_77_signal_map() — and testing on one file from Leica; discrepancies with the extracted doppler values compared to the documentation

updated decompose_Leica_MDB_68() (record 104) for new Leica receiver types and decompose_Leica_MDB_6c() (record 108) for new Leica antenna types

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

implemented new +rx_state option which (like +qc, +verify, +mds and +meta) suppresses conversion of input to RINEX and outputs any detected receiver state parameters to stdout or redirected stdout if using +out; currently the only receiver state parameters are found in BINEX 0x7d-00 (see 8 Dec 2008 entry)

2008 Dec 8: adding reading of BINEX 0x7d-00 — receiver internal state parameters — with decomposed_binex_7d() (at the moment output goes to stderr or error file)

2008 Nov 25: initialization error for the on variable in set_obs_obs_out() and set_met_obs_out() corrected (otherwise sometimes leads to faulty GNSS or met observable lists being made and associated memory overflow; probably broken Oct 23)

2008 Nov 24: +qc fix: moved the call for qc_final_obs_epoch() from the end of rinex_obs() to special_processing() because the former location causes the code to treat the end of one file to the end of the window (which might be in one of the later files and by default it would be the last epoch in the last file) as a gap prematurely calling qc_missing_epochs() and trying to populate the plot files with a large number of invalid empty epochs

2008 Nov 21: binary encoded Trimble firmware fields are now directed to a single function, decompose_Trimble_firmware(), which attempts to create a string consistent with the series 4000 receivers, the NetRS nomenclature, and NetR5 and later receiver nomenclature (note: this doesn't attempt to recast the firmware string found in the Trimble .mes file yet)

2008 Nov 20: tried to improve the description of no A/S (antispoofing) flags in the +sym option in symbol_codes()

2008 Nov 18: correction to qc_SVs_present() to include the SV offset parameter when listing the SVs without observations ("SVs w/o OBS") — without the offset parameter, the PRNs of SBAS SVs are off by 119 (rather than the intended 100 like in RINEX) in this listing

2008 Nov 17: included case for GPS L5 in SeptentrioBF_signal_map() (accidentally left out in 7 Aug 2008)

mod to format_settings() so that use of +L5 option without -O.obs option during translation will automatically include RINEX L5, C5, and S5 in the observable list when translating Leica MDB, Septentrio Binary Format (SBF), TPS/JPS, or Trimble RT27

2008 Nov 14: reading of SBF 5949 for base station coordinates in decompose_SeptentrioBF_5949() if datum is WGS-84 or Galileo

2008 Nov 12: added a test in binary_OBS() to abort and return a non-zero result if the current observation epoch time is equal to the last observation epoch time; not sure if this should be the default (which would break the past behaviour to output epochs with duplicate times) or if this should be an option; added to test elimination of duplicate epochs in Trimble RT27 stream data

2008 Nov 7: verified that the current translation of Trimble's RT27 (.dat and stream formats) yields the same RINEX results (right or wrong) on Solaris Sparc and Solaris x86

2008 Nov 6: the dump of BINEX config options (e.g. +bcf, if reading BINEX) was changed in decompose_binex_00() so that the accumulated comment buffer is now deallocated upon detection of each BINEX 0x00 record if the input is stdin; this allows one to monitor a BINEX stream as stdin with +bcf without the comments accumulating in the output

2008 Nov 4: the original extract_sint6_2m16() and extract_uint6_2m16() (originally for certain TI-4100 and Rockwell Zodiac data fields) were generalized so that the increment scaling can be any 8-byte floating point number (rather than limited to the original 2^-16); the new functions are extract_sint6() and extract_uint6()

updated IGS receiver/antenna designations up through 3 Nov 2008 entry

completed first cut of reading Trimble RT27 stream records 0x55-9 and 0x57-6; testing is yielding suspicious results

2008 Oct 30: modified read_Trimble_mes_file() and read_Trimble_rec_file() to recognize Trimble .tgd (or .TGD) filename extensions so that a search for .mes or .rec files with the same filename prefix would be automatically performed

2008 Oct 29: leap_seconds() was updated to include the introduction of a positive leap second at the end of December 2008

2008 Oct 27: completed first cut of reading Trimble RT27 .dat record 27, plus .dat record 28 (GLONASS navigation message), and .dat record 29 (position info)

2008 Oct 23: Septentrio SBF records 5919 and 5949 quietly skipped

improvements on how SBF 5936 (user comment) is handled in decompose_SeptentrioBF_5936(): new maximum length (120 instead of 480 characters), skip is zero length, replace non-printable characters with whitespace, only call obs_native_to_RINEX_out() if RINEX header has already been output

removed the obfuscated second argument of set_obs_obs_out() and set_met_obs_out(); verified that the call to set_obs_obs_out() in Ashtech_rx_specifics() is required to avoid user confusion with regard to setting observable types for the different Ashtech receivers and/or formats (see also switch for set_obs_obs_out() in format_settings() which excludes Ashtech formats)

2008 Oct 22: restriction of the call to set_obs_obs_out() in Ashtech_rx_specifics() when the input format of the target file is not RINEX; this fixes the odd bug that occurs if the +C2, -P, and/or -L2 options are used when qc-ing RINEX with the # / TYPES OF OBSERV line preceding the REC # / TYPE / VERS line and the receiver type is identified as an Ashtech

2008 Oct 8: decompose_Leica_MDB_71() for reading of a Leica MDB point record (113 = 0x71) was modified so that: if the point content flag indicates that point data is available, but the status flag indicates a deleted point record or if the status flag indicates a valid point record but the point type flag indicates a temporary point record, then further reading of the point record is skipped; on several example files, this skips over point records which have bogus values for milliseconds of the week, which, when in previous versions of teqc (since at least 20 Apr 2007) was interpreted as valid when using the -week override, caused teqc to incorrectly increment the GPS week when a valid point record immediately followed an "invalid" point record ("invalid" meaning that it meets the above requirements for skipping)

2008 Oct 3: check of string overwrite capability added to the_details() (++details option), plus some other minor reworking of the function

2008 Oct 2

2008 Oct 1: reading of u-blox UBX will now skip quietly over GPS almanac record ID 0x0230

setting of receiver limits of maximum number of SVs that can be tracked and maximum number of channels (which is possibly now obsolete) — if not set explicitly by a user option — are now centralized in a new function set_rx_max()

updated IGS receiver/antenna designations up through 1 Oct 2008 entry

2008 Sept 30: build line and other final code tweaking for Vertex/ARM Gumstix build for testing

2008 Sept 29: set_types() was renamed to set_obs_types()

2008 Sept 25: minor correction to nav_out_data() so that all navigation message lines again have C-style 'e' replaced with Fortran-style 'D' for scientific notation in RINEX nav output (the minor error was probably introduced when putting in the output for the Galileo nav message on 8 Aug 2008 and the function was rewritten a bit to better optimize it)

the algorithm for correct_GPS_nav_times() was changed again (see 23 Sept 2008 entry): the RINEX requirement that the time of message transmission value in the GPS navigation message be possibly adjusted, i.e. adjust the transmission time of message by -604800 to refer to the reported week, if necessary requires an assumption about how far in the future a GPS navigation message might be sent compared to when it would apply; the previous algorithm (in effect since 9 Feb 1999) had assumed that the ToC and ToE had to be zero before an adjustment would be considered, which given a normal nav message refresh time of 2 hours meant that there was roughly only a 2-hour window of messages where this would be applied, limiting the advance transmission to be limited to only about 2 hours for a correct RINEX ToW value; the new algorithm expands this window to 2 days + 2 hours which should be flexible enough to capture and correct all the necessary ToW values

2008 Sept 23: changed warning of detection of old ConanBinary records 6, 8, or A to a "teqc can't do this" type of message; teqc is not designed to deal with these records

for reading Trimble .dat format, if record 5.2 or 6 or 12 is encountered, a non-zero value for the number of channels is required before resetting the maximum allowable number of SVs that can be tracked (or, in the case of 5.2, a non-zero value for the number of channels - 1); modification to decompose_Trimble_5(), decompose_Trimble_6(), and decompose_Trimble_12()

GPS nav ToW values for Leica formats are now estimated from various time tags modulo 30 seconds (time for rotation of all five 300-bit subframes) rather than modulo 6 seconds (time for one 300-bit subframe)

the logic in correct_GPS_nav_times() was changed when the local ToW is greater than 302400 seconds (i.e. ½ week): to not increment the global ToC and global ToE when the local ToC and local ToE were zero, nor increment the GPS week when both were zero; this change was made because the original logic is definitely not correct for nav messages which are now occurring at the end of Saturday but apply for the first epoch on Sunday; the original logic has been in the code about since the beginning, so either this was a bug that has gone unnoticed by years, or this new "fix" will introduce new problems to the RINEX nav output

2008 Sept 19: relabeling of constants and functions from "RT17" to "BSTR" (== "big-endian stream"), which is for Trimble's streamed format (which they don't have a name for), to avoid latter confusion between RT17 and RT27 data payloads, which Trimble uses to describe the data layout for both their little-endian .dat format records and their big-endian stream format records (note: this seemed better than "BCPM" for "binary cyclic printout mode" which is how Trimble had referred to their big-endian stream format in earlier years)

2008 Sept 18: reasonably stable code for the outputting of the GPS CA navigation 50-bps 300-bit subframes, now directed to stdout or target of +out option, with reported GPS times based on ToW of subframe - 6 seconds; untested with messages near GPS week rollover; appears to be problems with reporting of messages in SBF 4017

2008 Sept 17: forgot to increase size of default_type[ ] arrray in set_met_obs_out() when increasing for the Vaisala WXT510 observables (see 18 July 2008 entry) — now fixed (earlier code leads to crashes or incorrect header in RINEX MET if -M.obs is not being used, i.e. the code is using the default set of met observables)

2008 Sept 16: met_out_sensor_pos() and met_out_sensor_mod() were modified to include all new observables types in RINEX 2.11 for calling met_out_sensor_pos_xyzh() and met_out_sensor_mod_type() to populate the non-optional MET header fields SENSOR POS XYZ/H and SENSOR MOD/TYPE/ACC

2008 Sept 15: config_arg() was modified so that incomplete -O., +O., -N., +N., -M., +M., -B., and +B. options in a config file would get handled the same way as the same incomplete options on the command line

correction of minor indexing typo in qc_long_report() when calling qc_end_sn() and +L5 option is not being used (new code ready for L5 was not calling qc_end_sn() for L2 resulting in a missing L2 SNR histogram by elevation bin with default -L5)

2008 Sept 12: get_next_rinex_line() was modified so that the buffer into which the RINEX line is being read is preset with nulls (to eliminate any characters from a previous line)

2008 Sept 11: get_next_rinex_line() was modified so that the +relax option also replaces any non-printable ASCII character with a space (0x20)

obs_scan() — for parsing RINEX 1 and 2.xx data lines — was modified so that the +relax option replaces any loss-of-lock indicator in the line that is not a space or a value 0-7 with the value of 0 (added to be able to read quasi-RINEX from the old JPL translator srx that occasionally has a '*' in the loss-of-lock field)

rinex_constellation() — for parsing RINEX 1 and 2.xx epoch/SV lines — was modified so that the +relax option attempts to read an incorrectly formatted SV list with more than 12 SVs, i.e. all the SVs are listed at the end of the epoch/SV line

constellation_total() was modified for when reading RINEX and doing a qc and the number of listed SVs in the file is larger than expected

2008 Sept 10: a final few bugs ironed out for qc of L5 data with +L5 in reporting various stats in qc_long_report()

2008 Sept 9: added another option to dump the inverted bits of the GPS CA navigation 50-bps 300-bit subframes; both versions (raw as broadcast or inverted) include the 2 LSBs of the previous 30-bit word in the two MSBs of words 2-10

2008 Sept 8: added preliminary dump of raw GPS CA navigation 50-bps 300-bit subframes if reading Topcon [GD] message

2008 Sept 5: added dump of raw GPS CA navigation 50-bps 300-bit subframes if reading Trimble RT17 0x57-5 (as reported in 0x57-5, which are in a partially decoded state) with decompose_Trimble_m57h_5()

2008 Sept 4: the dump of BINEX config options (e.g. +bcf, if reading BINEX) was split off from dump_config() into a new dump_binex_config() which is also now called after reading each BINEX 0x00 record at the end of decompose_binex_00() if the input is stdin and if +bdf is being used — this allows one to monitor BINEX metadata in 0x00 in a stream input

2008 Sept 3: change to g_arg() when reading the -binex option to set the input format to FORMAT_IS_BINEX so that if BINEX is input as stdin then the later parsing understands the input to be BINEX format

2008 Sept 2: change to rinex_comment() to skip storing a RINEX obs comment if doing qc or a metadata extraction

another addition to rinex_comment() to eliminate duplicate comment lines from post-header areas in a RINEX obs file input

added missing conditionals for skipping new L5 plot files in qc_start_obs_epoch()

2008 Aug 22: more complete qc using L1 and L5 observables — though still plenty of tweaking needed in various summaries in the long report; tested on fake L5 data with real L1 data and on real GIOVE-B L1/L5 data; new +L5 option to turn on use and output of qc combinations involving L5 observables

2008 Aug 20: changed the condition in is_met_in_00_comment() for determining whether or not to override the extraction of a possible seconds-into-week value (sometimes used by Trimble firmware) from the external data string

2008 Aug 13: first preliminary qc using L1 and L5 observables

2008 Aug 11: some cleanup of details on reading for SBF 4002 message (Galileo ephemeris and clock); tested on simulated Galileo data supplied by Septentrio

added reading of SBF 4030 (Galileo NeQuick ionosphere model parameters) and 4031 (Galileo system time - UTC model), though, as with 4002, final implementation will depend on a RINEX 2.xx definition

initial start on adding qc of L5 observables for all constellations

2008 Aug 8: added reading for SBF 4002 message (Galileo ephemeris and clock)

began adding code for GPS and SBAS L5, Galileo E5a (L5), Galileo E6 (L6), Galileo E5b (L7) and Galileo E5a+b (L8)

began adding code modifications for handling Galileo navigation messages (even though there is no currently defined RINEX 2.xx for these)

eliminated preprocessor blocks for WatCom compiler (it was a pain in the neck from the start anyway)

2008 Aug 7: some generalization for reading SBF 4027 (maintaining consistency with the older 5944) so that any signal can occur in the type-1 or type-2 sub-blocks; new SeptentrioBF_signal_map() were all of this is sorted out; tested on AsteRx2 SBF file with GPS + GLONASS + SBAS and another file with GPS + Galileo (GIOVE-B) + SBAS

2008 Aug 6: first teqc translation of Galileo (GIOVE-B) data into RINEX 2.11 from Septentrio Binary Format collected with an AsteRx2 receiver (tracking E5a and L1BC carriers)

entry of a number of SBF record IDs into next_SeptentrioBF_record() — mostly for the raw navigation messages of GPS, GLONASS, SBAS, and Galileo — so that notice messages won't be reported when these records IDs are encountered

changed condition under which alternate qc summary line SWN would be output: now, any windowing condition (start, delta, and/or end time specified)

2008 Aug 5: merging of compute_observation_and_slips() and compute_multipath_rms() into new compute_gross_stats()

simplification of a several of the statistics counters, and removal of some unneeded ones

2008 Aug 4: two alternate sum line bugs fixed: (1) reporting the total hours data of collected data for both qc full and qc lite on the original SUM line, and (2) including the stats on the first epoch of a beginning or ending windowed period of time with no data

2008 Aug 1: the alternate qc summary line — proposed by users in Mar 2007 — is close to being 100% operational and kicks in automatically when (1) a time window is specified during the qc, (2) an antenna position is found successfully, and (3) there is an absence of epochs with data at the beginning and/or the end of the specified time window; the new alternate qc summary line is labeled "SWN" due to its dependence on windowing; this was accomplished by generalizing qc_missing_epochs() (originally intended just for data gaps with the start and end of the main data) and by adding some counters in the right places

the only change needed for logical consistency on the original "SUM" line is the meaning of the "hrs" value: this now means the number of hours of actual data for all cases of qc full runs

2008 July 30: implemented standardized approach to computing the GLONASS navigation parameter tk (message frame time) for Ashtech, Septentrio, and Topcon/Javad formats for RINEX GLONASS navigation messages

implemented standardized approach to compute the SBAS navigation parameter ToW (transmission time of message, for RINEX 2.11 in GPS seconds of the week); new adjust_SBAS_ToW_ToC() function

2008 July 29: first attempt to crack the alternate SUM line for qc full: if windowed, teqc would attempt to compute the number of missing observations (not quite successful yet …)

updated IGS receiver/antenna designations up through 28 July 2008 entry

2008 July 28: experimental removal of resetting the last epoch to the current epoch in qc_first_obs_epoch() — doing the reset seems to be the cause of several cases of the first observation epoch not being included in the qc analysis (the question is: what does this removal break?)

2008 July 25: the timecode algorithm in qc_constellation() was split off to its own function, qc_timecode(), for reuse in qc_short_report()

last two uses of rewind() were replaced with equivalent fseek(fp, OL, SEEK_SET)

2008 July 24: nav_filtering() was modified so that if a start time has not been specified (i.e. -st) then a navigation message is accepted if its time-of-clock (ToC) is within 1 hour earlier of the start of observation data (== default start time) once an initial observation epoch has been read

2008 July 23: reading of Septentrio Binary Format (SBF) was updated to include some of the new GNSS record blocks; the code was tested for GLONASS observation and navigation data extraction (might be some bugs with the GLONASS nav messages); still to be tested: Galileo observation data; still to be developed: extraction of Galileo navigation, ionosphere model, time model data

2008 July 22: AOA_snr() was modified so that the SNR of AOA TurboBinary or ConanBinary would output a minimum bounded by zero, thus eliminating the spurious "-3" values of very low SNR

cleanup of old #define statements, including eliminating unnecessary #define OLD_ATAN2 and #define OLD_REALLOC, where the former now seems be be only necessary for Borland builds (i.e. atan2(0, 0) yields a NaN error) and the latter (realloc() of a null pointer yields an error) is not necessary for any current build; tests for the modern atan2() and realloc() functionality are now built into the_details() (++details option)

special OS and compiler #define details should now be confined to only os.h

changed order of include files in include.h: reading of os.h now precedes types.h

for reading Septentrio Binary Format (SBF), the minimum allowed record ID (SBF "block number") was changed to be 4000 in next_SeptentrioBF_record() (to allow for new GNSS SBF record blocks)

2008 July 21: better fix to BINEX 0x7f-03 decoding function extract_xNb() which does not use the modulo operator

for Window builds: in order to correctly output binary data (e.g. BINEX), a change to the fopen() call was made for setting +out if +binex or +native in g_arg() occur earlier in the command options

2008 July 19: fix to BINEX 0x7f-03 encoding function append_xNb for Mac OSX — again due to gcc on OSX not having wraparound on the C bit shift operators >> and <<;

2008 July 18: calls to new_tbin_file() put into hdr_binex_out(), nav_binex_out(), obs_binex_out(), and anc_binex_out() for creating time-binned BINEX with the new -tbin option

set_met_obs_out() was modified so that the default set of RINEX met observables is now equivalent to using -M.obs pr+td+hr+ws+wd+ri+hi, i.e. the met observables of the Vaisala WXT510 met pack

2008 July 17: better fix to extract_xNb() than the one on 16 July 2008 — the same code can now be used everywhere; from a few tests, it looks like the encoding function append_xNb() is ok

2008 July 16: change to extract_xNb() for reading BINEX uNb quantities in 0x7f-03 records on OSX builds because the default gcc on Macs do not have wraparound on the C bit shift operators >> and <<

2008 July 15: first cut at implementing the -tbin and -ast options for creating time-binned RINEX from various target file inputs

2008 July 10: to make it easier to find current code debugging and code under development a cleanup of long-standing #if 1 preprocessor blocks of code was done by either making them a regular part of the code or by replacing with #if PREFERRED where PREFERRED is defined as 1; current code debugging and code under development left as #if 1

2008 July 9: nav_data() and rinex_read_failure() were changed to distinguish the RINEX nav SV/ToC/SVclock data line from the rest of the navigation message if there is a read or format error

with the +relax option, nav_data() now skips an incomplete or bogus RINEX nav SV/ToC/SVclock data line when it is at the end of the file

2008 July 7: help option (output by usage()) now displays options -ns (== set "next start" time) and -ne (== set "next end" time) which were put into the code 16 July 1999 but never officially included in the documentation

GPS_week_decomp() modified to also accept '-' (dash) and '_' (underscore) as acceptable delimiter characters in a date string for defining a GPS week (e.g. -week option) in addition to the original '/' (slash) and ':' (colon)

2008 July 2: modification to rinex_read_failure() so that if in relaxed read mode using +relax (i.e. teqc is trying to get past certain illegally formatted parts of a RINEX file being read) and the RINEX terminates prematurely, then teqc will not terminate immediately but will finish to the best of its ability; the usual consequence now when using +relax is that if a prematurely terminated obs epoch or nav message is at the end of the RINEX file, this incomplete obs epoch or nav message will be not be processed (e.g. output, part of metadata, qc-ed, etc.) but the RINEX file prior to this will be and teqc will terminate normally

correction of a typo in Topcon_GE_ephemeris() which was causing the antispoofing flag of an SV to be incorrectly determined (i.e. have been using the wrong uint1 variable since about May 2007)

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 almanac, 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 entry) 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 will 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: Leica_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 GPS 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 plus some other cleanup and mods

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 15

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 entry) 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 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 entry)

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 entry) — 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 entry); 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 entry)

2007 Aug 6: changed terminate() call in possible_wrong_GPS_week() so that the exiting message is not output if a GPS week discrepancy 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 Jun 25

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 18 June 2007 entry) 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 some possible windowing options)

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 27 Apr 2006 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 6 June 2007 entry)

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 31 Oct 2006 entry)

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 -,-,

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 1 Apr 2007 entry)

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

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

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 antispoofing 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 26

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 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 Jul 20

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 Jun 29

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

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 Windows and Linux 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 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 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.clk_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 entry)

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 with the original sample interval unless the original sample rate is greater than 500 Hz, though e.g. 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 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 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 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,, and (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 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 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, 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 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 antispoofing 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 (antispoofing 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 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 missing development notes from Oct 2003 - mid Dec 2003 due to the move of the UNAVCO Facility from UCAR to UNAVCO Inc.

2003 Aug 22: modification to out_settings() so that if not doing qc, metadata extraction, configuration extraction, or verification and setting a stdout file with +out but not +obs, +nav, or +met, then any single RINEX file pointer in use is set to be equal to what was specified with +out

2003 Aug 20: added a special preprocessor condition in collapsed_raw_ephemeris() for extracting the TGD value when compiling on AIX

2003 Aug 19: a couple of minor typos in usage() for the case HELP_DIAGNOSTICS were fixed

2003 Aug 8: went back to skipping over the bulk of the memory cleanup in terminate() for Microsoft and Linux builds

2003 Aug 6: changed qc output message "|qc - header|" in qc_position_out() to be "|qc - supplied|" if setting antenna position with -O.px or

2003 July 21: returned to skipping memory cleanup in Windows builds in terminate()

changed all instances of RINEX header flag checking with rinex.out_X to rinex.in_X in rinex_end_of_header() and all_header_records(), which probably goes back to code changes that were missed on 5 Mar 2002

2003 July 16: added code for TPS/JPS messages [CE], [1E], and [2E] (like original [EC], [E1], and [E2], but SNR stored in 1/4 dBHz units)

added code to ignore TPS internal messages [dC], [d1], and [d2]

2003 June 30: all cases of allocate() for strings were switched to using the SD() macro where possible multiplied by sizeof(sint1)

2003 June 27: epoch_passed_continuity() modified

extract_root() was modified to add an extra character to the space name allocation for qc plot filenames

2003 June 26: option +svo generalized to also order the SVs in the qc ASCII time plot

collapsed the epoch test for gaps and slips to a new function epoch_passed_continuity() in ion_obs(), pl_obs(), and mp_obs() and modified the code of the 25th to (hopefully) cover all situations where SV tracking of the receiver resumes prior to the qc computed rise time of that SV

2003 June 25: added storage of the SV set times in the qc QC_SV struct, which are computed in qc_satellite_elevation_crossing(); the SV set time is potentially used in ion_obs(), pl_obs(), and mp_obs() (to test for SV ion, "pseudorange - phase", and multipath gaps and slips) instead of the SV rise time when the last set time is later than the last rise time, i.e. the receiver seems to be tracking the SV after the SV has set below the horizon but before it has risen again above the horizon; this can be turned off by setting the define USE_SET_TIME to 0 in qc_obs.c and recompiling

added option -bins that can be used to set ion, multipath, and SNR bins in the qc (i.e. auto sets -ion_bins, -mp_bins, and -sn_bins all to the same value)

2003 June 11: added case for TPS internal use message [dC] to be skipped; added -warn condition for the stderr warning message that is printed when any new TPS/JPS message is found

changed all messages for all new or unknown records types for all formats to operate (now -warn suppression, some had been +diag) and similar message structure

2003 June 7: added the date stamp of BINEX 0x00 with +bcf output as a config comment (i.e. line starts with "#")

2003 June 6: first cut of new +bcf option to output BINEX 0x00 metadata as ASCII fields, which are also readable as normal config file input using -config; automatically handles some conversion between RINEX and BINEX metadata with rinex_to_binex_hdr() and binex_to_rinex_hdr()

updated IGS receiver, antenna, and radome designations to listing for 30 May 2003

2003 June 5: added switch cases in binex_observables_7f_00() to additionally allow translation of Ashtech R-file and U-file formats to BINEX

2003 June 4: corrected minor typo in g_arg() for rt_dynamic_obs case

constellation_total() in decompose_Leica_LB2_0c() now uses Leica_LB2_0c_constellation() rather than Leica_LB2_03_constellation()

constellation_total() in decompose_Leica_MDB_13() now uses Leica_MDB_13_constellation() rather than Leica_LB2_03_constellation()

constellation_total() in decompose_Leica_MDB_14() now uses Leica_MDB_14_constellation() rather than Leica_LB2_03_constellation()

2003 May 29: according to personal communication from Ashtech (Art Sauer), the Z18, G12, and GG24 all output the SNR in dBHz by default and the Z18 can only output SNR in dBHz; appropriate changes to Ashtech_rx_specifics() and Ashtech_snr() were made to reflect this to get the correct RINEX SNR 0-9 flag message in the OBS header (assuming a default setting in the G12 or GG24), though this requires the code to recognize the receiver type as ASHTECH Z18, ASHTECH G-XII, or ASHTECH GG24.

2003 May 27: added satellite system switch is qc_satellite_nav_update(), which seems to be necessary to avoid calling GPS NAV tests in GPS_NAV_times_make_sense() when doing a qc on a binary format which includes non-GPS navigation messages (e.g. GLONASS)

changed qc_auto_find_nav_files() to using allocate() and deallocate() for temporary namespace instead of using a pre-set buffer size of BUFSIZ bytes

for consistency with GPS and GLONASS, changed all names with "Transit" to "TRANSIT"

added cases for newer formats in qc_file_list() (for doing qc on non-RINEX input)

2003 May 23: minor text typo in nonmatching_GPS_IODC_IODE() fixed

all fopen() calls for writing and appending now use "wt" and "at" for Windows builds (Borland and Watcom)

slight modification of low dBHz mapping in snr_map(), plus corresponding RINEX OBS comment created in snr_comment()

2003 May 22: new Trimble_rx_specifics() which serves a similar role as Ashtech_rx_specifics(), i.e. identifying any receivers which now store SNR values as dBHz instead of the old Trimble AMU; test of receivers using dBHz has been removed from process_input() (2003 May 15) and now occurs in Ashtech() (calling Ashtech_rx_specifics()), Trimble() (calling Trimble_rx_specifics()), and BINEX() (calling Ashtech_rx_specifics() and Trimble_rx_specifics())

updated IGS receiver, antenna, and radome designations to listing for 19 May 2003

2003 May 20: Ashtech "ireg" SNR value is now converted to dBHz for Ashtech Z-12 data formats (using Ashtech's 16 Dec 1997 formulae) if the receiver type is recognized as ASHTECH Z-XII or ASHTECH Z-12; RINEX SNR 0-9 flag is mapped using new snr_map; old Ashtech_specifics() was changed to Ashtech_rx_specifics(), is now called after each possible finding of a receiver name in the Ashtech code, and called initially prior to processing any Ashtech format; part of the new role of Ashtech_rx_specifics() is to identify a Z-12 receiver for conversion of the ireg SNR to dBHz

The only Ashtech code now not using a Ashtech_snr() call in snr_map() (aside from a U-file, which always has the SNR as dBHz) is the code for B-file versions 1 and 2 — but this B-file code is not complete anyway.

2003 May 19: major changes for obtaining the RINEX SNR 0-9 flag for all formats of pertinent receivers with SNR in dBHz: now use new snr_map() which uses a scaling introduced for Leica's L2R2 code in Jan 2002; this includes Ashtech micro-Z, Trimble receivers after series 4000 (e.g. 4400, 4600, 4700, 4800, 5700, 7400), Leica LB2 and MDB formats, Javad JPS and Topcon TPS formats, CMC Allstar binary, and TI-4100 formats

2003 May 15: changed binex_7f_00_snr_map() to call Ashtech_snr() for Ashtech id, and moved test for micro-Z receiver type to process_input()

2003 May 12: changed the enum for NON_STANDARD_RINEX_LINE_LENGTH to NON_STANDARD_RINEX_LINE_ENDING, changed its corresponding message in rinex_read_failure()

added a case in rinex_read_warning() for the above enum, and added a test in get_next_rinex_line() if the end of file has been reached and if using +relax to report and fix this condition

2003 May 8: added a file pointer argument to scan_config_line() which now looks for a '#' character and interprets the rest of the line as a comment, but this only works in general if the config parameters are being read as a file, i.e. if the file is input as a command line string as `cat config` the first '#' character in such a file will interpreted as a filename

2003 May 6: file pointer argument of hdr_binex_out() call in window_OK() fixed

2003 Apr 29: Ashtech_U_snr() was generalized to be the new Ashtech_snr(), which handles both the original Ashtech ireg SNR values and the micro-Z ireg dBHz values, assuming that either the file format is a U-file (micro-Z only) or the receiver type is identified as ASHTECH UZ-12 or ASHTECH MICROZ; this new function now does all the RINEX SNR 0-9 flag mapping for Ashtech formats

2003 Apr 23: increased the default SV tracking maximum for Javad JPS/Topcon TPS receivers from 18 to 20

2003 Apr 21: new_fmod() did not work correctly if the y argument was less than 1; a new function, dec_fmod(), replaces it (since this is only used in sample decimation) and hopefully fixes the problem (tested OK on Solaris Sparc and Linux x86)

2003 Apr 16: Ashtech_MBEN_snr() should now only attempt to convert Ashtech MBEN SNR values to dBHz when the receiver is recognized as a Z-12

2003 Mar 31: fix of Ashtech_phase() to get the correct byte from MBEN record for converting to the RINEX SNR 0-9 flag (should be OK except can't check the L2-codeless block — missing documentation)

2003 Mar 24: fix of Topcon TPS/Javad JPS format reader to deal with "NaN" values for GLONASS slot numbers in [NN] message and constrain GPS PRN to be 1- 32 (i.e. disallow GPS PRN 33-37); also limited the number of channels in for reading this format to be max of 32 (see definition of typedef struct Javad_details)

2003 Mar 12: next_Ashtech_stream_record() was modified to not assume 2 spare bytes in MCA, MPC, etc. records prior to checksum (as incorrectly described in some Ashtech documentation) which allowed for correct extraction of P2 smoothing correction

qc indicator change: 'a' indicates C/A and L1 with antispoofing on, 'c' indicates C/A and L1 with antispoofing off or not known, ',' indicates C/A only with antispoofing on, '.' indicates C/A only with antispoofing off or not known

2003 Mar 11: obs_interval() needed another little fix

2003 Mar 7: first working cut for Topcon TPS/Javad JPS format reader for both big- and little-endian processors (last major bug on this was the multi-byte integer "NaN" values in little-endian)

2003 Mar 4: the leap second offset (GPS to UTC) is now treated as a state variable like the current GPS week value; e.g. setting either O.leap or N.leap sets the other to the same value and during translation of a raw data format encountering the leap second offset sets this state variable unless otherwise overridden by the user using O.leap or N.leap

2003 Feb 6: obs_interval() was modified slightly to skip over a RINEX OBS header with a zero value in the INTERVAL field if it is being overwritten with rather than aborting.

2003 Jan 14: added two new data indicators for the qc for C/A pseudorange (RINEX C1) being the only observable for an SV in a epoch: 'a' indicates antispoofing on, 'c' indicates antispoofing off or not known

2003 Jan 13: changed the conditional test in nav_out_delta_UTC() for reversing UTC model parameters A0 and A1 to be if fabs(A0) < fabs(A1) and fabs(A1) >= 2^-30 or if 0 == fabs(A1) and fabs(A0) < 2^-30 (this will fail when valid A0 and A1 are A0 = 0 and A1 >= 2^-30, though this situation should be rare)

2002 Dec 16: for Ashtech U-file data mode 7: added check in decompose_Ashtech_U_V7() to skip record if spare bit is set (as suggested in documentation), and added check in Ashtech_U_V7_obs() to insert RINEX OBS comment stating smoothing condition of pseudoranges

2002 Dec 5: in nav_processing(), a special check for the GPS week was introduced for ConanBinary ephemeris records

2002 Dec 3: in NMEA_XDR_met(), a test was added prior to the normal strtok() for the sensor ID field to allow for a zero-character sensor ID field

a bypass of obs_epoch_check() for the initial epoch of ConanBinary in binary_OBS() was introduced

2002 Nov 7: yet another code tweak in obs_epoch_check() for data decimation

2002 Nov 1: solution for first character of project field in YREC of Ashtech micro-Z U-file format (sometimes printable and sometimes not)

2002 Oct 31: new documentation from Ashtech for micro-Z U-file indicates that the operator field of the YREC now contains binary information; no clue on non-printable characters in project field of YREC

2002 Oct 24: Ashtech micro-Z U-file for "data mode 7" completed, though it does not account for occasional non-printing characters that are now showing up in the U-file YREC-record and then are put into the RINEX OBS or MET header; fixed a bug in the extraction of the operator information from the YREC record

added decoding for Leica MDB record 11 (0x0b)

2002 Oct 23: first cut at including translation of Ashtech micro-Z U-file for "data mode 7" using modified record 'BR\00\07' (compressed version of 'BR\00\09'); some odd problems

2002 July 9: additional logic in obs_processing() to deal with the metadata extraction for ConanBinary (see 2002 Mar 18)

2002 June 14: change to the math logic added on 2002 Apr 15 (test whether predicted GPS time of CMC record 23 is within 1 msec of 604800 seconds) because original math wouldn't work correctly on Intel processors (go figure)

2002 May 13: in met_out_sensor_mod_type() and met_out_sensor_pos_xyzh() went back to old code of allowing multiple elements per header

2002 May 8: changes to decompose_Leica_LB2_85() for better extraction of the site ID string (apparently, this can be shorter than 8 characters)

changed test in obs_out_start() to test obs.basic.rinex.opt_X for the RINEX_SESS_START condition (rather than set_X), which also required setting opt_X in obs_arg() for RINEX_SESS_START (see also 2001 Dec 10 entry)

2002 May 7: a bit more tweaking in obs_out_data() to deal with event flags 3 and 5

added case in obs_data() to allow cycle slip repair (event flag = 6) to have same epoch time as preceding epoch time (as in RINEX example file in Table A7: GPS Observation Data File)

2002 May 6: added kinematic boolean in obs_out_data() to (hopefully) correctly identify 1 cases

2002 Apr 29: change in obs_out_data() to reject any RINEX OBS data observable which does not fit into the F14.3 ASCII format without overflow; a message to stderr is reported for any observable thus rejected

addition to out_settings() to set the output file name to "stdout" for any output that is stdout

change from passing a pointer to FILE to FILE_INFO in obs_out_data(), met_out_data(), nav_out_data(), obs_native_to_RINEX_out(), met_native_to_RINEX_out(), and nav_native_to_RINEX_out() so that the file name can be accessed if needed

2002 Apr 23: slight change to CMC_Allstar_23_obs() for extraction of cycle slip detected flag in record 23 for RINEX LLI flag (previous code could interpret a "not ready" status as a cycle slip detection)

2002 Apr 22: change in rinex_version_type() to not reset the satellite system flag when splicing or editing the satellite system flag with RINEX files

2002 Apr 16: cleanup of the CMC code to remove the failed attempts used to try to eliminate the n x 175-ns clock resets between epochs (this gets the code looking more or less like the original CMC code, without all the extraneous preprocessor logic)

2002 Apr 15: change to decompose_CMC_Allstar_23 so that if the predicted GPS time of record 23 is 604799.9995 seconds or higher, this is interpreted as the epoch for the start of the next GPS week

2002 Apr 3: first successful compile and run of the code on Mac OSX, compiling with

    /usr/bin/cc -fwritable-strings
and all 2-dimensional char arrays had to be rewritten as:
    char **thing= (char *[ ]) { "...", "....", ".....", "....." };
(and related changes like extern char month[4][12] to extern char **month). The one 3-dimensional char array in ashtech.c was broken down into 3 2-dimensional char arrays. The final loader warnings are:
    /usr/bin/ld: warning unused multiple definitions of symbol _TI
    ti.o definition of _TI in section (__TEXT,__text)
    /usr/lib/libm.dylib(curses.o) unused definition of _TI
    /usr/bin/ld: warning unused multiple definitions of symbol _err
    "link editor" definition of _err in section (__DATA,__common)
    /usr/lib/libm.dylib(err.o) unused definition of _err
which are related to the teqc function TI() in ti.c and the struct FILE_INFO err in globals.c, both of which seem to end up with a leading underscore in the symbol table — which then conflict with other symbol names in the dynamic library modules curses.o and err.o.

The OSX build was then tested doing a translation of a Trimble DAT file to RINEX OBS amd NAV, and then a successful qc of the RINEX.

2002 Apr 2: added new function Ashtech_MBEN_snr() to test conversion of the ireg value in a Z-12 B-file to dBHz following the formulae in the Rex Dwyer 16 Dec 1997 Ashtech memo — for test purposes only!

first test compile on Mac OSX, but /usr/bin/cc fatally errors out on every multi-dimensioned character array in the code

2002 Mar 20: change of which integer counter is used in probable_XDR_sample_interval() to determine probable XDR sample interval for Ashtech XDR records in reading stream data

2002 Mar 18: added additional logic in binary_OBS() to not skip reading the observables of decimated epochs in ConanBinary, with the epoch skipping check now occurring in obs_processing() for ConanBinary (simple changes now for any other format using incremental changes per epoch like ConanBinary)

2002 Mar 15: the function decompose_Leica_LB2_85() had an invalid resetting of the flag; even though the LB2 0x85 may have an invalid time-of-week, there may be a correct setting from an earlier 0x01, 0x02, 0x03, or 0x0c message; this has been broken since 7 June 2001

2002 Mar 14

2002 Mar 14: possible incorrect pointer reference (compiler dependent) fixed in nav_out_ion_alpha() and nav_out_ion_beta()

2002 Mar 12: functions for MET extraction from Leica MDB record 14; hook functions for Leica MDB records 16 and 17 (no reading done)

updated IGS receiver, antenna, and radome designations to listing for 5 Mar 2002

minor cleanup for Borland, HP-UX, and IRIX compilation

2002 Mar 11: final cleanup from March 5 (I hope)

slight change for reading of Leica MDB record 8 antenna number in decompose_Leica_MDB_08(); and added reading of record 8 antenna type (name) in decompose_Leica_MDB_08() if sensor type is unknown/user defined (type = 0)

2002 Mar 8: collapsed main file loop in main() to new filename_loop()

more code collapse with new special_processing()

2002 Mar 7: more cleanup from March 5

2002 Mar 6: slight changes to process_rinex_obs_end(), process_rinex_nav_end(), and process_rinex_met_end() to account for +v, +meta, and splicing operations

major code scouring to get all the RINEX header reading functions working on the same logic

2002 Mar 5: collapsed the data tests at the end of process_rinex_obs(), process_rinex_nav(), and process_rinex_met() to three new functions: process_rinex_obs_end(), process_rinex_nav_end(), and process_rinex_met_end() (with some additional work, these could be collapsed down to one function, along with some code collapse with all_header_records() and rinex_v2_end_of_header())

delved into the long-dreaded unscrambling of the rinex.set_X and rinex.opt_X flags to replace with rinex.set_X, rinex.in_X, and rinex.out_X flags (this changes so much code that teqc may never work right again! ... well, ok, but it will take a while); still some residual rinex->opt_X logic in misc.c and teqc.c where opt_X has all flags unset back to 0 or one or more flags in it unset back to 0

2002 Mar 4: see 2001 Mar 14: also needed to change the call of obs_out() and met_out() to be:

    void (*rin_out)(FILE_INFO *, BSC_INFO *, int);

2002 Mar 1: major change in the structure of internal RINEX comment containment (in struct basic_info), necessitating call changes in rinex_comment(), nuke_comment(), and rinex_out_comment() and all other code locations using RINEX comments

explicit block added to rinex_comment() to disallow any additional comments to be added to RINEX GPS NAV, GLONASS NAV, GSSP NAV, or MET files after the END OF HEADER has been output (to totally eliminate the possibility of post-header comments during, say, splicing operations of these file types)

modification of nav_ion_alpha(), nav_out_ion_alpha() nav_ion_beta(), nav_out_ion_beta() nav_delta_UTC() and nav_out_delta_UTC() to allow for multiple ION ALPHA, ION BETA, and/or DELTA-UTC: A0,A1,T,W in RINEX GPS NAV headers

modification of nav_corr_to_system_time() and nav_out_corr_to_system_time() to allow for multiple CORR TO SYSTEM TIME in RINEX GLONASS and GSSP NAV headers

modification of rinex_leap_seconds() and rinex_out_leap_seconds() to still allow for multiple LEAP SECONDS in RINEX OBS headers (for the extremely rare cases where this might be applicable), but disallow in all RINEX NAV files after the header

2002 Feb 28: introduction of a new qc option +eep ("every epoch point-position") which does a pseudorange point-position at every possible epoch (i.e. enough SVs being tracked, etc.), and produces a normal qc short report; the original related options +eepx and +eepg continue to spew the point position solution to stdout which replaces the qc short report output; recommendation is to use +eep when doing a qc of an mobile antenna, such as would be found on LEO (low-Earth orbiting) platforms

added standard test in nav_processing() to eliminate duplicate navigation messages for RINEX NAV files, mainly to reduce duplicate messages during splicing operations

added deallocation of any in terminate() (which has been overlooked until this point)

2002 Feb 27: fairly extensive changes in logic to control the outputting of header lines for ION ALPHA, ION BETA, DELTA-UTC: A0,A1,T,W, LEAP SECONDS, CORR TO SYSTEM TIME, MARKER NAME, MARKER NUMBER, SENSOR MOD/TYPE/ACC, and SENSOR POS XYZ/H in all RINEX files, especially to get correctly formatted output during splicing of RINEX

2002 Feb 26: addition in obs_epoch_check() to better determine the nominal sampling interval in the presence of an early 1 millisecond clock reset, for sampling intervals down to 5 milliseconds (200 Hz)

added case for Trimble antenna "GZ" in extract_Trimble_ant_type() = "TRM41249.00" for Zephr Geodetic when decoding DAT files

2002 Feb 19: added test in obs_bs_flush() for non-zero header elements when outputting post-header comments (i.e. +phc) during splicing

2002 Feb 13: likely minor bug in the calculation of possible epoch during a qc in qc_short_report(), which would have caused the count to be one less than the real maximum for about 50% of the cases of non-steered receiver clocks (depending on receiver clock drift relative to real GPS time)

fixed some minor formatting problems in the qc_out.c functions for negative horizon and/or mask angles

2002 Feb 11: all memory cleanup in terminate() is bypassed for Borland and WatCom builds; Linux x86 build continues to just bypass the qc memory cleanup

change in rinex_comment() for the post-header comments (i.e. -phc) to skip comments only after there is both a RINEX header start and end

2002 Feb 8: changed the conditional test in nav_out_delta_UTC() for reversing UTC model parameters A0 and A1 to be if fabs(A0) < fabs(A1) and fabs(A1) >= 2^-30 or if 0 < fabs(A0) and fabs(A0) < 2^-30 (this will fail when valid A0 and A1 are A0 = 0 and A1 >= 2^-30, though this situation should be rare)

completion of prototype code for reading Leica MDB record 22 (0x16), and testing on big- and little-endian processors

added options +dump_ion and +dump_utc which send all changes in encountered instances of the ionosphere model or UTC model parameters, respectively, to stderr (or whatever +err might be reassigned to be)

2002 Feb 4: prototype code for reading Leica MDB records 20 (0x14) and 22 (0x16), though it is unclear from the documentation how to reconstruct the UTC model parameters A0 and A1 from record 22

2002 Feb 1: prototype code for reading Leica MDB records 13 (0x0d), 26 (0x1a), and 28 (0x1c) and hooks for records 20 (0x14) and 22 (0x16)

2002 Jan 31: changed format_settings() to include just phase and pseudorange (i.e. "l1+l2+ca+p1+p2") as default observables for R-file translation (like with the U-file translation)

2002 Jan 23: changed Leica_LB2_snr() to new RINEX SNR flag scheme submitted by Frank Pache (Leica-Geosystems), which affects the value used on LB2 and MBD translation; corresponding RINEX header comment in binary_OBS() changed

2002 Jan 16: testing of a bypass of free_qc() in the Borland build: Doug H. has a dataset that has a memory fault at the end of a qc run (on a Win2000 SP2) using the 15 Jan build, though the same dataset works OK on the UNAVCO development Win2000 SP2 machine.

2002 Jan 15: included a test for qc->plot in free_qc() prior to calling close_qc_plot() and free_qc_plot(), because DO_QC_PLOT_FILE is always automatically set when initialize_udv() is executed from initialize()

bypass of free_qc() in the Linux builds (still some mystery here)

With these changes, crash-free and correct qc runs occur on all the test cases supplied by Doug Hogarth (problems with previous Borland build) and Ole Hansen (problems with previous Linux x86 build).

2002 Jan 14: modification to nav_out_corr_to_system_time() to have it output the correction to system time in correct Fortran-ese D19.12

2002 Jan 11: added a test in GPS_SV_geocentric_position() to detect, report, and skip any GPS ephemeris with a semi-major axis <= 0

added a couple of missing deallocate() calls in free_qc() (i.e. ihp, qc->GLONASS), plus new free_qc_plot() and free_plot_file()

2002 Jan 10: returned to skipping the final memory deallocation in terminate() for Linux builds; this seems to eliminate the occasional memory fault caused by executing terminate() at the end of some qc runs

2002 Jan 9: changed the definition of round() to explicitly force each argument to be a 8-byte float (though these should have been, implicitly or otherwise, treated as 8-byte floats by the old definition), in the hopes of totally eliminating a repeat of the dynamically-linked DEC build problem reported by JPL with the 2001Nov28 beta(2) release

while at it, also changed definition of sign() to also explicitly force 8-byte floats

2002 Jan 4: added a test to check of valid L1 and L2 observables when doing the S1 and S2 qc stats in qc_satellite_obs_update()

2001 Dec 21: added teqc executable, version, and build output to the_details() function (which is accessed with the ++details option)

2001 Dec 14: added FILE_INFO * parameter to nav_processing() and any functions that call it

split off reading of data in nav_data() as a case in nav_processing()

changed return code in nav_filtering() when TRUE is returned by filter_system_in_nav()

moved RINEX_OUT flag from teq.main to teq.edit; added test for RINEX_OUT in rinex_version_type(); added test for BINEX_OUT or NATIVE_OUT in out_settings() before forcing a RINEX_OUT condition

2001 Dec 12: minor error in obs_types() on 7 Dec in that it would try to read one too many lines if the number of observables was 9

split off last portion of nav_processing() to be new nav_filtering(), to parallel code for RINEX OBS and MET

2001 Dec 11: included new code for Leica_LB2_snr() (computes RINEX SNR 0-9 flag for LB2 0x03, 0x0b, 0x0c and MDB 0x13, 0x14) based on email from Frank Pache at Leica, but it's "if"ed out pending verification from Frank

2001 Dec 10: included test in rinex_leap_seconds() that if a change in LEAP SECONDS (e.g. RINEX OBS file splicing) is detected with -phc option set, then the user is informed that the second LEAP SECONDS value is deleted

test in rinex_leap_seconds() to skip over this header field if it cannot be "fscan"ned and the RINEX file is OBS with just GPS (system == 'G') or is GPS NAV

additional test in rinex_version_type() to allow splicing of RINEX OBS files with SV filtering (e.g. -R) and system editing (i.e. -O.system) of the resulting output (e.g. splicing mixed SV systems, editing out GLONASS, and setting new system type to 'G' = GPS)

added test in obs_out_data() to see if the time of the first observation epoch matches that reported in TIME OF FIRST OBS in RINEX OBS file being output and inform user if there is not a match

added test in obs_out_start() to force TIME OF FIRST OBS in RINEX OBS file being output to match starting epoch of window when time windowing is being used but is not

modified decompose_Ashtech_U_Y() and decompose_Ashtech_U_VH() to extract the "NAV" portion of the firmware version (rather than the "BOOT" portion) of Ashtech U-file Y-records or VH-records

2001 Dec 7: modified obs_out_obs_types() and met_out_obs_types() to correctly output the # / TYPES OF OBSERV header lines in RINEX OBS and MET files if the number of observations > 9

collapsed reading of # / TYPES OF OBSERV header lines in obs_out_obs_types() and met_out_obs_types() to new obs_types() which now allows the number of observations in a RINEX OBS or MET file being read to be > 9

minor cleaning up of obs_type() function declaration in extract_types_list (to make consistent with that in obs_types())

2001 Dec 6: logic for detecting change of RINEX OBS header leap seconds in rinex_leap_seconds() was fixed (encountered, e.g., if splicing two RINEX files of mixed constellations, e.g. GPS + GLONASS)

added in-line header buffer in rinex_out_leap_seconds(), in case of the extremely rare occurrence of splicing two RINEX OBS files with differing leap seconds in the headers (splice just happens to span a leap second change)

corrected loop indexing in obs_obs_types() and met_obs_types() to correctly detect a change in ordering of RINEX OBS or MET observables (mostly for splicing)

added additional code in obs_obs_types() and met_obs_types() to correctly deal with a change in the number and/or type of RINEX OBS or MET observables when splicing

2001 Dec 5: removed some debugging comments to stderr that were in set_obs_obs_out() (which were put in around Nov 20)

2001 Dec 4: test function adjust_start_time() which tries to guess at the start time when doing decimation of native format data, included in binary_OBS() and binary_MET() prior to the any_initial_epoch() call which set the final windowing parameters, included in implied_window_limit() after extracting the start time of a RINEX OBS or MET file -> not needed if it is assumed that windowing operation takes place first, and then decimation

phase calculations in Leica_LB2_0c_obs() now include the user clock time of week - channel time base value - offset from channel time base value correction described in the Leica LB2 ICD for decoding record 0x0c

2001 Dec 3: added default receiver types for output to RINEX in format_settings(), though these do not conform to the specific IGS designations (because the specific receiver type is still unknown)

2001 Nov 29: changed variable n_samples in spew_AOA_TB_LC() from a char to an unsigned char

collapse of all static variable instances of meters_per_CA_chip, meters_per_P_chip, meters_per_L1_cycle, meters_per_L2_cycle, code_phase_to_meters, L1_to_L2 to global variables in aoa.c, ti.c, leica.c, cmc.c, and binex.c

2001 Nov 28: finished compiler warning cleaning for SGI IRIX build

added A0 and A1 test and swap if abs(A0) < abs(A1) in nav_out_delta_UTC() which will not only fix the occasional A0/A1 switching in some Trimble firmware, but will also allow a corrected A0/A1 if using teqc as a RINEX-to-RINEX filter on a preexisting RINEX NAV file; a notice message is sent to stderr if a swap occurs

2001 Nov 27: started compiler warning cleaning for SGI IRIX build

2001 Nov 26: finalized Ashtech_U_snr() for assigning the RINEX 0-9 flag to the Ashtech U-file SNR dBHz values

change to rinex_out_version_type() to output the latest RINEX version number (handled by teqc) for each RINEX file type in any RINEX-to-RINEX filtering (rather than version of original input file); does not effect original reported version with +meta or +v options

fixed function return types for filter_monument_number() and filter_monument_name()

2001 Nov 21: due to other logic changes, implied_window_limit() required another logical condition to allow delta windowing (+dX or -dX) to work without additional windowing options on reading RINEX

changed nulling of flags in process_input() to be clean_rinex_flags() instead, with eliminated the need to do the maximum test in constellation_array() put in place on 20 Nov, and (as a backup) put in a test for the satellite data array accessing in rinex_constellation_obs() before calling obs_scan() (though, if everything is OK, this shouldn't be needed)

2001 Nov 20: changed memory allocation in constellation_array() to use the maximum of the either the input or the output observation list (rather than the output list, though this is just a temporary fix until resolving the nulled flags problem introduced on 27 Aug 2001)

fixed data type indicator in call to obs_scan() to use the input data type rather than (incorrectly) the output data type

2001 Nov 19: generalized call to binex_hdr_message_00_field() to be the inverse of extract_binex_00_field()

corrected missing 2nd arg in using rin_out_standard_header() function pointer in rinex_v2_end_of_header()

2001 Nov 16: changed binex_hdr_message_00() to be more explicit about which of the remaining BINEX 0x00 fields were being skipped

2001 Nov 14: new fix to string_to_date() because the fix on 12 Nov caused a core dump if there wasn't a decimal point (jeez!)

test to skip any Ashtech U-file V-record that has an "adjusted week number" of zero (the phase and pseudorange data don't look reasonable anyway)

included checksum for Ashtech U-file V-record in next_Ashtech_U_record(); RINEX SNR 0-9 flag for V-record in Ashtech_U_V_obs()

2001 Nov 13: rollback of some debugging code for Ashtech U-file translation in next_Ashtech_U_record()

2001 Nov 12: assignment error in rinex_version_type() to basic->rinex.fhm_X used inclusive-or (|=) rather than direct assignment (=) which did not allow splicing situation to be detected in obs_out, nav_out, and met_out new switch logic

fix to string_to_date() to allow for a windowing string to end in a decimal point

test for positive RINEX OBS interval in obs_out_interval()

test whether same RINEX OBS interval has been output already in obs_interval()

change to comment for -phc option in obs_bs_flush(), and now uses the f2i() function

2001 Nov 2: added case for KZ in extract_Trimble_ant_type() to be "UNKNOWN EXTERNAL"

2001 Oct 16: switched order of reading UTC model parameters A0 and A1 for Trimble DAT record 15 in decompose_Trimble_15()

2001 Sep 13: added comment output in decompose_Trimble_19() for external, manual, and RS232 events if detected in Trimble DAT record 19 (event marker)

2001 Aug 28: first cut of translation for Ashtech U-file (still to go: record checksums, V-record SNRs, D-record)

2001 Aug 27: collapsed RINEX flag initialization into null_rinex_flags() and added a call to this function for all RINEX types in process_input() after any pre-run on a RINEX file (for decimation, windowing, etc.)

2001 Aug 22: reading of MDB records 2, 4, 8, 9, and 10 for RINEX metadata

2001 Aug 21: split of LB2 and MDB parsing logic, and establishment of autodetection of MDB file structure in id()

2001 July 31: minor error introduced on 12 June had basic->rinex.fhm_X being IOR-ed in rinex_version_type() before the pointer basic was assigned, which caused a memory fault on Linux systems when trying to read a RINEX file

2001 July 26: changed rinex_out_marker_name() so that the initial RINEX OBS (and MET) marker name lines use the string supplied by the option -win_mo so that is not also needed to in order to get a correct header

same type of change for rinex_out_marker_number(), to use string supplied by -win_mn so that is not also needed to be used

2001 July 25: minor bug fixes for compiling with Borland and WatCom

2001 July 24: removed some of the repetitive testing for each epoch in obs_out() by introducing some static booleans

added new "windowing" capability with options -win_mn and -win_mo[nument] (window on some monument number and/or monument name, respectively) both of which are followed by a character string; these only allow data for RINEX OBS when the supplied string exactly matches the initial characters of the current monument number (up to 20 characters) and/or monument name (up to 60 characters)

2001 July 9: reinstated code block on experimental Trimble DAT record 0 and 7 decode

exclusion of BINEX input from GPS week check in GPS_NAV_times_make_sense()

2001 June 18: replaced header_description[ ] with new rinex_header_label[ ] which uses obs_index[ ], nav_index[ ], and met_index[ ], new RINEX flag values (see flags.h), and new f2i() function; this frees up 6 bit flags for moving to RINEX version 2.20

2001 June 15: the isNaN() function is reduced to just a 1-byte test, which will eliminate all IEEE 754-1985 +-NaN, +-Inf, the "indeterminate" value, and many extremely large normalized floats with the -NaN_obs option

2001 June 14: tested isNaN() with -NaN_obs option on TurboBinary file containing a NaN observable on Solaris Sparc, Solaris x86, and Linux x86; the file for EISL send by Dave Stowers (JPL) doesn't seem to contain an Inf observable, so this can't be tested yet

2001 June 13: introduced a replacement function isNaN() to use in place of the standard isnan(), which will determine if the 8-byte quantity is a IEEE 754-1985 +-NaN, +-Inf, or indeterminate value (i.e. not -0, +0, or positive/negative normalized or denormalized floating point number)

2001 June 12: cleaning up of some RINEX flags in flags.h and which bit flags they control

2001 June 8: added calls to binary_MET() in decompose_Trimble_9() and decompose_binex_7e()

2001 June 7: for Leica LB2 and MDB format translation, changed approximate ToW to exclude record 0x85 by setting the ToW to be -1, and an initial setting of the ToW to -1; a value other than -1 is needed before an ephemeris is output, usually requiring a data record: this should correct the problem where ephemeris records were being output immediately after a 0x85 record, resulting in a approximate ToW value that was too small (by several hours) for some RINEX navigation messages

2001 June 6: added a new default set_types() for the Trimble download case (DAT format) in format_settings() which does not have L2-Doppler (RINEX D2) since DAT record 17 does not have this observable

major re-org of MET handling, to more closely parallel the procedures for OBS handling, with calls in RINEX met_data() and binary format routines to met_processing(), which then calls met_no_data() and met_filtering(), though some work still needs to be done to met_data() for windowing, decimation, etc. Part of this involved renaming some functions:

  • old constellation_processing() is now obs_processing()
  • old binary_ephemeris() is now nav_processing()
  • old met_processing() is now met_filtering(), with new met_processing() and met_no_data() functions added

added a BINEX exclusion in met_out_sensor_mod() and met_out_sensor_pos()

2001 June 4: fixes to obs_obs_types() and met_obs_types() to allow the options -O.rename_obs and -M.rename_obs to work again (though these options are still dangerous and should not be used unless you know what you are doing)

2001 June 1: change in id() to better automatically distinguish ASCII format RINEX and ARGO files from binary format files

minor fix in obs_arg() for O_def_wf to allow a setting of -O.def_wf 1 2

2001 May 30: for qc of "geostationary satellite payload" data, added a case in open_qc_compact_plot_file()

added an initialization loop in qc_compact_file_allocation() for the plot file data and flags, to prevent spurious values in the plot files when the total number of SVs being observed increases

2001 May 29: for Ashtech B-file translation, eliminated all cases of supplying a fake L2-Doppler (RINEX D2) from L1-Doppler

added new option, +rds, "reverse Doppler sign", which can be turned on to reverse the input Doppler sign upon output

2001 May 25: for CMC binary reading, in decompose_CMC_Allstar_23() eliminated the default setting of the sample interval to 1 second (needed when we were trying to use the clock drift, etc.), so now +meta will return the correct minimum sample interval if it is greater than 1 second

updated IGS rx/ant/dome designations to 27 Apr 2001 table

2001 May 21: minor changes to fp_settings() to further sort out the output file pointers for BINEX, allowing the user to use +out, +obs, +nav, +met in any combination

due to the WatCom compiler not recognizing cases on function names, had to change all the the *_mGFZi() names to *_mGFZ_i() (none of these are currently being used anyway)

2001 May 18: the algorithm for attempting to salvage corrupted Ashtech B-files was improved in next_Ashtech_dld_B23_record (which is still turned on with +Ashtech_B_file_adjust as before)

modified the conditions for setting the output file pointers for BINEX in out_settings(), though the logic still might not be right for call cases

2001 May 17: the algorithm for determining outliers in the linear system for the point-position was found to be unstable on Linux x86, and changes were made in find_position() to reset the mean closer to zero.

2001 May 16: limits for the orbital path fit window, qc->ws->t[ ], were not initialized and this was causing problems on Linux x86, so these are now set initially to zero after memory allocation in initialize_qc_ws()

2001 May 15: first cut for decoding Leica LB2 0x0f (using Leica System 400 Measurement DB Projekt GPS System 400 Version 2.8 2 Feb 2001) — which is an ephemeris record essentially like 0x88 — though this record designation is in conflict with Leica LB2 ICD, Version 1.3, Rev D, 17 Aug 2000 where 0x0f is for RTCM messages

2001 May 14: updated Leica_LB2_03_constellation() and Leica_LB2_03_obs() to account for Doppler data (based on Leica LB2 ICD, Version 1.3, Rev D, 17 Aug 2000)

change to Ashtech_BEN_block() to correctly extract the Doppler values by fixing the offset when pseudoranges are requested

first cut code for decoding Leica LB2 0x13 record (uncertain about the wavelength factor bits, though)

2001 May 11: raised maximum allowable number of SVs from 12 to 24 for Leica LB2 0x03 record in decompose_Leica_LB2_03()

correction of where to extract initial position block from Leica LB2 0x85 in decompose_Leica_LB2_85() (1-byte error in offset was probably introduced when switching over to the new extraction methods)

2001 May 10: some minor cleanup for Kernighan/Ritchie compiling on HU-UX

splitting off of RINEX startup in process_input() to be in separate RINEX() (with the plan to make this someday analogous to the layout of ARGO() and associated functions)

slight re-ordering of the memory deallocation in terminate(), which may have eliminated the crash/illegal instruction message that occurs sometimes on the Windows builds (e.g. Borland build with some qc runs); this also seems to eliminate the need to do the strange null character output to get the Linux build "unstuck" introduced on 31 Jan 2001

2001 May 9: changed Ashtech_lli_cleanup() to be lli_cleanup() (more of of a general utility)

first complete cut of decoding of Leica LB2 0x0c observation record

2001 May 8: added pseudorange_offset to pseudorange observables in Ashtech_R_23_obs() for Ashtech R-file translation, though it is unclear whether this is ever needed (i.e. needed if the receiver does not have clock steering)

changed system_time to recognize Windows 2000 OS case

2001 May 1: collapsed all turning on of any antispoofing bit-2 of the RINEX "LLI" flag on the non-phase (pseudoranges, doppler, SNR) observables in Ashtech_lli_cleanup

2001 Apr 24: cleanup of usage()

2001 Apr 10: change in main() to capture the return value of process_input() when using stdin, for the subsequent switch when doing qc mode

2001 Apr 5: fix in next_Ashtech_R_record() (reading Ashtech R-file) to do a test for record lengths for records 6 and 23 to prevent a memory overflow, and if file reading, a rewind of 1 byte if there is a bad record read (so the file pointer is only advanced by one byte from the failure attempt to the next attempt); included test for even length in Ashtech_cks16() prior to calling cks16_brief()

2001 Mar 16: change to initial parsing logic in next_Ashtech_stream_record() to allow for incomplete records prior to the first complete stream record (old logic read data in blocks of 7 bytes searching for something that matched "$.....," before starting)

2001 Mar 14: uncovered major bug lurking in all_header_records() (check for all non-optional header elements in various RINEX, and fill-in if possible from edit info): *rin_out was declared to be

    void (*rin_out)(FILE_INFO *, FILE *, int);

rather than

    void (*rin_out)(FILE_INFO *, BSC_INFO *, int);

with the call being

    rin_out(file, out.fp, basic->rinex.set_X & 0x00000001 << i);

rather than

    rin_out(file, basic, basic->rinex.set_X & 0x00000001 << i);

(Hard to guess how many weird problems this was occasionally causing, including a post-Oct 2000 segmentation fault in the situations where the target file is a RINEX NAV or MET file with an incomplete header, but is being correctly edited with header options — related to the logic changes made 11-16 Oct 2000 for adding optional header metadata to RINEX. This bug was introduced when the calls to obs_out, nav_out, and met_out where changed sometime in the past (10 Jan 2000?).)

2001 Feb 22: it appears that the slew correction for phase suggested by CMC in record 23 really screws up the RINEX L1 for high-precision processing, so we're back to the original non-slew and non-drift version of decompose_CMC_Allstar_23()

2001 Feb 15: added testing for Doppler data blocks in Leica_LB2_03_obs() (LB2 record ID 0x03) though this has not been tested and therefore it is not known whether the Doppler sign conforms to the RINEX specification

2001 Jan 31: by adding a print to stderr of a single null character just before exiting in terminate(), the mysterious "getting stuck" at the end of a qc mode of certain input files on Linux x86 seems to be eliminated; no idea if this will cure other mysterious reports of this happening

2001 Jan 16: slight logic change in new_position() to allow low numbers of SVs for the qc position code block

2001 Jan 5: correction for negative values in extract_sint3() (reading of 3-byte signed integers)

2001 Jan 3: for Rockwell Zodiac binary records, added header and data checksum verification to next_Rockwell_Zodiac_record()

completed collapse of reading of all primitive data types in all binary formats with the extract_*() functions originally developed for BINEX, with the addition of extract_sint6_2m16() and extract_uint6_2m16() (eliminating the old i6() function) needed for TI-4100 and Rockwell Zodiac formats

addition of +binex = option, which after reading any verified BINEX record outputs the record to out.fp without decomposing it (for cleaning dirty BINEX files)

2001 Jan 2: changed allocate() to accept additional boolean argument, which, if set to TRUE, the function would not terminate the program if unable to allocate memory and instead return FALSE

changed next_BINEX_record() to skip any BINEX record if unable to allocate sufficient memory for the record (probably due to a corrupted file and thus a bogus record length value)

2000 Dec 18: trial implementation (modifications to little_endian(), extract_real8(), and append_real8()) to deal with processors like the Strong Arm

added case for parsing Ashtech RS-232 stream $PASHR,ION record, though I don't have any documentation on the structure of this record

2000 Dec 13: minor fix to nav_out_data() to replace the C format exponential "e" with "D" in the GPS fit interval parameter when writing out RINEX NAV

2000 Dec 11: first modification to decomposition of CMC record 23 using the slew count (receiver must be operating in "time alignment mode"), though processing of the resultant RINEX needs to be tested in processing

2000 Dec 7: modification to Ashtech_R_receiver_header() (reading Ashtech R-file) to extract the session sampling interval

2000 Dec 4: modification to epoch_store() and obs_data() to read null epochs in a RINEX OBS file for event flags 2-5 (time tag is composed entirely of zero values, which is an invalid RINEX time tag) if +relax is used

fixed bug in read_ubnxi() to correctly read 4-byte BINEX ubnxi value

2000 Dec 1: modification to binex_crc() to not terminate when a BINEX record length appearing to need the MD5 checksum (which is not yet coded) is encountered

2000 Nov 29: modification to obs_out_data() to reset any RINEX SNR flag greater than 9 to the maximum value of 9 (rather than exiting), and modification to turbobinary_snr_0to9_map() to limit the SNR flag to a maximum of 9

2000 Nov 20: modification made in clock_jump_search() to account for the cases where decimation when the original sample interval is less than 1 second and initially the mod(epoch, decimation interval) != 0

2000 Nov 16: a workaround was implemented in next_Ashtech_R_file() for dealing with some situations with mixed GPS (record 23) and MET (record 6) data in Ashtech R-files, where the MET "event time" has a value greater than 604800 seconds (= number of seconds in a week)

generalization of decompose_Trimble_19() when reading Trimble DAT record 19, but events are still not logged anywhere (such as stderr, RINEX OBS file)

2000 Nov 15: completed initial reading capability for Ashtech DBEN RPC records with addition of decompose_Ashtech_DBN(), Ashtech_DBN_constellation(), and Ashtech_DBN_obs() and minor modifications elsewhere

2000 Nov 9: added decompose_Leica_LB2_10() for decoding of MET data in Leica LB2 record 0x10 (tilt data — if present — is not yet decoded, since there is no RINEX format for this)

2000 Nov 2: BINEX() and next_BINEX_record() have been generalized to dynamically allocate memory for each BINEX record (rather than relying on a pre-specified maximum); also, better re-try logic in the case of reading partial or corrupted BINEX records in files (still need a better mechanism for reading stdin)

2000 Nov 1: modification of all reconstructed L2 from BINEX 0x7f, so that the resulting float-point number is explicitly rounded to the nearest 0.0001 cycle value (and same for reconstructed L1 from BINEX 0x7f-01)

2000 Oct 31: final change of endian-ness and reversal flags, which does the final cleanup of the prototype code in the new Trimble_17_m57h_obs()

final bit flag changes from Trimble in new Trimble_17_m57h_obs() to detect whether L2 code obtained under encryption (assumed to be equivalent to antispoofing being on) and to distinguish between L1 pseudorange being C/A-code or P-code; tested on old data from the following Trimble receivers and firmware:

  • SLD: 3.12 3.22 3.24 3.25 3.26
  • ST: 3.25
  • STD: 3.25
  • SST: 3.25 4.10 4.11 4.30 4.53 4.57 4.64 4.81
  • Geodesist-P: 4.11 4.81

Changed rbew option to be r, though +r will only effect the endianness of output BINEX at the current time (since this is the only binary format known which can be big- or little-endian).

2000 Oct 30: final testing of binex_observables_7f_02() (observables to BINEX 0x7f-02) to resolve main differences with running on a Sparc system vs. an x86 system (e.g Intel Pentium II): currently there is about a 0.5% chance of a ±1/10000 L1-cycle difference for the delta between L1 and L2 as computed using these two different processors; same logic applied to binex_observables_7f_00() for delta between L1 and L2

2000 Oct 26: modification of calls to binex_crc() to deal with user-requested endian reversal of BINEX output using +rbew; endian-ness symmetry nows seems to be complete

2000 Oct 25: modification of binex_f_stx() to deal with user-requested endian reversal of BINEX output using +rbew

introduction of +GPS_t[ime] option, for outputting of receiver epochs and observables in GPS time, rather than receiver time; this is automatically set when using the +binex option, so that the resulting BINEX epochs and observables are in GPS time (which, for example, will make teqc-generated BINEX records 0x7f-02 consistent with what are generated by the Trimble 4700 SuomiNet firmware); Note: the case of RINEX to BINEX conversion, part of case 2 below, has not yet tackled the reverse conversion from receiver time to GPS time

2000 Oct 24: changed the BINEX record/subrecord reading/writing to deal with the following situations:

  • BINEX in, something else out
  • something else in, BINEX out
    • specified output record type(s)
    • default: output record type(s) fixed
    note: for RINEX to BINEX, the conversion from receiver time to GPS time for time tags and pseudorange observables has not yet been done
  • BINEX in, BINEX out
    • specified output record type(s)
    • default: output record type(s) equals input record type(s) (note: doesn't yet copy the exact same observable lists on an epoch-by-epoch basis, the output lists being controlled by the global default or user-specified (i.e. using -O.obs or -M.obs lists of observables)

2000 Oct 19: obsoleting of the +reverse option, which hasn't been necessary for years (endian-ness of processor is determined automatically by teqc in little_endian(), and endian-ness of native formats is pre-defined in format_endianness())

2000 Oct 18: first test of new Trimble_17_m57h_obs() for decoding Trimble DAT record 17 and RT17 record 57h using flag logic provided by Brian Frohring at Trimble on 28 Sept 2000; tested on files from 4700 and older data from ST, STD, SLD, SST, Geodesist-P receivers with firmware 3.12 through 4.81; only remaining issues seem to be

  • definitive test for whether L1(C/A) or L1(P1)
  • antispoofing status of SV

This function also makes use of the extract_*() functions developed for BINEX, which required a re-tooling of the design for endian-ness testing and status storing.

modification to BINEX_00_field_basis() to skip any memory allocation for any field length of zero (which apparently the DEC Alpha OSF1 doesn't like), although this really shouldn't occur (but does with the current Trimble 4700 BINEX firmware)

2000 Oct 17: addition of new GLONASS_slot_vs_freq(), and related modifications to qc_satellite_obs_update(), to better inform user of missing GLONASS RINEX NAV file, or slot vs. frequency number file input with -glonass_n option, when trying to do a qc on GLONASS data (this function really needs to be generalized for GSSP data as well as GLONASS if GSSP becomes dual-frequency, and needs to be SV specific)

obsoleting of the +dynamic option, which was only relevant for Trimble data files and could create RINEX files which were probably not compatible with most RINEX readers

2000 Oct 16: modification to Trimble_17_m57h_obs() to correctly extract P2 without requesting C1 and/or P1 when translating Trimble DAT (record 17) or RT17 (record 57h)

allowing -N.a to work for GPS RINEX-to-RINEX NAV cases where there is no ION ALPHA record in the header with modifications to nav_ion_alpha() and nav_out_ion_alpha(), with trigger in rinex_out_pgm_agency_date() after the required PGM / RUN BY / DATE record is output

allowing -N.b to work for GPS RINEX-to-RINEX NAV cases where there is no ION BETA record in the header with modifications to nav_ion_beta() and nav_out_ion_beta(), with trigger in rinex_out_pgm_agency_date() after the required PGM / RUN BY / DATE record is output

allowing -N.UTC to work for GPS RINEX-to-RINEX NAV cases where there is no DELTA-UTC: A0,A1,T,W record in the header with modifications to nav_delta_UTC() and nav_out_delta_UTC(), with trigger in rinex_out_pgm_agency_date() after the required PGM / RUN BY / DATE record is output

allowing -N.corr to work for GLONASS or GSSP RINEX-to-RINEX NAV cases where there is no CORR TO SYSTEM TIME record in the header with modifications to nav_corr_to_system_time() and nav_out_corr_to_system_time(), with trigger in rinex_out_pgm_agency_date() after the required PGM / RUN BY / DATE record is output

2000 Oct 13: allowing to work for RINEX-to-RINEX OBS cases where there is no INTERVAL record in the header with modifications to obs_interval() and obs_out_interval(), with trigger in obs_out_obs_types() after the required # / TYPES OF OBSERV record is output

extensive re-design for allowing -O.leap to work for RINEX-to-RINEX OBS cases where there is no LEAP SECONDS record in the header with modifications to rinex_leap_seconds() and rinex_out_leap_seconds(), with trigger in obs_out_obs_types() after the required # / TYPES OF OBSERV record is output; same for for allowing -N.leap to work for RINEX-to-RINEX NAV cases where there is no LEAP SECONDS record in the header, with trigger in rinex_out_pgm_agency_date() after the required PGM / RUN BY / DATE record is output

2000 Oct 12: more work on rinex_marker_number(), so that only first occurrence of MARKER NUMBER in a RINEX file is changed if or is used, with modifications to rinex_out_marker_number(), with trigger in rinex_out_marker_name() after the required MARKER NAME record is output

2000 Oct 11: initial work for allowing to work for RINEX-to-RINEX cases where there is no MARKER NUMBER record in the header (case(s) where MARKER NUMBER record(s) occurs after END OF HEADER needs clarification)

renamed open_rinex_files() to rinex_out_settings() and added logic to set MARKER NAME in both RINEX OBS and MET files if only or is set (same for MARKER NUMBER in both RINEX OBS and MET files if only or is set), as specified by RINEX version 2 specification (see Table A5)

2000 Oct 10: check for case in decompose_AOA_TB_ff() for a data termination in TurboBinary of repeated 0xff bytes, plus appropriate modifications in next_AOA_TurboBinary_record()

2000 Oct 9: all allocation of met observables with new set_met_obs_values(), including case for default set-up from BINEX 0x7e

2000 Oct 5: clean-up of testing cases in BINEX code, for implementation of BINEX records:

2000 Oct 3: collapse of code calling extract_types_list() and a few other calls into new set_types() function, generalized binex_out_settings() (had been binex_setting()), and modified decompose_binex_7f() and decompose_binex_7e() to set default set of RINEX OBS and MET observables upon reading BINEX 0x7f and 0x7e records if not already set elsewhere (basically, the latter removes the need to use -O.obs and -M.obs to get a default set of RINEX observables out of BINEX)

2000 Oct 2: slight modification to g_arg() and file_id() to correctly deal with a partial BINEX record at the beginning of a BINEX file when using the -binex option (to specify BINEX formatted data to be read); also a modification to main() and file_id() to make the logic for ARGO format and the -argo option work the same way

millisecond clock resets accounted for in BINEX 0x7f-02 to RINEX conversion

2000 Sept 29: implemented function GPS_curve_fit_interval() for remaining formats

slight modification to Trimble_17_m57h_obs() to extract observables S1 and S2 from Trimble RT17 57h data stored in "Concise Format"

2000 Sept 28: added function GPS_curve_fit_interval() to obtain the GSP SV curve fit interval (in hours) parameter for RINEX NAV given the 1-bit fit interval flag from subframe 1, the IODC, and some knowledge of whether Block I or II; implemented for conversion of Trimble formats

2000 Sept 25: modified obs_epoch_check() (yet again) to eliminate the case when decimating observation epochs, where doing the in-line computation for whether to skip the current epoch results in numerical fuzz; now the fuzz would have to be larger than 0.5 ms in order for the algorithm to fail, and hopefully this doesn't effect any of the other decimation cases

2000 Sept 20: added reset of to zero in AOA() and reset of file header flag to false in next_AOA_TurboBinary_record() for each TurboBinary file read

modification of collapsed_raw_ephemeris() to extract the 1-bit fit interval flag from subframe 2 word 10 of the GPS broadcast navigation message, but the conversion to hours for RINEX 2.10 NAV is uncertain

2000 Sept 19: modified get_next_Trimble_RS_232_record() (plus some minor tweaking of next_Trimble_RS_232_record()) to correctly deal with the -tr_s_jump option (only needed for VSAT data collected at Golden, CO by USGS) to fix the code that was added on 2000 June 28

2000 Sept 18: modified qc_short_report() to eliminate the epoch gaps in the calculation of the rate of receiver clock drift

2000 Sept 15: modified turbobinary_snr_0to9_map() to correctly map the TurboRogue volts signal per volts noise (SNR values) into the desired RINEX flag 0-9 range

2000 Aug 24: function round_metadata_date() created for adjusting the representation of dates with the metadata options +meta, +mds, etc. so that epochs like 2000 08 24 06:52:59.997988 will now be reported as

    2000 08 24 06:52:59.998 with +meta
    2000 08 24 06:53:00 with +mds

(previously, the rounded was done automatically with C fprintf(), sometimes resulting in date stamps like 2000 08 24 06:52:60)

2000 Aug 23: bug introduced on 11 Aug caused +v option to continue to output RINEX, but this was fixed by adding VERIFY case in open_rinex_files()

2000 Aug 22: Opps! major buglets found in arg_5hi_1d() which would not allow or correctly enter any start date set by (not exactly sure when this was introduced)

re-do of the logic for RINEX OBS header line TIME OF FIRST OBS, using the new set, opt, in, and out flags

2000 Aug 11: setting of RINEX_OUT flag at end of open_rinex_files() if any of the RINEX file pointers are not NULL (note: RINEX_OUT flag could probably be obsoleted now anyway, using the status of the individual RINEX file pointers instead)

2000 Aug 16: introduction of any_initial_epoch() function and calls in binary_OBS() and binary_MET() to collapse logic for establishing time windows

2000 Aug 15: slight reorg of cases in process_input() to correctly deal with qc mode of BINEX

2000 Aug 1: confirmation on CMC records 6 and 7, so these will no longer generate verbose messages to stderr, though no decoding of the data in 6 and 7 is attempted

2000 July 28: modification to decompose_TI_4100_GESAR_01() and GPS_week_decomp(), with additional introduction of usage_GPS_week(), to not abort if a faulty GPS week string is constructed from a corrupted file; modification to next_TI_4100_GESAR_record() for faulty or misidentified TI-4100 GESAR record = 1; changed firmware decomposition for GESAR record 1004 to divide 2-byte integer software version by 10

fix to extract_Trimble_rx_type() when receiver type = 1 (old code would cause a segmentation or memory fault)

2000 July 26: modification to decompose_NMEA_XDR() to deal more gracefully with improperly formated NMEA MET strings

2000 Jul 20

only builds for Solaris Sparc 2.3-2.7, Linux x86, and HP-UX 10.20 released!

2000 July 20: modification to obs_arg(), nav_arg(), and met_arg() to gracefully terminate if certain options are accessed with less the required fixed number of additional valid arguments

2000 July 7: modification to decompose_Leica_LB2_88() and obs_epoch_clock_adjustment() to correct the GPS week for the Sunday problem files from a subsystem MC1400, version 6.11, nav_software 6.10, receiver firmware 4.42 (collected by Glen Mattioli) -> requires at least one valid navigation message to occur before the first data record

2000 July 5: corrected offset in decompose_Leica_LB2_85() to correctly extract antenna position in LB2 0x85 record

2000 June 28: implemented a new parsing function for the Trimble RS-232 stream format, and added record decomposition for record 15h

fixed +mdjm for Ashtech RS-232 stream format (was missing the value for the last MET epoch)

2000 June 22: code fix to uint4_to_ubnxi(), to fix a bug for the code changes introduced on 2000 Apr 12; modified obs_out_standard_header() to find the correct number of leap seconds based on the first epoch when outputting a mixed constellation and there is no value set for the leap seconds

2000 June 20: added cases for identification of CMC message IDs 50, 114, 117, and 120, and allowed for variable length message ID "0"

2000 June 13: numerous modifications for reading of TurboBinary high-rate (up to 50 Hz) data (records 0x1a, 0xdb, 0xdc) to correct a number of problems

2000 June 12: modification to constellation_processing() to prevent the erroneous extra call to constellation_filtering() at the end of the function when reading 1-Hz LC TurboBinary

2000 May 31: removed calls to raw_iono_alpha() and raw_iono_beta() for formats using the raw 72-byte subframe 1-3 words 3-10 navigation message (TI-4100 GESAR record 9, ConanBinary EPH record, TurboBinary 0x65, and CMC Allstar message 22) since it appears that the 8 bytes designated for the ionospheric model parameters circa 1980 now are used for something else or contain junk

2000 May 16: included the case of Trimble antenna designation "E_" to map to "TRM33429.20+GP" in extract_Trimble_ant_type() for DAT record 16.27 (might be right, might be wrong)

2000 May 12: enhancement of +relax option for reading RINEX OBS and MET which allows epochs in the input to be nonsequential and only sequential epoch occur on output (modification to epoch_store(), obs_data(), and met_data()); the first encountered epoch upon input is the one that is used

2000 May 10: addition of option +mdjm which is like +mdj except that it also outputs the last MET epoch as well; and option -M.l, which can be used to set the last known MET epoch (both primarily for use with Jstream)

2000 May 8: modification of CMC translation with record 21 based on communication from Michel Gonthier at CMC, where the clock bias is adjusted by: bias(true) = bias(Message 21) - 0.82*2.9008...e-09 seconds/seconds (4.57/1575.42e6 = 2.9008...e-9), where the value of 0.82 was arrived at by trial and error to reduce the residual clock drift in the CA-L1 combination on a number of data files for different receivers/sites

2000 May 4: addition of the option -cmc_sin23 for skipping n initial record 23s from a CMC binary file (default = 0), to correct a problem of data collection apparently from the TDMACMC Jstream software which sometimes puts in an initial errant record 23 at the start of files; switched back to some original logic in Trimble_dat() which seems to correct a problem of incorrect record parsing when also decimating epoch (with -O.dec)

2000 Apr 12: modification to some of the BINEX functions to make them more compatible with the library put together by Doug Hunt (mainly a modification to append_uint3() and binex_append_mGFZI); also added a option to force a switch from native endianness to non-native endianness upon outputting BINEX (also analogous to the BINEX library)

2000 Mar 27: the option +lb2_fe was added for use with Leica LB2 format data, which forces teqc to encounter a 0xfe record (internal flash disk dump signature) before using any other records

2000 Mar 13: alpha-version of Ashtech R-file translation, for Ashtech Z-12 using data type 3, 6, and 23 ("TINYRANGER3") only (RINEX header metadata extraction not completed yet)

2000 Mar 9: tested big- and little-endian versions on Ashtech R-file, records 3 and 6, conversion to RINEX (identical conversion)

2000 Mar 8: conversion of Ashtech R-file record 3 to RINEX GPS NAV and record 6 with XDR MET info to RINEX MET; autodetection (I hope) of most types of Ashtech R-file (assuming the first bytes of the R-file have a receiver designation the same as listed in the latest IGS receiver/antenna table for RINEX names)

2000 Mar 7: removed RINEX version dependence when doing RINEX splicing (in rinex_version_type())

2000 Mar 6: prototype parsing of Ashtech R-file format, with records 3, 6, and 23

prototype decomposition of Trimble stream with MET3 data (0x57, type 3), with addition of decompose_Trimble_m57h_3() and option -tr sm

2000 Mar 3: RINEX MET observables limited to -9999.9 to 99999.9, to force a fit into a %7.1lf format

2000 Feb 29

2000 Feb 28: additional logic for translation of Ashtech download fileset where there is a E-file, but no S-file, for a possibly correct (or closer) value for starting GPS week, with the main modification being to decompose_Ashtech_dld_B_raw_nav() (still, there is no guarantee that the correct GPS week was selected, especially near week boundaries)

2000 Feb 25: test compilation of teqc code on HP-UX 10.20 and IBM AIX 4.1; some code clean-up for minor warnings reported by the Borland compiler; updated IGS receiver/antenna/dome designations to (27 Oct 1999); backup leap_second() function good through at least 31 Dec 2000, since there will be no UTC leap second applied at the end of June 2000.

2000 Feb 22: overhaul of file_id() and id() for slightly more robust identification of input files; overhaul of +v functionality so that the output corresponds with the user-specified of automatic format identification of the input format; added option +mdf for improved human readability of automatic format identification

switched to official stamping of RINEX 2.10

2000 Feb 21: de-coupling of format types, primary RINEX version numbers (1 and 2) (now in struct file_info, defined as a char array), and stdout behaviour (now in stdout.h); replaced hard-wired values for most recent RINEX version numbers (for OBS, GPS NAV, GLONASS NAV, GSSP NAV, MET) with values in defines.h; first cut on all GPS health extractions for RINEX 2.10 compliance (except, perhaps, Leica dsNNNN.eph files and LB2 0x88 record)

2000 Feb 18: set up a DEC Alpha OSF1 static build, which was minimally tested on DEC Alpha Linux (translation tested on a Trimble dat file only)

2000 Feb 17: modification to the i6() function so that it correctly deals with signed (e.g. TI-4100) and unsigned (e.g. Rockwell Zodiac) 6-byte integers

first cut of BINEX 0x7f-01 for compact LC only storage

2000 Feb 16: (almost) finished major rewrite and simplification of code for high-rate TurboBinary (records 0x1a, 0xdb, 0xdc, 0xde; which includes the "30-1" file format) so that filtering (SV, channel, NaN, etc.) and conversion to BINEX is applied if requested (still some final simplification needed for AOA_TB_HR_L1_obs())

when BINEX 0x7f-00 is requested as output (which is the also the default if the +binex - option is used), the default set of SV observables is now reset to the equivalent of -O.obs la+l1+l2+ca+p1+p2+s1+s2 using new binex_settings(); the default set of MET observables is already equivalent to -M.obs pr+td+hr, though this could also be modified in binex_settings()

2000 Feb 15: corrected bug in spew_any_TB_OBS() which eliminates the need to include the option +TB1s when extracting LC, or normalized L1/L2, from TurboBinary "30-1" format data with 0xde records

2000 Feb 8: first cut for inclusion of P(i)-L(i) observables in qc-mode (prototype for L1-only qc), which is off (-pl) by default for now, but is turned on with +pl option:

  • L1 or L2 is normalized to meters
  • P1 is used if available, C/A (RINEX C1) otherwise
  • plot file are called *.pl1 and *.pl2 for P1-L1 and P2-L2 respectively
  • observable should approximately equal 2I(i) + M(i) - m(i) - n(i)λ(i), where:
    • I(i) is the ionospheric range error for frequency i
    • M(i) is the pseudorange multipath for frequency i
    • m(i) is the phase multipath for frequency i
    • n(i)λ(i) is the integer wavelength phase ambiguity for frequency i

modified qc_satellite_obs_update() to ignore writing to multipath plot files if multipath calculation is suppressed (i.e. -mp)

2000 Feb 7: added switch_Rockwell_Zodiac() and switch_bytes() to order the 2-byte and 4-byte portions of the little-endian 6-byte integers in record 1102 for correct interpretation in i6() on little-endian processors

corrected the comment in binary_OBS() describing the Rockwell Zodiac RINEX snr 0-9 flag mapping for the L1 observable

first cut of BINEX record 0x7e-00 (ancillary site data), which, for example, can store the information in a RINEX MET file

funneling of all GLONASS pseudorange values through new Ashtech_GLONASS_pseudorange_correction() to remove speed of light times leap second offset only if pseudorange exceeds 3e9 meters (when +leap is on) (since the Z-18 and perhaps other Ashtech firmware do not consistently apply the leap second offset to all GLONASS pseudoranges all the time)

2000 Feb 4: corrected byte-swap error in Rockwell Zodiac record 1102 (6-byte integers) for phase and pseudorange extraction on big-endian processors; added another case to reverse_bytes() for this (to differentiate between the original 6-byte integer in TI-4100 formats)

2000 Feb 3: finalized storage of S1 and S2 for TurboBinary and RINEX in BINEX 0x7f-00

2000 Feb 2: final testing and debugging of changes for "GEO" constellation SV data (except for qc code) using hand-edited modifications of GLONASS RINEX files; this constellation is referred to by the acronym GSSP (geostationary signal payload) within teqc; addition of -S and +S option, for filtering of specific GSSP ("GEO") SVs (though, currently, only GSSP SV numbers of "20"-"51" [the actual number - 100] are allowed in teqc, mainly due to the current filter setup which only allows a maximum of 32 SVs per constellation; RTCA code allowed from 120-138, though currently only using 120, 122, 131, and 134)

modification of TurboBinary parsing to minimally reset the file pointer and skip records with corrupted time tags for all data records

2000 Jan 31: addition of read/write of RINEX OBS header line RCV CLOCK OFFS APPL for RINEX 2.10 (though teqc is currently set to terminate if using the qc mode +qc and reading a RINEX OBS file where the receiver clock offset has been applied to the observables, since the code to unscramble this situation has not been written for teqc so that the observables can be correctly qc-ed).

2000 Jan 27: completion of -NaN_obs option, to filter out any RINEX OBS observables which are "not a number" (NaN):

  • -NaN_obs - will filter out any SV in a RINEX OBS where any observable is NaN
  • -NaN_obs ca will filter out any SV where only the C1 (C/A) observable is NaN
  • -NaN_obs l1,l2 will filter out any SV where the L1 and/or L2 observable is NaN
  • etc.

By default, outputting of NaN is still allowed, since they are rare and turning this filter on adds some additional CPU time. Modification to obs_out_data() made on Jan 19 was returned to the original code to allow outputting of "NaN" if present (i.e. if they occur and are not filtered out with -NaN_obs).

2000 Jan 19: modification to obs_out_data() to filter out any "not a number" (NaN) observation values using isnan() (which should at least work on Solaris, Linux, and DEC OSF1 version); addition of cc compiler flag -ieee on DEC OSF1 compilation to allow continued operation (i.e. not core dump) of the DEC-build executable when a NaN is encountered and involved in a floating point operation

2000 Jan 15: finished first pass modifications to allow reading/editing of RINEX with GEO (geostationary signal payload) data (but, as yet, this is untested) for compliance with RINEX 2.10 specifications

2000 Jan 12: modification to decompose_Ashtech_XDR() to force units in MET XDR string to be

  • pressure unit = "B" (bars)
  • temperature unit = "C" (degrees Centigrade)
  • humidity unit = "P" (percent)

for valid conversion (and if lower-case is possible, somebody better let me know!)

new probable_XDR_sample_interval() to estimate the most likely sample interval for XDR data strings from the Ashtech stream data using the GPS/GLONASS epochs if is not used

2000 Jan 11: modifications to binex_7f_00_obs() and binex_observables_7f_00() to finish alpha-version of direct conversion of ConanBinary, TurboBinary, and RINEX OBS to BINEX 0x7f-00 (to within design constraints of the 0x7f-00 record)

2000 Jan 10: modifications to obs_out(), nav_out(), met_out(), constellation_processing(), binary_ephemeris(), and met_processing() to allow direct conversion of RINEX to BINEX

modification to binex_out_records() to allow automatic default BINEX record-subrecord selection by specifying +binex - or +binex _ (rather than a complete BINEX record/sub-record list)

2000 Jan 7: alpha-cut for Ashtech stream with XDR records to RINEX MET translation

added binary_MET() as an analogue to binary_OBS() (which had been named binary_GPS_only_OBS()) as the function to direct all MET epochs after each successful call of met_epoch_clock_adjustment(), and added this function to:

  • decompose_Ashtech_XDR() (which deals with Ashtech stream XDR records, Ashtech D-file XDR records, and Trimble DAT 16.254 XDR records)
  • decompose_Trimble_20() (for Trimble DAT record 20)

(this is now analogous to the obs_epoch_clock_adjustment() and binary_OBS() sequences), fixed met_epoch_check() (which is called by binary_MET()), and modified the code in met_data() which calls met_epoch_check()

now -M.dec should work for decimation of RINEX MET or met data in native formats

2000 Jan 6: added binex_out_records to parse a list of comma (,) or other delimited BINEX records with the +binex option into the appropriate records and subrecords, with the record-subrecord delimiter fixed as a dash (-)

in AOA_TB_LC_epoch, a scaled conversion of the LC value (in 1-sec TurboBinary 0xde records) is used to compute "L1" and/or "L2" phase values

added BINEX_OUT route to met_processing() (analogous to that in constellation_processing), though NATIVE_OUT mode is currently not allowed (filtered out)

new option to specify the MET sample rate for data where there is no time tag for the MET and other ancillary data (e.g. XDR strings in Ashtech stream data)

2000 Jan 5: alpha-cut for all translators for DEC Alpha-UNIX (OSF1) platform, with all variables and functions moved over to new prototyping alias except for those functions in prototypes.h; tested on some sample ConanBinary and TurboBinary files

2000 Jan 3: modification to rinex_version_type() to allow for the special case of splicing GPS-only RINEX OBS files which contain a blank for the satellite system in the initial RINEX VERSION / TYPE header record.

Proceeded with the 64-bit upgrade (currently for DEC Alpha machines) with appropriate modifications to:

    aoa.h aoa.c (for ConanBinary and TurboBinary)
    argo.h argo.c (for ARGO format)
    binary.h binary.c (low-level routines)
    binex.h binex.c (for BINEX)
    cmc.h cmc.c (CMC binary format)
    crc.h crc.c (BINEX CRC/checksum code)
    diag.h diag.c (diagnostic routines)
    format.h format.c (ASCII format names)
    general.h general.c (low-level routines)
    igs.h igs.c (IGS rx/ant/dome ASCII names)
    leica.h leica.c (for Leica formats)
    motorola.h motorola.c (for Motorola Oncore format)
    rockwell.h rockwell.c (for Rockwell Zodiac format)
    ti.h ti.c (for TI-4100 formats)
    trimble.h trimble.c (for Trimble formats)

1999 Dec 28: modification to qc_position_out() to supply the magnitude of the vector difference between the QC position and what would be the RINEX OBS header position for the antenna; changed internal storage of MET observables from float to double for BINEX (also gives cleaner read of NMEA MET strings)

1999 Dec 27: modification to usage() to direct messages to stdout (rather than stderr) if +help/-help option is used; first cut to allow reading of Ashtech D-file and associated writing of RINEX MET file

1999 Dec 16: modification to clock_jump_search() to correctly set the last millisecond jump when decimating and the millisecond offset increments change sign in the data, without needing to supply the original sampling interval with the option

1999 Oct 18: correction to decompose_Rockwell_Zodiac_1000()

1999 Oct 15: modification to dump_metadata() (stdout for +meta option) to also show antenna type and receiver type

1999 Oct 8: modification to decompose_AOA_TB_68() to nullify L2 and P2 data if S2 has a zero value (a firmware bug in the TurboRogue results in the L2 data space being filled with the L1 value and the P2 data space being filled with the P1 value when S2 == 0 in at least TurboBinary record 0x68)

1999 Oct 7: added option +gws to allow outputting of date as GPS week and seconds to all epoch_stamp() calls (which, e.g., will effect the representation of dates when using +diag and other stderr outputs)

1999 Sep 24: modification to extract_types_list() so that a zero item list will be accepted if also doing metadata extraction or requesting diagnostics (e.g. "-O.obs - +mds" or "-O.obs - +diag")

1999 Sep 17: modification to GPS_NAV_times_make_sense() to increment the ToW by increments of 10321920 minutes (1024 weeks) if the ToW lags the observation time by similar amounts (e.g. TurboRogue software 1998.12.27 results in the correct observation times, but the GPS week in the ephemeris record lags by 1024), and this corrects the output of the metadata output (e.g. +meta, +mds, +mdj)

1999 Sep 15: added +mdfi option for format metadata extraction for use with UNAVCO inject script

1999 Aug 31: added +mdj option for start time metadata extraction for use with Jstream

1999 Aug 27: modification to extract_Trimble_rx_type() and and extract_Trimble_ant_type() to null unknown receiver and antenna type strings

1999 Aug 24: modification to next_AOA_TurboBinary_record() and decompose_AOA_TB_39() to account for TurboBinary user data record 0x39 of length less than 216 bytes

1999 Aug 23: modification to obs_epoch_clock_adjustment() to ignore the transition in Leica DS data from an invalid receiver clock offset value of -1 second to the first valid value (which occasionally had been triggering the incorrect detection of a receiver millisecond clock reset for this format)

changed +eep to +eepx, which continues to output the epoch-by-epoch location in Cartesian xyz, and added +eepg, which outputs the epoch-by-epoch location in ellipsoidal geographical coordinates (lat, lon, height)

1999 Aug 17: modification to AOA_CB_constellation() to disallow all GPS SV PRN # > 32 and correction of indexing of all[ ] values to allow for GPS SV PRN 32

1999 Aug 10: latest round of modifications for the -tr_s_jump option (for LKWY data collected by VSAT via USGS at Golden only), tested on ~100 files

1999 Aug 5: fixed minor error when reading TurboBinary record 0x39: slant height is stored in the record as centimeters (instead of meters as originally assumed), so the corresponding comment in the RINEX OBS file will now be correct

1999 Aug 3: added +Ashtech_B_file_adjust option to attempt to correct the file placement in corrupted B-files, with this first trial implementation only being in next_Ashtech_dld_B23_record() (for versions 2 and 3 B-file only) and only adjusting for missing bytes at this time

1999 Aug 2: collapsed boolean flags in struct win_info and other time related flags into a new struct teqc_info FLAGS time entry; slight change to GPS_week_decomp() so that usage is only output for a bad date when using the -week option

1999 July 30: changed Ashtech_channels() to Ashtech_specifics() (since it has evolved into setting lots more that the correct number of channels for specific receivers) and added a test for LM-XII and L-XII receivers in it

1999 July 29: fixed some unsigned long/signed long problems in the Ashtech code introduced on 20 July which were screwing up Doppler and other values

1999 July 23: added new qc mode option +eep ("every epoch position") to output a time stamp to millisecond resolution plus the WGS84 xyz position to millimeter resolution every epoch

1999 July 22: collapsed some code into bad_SV_number() and added this to test PRN number of TurboBinary 0x68, 0x1a, 0xdb, 0xdc, and 0xde records

1999 July 21: testing Solaris 2.7 Ultra 2 as the primary Solaris Sparc development platform (from Solaris 2.3); corrected the corrected record reset problem for Trimble formats

1999 July 20: implemented types.h and began code changes on Ashtech code for testing on Solaris Sparc 2.3 build

1999 Jul 19

1999 July 16: added experimental options -ns and -ne ("next start" and "next end") windowing options which work only out to the hours level, with new function window_next_epoch()

1999 July 15: have prototype BINEX 0x01-01 working for GLONASS navigation message; modified Ashtech_phase and eliminate_oversize_phase() calls to them to correctly resize both L1(CA) and L1(P1) for BINEX; replaced all calls to eliminate_oversize_L1() and eliminate_oversize_L2() with the more generic eliminate_oversize_phase; restructured extract_Trimble_rx_type() so that receiver specific flags get set when Trimble DAT records with the receiver type flag are present, even when the -O.rt option is used, and restructured extract_Trimble_ant_type() to follow the same style

1999 July 14: fixed the new_fmod() problem that was causing certain C library fmod() calls to fail when the second argument was equal to zero (this was causing the -O.dec decimation not to work as it should on some systems); modified binary_ephemeris() to correctly sort the RINEX NAV file pointers for GLONASS navigation messages (due to BINEX addition); modified Ashtech_channels() to automatically set the channel numbers and a few more items when using a B-file from an Ashtech GG24

1999 July 13: removed the abort from reading of CMC binary when the 60-sec time tag error problem occurs (still reports to stderr, though); added hidden option -tr_s_jump to allow correct translation of corrupted Trimble stream files from LKWY site; modified binary_GPS_ony_OBS() to correctly unmask the end time

1999 July 12: changed valid_Ashtech_pseudorange() to only examine bit 3 of the warning flag to screen each pseudorange, changed valid_Ashtech_phase() to output the phase value regardless of the bits in the warning flag

1999 July 9: added a new corrupt record test for TurboBinary record 0x68 in next_AOA_TurboBinary_record() to stop if the record starts with 68_XX_2e_20_20_20_20_20_20_20_20_20_20 byte sequence

1999 July 8: first initial cut for BINEX

also: modified obs_data() to correctly set an implied value of zero (empty) following event flag value = 2, 3, 4, or 5 when a time tag is present, and also changed the "no value" key from 255 to 1000 since values of 0-999 are valid; modified rinex_out_comment() to fix the latest splicing problem; translation of L2-phase value corrected for TurboBinary 0xdc record; translation of L1- and L2-phase values corrected for ConanBinary "brief" records on DEC Alpha OSF1 (C long data type is an 8-byte integer, instead of the more usual 4-byte integer)

1999 June 16: added TBfe_ff option to recognize or ignore the header/trailer (0xff and 0xfe) records of TurboBinary, with the default being +TBfe_ff (i.e., recognize these records); this allows TurboBinary files to be concatenated together (e.g. UNIX cat), and teqc will ignore the original termination marker (0xfe) in the resultant file

1999 June 12: modified window_OK() to examine stdin only as a special case and correctly set any windowing parameters

1999 June 11: fixed next_AOA_ConanBinary_record() to reset the pointer to the data record when using stdin

1999 June 7: rebuilt the Ashtech_BEN_block() function (for Ashtech stream data code blocks) to make it more readable

1999 June 6: modified decompose_AOA_CB_header() to read as much of the receiver number/version line in a ConanBinary record 1 if the line is corrupted

1999 June 3: modified obs_out_obs_types() to output a zero if zero observables (weird case, I admit)

1999 May 26: changed TB68 option to be TBnr; changed default setting of TBLC, TB1s, and TBhr to be off, rather than on (i.e. teqc will now only examine the normal-rate 0x68 records by default)

1999 May 24: modified TB_record_duplication() to be TB_record_elimination() to correct the behaviour of the option -TB1s when reading TurboBinary files with records 0xde and 0x68, and it should also work with option -TBhr when records 0x1a, 0xdb, and/or 0xdc are present

1999 May 18: added test in GPS_week_check to print a possible error message to stderr if the GPS week being tested in less than the initially set GPS week value

1999 May 17: re-write of IGS receiver and antenna designation check to include antenna dome (radome) check in characters 17-20 of antenna type field; added ++igs option to output a list of all internally recognized strings for receivers, antennae, and domes; added option for "post-header comments", by default left on, and turned off with -phc option

1999 May 13: final official alpha cut of Leica DS format translator, incorporating details given by Erwin Rapatz at Leica for wavelength factors and receiver number extraction

1999 May 7: modified rinex_out_marker_number() to copy and 4-char ID code into the marker number field if empty and not set as empty; other monument.code enhancement, especially for RINEX MET; amended Trimble_dat() to recover from a corrupted dat file when there are multiple bogus records 0 or 7; changed all uses of epoch_clock_sanity() into a switch to discard corrupted epoch information

1999 May 6: alpha release on IBM AIX 4.1; modified decompose_Trimble_5() to convert 5.0 user-entered lat/lon as degrees, rather than semi-circles

1999 May 5: found and fixed memory overflow problem in rinex_out_comment() when buffering output for "number of RINEX records to follow"

1999 May 4: modified CMC code to not accumulate time offset due to clock drift (record 21) when using +native; modified rinex_version_type() to allow splicing of version 1 RINEX OBS files

1999 May 3: added +native option to output filtered native receiver format when inputting a native receiver format, and partially tested with decimation of CMC data

1999 Apr 30: fixed 2nd major overhaul of CMC translation for 21 and 23 record pairs, and split the old function binary_epoch_clock_adjustment() into: obs_epoch_clock_adjustment(), met_epoch_clock_adjustment(), epoch_clock_sanity(), and epoch_clock_to_date().

1999 Apr 29: fixed at bug in GLONASS_time_to_epoch() which would give the wrong dates for GLONASS from 1984 to 1988.

1999 Apr 28: tackled (in a very unelegant way) the problem of more than 999 in-line comments being generated in a RINEX OBS file

1999 Apr 25: modification to obs_epoch_check() call in obs_data() to account for simultaneous decimation and time-windowing of input RINEX OBS

1999 Apr 24: modification to obs_epoch_check(), since the 1 msec test made on Apr 21 wasn't quite right; added test to implied_window_limit() to allow time window masks to be used for RINEX files

1999 Apr 23: modified nav_data() to allow teqc to continue to read a RINEX NAV file with a satellite number of 0, but that ephemeris is skipped

1999 Apr 21: modified backslash_string() to change any null string into a single whitespace string; modified implied_window_limit to allow outputting of configuration information; modified dump_comments() to output build comments only when using ++config; modified obs_epoch_check() to allow for decimation of time tags > 1 msec from an integer second, e.g. Rockwell Zodiac data; added option -tbX for transforming Benchmark Y-codeless TurboBinary:

    RINEX L1 = L1(CA) RINEX L2 = L2(Y2) RINEX P1 = Y1 RINEX P2 = Y2 + CA - Y1

1999 Apr 20: finished overhaul of CMC translation logic when dealing with records 21 and 23 pairs to account for "missing" records in various combinations; modified rinex_out_marker_name() to disallow overriding filling in the monument name with the 4-char ID when the is used with a blank argument, i.e. ""

1999 Apr 19: changed tolerance in obs_epoch_check() from 2e-5 seconds to 1e-3 seconds

1999 Apr 16: fixed de_pad_left() to handle all whitespace strings

1999 Apr 14: modified command_parse() to skip over multiple whitespace separators between config file options and their arguments

1999 Apr 8: possible fix to CMC time tag and pseudorange translation problem using record 23/21 pairs; still an ambiguity as to which sign the deltas on the time tags accumulate, which will have to be resolved by processing; also not known if the clock bias values in record 21 are an important contribution

1999 Apr 7: fixed Trimble_55h() and Trimble_57h() to eliminate buffer overflow reads with corrupted data

1999 Mar 2: eliminated the int casting in eliminate_oversize_L1() and eliminate_oversize_L2(), which was screwing up the resizing for oversize phase values in Ashtech translations, and in using the +reformat option

1999 Mar 1: changed threshold for GPS week decrement for MET data in binary_epoch_clock_adjustment() to be > 561600 seconds (week - 1/2 day) rather than 302400 seconds (1/2 week)

1999 Feb 24: have possible solution for the problem where MET data starts at the end of the GPS week and OBS data starts at the beginning of the next GPS week, modifications primarily in binary_epoch_clock_adjustment(); expanded stderr statement in possible_wrong_GPS_week() to include the two next most likely weeks to try (rather than one)

1999 Feb 19: added option +mds ("metadata short"), as a substitute for option +meta, which gives: the start and end times, file size in bytes, and filename on a single stdout line

1999 Feb 9: change in RINEX NAV translation: changed correct_nav_times() so that for cases where ToE = ToC = 0 and ToW > 302400 seconds (i.e. mid-week), then the GPS week is incremented by +1 and ToW is decremented by 604800 seconds.

corrected rinex_version_type() to correctly ID GPS and GLONASS RINEX NAV files for splicing

1999 Feb 8: added option +Ashtech_qd, which ignores the values of bit_2 and bit_3 on the warning flag of Ashtech data (i.e. "include Ashtech questionable data")

1999 Feb 6: in obs_data(), removed the memcpy() of the last observation epoch into the current observation epoch for cases of non-"time tagged" event flags

eliminated the possible infinite loop in scan_config_line() when strings had invalid meta-syntax by reporting the problem to stderr and terminating

added bit_2 and bit_3 testing on warning flag of Ashtech MBN records to eliminate questionable data

1999 Feb 3: added switch in obs_binary_out() to account for switching between kinematic (RINEX event flag = 2) and static (RINEX event flag = 3) survey and correctly output any comments at the transitions; changed location of file_id() call to be after parsing the config file(s)

1999 Jan 29: used adjust_week() to modify the GPS week in the RINEX NAV field from the cases where it is = teqc best value GPS week (±1) modulo 1024; this is added mainly for the W1k (1024) rollover that will occur on 22.0 Aug 1999

1999 Jan 28: added adjust_week() to modify the UTC week in the RINEX NAV record DELTA-UTC: A0, A1, T, W from the cases where it is equal to the teqc best value GPS week (±1) modulo 256; this function was added before the record is output to RINEX, and before the configuration -N.leap is output

1999 Jan 21: format for 2-digit years in RINEX changed to zero-padded, so that years 2000-2009 will appear as "00"-"09"

1999 Jan 15: fixed -L2_2 option for reading RINEX OBS files, to set BIT-1, rather than BIT-2, of the LLI flag on the L2, P2, and D2 observables; likewise, fixed -L2_1 option for reading RINEX OBS files, to set BIT-1, rather than BIT-2, of the LLI flag on the L1, P1, and D1 observables

1999 Jan 8: changed forced rounding of seconds in RINEX OBS time tag to 0.1 microseconds (from 1 microsecond); changed most rounding by floor() to new round() macro; changed format of seconds in RINEX OBS TIME OF FIRST OBS and TIME OF LAST OBS fields to be %13.7lf (Fortran F13.7) to be consistent with the time tag in the epochs to avoid epoch labeling disasters/confusions with CMC

1999 Jan 7

1999 Jan 6: streamlined the reporting of not using GLONASS ephemerides when doing qc of GLONASS data

1999 Jan 5: extended SV editing to RINEX NAV files, though comments in the RINEX NAV header have not been added

1999 Jan 4: found address bug in store_compact_plot_data() which was causing same_compact_plot_list() to malfunction, thereby sometimes scrambling the data in one or more plot files

1998 Dec 31: updated the receiver and antenna RINEX designation check to conform with the newest table (24 Dec 1998) for the IGS

1998 Dec 31: finished prototype Benchmark -> TurboRogue commensurate conversion, using -aoa bs option:

    P2_commensurate= Y2 + CA - Y1 L2_commensurate= L2(Y2) + L1(CA) - L1(Y1)

where Y1 and Y2 are the Y1- and Y2-codeless data blocks collected by the Benchmark (and erroneously labeled P1 and P2 in RINEX); only done correctly if data is is normal TurboBinary 0x68 records.

1998 Dec 30: preliminary options for excluding certain receiver channels, e.g. -ch2,4 to exclude channels 2 and 4; plus appropriate comments in RINEX OBS header, plus complementary config output; have retrofitted the different format readers to extract the receiver channel number for:

  • Ashtech formats, all cases (I think)
  • CMC binary format (maybe, if the measurement block # = channel number)
  • ConanBinary, "full" records only, since "brief" records don't contain the channel number (this will probably turn out to be buggy when data switches from being stored as a "full" record to a "brief" record)
  • Leica 200/300 DS format, not "full" case only ("full" channel numbers are zero)
  • Leica LB2 format
  • Rockwell Zodiac (maybe, assuming channel ordering in record 1102)
  • TI-4100 (maybe, assuming channel ordering in ROM record 1, or GESAR record 6)
  • TurboBinary

Formats examined that have no receiver channel numbers, or not easily determined:

  • ARGO
  • Trimble formats, all cases (channel number not stored with SV data record)

Eliminated (once again!) the duplicate build line problem in RINEX headers.

1998 Dec 29: preliminary options for excluding certain SVs in RINEX OBS, e.g. -R to exclude all GLONASS SVs, -G10,24 to exclude GPS PRN 10 and PRN 24; plus appropriate comments in RINEX OBS header, plus working for qc mode, plus complementary config output

1998 Dec 28: Fixed rinex_constellation_slip_obs() to correctly skip multiple constellation lines in RINEX OBS when the number of SVs > 12

1998 Dec 22: Fixed rinex_out_comment() to eliminate minor memory leak and added elimination of any original comments fields when starting to read the next target RINEX file by adding nuke_comments(); completed +reformat option which allows reading misformatted RINEX OBS observables as %n.3lf%c%c (n not necessarily 14) and subtracted a fixed integer number of cycles from the L1 or L2 observable as necessary to make it fit in %14.3lf%c%c

1998 Dec 18: Fixed rinex_out_comment() to stop the dropping of COMMENT fields when time windowing and all other cases; eliminated teqc from stopping at the nth file during a multiple file splice when the n-1th file ends in header fields by resetting the expected header count to zero after reading each file.

1998 Dec 17: Using -st option overrides option and correctly stamps the TIME OF FIRST OBS RINEX OBS header field, involving routing all setting of the session start time through a new function obs_session_start().

1998 Dec 15: Eliminated the windowing problem when using multiple target RINEX OBS files and a line " 0" would be generated for each file outside of the specified time window.

1998 Nov 18: allowed reading of RINEX OBS files with SV-specific wavelength factor records, but missing a default wavelength factor record, when using the -O.def_wf option to specify the default wavelength factors

1998 Nov 17: changed translation of SV health code for GPS RINEX NAV messages for all Ashtech formats and Trimble TSIP format (prior translations probably always reported a value of 0 = healthy regardless of the original broadcast SV health value)

1998 Nov 16: possible fix for the Ashtech Z-18 and GG24 phase overflow problem

1998 Nov 13: changed all ConanBinary warning messages to be suppressed with -warn option

1998 Nov 11: changed the two minor (and undocumented) items for GLONASS NAV files pointed out by Werner Gurtner

1998 Oct 27: prototype fix for the CMC L1 2**20 cycle rollover

1998 Oct 22

1998 Oct 21: fixed Ashtech Z-18 and GG24 translations to correct L1 and L2 values for millisecond clock resets by including the +msec_phs_adj option; tested for: Z-18 B-files, Z-18 MPC records, GG24 MBN and MCA records.

1998 Sept 30: fixed temporary buffer size for Ashtech Z-18/GG24 datasets for tracking up to 24 satellites; fixed filtering out of "questionable" carrier phase and code phase values on Ashtech data (bit 3 or bit 4 of warning flag set); fixed auto-detect of GLONASS NAV files ending in ".glo" and ".GLO" to go with RINEX OBS files ending in ".obs" and ".OBS" in the qc mode

1998 Sept 29

1998 Sept 28: finished first cut of GPS/GLONASS translators for Z-18 B/E/S download data and GG24 RS-232 stream data; first cut of mixed GPS/GLONASS qc mode

1998 Sept 24: modified Trimble RS-232 stream records reader to ignore 57h position records (rather than trying to interpret them as 57h observation records

1998 Sept 16: modified reading/writing of RINEX OBS to allow epochs with an event flag value of 0, 1, or 6 to have observations, epochs with an event flag value of 2, 3, 4, or 5 to have in-line header records; modified epoch interval detection to only determine observation interval based on epochs with an event flag of 0, 1, or 6

1998 Sept 15: finished code to deal with the new RINEX header fields: LEAP SECONDS in RINEX OBS, and SENSOR MOD/TYPE/ACC and SENSOR POS XYZ/H in RINEX MET

1998 Aug 27: tighted code on hidden trap door for rounding of second time tags when reading CMC binary and Leica LB2 data

1998 Aug 21: added limitation for sample interval extracted directly from ConanBinary to 300 seconds, as cases were found where this field was corrupted

1998 Aug 11: initial code cut for translating Ashtech XDR string format, both from Ashtech download D-file and from Trimble download record 16.254 (supplied via RS-232 from ParoScientific met package); modified the -O.dec option decimation code to allow time tag to be off by up to 5 microseconds

1998 Aug 3: initial code cut for Trimble TSIP translator, though still not ready for prime time due to lack of documentation on certain types of 0x6f and 0x8f packets

1998 July 31: fixed GPS week offset problem for Ashtech download translation when the S-file is a GPS week rollover from the starting time

1998 July 28: prototype translator for the Leica DS format, though there is still some uncertainty about the L1-code value ("C1" or "P1", depending on antispoofing status?) and detection of half-wavelength (squaring) tracking; fixed reading of Trimble DAT to not skip null-body records (records w/ 4-byte headers only)

1998 July 21: initial code cut for Ashtech download versions 1 and 2 translator, though there is a problem with the phase values

1998 July 17: fixed code to allow use of env variables $teqc_OPT and $teqc_CONFIG without specifying a config file on the command line

1998 July 15: check for match of existing IGS receiver or antenna RINEX designations (done only when using options -O.rt or for now)

1998 July 14: minor change for reporting status of Trimble DAT record 16 subrecords; expansion of Trimble DAT rx codes to RINEX rx designations.

1998 July 7: corrected all known bugs for windowing functionality of non-RINEX input, covering 19 general cases; teqc will abort out of 6 of these: -dX alone or any case with a -e mask (not fully qualified date-time)

1998 July 2: added calls to epoch_minutes() to initialize obs.session.start.minutes in obs.session.start after all instances of obs.session.start becoming populated with a date (thus fixing a variety of problems with the qc mode after the changes to the time-windowing scheme); added same calls to initialize obs.session.end.minutes in obs.session.end for symmetry, though not doing this was apparently not causing any problems

1998 July 1

1998 July 1: fixed bug where ARGO translator would crash when not specifying an output RINEX NAV file

1998 June 29: (finally!) have ConanBinary and TurboBinary SNR values talking the same language, including the RINEX snr 0-9 mapping

1998 June 26: Changed ±ar_raw option to ±meta, though ±ar_raw will be enabled until the next release; tweaked the windowing code a bit.

1998 June 25: Changed -aoa bm option to -aoa tbY.

1998 June 23: Finished substantial re-write of the windowing functionality for non-RINEX input; added automatic comments for recording windowing in the RINEX OBS header

1998 June 22: Corrected code for Ashtech download from P-codeless receiver (e.g. LM-XII) where L2 is squared

1998 June 19: Modified code for Ashtech stream data reading/translation to handle data from receivers other than the Z-XII, e.g. G-XII, using MBN and PBN records; added options ±L2 for translation, with default of +L2 meaning that L2-carrier observables (i.e. L2, P2, D2, S2) could be present, and -L2 will ignore all L2-carrier observables

1998 June 15: Modified code for Ashtech download reading/translation to handle data from receivers other than the Z-XII, e.g. LM-XII; finished initial +diag cut for all binary formats

1998 June 12: added beta-version -aoa bm option to translate TurboBinary from the Benchmark ACT rx, using the C/A phase for L1 (instead of the P1 phase) since the cross-correlation bit (used to identify antispoofing status) is always off in record 0x68 from the Benchmark

1998 June 11: finished initial cut of Leica LB2 format reader and RINEX OBS and NAV translator; added +diag feature to ConanBinary and TurboBinary reader

1998 May 8: Modified TurboBinary parser to handle 56 and 58 byte 0x68 records, enabling D1 observable and pseudo D2 observable if present

1998 Apr 23: Forced times set with or -O.e to be displayed in RINEX OBS header in fields TIME OF FIRST OBS and TIME OF LAST OBS.

1998 Apr 22: using -O.dec with data where the original sampling interval is less than 1 sec should now work correctly, including decimation during qc mode, though this may require specifying the original sampling interval with if the original sampling interval is less than 1 second and not indicated by other means (e.g. the optional RINEX header field using INTERVAL).

Changed RINEX version read/write to allow for new %9.2f (F9.2 in Fortran) standard, changed from original %6d (I6 in Fortran). Teqc will only produce RINEX version 2.00, however.

Fixed output of config strings to include a metacharacter backslash in front of any original backslash or double-quote.

1998 Apr 14: any invalid RINEX time tag where seconds >= 60 or < 0 is now read correctly and the time tag is correctly adjusted, changing minutes, hours, days, etc. as needed

1998 Feb 26: improved corrupted epoch detection (& possible incorrect detection of end of GPS week) and implemented this for Trimble formats, though it can be readily expanded to include any other format

1998 Feb 11: added +diag option for diagnosis of binary streams; implemented for CMC Binary, Motorola Oncore, Trimble, and TI-4100 formats

1998 Jan 26: fixed bit error problem for RINEX NAV for big-endian version, effecting ConanBinary, TurboBinary, Canadian Marconi binary, and TI-4100 Record 9 translations; fixed ConanBinary translation for multiple filename inputs.

1998 Jan 21: added option -fwritable-strings to the gcc and g++ compiler flags, to allow correct processing of default RINEX OBS observable list for ConanBinary, Canadian Marconi binary, Rockwell Zodiac binary, and ARGO format.

1998 Jan 13: finished initial cut of ARGO format reader, for reading .dat and .orb files, and translating to RINEX V. 2; modification of ConanBinary record header reader to skip over xmodem fill pattern bytes (0x1a)

1998 Jan 12: eliminated infinite loop in translation of Ashtech B-file where 4-character site name changes several times

1998 Jan 7: modified Trimble Record 16 to dump all subrecord remarks, COGO codes and definitions to stderr

1997 Dec 29: allowed for splicing of RINEX NAV files, though these cannot contain in-line header info like RINEX OBS files, due to the limitations of the RINEX specification

1997 Dec 19: changed option reading for strings encapsulated with double quotes so that the double quotes can contain any characters, with double-quotes (") and backslash (\) preceded by a backslash to yield a double-quote or a backslash, respectively, in the RINEX COMMENT field. All whitespace is preserved if accessed as a configuration file; whitespace is replaced by a single space ( ) if input with a back single-quote (`) command substitution, as in

    `cat config_file`

available on certain shells.

1997 Dec 17: modified option reading for strings encapsulated with double quotes so that the double quotes can contain only whitespace and still work with the configuration environment variable and configuration file(s)

1997 Dec 16: modified +ar_raw option to give correct RINEX version number when inputting RINEX version 1

1997 Nov 20: fixed file location for Ashtech E- and S-files when supplied B-file name has a path prefix (e.g. "data/BFOOB097.324"); fixed more GPS week problems involving composite Trimble DAT file (made from a sequence of smaller DAT files) when there is a GPS week boundary crossing

1997 Nov 17: improved GPS week increment code to eliminate most spurious increments due to corrupted records; improved detection and elimination of bad observables in Trimble observation records; amended 6 Nov change to allow for binary garbage in Trimble MES (or REC) or Ashtech S-files.

1997 Nov 10: found and fixed bugs for editing certain strings in RINEX-to-RINEX metadata editing, e.g. (see teqc bugs)

1997 Nov 6: found and fixed CMC translator bug; allowed for binary garbage when reading the supposedly ASCII Trimble MES (or REC) or Ashtech S-files.

1997 Oct 24: added three fields for +ar_raw option when input is RINEX (for archival purposes)

1997 Oct 21: fixed filename matching code for Ashtech download E-file name (to eliminate name overwriting of B-file name)

1997 Oct 20: modified filename matching for Trimble download names to look for *.mNN or *.MNN where NN are the numbers 00 to 99

1997 Oct 16: fixed GPS SV PRN #32 bug in qc mode, and added check for PRNs out of index bounds in qc mode

1997 Oct 7: report decimation interval from -O.dec on qc report(s)

1997 Sept 29: minor alterations to remove superfluous warnings reported by Borland bcc32 compiler

1997 Sept 28

1997 Sept 26: expanded +relax option to include null lines in near-RINEX in between epochs in OBS or MET, ephemerides in NAV, or at the end of input/files.

1997 Sept 24: multiple options now allowed on each line of configuration file or in configuration environment variable

1997 Sept 23: replaced volatile pointer assignment for options +obs, +nav, +met, +out, ++out, +err, and ++err with direct memory allocation and strcpy().

1997 Sept 19: fixed -O.dec option for translation modes

1997 Sept 18: added duplicate ephemeris check for Ashtech RS-232 real-time stream translation; fixed IOD slip removal in COMPACT *.iod plot files in qc mode

1997 Sept 17: all declarations of variables within functions that are copied to with memcpy() were made static

1997 Sept 10: corrected RINEX S1 value for Ashtech download translator; added use of warning flags to screen questionable phase and pseudorange values for Ashtech download and real-time stream translators.

1997 Aug 19: corrected RINEX Doppler value scaling for Ashtech download translator

1997 Aug 14: fixed infinite loop problem for Ashtech download translator when 4-character station code changes within the B-file

1997 July 25: allow RINEX reader to allow header field identifiers w/ lower case ASCII; allow +ar_raw option with RINEX OBS input

1997 July 23: finished ConanBinary translator for ASCII records and binary records 2, 4, 6, G, and K; code in place for records 8, A, C, and E (but untested)

1997 July 16: added -O.dec option for OBS epoch decimation (similar options -N.dec and -M.dec in place for NAV and MET info, but not completed yet)

1997 July 15: (finally!) found and fixed the memory bug that was causing certain TurboBinary and TI-4100 files to crash

1997 July 14: corrected file splicing when using command line file names (i.e. +obs, +nav, +met options), instead of using shell redirection

1997 July 1: found temporary workaround for the "TurboBinary bug" for little-endian processors

1997 June 30: fixed epoch identification for time-sequential ConanBinary

1997 June 26: removed receiver clock offset value from any RINEX OBS output; changed qc indicator of SVs w/ P1 data when antispoofing is on (mainly for Ashtech and TurboBinary data) to "o", rather than "y", unless using +Y option (Y-code receiver); improved interval detection and reporting scheme, including qc SUM line for sampling interval < 1 second

1997 June 25: translator cut for Canadian Marconi Binary, for single-frequency Allstar OEM receiver board (records 22, 23, 63, and 126 only)

1997 June 19: RINEX version 1 reading capability, plus recasting Version 1 on input as Version 2 on output

1997 June 18: all big-endian formats working on little-endian processors except for TurboBinary

1997 June 13: translator cut for TI-4100 TI-ROM format (record ID 1 only)

1997 June 2: fixed spurious stdout bug (various RINEX OBS header records) when using multiple target files in qc mode; allow incomplete RINEX headers if info is supplied via editing options (e.g. -O.*); allow "relaxed" constraints on required RINEX header fields when doing qc mode, using new +relax option

1997 May 30: fixed various problems with the -st, -d, +d, and -e windowing options (using window masks, reading RINEX, etc.); skip OBS epochs w/ flag 6 (cycle slip repair) when doing qc mode; removed all possible zero-time length windows from IOD calculations (eliminating infinities)

1997 May 21: translator cut for Ashtech download (B-, E-, and S-files)

1997 May 12: correctly place encountered comments in RINEX from Trimble or AOA binaries; correct placement of RINEX kinematic flag from Trimble DAT record 16; code written for RINEX kinematic flag from Trimble DAT record 8, but not tested (no example file); teqc option to force initial kinematic state in RINEX flags at start of RINEX OBS file

1997 May 9: translator cut for time-sequential ConanBinary

1997 May 1: translator cut for Rockwell Zodiac binary format (big-endian processors only)

1997 Apr 28: repaired error in ToW calculation for TI-4100 GESAR & BEPP/CORE data

1997 Apr 23: fixed bug to output requested additional RINEX COMMENTs when using RINEX target files with the +O.c, +N.c, and/or +M.c options

1997 Apr 21: workaround for obtaining correct system time from Windows 95 and DOS

1997 Apr 9

1997 Apr 9: fixed bug to output correct session end for -e and -O.e configuration options when using ++config option and correct final date & time when using +ar_raw option with RINEX OBS target file(s) (e.g. teqc ++config OBS_file or teqc +ar_raw OBS_file); correctly extract lat lon ele from x y z w/ +ar_raw option

1997 Apr 8: added option for entering approx antenna position as lat long elevation (degrees degrees meters); fixed +v option for multiple target files; re-fixed -O.obs and -M.obs options with RINEX target file(s); eliminated all multiple teqc build comments in RINEX output and/or config output; added extra characters for config output of -st and -e options (for human readability only — added extra characters are not required); changed default set of OBS observables for RINEX translation to be L1 L2 C1 P2 P1 D1 D2 (equivalent to -O.obs l1+l2+c1+p2+p1+d1+d2), to drop S1 and S2 by default and put P1 in the last spot on the first line for each SV to minimize overall RINEX OBS size when antispoofing in on

1997 Apr 7: place teqc build info in all RINEX created, whether by files or stdout; build for Solaris Intel 2.5

1997 Apr 4: slight rewrite of NAV ToW - obs time to better detect and report GPS week discrepancies

1997 Apr 3

1997 Apr 3: temporarily disallow all attempts of translation/reading of TurboBinary or TI-4100 formats on Intel(-like) platforms

1997 Apr 2: additional work on +qc +ar_raw option; allowed for separators (:,;/\+-=_~# plus space, newline, carriage return, tab) in -st and -e options

1997 Apr 1: eliminated output of TIME OF LAST OBS OBS record for all cases to simplify and correct cut/splice operations; enabled stdin for DOS builds, tested prototype function with Borland bcc32; fixed -st option for input OBS and MET RINEX files; windowing on RINEX NAV files based on ToW (shut off for now)

1997 Mar 31: fixed dirty buffer problem in Ashtech RS-232 data translator (was not a problem in rt); fixed resetting of input file pointer for stdin to NULL; fixed identification of stdin via piping on Sun versions

1997 Mar 21: code clean up (unused variables); fix missing ToW time stamp in TI-4100 translation; GPS week on system time output line for +id option; if +ar_raw and +qc are set, only archive table goes to stdout (instead of both)

1997 Mar 20: build info in id option and RINEX header comment

1997 Mar 19: for archive metadata dump, replicate monument name from code if no name and code is present; added system time to id function; added functionality to deal with DOS EOF (CTRL Z) and other strange DOS endings for WatCom version (for true DOS port); first successful port to DOS 5.x & test on 386SX (no math coprocessor); included wildcard arguments for Borland build

1997 Mar 18: more explicit information on incorrectly entered observation codes (OBS & MET); GPS week suggestion on first ephemeris only; for archive metadata dump, replicate monument code from monument name if no code and name has length of 4 characters

1997 Mar 17

The main differences between this first release of teqc and the alpha-release rt are translator enhancements for reading/translating TurboBinary and TI-4100 GESAR and BEPP/CORE formats, though in this release of teqc these formats still are not readable with teqc on PCs.

The next main difference is in the handling of wavelength factors in general and a correction for the reading of Trimble binary formats related to wavelength factors. Due to an ambiguity in the RINEX version 2 documentation, rt was not handling the wavelength factors correctly, and this resulted in files that Trimble's GPSurvey software would read and interpret most of the L1 and L2 data as squared (half-wavelength) phase data when, in fact, this was not the case. This ambiguity has been resolved to the satisfaction of Berne (contact Werner Gurtner (, Trimble (contact Brian_Brian Frohring (, and UNAVCO (contact Lou Estey ( teqc translations should work fine for Trimble binary data, and the RINEX version 2 documentation is being clarified. Due to this change, the rt option dynamic_iwf has been removed from teqc.

The next difference is in the removal of unneeded white space at the end of lines in RINEX OBS output. This should result in slightly smaller RINEX OBS files.


Last modified: 2019-12-24  02:29:43  America/Denver