From 23d8b69e3ddd3df55d1383f77751882c915466d0 Mon Sep 17 00:00:00 2001 From: px4dev Date: Sat, 25 Aug 2012 11:52:44 -0700 Subject: [PATCH] Sensor drivers should run all the time, not just when their device is open. Disable this for the mpu6000 driver though, as it's currently busted in that regard. --- apps/drivers/hmc5883/hmc5883.cpp | 42 ++++-------------------- apps/drivers/mpu6000/mpu6000.cpp | 27 +++------------- apps/drivers/ms5611/ms5611.cpp | 55 ++++++++++---------------------- 3 files changed, 27 insertions(+), 97 deletions(-) diff --git a/apps/drivers/hmc5883/hmc5883.cpp b/apps/drivers/hmc5883/hmc5883.cpp index c6d03a7e49..3ebfd5f2cf 100644 --- a/apps/drivers/hmc5883/hmc5883.cpp +++ b/apps/drivers/hmc5883/hmc5883.cpp @@ -126,9 +126,6 @@ public: virtual ssize_t read(struct file *filp, char *buffer, size_t buflen); virtual int ioctl(struct file *filp, int cmd, unsigned long arg); - virtual int open_first(struct file *filp); - virtual int close_last(struct file *filp); - /** * Diagnostics - print some basic information about the driver. */ @@ -277,7 +274,7 @@ HMC5883::HMC5883(int bus) : _scale.z_scale = 1.0f / 1090.0f; /* default range scale from counts to gauss */ // work_cancel in the dtor will explode if we don't do this... - _work.worker = nullptr; + memset(&_work, 0, sizeof(_work)); } HMC5883::~HMC5883() @@ -296,44 +293,19 @@ HMC5883::init() int ret = ERROR; /* do I2C init (and probe) first */ - ret = I2C::init(); - - if (ret != OK) + if (I2C::init() != OK) goto out; -out: - return ret; -} - -int -HMC5883::open_first(struct file *filp) -{ - /* reset to manual-poll mode */ - _measure_ticks = 0; - /* allocate basic report buffers */ _num_reports = 2; _reports = new struct mag_report[_num_reports]; + if (_reports == nullptr) + goto out; _oldest_report = _next_report = 0; - return OK; -} - -int -HMC5883::close_last(struct file *filp) -{ - /* stop measurement */ - stop(); - - /* free report buffers */ - if (_reports != nullptr) { - delete[] _reports; - _num_reports = 0; - } - - _measure_ticks = 0; - - return OK; + ret = OK; +out: + return ret; } int diff --git a/apps/drivers/mpu6000/mpu6000.cpp b/apps/drivers/mpu6000/mpu6000.cpp index 0a18764268..57713f40b0 100644 --- a/apps/drivers/mpu6000/mpu6000.cpp +++ b/apps/drivers/mpu6000/mpu6000.cpp @@ -157,9 +157,6 @@ public: virtual ssize_t read(struct file *filp, char *buffer, size_t buflen); virtual int ioctl(struct file *filp, int cmd, unsigned long arg); - virtual int open_first(struct file *filp); - virtual int close_last(struct file *filp); - /** * Diagnostics - print some basic information about the driver. */ @@ -322,6 +319,7 @@ MPU6000::MPU6000(int bus, spi_dev_e device) : memset(&_accel_report, 0, sizeof(_accel_report)); memset(&_gyro_report, 0, sizeof(_gyro_report)); + memset(&_call, 0, sizeof(_call)); } MPU6000::~MPU6000() @@ -444,26 +442,6 @@ MPU6000::init() return ret; } -int -MPU6000::open_first(struct file *filp) -{ - /* reset to manual-poll mode */ - _call_interval = 0; - - /* XXX set default sampling/acquisition parameters */ - - return OK; -} - -int -MPU6000::close_last(struct file *filp) -{ - /* stop measurement */ - stop(); - - return OK; -} - int MPU6000::probe() { @@ -911,12 +889,15 @@ start() if (OK != g_dev->init()) goto fail; +#if 0 /* XXX don't do this for now - the auto-poller is børked */ + /* set the poll rate to default, starts automatic data collection */ fd = open(ACCEL_DEVICE_PATH, O_RDONLY); if (fd < 0) goto fail; if (ioctl(fd, SENSORIOCSPOLLRATE, SENSOR_POLLRATE_DEFAULT) < 0) goto fail; +#endif exit(0); fail: diff --git a/apps/drivers/ms5611/ms5611.cpp b/apps/drivers/ms5611/ms5611.cpp index 40448511d2..4921efb283 100644 --- a/apps/drivers/ms5611/ms5611.cpp +++ b/apps/drivers/ms5611/ms5611.cpp @@ -64,6 +64,12 @@ #include +/* oddly, ERROR is not defined for c++ */ +#ifdef ERROR +# undef ERROR +#endif +static const int ERROR = -1; + /** * Calibration PROM as reported by the device. */ @@ -99,9 +105,6 @@ public: virtual ssize_t read(struct file *filp, char *buffer, size_t buflen); virtual int ioctl(struct file *filp, int cmd, unsigned long arg); - virtual int open_first(struct file *filp); - virtual int close_last(struct file *filp); - /** * Diagnostics - print some basic information about the driver. */ @@ -259,7 +262,7 @@ MS5611::MS5611(int bus) : _debug_enabled = true; // work_cancel in the dtor will explode if we don't do this... - _work.worker = nullptr; + memset(&_work, 0, sizeof(_work)); } MS5611::~MS5611() @@ -275,43 +278,23 @@ MS5611::~MS5611() int MS5611::init() { - int ret; + int ret = ERROR; /* do I2C init (and probe) first */ - ret = I2C::init(); - - return ret; -} - -int -MS5611::open_first(struct file *filp) -{ - /* reset to manual-poll mode */ - _measure_ticks = 0; + if (I2C::init() != OK) + goto out; /* allocate basic report buffers */ _num_reports = 2; _reports = new struct baro_report[_num_reports]; - _oldest_report = _next_report = 0; - - return OK; -} - -int -MS5611::close_last(struct file *filp) -{ - /* stop measurement */ - stop(); - - /* free report buffers */ - if (_reports != nullptr) { - delete[] _reports; - _num_reports = 0; - } + if (_reports == nullptr) + goto out; - _measure_ticks = 0; + _oldest_report = _next_report = 0; - return OK; + ret = OK; +out: + return ret; } int @@ -807,12 +790,6 @@ MS5611::print_info() namespace ms5611 { -/* oddly, ERROR is not defined for c++ */ -#ifdef ERROR -# undef ERROR -#endif -const int ERROR = -1; - MS5611 *g_dev; void start();