static void read_distance(void) { float previous = state->distance; float read = ultrasonic.get_distance(); if(read > state->config.can_height) { read = state->config.can_height; } if(read < 0) return; float delta = previous - read; if(delta > 10 || delta < -10) { if(state->distance_change++ == 5) { state->distance_change = 0; state->distance = read; state->level = (state->config.can_height - read) / state->config.can_height * 100; } else { read = previous - (delta * state->distance_change / 5); state->distance = read; state->level = (state->config.can_height - read) / state->config.can_height * 100; } } else { state->distance_change = 0; state->distance = read; state->level = (state->config.can_height - read) / state->config.can_height * 100; } }