Example #1
0
static bool sids_match(const gnss_signal_t *old_non_ref_sids, u16 num_non_ref_sdiffs,
                       const sdiff_t *non_ref_sdiffs)
{
  if (sats_management.num_sats-1 != num_non_ref_sdiffs) {
    /* lengths don't match */
    return false;
  }
  for (u8 i=0; i<num_non_ref_sdiffs; i++) {
    /* iterate through the non-reference_sats, checking they match. */
    if (!sid_is_equal(old_non_ref_sids[i], non_ref_sdiffs[i].sid)) {
      return false;
    }
  }
  return true;
}
Example #2
0
/** Set the elevation angle for a tracker channel by sid.
 *
 * \param sid         Signal identifier for which the elevation should be set.
 * \param elevation   Elevation angle (deg).
 */
bool tracking_channel_evelation_degrees_set(gnss_signal_t sid, s8 elevation)
{
  bool result = false;
  for (u32 i=0; i < NUM_TRACKER_CHANNELS; i++) {
    tracker_channel_t *tracker_channel = tracker_channel_get(i);

    /* Check SID before locking. */
    if (!sid_is_equal(tracker_channel->info.sid, sid)) {
      continue;
    }

    /* Lock and update if SID matches. */
    tracker_channel_lock(tracker_channel);
    {
      if (sid_is_equal(tracker_channel->info.sid, sid)) {
        tracker_channel->elevation = elevation;
        result = true;
      }
    }
    tracker_channel_unlock(tracker_channel);
    break;
  }
  return result;
}
Example #3
0
static u8 get_de_and_phase(sats_management_t *sats_man,
                           u8 num_sdiffs, sdiff_t *sdiffs,
                           double ref_ecef[3],
                           double *de, double *phase)
{
  gnss_signal_t ref_sid = sats_man->sids[0];
  u8 num_sats = sats_man->num_sats;
  double e0[3];
  double phi0 = 0;
  /* TODO: Detect if ref_sid is not in sids and return error? */
  u8 i;
  for (i=0; i<num_sdiffs; i++) {
    if (sid_is_equal(sdiffs[i].sid, ref_sid)) {
      e0[0] = sdiffs[i].sat_pos[0] - ref_ecef[0];
      e0[1] = sdiffs[i].sat_pos[1] - ref_ecef[1];
      e0[2] = sdiffs[i].sat_pos[2] - ref_ecef[2];
      vector_normalize(3, e0);
      phi0 = sdiffs[i].carrier_phase;
      break;
    }
  }
  i=1;
  u8 j = 0;
  while (i < num_sats) {
    if (sid_compare(sdiffs[j].sid, sats_man->sids[i]) < 0) {
      j++;
    }
    else if (sid_compare(sdiffs[j].sid, sats_man->sids[i]) > 0) {
      /* This should never happen. */
      log_warn("sdiffs should be a super set of sats_man sids");
      i++;
    }
    else {  /* else they match */
      double e[3];
      e[0] = sdiffs[j].sat_pos[0] - ref_ecef[0];
      e[1] = sdiffs[j].sat_pos[1] - ref_ecef[1];
      e[2] = sdiffs[j].sat_pos[2] - ref_ecef[2];
      vector_normalize(3, e);
      de[(i-1)*3    ] = e[0] - e0[0];
      de[(i-1)*3 + 1] = e[1] - e0[1];
      de[(i-1)*3 + 2] = e[2] - e0[2];
      phase[i-1] = sdiffs[j].carrier_phase - phi0;
      i++;
      j++;
    }
  }
  return num_sats;
}