AP_Airspeed: protect sample timestamp while get data

This commit is contained in:
liang 2019-10-11 23:19:33 -07:00 committed by Andrew Tridgell
parent fe889b6f4e
commit 194ea66912
4 changed files with 25 additions and 28 deletions

View File

@ -98,18 +98,17 @@ void AP_Airspeed_DLVR::timer()
// return the current differential_pressure in Pascal // return the current differential_pressure in Pascal
bool AP_Airspeed_DLVR::get_differential_pressure(float &_pressure) bool AP_Airspeed_DLVR::get_differential_pressure(float &_pressure)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - last_sample_time_ms) > 100) { if ((AP_HAL::millis() - last_sample_time_ms) > 100) {
return false; return false;
} }
{
WITH_SEMAPHORE(sem);
if (press_count > 0) { if (press_count > 0) {
pressure = pressure_sum / press_count; pressure = pressure_sum / press_count;
press_count = 0; press_count = 0;
pressure_sum = 0; pressure_sum = 0;
} }
}
_pressure = pressure; _pressure = pressure;
return true; return true;
@ -118,12 +117,12 @@ bool AP_Airspeed_DLVR::get_differential_pressure(float &_pressure)
// return the current temperature in degrees C, if available // return the current temperature in degrees C, if available
bool AP_Airspeed_DLVR::get_temperature(float &_temperature) bool AP_Airspeed_DLVR::get_temperature(float &_temperature)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - last_sample_time_ms) > 100) { if ((AP_HAL::millis() - last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (temp_count > 0) { if (temp_count > 0) {
temperature = temperature_sum / temp_count; temperature = temperature_sum / temp_count;
temp_count = 0; temp_count = 0;

View File

@ -223,12 +223,12 @@ void AP_Airspeed_MS4525::_timer()
// return the current differential_pressure in Pascal // return the current differential_pressure in Pascal
bool AP_Airspeed_MS4525::get_differential_pressure(float &pressure) bool AP_Airspeed_MS4525::get_differential_pressure(float &pressure)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - _last_sample_time_ms) > 100) { if ((AP_HAL::millis() - _last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (_press_count > 0) { if (_press_count > 0) {
_pressure = _press_sum / _press_count; _pressure = _press_sum / _press_count;
_press_count = 0; _press_count = 0;
@ -242,12 +242,12 @@ bool AP_Airspeed_MS4525::get_differential_pressure(float &pressure)
// return the current temperature in degrees C, if available // return the current temperature in degrees C, if available
bool AP_Airspeed_MS4525::get_temperature(float &temperature) bool AP_Airspeed_MS4525::get_temperature(float &temperature)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - _last_sample_time_ms) > 100) { if ((AP_HAL::millis() - _last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (_temp_count > 0) { if (_temp_count > 0) {
_temperature = _temp_sum / _temp_count; _temperature = _temp_sum / _temp_count;
_temp_count = 0; _temp_count = 0;

View File

@ -264,12 +264,12 @@ void AP_Airspeed_MS5525::timer()
// return the current differential_pressure in Pascal // return the current differential_pressure in Pascal
bool AP_Airspeed_MS5525::get_differential_pressure(float &_pressure) bool AP_Airspeed_MS5525::get_differential_pressure(float &_pressure)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - last_sample_time_ms) > 100) { if ((AP_HAL::millis() - last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (press_count > 0) { if (press_count > 0) {
pressure = pressure_sum / press_count; pressure = pressure_sum / press_count;
press_count = 0; press_count = 0;
@ -283,12 +283,12 @@ bool AP_Airspeed_MS5525::get_differential_pressure(float &_pressure)
// return the current temperature in degrees C, if available // return the current temperature in degrees C, if available
bool AP_Airspeed_MS5525::get_temperature(float &_temperature) bool AP_Airspeed_MS5525::get_temperature(float &_temperature)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - last_sample_time_ms) > 100) { if ((AP_HAL::millis() - last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (temp_count > 0) { if (temp_count > 0) {
temperature = temperature_sum / temp_count; temperature = temperature_sum / temp_count;
temp_count = 0; temp_count = 0;

View File

@ -278,19 +278,17 @@ float AP_Airspeed_SDP3X::_correct_pressure(float press)
// return the current differential_pressure in Pascal // return the current differential_pressure in Pascal
bool AP_Airspeed_SDP3X::get_differential_pressure(float &pressure) bool AP_Airspeed_SDP3X::get_differential_pressure(float &pressure)
{ {
uint32_t now = AP_HAL::millis(); WITH_SEMAPHORE(sem);
if (now - _last_sample_time_ms > 100) {
if (AP_HAL::millis() - _last_sample_time_ms > 100) {
return false; return false;
} }
{
WITH_SEMAPHORE(sem);
if (_press_count > 0) { if (_press_count > 0) {
_press = _press_sum / _press_count; _press = _press_sum / _press_count;
_press_count = 0; _press_count = 0;
_press_sum = 0; _press_sum = 0;
} }
}
pressure = _correct_pressure(_press); pressure = _correct_pressure(_press);
return true; return true;
@ -299,12 +297,12 @@ bool AP_Airspeed_SDP3X::get_differential_pressure(float &pressure)
// return the current temperature in degrees C, if available // return the current temperature in degrees C, if available
bool AP_Airspeed_SDP3X::get_temperature(float &temperature) bool AP_Airspeed_SDP3X::get_temperature(float &temperature)
{ {
WITH_SEMAPHORE(sem);
if ((AP_HAL::millis() - _last_sample_time_ms) > 100) { if ((AP_HAL::millis() - _last_sample_time_ms) > 100) {
return false; return false;
} }
WITH_SEMAPHORE(sem);
if (_temp_count > 0) { if (_temp_count > 0) {
_temp = _temp_sum / _temp_count; _temp = _temp_sum / _temp_count;
_temp_count = 0; _temp_count = 0;