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++; } }
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); }
time_t rtc_time(void) { return rtc_get_counter_val(); }