From 04cffce99218b4ef9d6fc24df376ba6188ecd5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Thu, 19 Mar 2020 14:43:05 +0100 Subject: [PATCH] refactor aerofc_adc: use driver base class --- .../intel/aerofc-v1/aerofc_adc/AEROFC_ADC.cpp | 16 +- .../intel/aerofc-v1/aerofc_adc/AEROFC_ADC.hpp | 12 +- .../aerofc-v1/aerofc_adc/aerofc_adc_main.cpp | 149 ++++++------------ boards/intel/aerofc-v1/init/rc.board_sensors | 2 +- src/drivers/drv_sensor.h | 1 + 5 files changed, 66 insertions(+), 114 deletions(-) diff --git a/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.cpp b/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.cpp index e99f0fd1d4..bd82b4c4bc 100644 --- a/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.cpp +++ b/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.cpp @@ -35,17 +35,15 @@ using namespace time_literals; -AEROFC_ADC::AEROFC_ADC(uint8_t bus) : - I2C("AEROFC_ADC", AEROFC_ADC_DEVICE_PATH, bus, SLAVE_ADDR, 400000), - ScheduledWorkItem(MODULE_NAME, px4::device_bus_to_wq(get_device_id())), +AEROFC_ADC::AEROFC_ADC(I2CSPIBusOption bus_option, int bus_number, int bus_frequency) : + I2C("AEROFC_ADC", AEROFC_ADC_DEVICE_PATH, bus_number, SLAVE_ADDR, bus_frequency), + I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus_number), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")) { - } AEROFC_ADC::~AEROFC_ADC() { - ScheduleClear(); perf_free(_sample_perf); } @@ -94,7 +92,7 @@ error: return -EIO; } -void AEROFC_ADC::Run() +void AEROFC_ADC::RunImpl() { /* * https://github.com/intel-aero/intel-aero-fpga/blob/master/aero_sample/adc/adc.html @@ -112,8 +110,8 @@ void AEROFC_ADC::Run() return; } - adc_report_s adc_report; - adc_report.device_id = this->get_device_id(); + adc_report_s adc_report{}; + adc_report.device_id = get_device_id(); adc_report.timestamp = hrt_absolute_time(); adc_report.v_ref = 3.0f; adc_report.resolution = 1 << 12; @@ -132,4 +130,4 @@ void AEROFC_ADC::Run() _to_adc_report.publish(adc_report); perf_end(_sample_perf); -} \ No newline at end of file +} diff --git a/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.hpp b/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.hpp index c148c08946..9d7fe849cf 100644 --- a/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.hpp +++ b/boards/intel/aerofc-v1/aerofc_adc/AEROFC_ADC.hpp @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include @@ -52,17 +52,21 @@ #define MAX_CHANNEL 5 #define AEROFC_ADC_DEVICE_PATH "/dev/aerofc_adc" -class AEROFC_ADC : public device::I2C, public px4::ScheduledWorkItem +class AEROFC_ADC : public device::I2C, public I2CSPIDriver { public: - AEROFC_ADC(uint8_t bus); + AEROFC_ADC(I2CSPIBusOption bus_option, int bus_number, int bus_frequency); ~AEROFC_ADC() override; + static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, + int runtime_instance); + static void print_usage(); + int init() override; + void RunImpl(); private: int probe() override;; - void Run() override; uORB::Publication _to_adc_report{ORB_ID(adc_report)}; diff --git a/boards/intel/aerofc-v1/aerofc_adc/aerofc_adc_main.cpp b/boards/intel/aerofc-v1/aerofc_adc/aerofc_adc_main.cpp index db4640ec6e..19003327b0 100644 --- a/boards/intel/aerofc-v1/aerofc_adc/aerofc_adc_main.cpp +++ b/boards/intel/aerofc-v1/aerofc_adc/aerofc_adc_main.cpp @@ -33,117 +33,66 @@ #include #include +#include #include "AEROFC_ADC.hpp" -enum AEROFC_ADC_BUS { - AEROFC_ADC_BUS_ALL = 0, - AEROFC_ADC_BUS_I2C_INTERNAL, - AEROFC_ADC_BUS_I2C_EXTERNAL -}; - -static constexpr struct aerofc_adc_bus_option { - enum AEROFC_ADC_BUS busid; - uint8_t busnum; -} bus_options[] = { -#ifdef PX4_I2C_BUS_EXPANSION - { AEROFC_ADC_BUS_I2C_EXTERNAL, PX4_I2C_BUS_EXPANSION }, -#endif -#ifdef PX4_I2C_BUS_EXPANSION1 - { AEROFC_ADC_BUS_I2C_EXTERNAL, PX4_I2C_BUS_EXPANSION1 }, -#endif -#ifdef PX4_I2C_BUS_ONBOARD - { AEROFC_ADC_BUS_I2C_INTERNAL, PX4_I2C_BUS_ONBOARD }, -#endif -}; - -extern "C" { __EXPORT int aerofc_adc_main(int argc, char *argv[]); } - -static AEROFC_ADC *instance = nullptr; - -static int test() +I2CSPIDriverBase * +AEROFC_ADC::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, int runtime_instance) { - PX4_INFO("test is currently unavailable"); + AEROFC_ADC *interface = new AEROFC_ADC(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - return 0; -} - -static void help() -{ - printf("missing command: try 'start' or 'test'\n"); - printf("options:\n"); - printf(" -I only internal I2C bus\n"); - printf(" -X only external I2C bus\n"); -} - -int aerofc_adc_main(int argc, char *argv[]) -{ - int ch; - enum AEROFC_ADC_BUS busid = AEROFC_ADC_BUS_ALL; - - while ((ch = getopt(argc, argv, "XI")) != EOF) { - switch (ch) { - case 'X': - busid = AEROFC_ADC_BUS_I2C_EXTERNAL; - break; - - case 'I': - busid = AEROFC_ADC_BUS_I2C_INTERNAL; - break; - - default: - help(); - return -1; - } + if (interface == nullptr) { + PX4_ERR("alloc failed"); + return nullptr; } - if (optind >= argc) { - help(); - return PX4_ERROR; + if (interface->init() != OK) { + delete interface; + PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + return nullptr; } - const char *verb = argv[optind]; + return interface; +} + +void +AEROFC_ADC::print_usage() +{ + PRINT_MODULE_USAGE_NAME("aerofc_adc", "driver"); + PRINT_MODULE_USAGE_COMMAND("start"); + PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); +} + +extern "C" int +aerofc_adc_main(int argc, char *argv[]) +{ + using ThisDriver = AEROFC_ADC; + BusCLIArguments cli{true, false}; + cli.default_i2c_frequency = 400000; + + const char *verb = cli.parseDefaultArguments(argc, argv); + + if (!verb) { + ThisDriver::print_usage(); + return -1; + } + + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_ADC_DEVTYPE_AEROFC); if (!strcmp(verb, "start")) { - if (instance) { - PX4_WARN("AEROFC_ADC was already started"); - return PX4_OK; - } - - for (uint8_t i = 0; i < (sizeof(bus_options) / sizeof(bus_options[0])); i++) { - if (busid != AEROFC_ADC_BUS_ALL && busid != bus_options[i].busid) { - continue; - } - - instance = new AEROFC_ADC(bus_options[i].busnum); - - if (!instance) { - PX4_WARN("No memory to instance AEROFC_ADC"); - return PX4_ERROR; - } - - if (instance->init() == PX4_OK) { - break; - } - - PX4_WARN("AEROFC_ADC not found on busnum=%u", bus_options[i].busnum); - delete instance; - instance = nullptr; - } - - if (!instance) { - PX4_WARN("AEROFC_ADC not found"); - return PX4_ERROR; - } - - } else if (!strcmp(verb, "test")) { - return test(); - - } else { - PX4_WARN("Action not supported"); - help(); - return PX4_ERROR; + return ThisDriver::module_start(cli, iterator); } - return PX4_OK; + if (!strcmp(verb, "stop")) { + return ThisDriver::module_stop(iterator); + } + + if (!strcmp(verb, "status")) { + return ThisDriver::module_status(iterator); + } + + ThisDriver::print_usage(); + return 1; } diff --git a/boards/intel/aerofc-v1/init/rc.board_sensors b/boards/intel/aerofc-v1/init/rc.board_sensors index b2e4de1701..c468d0adae 100644 --- a/boards/intel/aerofc-v1/init/rc.board_sensors +++ b/boards/intel/aerofc-v1/init/rc.board_sensors @@ -3,7 +3,7 @@ # intel aero specific board sensors init #------------------------------------------------------------------------------ -aerofc_adc start +aerofc_adc -I start if ! ms5611 -T 5607 start then diff --git a/src/drivers/drv_sensor.h b/src/drivers/drv_sensor.h index ebce13b5fd..5268bdec02 100644 --- a/src/drivers/drv_sensor.h +++ b/src/drivers/drv_sensor.h @@ -114,6 +114,7 @@ #define DRV_IMU_DEVTYPE_ADIS16448 0x57 #define DRV_BARO_DEVTYPE_LPS22HB 0x58 #define DRV_IMU_DEVTYPE_ADIS16477 0x59 +#define DRV_ADC_DEVTYPE_AEROFC 0x5a #define DRV_ACC_DEVTYPE_LSM303AGR 0x61 #define DRV_MAG_DEVTYPE_LSM303AGR 0x62