예제 #1
0
void sensors_aquire_odometer()
{
     if(!sensors_en.odometer) return;

     static uint32_t refsensor_ticks = 0;

     static device_ref refsensors[] = {
          &refsensor_left,
          &refsensor_right,
     };

     static int refsensor_values[2];
     static int refsensor_values_prev[2];

     static int lcl = 0;	// last count left
     static int lcr = 0;	// last count right

     switch(refsensor_ticks) {
     case 0:
          refsensor_start_charge_multi(refsensors, 2);
          refsensor_ticks++;
          break;
     case 100:
          refsensor_measure_multi(refsensors, refsensor_values, 2);

          int lp  = rtc_get_counter_val();	// time stamp of last poll

          int dlp_left  = lp - sensors.odometer_left.lp;
          int dlp_right = lp - sensors.odometer_right.lp;

          sensors.odometer_left.count += sensors_check_odo_level(refsensor_values[0],
                                         refsensor_values_prev[0]);

          refsensor_values_prev[0] = refsensor_values[0];

          sensors.odometer_right.count += sensors_check_odo_level(refsensor_values[1],
                                          refsensor_values_prev[1]);

          refsensor_values_prev[1] = refsensor_values[1];

          // calc ppm (if time advanced)
          if(dlp_left >= 1) {
               sensors.odometer_left.ppm = (60 / dlp_left) * (sensors.odometer_left.count - lcl);
               sensors.odometer_left.lp  = lp;
               lcl = sensors.odometer_left.count;
          }
          if(dlp_right >= 1) {
               sensors.odometer_right.ppm = (60 / dlp_right) * (sensors.odometer_right.count - lcr);
               sensors.odometer_right.lp = lp;
               lcr = sensors.odometer_right.count;
          }

          refsensor_ticks = 0;

          break;
     default:
          refsensor_ticks++;
     }
}
예제 #2
0
void rtc_isr(void)
{
  volatile uint32_t j = 0, c = 0;

  /* The interrupt flag isn't cleared by hardware, we have to do it. */
  rtc_clear_flag(RTC_SEC);

  c = rtc_get_counter_val();

  /* Display the current counter value in binary via USART1.
  for (j = 0; j < 32; j++) {
    if ((c & (0x80000000 >> j)) != 0)
      cdcacm_input('1');
    else
      cdcacm_input('0');
  }
  cdcacm_input('\r');
  cdcacm_input('\n');
  */
  //printf("Current counter: %d \r\n", c);
}
예제 #3
0
파일: rtc.c 프로젝트: mholtzberg/schranke
time_t rtc_time(void)
{
    return rtc_get_counter_val();
}