Browse Source

airspeed driver: Do not spam the console on error, report the system change only once

sbg
Lorenz Meier 11 years ago
parent
commit
709d104de4
  1. 31
      src/drivers/airspeed/airspeed.cpp
  2. 7
      src/drivers/airspeed/airspeed.h
  3. 14
      src/drivers/ets_airspeed/ets_airspeed.cpp
  4. 13
      src/drivers/meas_airspeed/meas_airspeed.cpp

31
src/drivers/airspeed/airspeed.cpp

@ -82,10 +82,12 @@ Airspeed::Airspeed(int bus, int address, unsigned conversion_interval, const cha
_buffer_overflows(perf_alloc(PC_COUNT, "airspeed_buffer_overflows")), _buffer_overflows(perf_alloc(PC_COUNT, "airspeed_buffer_overflows")),
_max_differential_pressure_pa(0), _max_differential_pressure_pa(0),
_sensor_ok(false), _sensor_ok(false),
_last_published_sensor_ok(true), /* initialize differently to force publication */
_measure_ticks(0), _measure_ticks(0),
_collect_phase(false), _collect_phase(false),
_diff_pres_offset(0.0f), _diff_pres_offset(0.0f),
_airspeed_pub(-1), _airspeed_pub(-1),
_subsys_pub(-1),
_class_instance(-1), _class_instance(-1),
_conversion_interval(conversion_interval), _conversion_interval(conversion_interval),
_sample_perf(perf_alloc(PC_ELAPSED, "airspeed_read")), _sample_perf(perf_alloc(PC_ELAPSED, "airspeed_read")),
@ -344,28 +346,34 @@ Airspeed::start()
/* schedule a cycle to start things */ /* schedule a cycle to start things */
work_queue(HPWORK, &_work, (worker_t)&Airspeed::cycle_trampoline, this, 1); work_queue(HPWORK, &_work, (worker_t)&Airspeed::cycle_trampoline, this, 1);
}
void
Airspeed::stop()
{
work_cancel(HPWORK, &_work);
}
void
Airspeed::update_status()
{
if (_sensor_ok != _last_published_sensor_ok) {
/* notify about state change */ /* notify about state change */
struct subsystem_info_s info = { struct subsystem_info_s info = {
true, true,
true, true,
true, _sensor_ok,
SUBSYSTEM_TYPE_DIFFPRESSURE SUBSYSTEM_TYPE_DIFFPRESSURE
}; };
static orb_advert_t pub = -1;
if (pub > 0) {
orb_publish(ORB_ID(subsystem_info), pub, &info);
if (_subsys_pub > 0) {
orb_publish(ORB_ID(subsystem_info), _subsys_pub, &info);
} else { } else {
pub = orb_advertise(ORB_ID(subsystem_info), &info); _subsys_pub = orb_advertise(ORB_ID(subsystem_info), &info);
}
} }
void _last_published_sensor_ok = _sensor_ok;
Airspeed::stop() }
{
work_cancel(HPWORK, &_work);
} }
void void
@ -374,6 +382,7 @@ Airspeed::cycle_trampoline(void *arg)
Airspeed *dev = (Airspeed *)arg; Airspeed *dev = (Airspeed *)arg;
dev->cycle(); dev->cycle();
dev->update_status();
} }
void void

7
src/drivers/airspeed/airspeed.h

@ -118,14 +118,21 @@ protected:
virtual int measure() = 0; virtual int measure() = 0;
virtual int collect() = 0; virtual int collect() = 0;
/**
* Update the subsystem status
*/
void update_status();
work_s _work; work_s _work;
float _max_differential_pressure_pa; float _max_differential_pressure_pa;
bool _sensor_ok; bool _sensor_ok;
bool _last_published_sensor_ok;
int _measure_ticks; int _measure_ticks;
bool _collect_phase; bool _collect_phase;
float _diff_pres_offset; float _diff_pres_offset;
orb_advert_t _airspeed_pub; orb_advert_t _airspeed_pub;
orb_advert_t _subsys_pub;
int _class_instance; int _class_instance;

14
src/drivers/ets_airspeed/ets_airspeed.cpp

@ -207,14 +207,18 @@ ETSAirspeed::collect()
void void
ETSAirspeed::cycle() ETSAirspeed::cycle()
{ {
int ret;
/* collection phase? */ /* collection phase? */
if (_collect_phase) { if (_collect_phase) {
/* perform collection */ /* perform collection */
if (OK != collect()) { ret = collect();
if (OK != ret) {
perf_count(_comms_errors); perf_count(_comms_errors);
/* restart the measurement state machine */ /* restart the measurement state machine */
start(); start();
_sensor_ok = false;
return; return;
} }
@ -238,8 +242,12 @@ ETSAirspeed::cycle()
} }
/* measurement phase */ /* measurement phase */
if (OK != measure()) ret = measure();
log("measure error"); if (OK != ret) {
debug("measure error");
}
_sensor_ok = (ret == OK);
/* next phase is collection */ /* next phase is collection */
_collect_phase = true; _collect_phase = true;

13
src/drivers/meas_airspeed/meas_airspeed.cpp

@ -288,13 +288,17 @@ MEASAirspeed::collect()
void void
MEASAirspeed::cycle() MEASAirspeed::cycle()
{ {
int ret;
/* collection phase? */ /* collection phase? */
if (_collect_phase) { if (_collect_phase) {
/* perform collection */ /* perform collection */
if (OK != collect()) { ret = collect();
if (OK != ret) {
/* restart the measurement state machine */ /* restart the measurement state machine */
start(); start();
_sensor_ok = false;
return; return;
} }
@ -318,10 +322,13 @@ MEASAirspeed::cycle()
} }
/* measurement phase */ /* measurement phase */
if (OK != measure()) { ret = measure();
log("measure error"); if (OK != ret) {
debug("measure error");
} }
_sensor_ok = (ret == OK);
/* next phase is collection */ /* next phase is collection */
_collect_phase = true; _collect_phase = true;

Loading…
Cancel
Save