void SONAR_MAXBOTIX12_IRQ_HANDLER(void)
{
  if (TIM_GetITStatus(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1) == SET)
    {
      TIM_ClearITPendingBit(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1);
      int32_t sonar_meas = TIM_GetCapture1(SONAR_MAXBOTIX12_TIM);
      /* pulse_cnts to actual pulse width in us:
       *   pulse width = pulse_cnts * (prescaler+1)/(actual clock)
       *   with 58us per centimeter, the alt in cm is:
       */
      //int32_t alt_mm = pulse_cnts * 10 * (69/72) / 58;
      //sonar_alt

      //if ((sonar_meas > (sonar_filter_val + 1500) || sonar_meas < (sonar_filter_val - 1500))
      if ((sonar_meas > (sonar_filter_val + 3000) || sonar_meas < (sonar_filter_val - 3000))
          && (sonar_spike_cnt < 5)) {
        sonar_spike_cnt++;
        sonar_meas = sonar_filter_val;
      }
      else {
          sonar_spike_cnt = 0;
      }

      //@TODO: check for angle > 10 deg ==> don't use value

      sonar_filter_val = SONAR_MAXBOTIX12_BUTTER_NUM_1*sonar_meas
      + SONAR_MAXBOTIX12_BUTTER_NUM_2*sonar_meas_prev
    //  + SONAR_MAXBOTIX12_BUTTER_NUM_3*sonar_meas_prev_prev
      - SONAR_MAXBOTIX12_BUTTER_DEN_2*sonar_filter_val_prev;
    //  - SONAR_MAXBOTIX12_BUTTER_DEN_3*sonar_filter_val_prev_prev;

      sonar_meas_prev_prev = sonar_meas_prev;
      sonar_meas_prev = sonar_meas;
      sonar_filter_val_prev_prev = sonar_filter_val_prev;
      sonar_filter_val_prev = sonar_filter_val;

      /** using float
      float factor_cm = 0.0165229885;
      float alt_cm_flt = sonar_meas * factor_cm * (1<<8);
      sonar_meas_real = alt_cm_flt;*/


      //((69 / 72) / 58) * (2^16) = 1082.85057
      //uint16_t conv_factor_cm = 1083;
      //sonar_alt_cm_bfp = conv_factor_cm*sonar_filter_val;
      //sonar_filtered = conv_factor_cm*sonar_filter_val;

      //((69 / 72) / 58) / 100 * (2^8) = 0.0422988506
      float conv_factor_m = 0.0422988506;
      float alt_m_bfp_fl = conv_factor_m*sonar_filter_val;
      sonar_filtered = alt_m_bfp_fl;
      //ins_sonar_initialised = TRUE;
      ins_update_sonar();
      //sonar_filtered = conv_factor_cm*sonar_filter_val;
      //DOWNLINK_SEND_VFF(DefaultChannel, &alt_mm_flt,0,0,0,0,0,0);
      DOWNLINK_SEND_INS_Z(DefaultChannel, &sonar_filtered,&sonar_spike_cnt,0, 0);
    }
}
Esempio n. 2
0
void navdata_update()
{
  static bool_t last_checksum_wrong = FALSE;
  // Check if initialized
  if (!nav_port.isInitialized) {
    navdata_init();
    return;
  }

  // Start reading
  navdata_read();

  // while there is something interesting to do...
  while (nav_port.bytesRead >= NAVDATA_PACKET_SIZE)
  {
    if (nav_port.buffer[0] == NAVDATA_START_BYTE)
    {
      assert(sizeof navdata == NAVDATA_PACKET_SIZE);
      memcpy(&navdata, nav_port.buffer, NAVDATA_PACKET_SIZE);

      // Calculating the checksum
      uint16_t checksum = 0;
      for(int i = 2; i < NAVDATA_PACKET_SIZE-2; i += 2) {
        checksum += nav_port.buffer[i] + (nav_port.buffer[i+1] << 8);
      }

      // When checksum is incorrect
      if(navdata.chksum != checksum) {
        printf("Checksum error [calculated: %d] [packet: %d] [diff: %d]\n",checksum , navdata.chksum, checksum-navdata.chksum);
        nav_port.checksum_errors++;
      }

      // When we already dropped a packet or checksum is correct
      if(last_checksum_wrong || navdata.chksum == checksum) {
        // Invert byte order so that TELEMETRY works better
        uint8_t tmp;
        uint8_t* p = (uint8_t*) &(navdata.pressure);
        tmp = p[0];
        p[0] = p[1];
        p[1] = tmp;
        p = (uint8_t*) &(navdata.temperature_pressure);
        tmp = p[0];
        p[0] = p[1];
        p[1] = tmp;

        baro_update_logic();

#ifdef USE_SONAR
        if (navdata.ultrasound < 10000)
        {
            sonar_meas = navdata.ultrasound;
            ins_update_sonar();

        }
#endif


        navdata_imu_available = TRUE;
        last_checksum_wrong = FALSE;
        nav_port.packetsRead++;
      }

      // Crop the buffer
      navdata_cropbuffer(NAVDATA_PACKET_SIZE);
    }
    else
    {
      // find start byte, copy all data from startbyte to buffer origin, update bytesread
      uint8_t * pint;
      pint = memchr(nav_port.buffer, NAVDATA_START_BYTE, nav_port.bytesRead);

      if (pint != NULL) {
        navdata_cropbuffer(pint - nav_port.buffer);
      } else {
        // if the start byte was not found, it means there is junk in the buffer
        nav_port.bytesRead = 0;
      }
    }
  }
}