// SPDX-License-Identifier: BSD-3-Clause
// SPDX-FileCopyrightText: 2018-2020 Carles Fernandez-Prades <carles.fernandez@cttc.es>
syntax = "proto3";

package gnss_sdr;

/* GnssSynchro represents the processing measurements at a given time taken by a given processing channel */
message GnssSynchro {
   string system = 1;  // GNSS constellation: "G" for GPS, "R" for Glonass, "S" for SBAS, "E" for Galileo and "C" for Beidou.
   string signal = 2;  // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5 and "5X" for Galileo E5a

   uint32 prn = 3;  // PRN number
   int32 channel_id = 4;  // Channel number

   double acq_delay_samples = 5;  // Coarse code delay estimation, in samples
   double acq_doppler_hz = 6;  // Coarse Doppler estimation in each channel, in Hz
   uint64 acq_samplestamp_samples = 7;  // Number of samples at signal SampleStamp
   uint32 acq_doppler_step = 8;  // Step of the frequency bin in the search grid, in Hz
   bool flag_valid_acquisition = 9;  // Acquisition status

   int64 fs = 10;  // Sampling frequency, in samples per second
   double prompt_i = 11;  // In-phase (real) component of the prompt correlator output
   double prompt_q = 12;  // Quadrature (imaginary) component of the prompt correlator output
   double cn0_db_hz = 13;  // Carrier-to-Noise density ratio, in dB-Hz
   double carrier_doppler_hz = 14;  // Doppler estimation, in [Hz].
   double carrier_phase_rads = 15;  // Carrier phase estimation, in rad
   double code_phase_samples = 16;  // Code phase in samples
   uint64 tracking_sample_counter = 17;  // Sample counter indicating the number of processed samples
   bool flag_valid_symbol_output = 18;  // Indicates the validity of signal tracking
   int32 correlation_length_ms = 19;  // Time duration of coherent correlation integration, in ms

   bool flag_valid_word = 20;  // Indicates the validity of the decoded navigation message word
   uint32 tow_at_current_symbol_ms = 21;  // Time of week of the current symbol, in ms

   double pseudorange_m = 22;  // Pseudorange computation, in m
   double rx_time = 23;  // Receiving time after the start of the week, in s
   bool flag_valid_pseudorange = 24;  // Pseudorange computation status
   double interp_tow_ms = 25;  // Interpolated time of week, in ms
   bool flag_PLL_180_deg_phase_locked = 26; // PLL lock at 180º
}

/* Observables represents a collection of GnssSynchro annotations */
message Observables {
  repeated GnssSynchro observable = 1;
}
