From fe404c8a5db7331743ae99bc1b5436fb5f0381f4 Mon Sep 17 00:00:00 2001 From: mirkix Date: Mon, 25 Jan 2016 20:13:48 +0100 Subject: [PATCH] AP_HAL_Linux: AnalogIIO: Remove unused code, add scaling for BBBMINI, rework --- libraries/AP_HAL_Linux/AnalogIn_IIO.cpp | 63 ++++--------------------- libraries/AP_HAL_Linux/AnalogIn_IIO.h | 23 ++++----- 2 files changed, 18 insertions(+), 68 deletions(-) diff --git a/libraries/AP_HAL_Linux/AnalogIn_IIO.cpp b/libraries/AP_HAL_Linux/AnalogIn_IIO.cpp index 832481bb92..08412916ae 100644 --- a/libraries/AP_HAL_Linux/AnalogIn_IIO.cpp +++ b/libraries/AP_HAL_Linux/AnalogIn_IIO.cpp @@ -6,8 +6,7 @@ extern const AP_HAL::HAL& hal; -const char* AnalogSource_IIO::analog_sources[IIO_ANALOG_IN_COUNT] = { -#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF +const char* AnalogSource_IIO::analog_sources[] = { "in_voltage0_raw", "in_voltage1_raw", "in_voltage2_raw", @@ -16,14 +15,12 @@ const char* AnalogSource_IIO::analog_sources[IIO_ANALOG_IN_COUNT] = { "in_voltage5_raw", "in_voltage6_raw", "in_voltage7_raw", -#else - "in_voltage0_raw", -#endif }; -AnalogSource_IIO::AnalogSource_IIO(int16_t pin, float initial_value) : +AnalogSource_IIO::AnalogSource_IIO(int16_t pin, float initial_value, float voltage_scaling) : _pin(pin), _value(initial_value), + _voltage_scaling(voltage_scaling), _sum_value(0), _sum_count(0), _pin_fd(-1) @@ -35,15 +32,12 @@ AnalogSource_IIO::AnalogSource_IIO(int16_t pin, float initial_value) : void AnalogSource_IIO::init_pins(void) { char buf[100]; - for (int i=0; i < IIO_ANALOG_IN_COUNT; i++) { + for (unsigned int i = 0; i < ARRAY_SIZE(AnalogSource_IIO::analog_sources); i++) { // Construct the path by appending strings strncpy(buf, IIO_ANALOG_IN_DIR, sizeof(buf)); - strncat(buf, AnalogSource_IIO::analog_sources[i], sizeof(buf) - strlen(buf) -1); + strncat(buf, AnalogSource_IIO::analog_sources[i], sizeof(buf) - strlen(buf) - 1); fd_analog_sources[i] = open(buf, O_RDONLY | O_NONBLOCK); - if (fd_analog_sources[i] == -1) { - ::printf("Failed to open analog pin %s\n", buf); - } } } @@ -55,39 +49,6 @@ void AnalogSource_IIO::select_pin(void) _pin_fd = fd_analog_sources[_pin]; } -/* - reopens an analog source (by closing and opening it again) and selects it - */ -void AnalogSource_IIO::reopen_pin(void) -{ - char buf[100]; - - if (fd_analog_sources[_pin] != -1) { - close(fd_analog_sources[_pin]); - fd_analog_sources[_pin] = -1; - _pin_fd = -1; - } - - if (_pin < 0) { - return; - } - - if (_pin > IIO_ANALOG_IN_COUNT) { - // invalid pin - return; - } - - // Construct the path by appending strings - strncpy(buf, IIO_ANALOG_IN_DIR, sizeof(buf)); - strncat(buf, AnalogSource_IIO::analog_sources[_pin], sizeof(buf) - strlen(buf) - 1); - - fd_analog_sources[_pin] = open(buf, O_RDONLY | O_NONBLOCK); - if (fd_analog_sources[_pin] == -1) { - ::printf("Failed to open analog pin %s\n", buf); - } - _pin_fd = fd_analog_sources[_pin]; -} - float AnalogSource_IIO::read_average() { read_latest(); @@ -96,9 +57,7 @@ float AnalogSource_IIO::read_average() } hal.scheduler->suspend_timer_procs(); _value = _sum_value / _sum_count; - // _value_ratiometric = _sum_ratiometric / _sum_count; _sum_value = 0; - // _sum_ratiometric = 0; _sum_count = 0; hal.scheduler->resume_timer_procs(); return _value; @@ -114,12 +73,8 @@ float AnalogSource_IIO::read_latest() } memset(sbuf, 0, sizeof(sbuf)); - pread(_pin_fd, sbuf, sizeof(sbuf)-1, 0); -#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF - _latest = atoi(sbuf) * BBB_VOLTAGE_SCALING; -#else - _latest = atoi(sbuf); -#endif + pread(_pin_fd, sbuf, sizeof(sbuf) - 1, 0); + _latest = atoi(sbuf) * _voltage_scaling; _sum_value += _latest; _sum_count++; @@ -147,12 +102,10 @@ void AnalogSource_IIO::set_pin(uint8_t pin) hal.scheduler->suspend_timer_procs(); _pin = pin; _sum_value = 0; - // _sum_ratiometric = 0; _sum_count = 0; _latest = 0; _value = 0; select_pin(); - // _value_ratiometric = 0; hal.scheduler->resume_timer_procs(); } @@ -170,7 +123,7 @@ void AnalogIn_IIO::init() AP_HAL::AnalogSource* AnalogIn_IIO::channel(int16_t pin) { - return new AnalogSource_IIO(pin, 0); + return new AnalogSource_IIO(pin, 0.0f, IIO_VOLTAGE_SCALING); } #endif // CONFIG_HAL_BOARD diff --git a/libraries/AP_HAL_Linux/AnalogIn_IIO.h b/libraries/AP_HAL_Linux/AnalogIn_IIO.h index 067f119f09..de5de19e83 100644 --- a/libraries/AP_HAL_Linux/AnalogIn_IIO.h +++ b/libraries/AP_HAL_Linux/AnalogIn_IIO.h @@ -1,29 +1,27 @@ +/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- #pragma once #include "AP_HAL_Linux.h" #include -#include -#include -#include #include #include -#include +#define IIO_ANALOG_IN_COUNT 8 +#define IIO_ANALOG_IN_DIR "/sys/bus/iio/devices/iio:device0/" #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF -#define IIO_ANALOG_IN_COUNT 8 // Note that echo BB-ADC cape should be loaded -#define IIO_ANALOG_IN_DIR "/sys/bus/iio/devices/iio:device0/" -#define BBB_VOLTAGE_SCALING 0.00142602816 +#define IIO_VOLTAGE_SCALING 0.00142602816 +#elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI +#define IIO_VOLTAGE_SCALING 10.0/30.0*1.8/4096.0 #else -#define IIO_ANALOG_IN_COUNT 8 -#define IIO_ANALOG_IN_DIR "/sys/bus/iio/devices/iio:device0/" +#define IIO_VOLTAGE_SCALING 1.0 #endif class AnalogSource_IIO : public AP_HAL::AnalogSource { public: friend class AnalogIn_IIO; - AnalogSource_IIO(int16_t pin, float v); + AnalogSource_IIO(int16_t pin, float initial_value, float voltage_scaling); float read_average(); float read_latest(); void set_pin(uint8_t p); @@ -36,17 +34,16 @@ private: float _value; float _latest; float _sum_value; - // float _value_ratiometric; + float _voltage_scaling; uint8_t _sum_count; int16_t _pin; int _pin_fd; int fd_analog_sources[IIO_ANALOG_IN_COUNT]; - void reopen_pin(void); void init_pins(void); void select_pin(void); - static const char *analog_sources[IIO_ANALOG_IN_COUNT]; + static const char *analog_sources[]; }; class AnalogIn_IIO : public AP_HAL::AnalogIn {