diff --git a/ROMFS/px4fmu_common/init.d/rc.sensors b/ROMFS/px4fmu_common/init.d/rc.sensors index 389b16fc12bb8810baf1bb53f67ff217d24512ba..7c91cda54d817f844db7f3693aa864416fb64ff0 100644 --- a/ROMFS/px4fmu_common/init.d/rc.sensors +++ b/ROMFS/px4fmu_common/init.d/rc.sensors @@ -322,9 +322,10 @@ then fi # teraranger one tof sensor -if param compare SENS_EN_TRONE 1 +if param compare SENS_EN_TRANGER 0 then - trone start +else + teraranger start fi # Wait 20 ms for sensors (because we need to wait for the HRT and work queue callbacks to fire) diff --git a/cmake/configs/nuttx_aerocore2_default.cmake b/cmake/configs/nuttx_aerocore2_default.cmake index a6a79bfe4209f355c8628e109d2146a031eb118d..836c049b8ac69308c285a88601e8553defac1c22 100644 --- a/cmake/configs/nuttx_aerocore2_default.cmake +++ b/cmake/configs/nuttx_aerocore2_default.cmake @@ -20,7 +20,7 @@ set(config_module_list drivers/lsm303d drivers/l3gd20 drivers/ms5611 - drivers/trone + drivers/teraranger drivers/gps drivers/pwm_out_sim drivers/airspeed diff --git a/cmake/configs/nuttx_auav-x21_default.cmake b/cmake/configs/nuttx_auav-x21_default.cmake index c5b774cf55b1c5ba3787a00248b5b4d02a5c2dd7..89aca889b1629aada0174a63882ad553d5bdcce8 100644 --- a/cmake/configs/nuttx_auav-x21_default.cmake +++ b/cmake/configs/nuttx_auav-x21_default.cmake @@ -28,7 +28,7 @@ set(config_module_list drivers/sf0x drivers/sf1xx drivers/ll40ls - drivers/trone + drivers/teraranger drivers/gps drivers/pwm_out_sim drivers/hott diff --git a/cmake/configs/nuttx_mindpx-v2_default.cmake b/cmake/configs/nuttx_mindpx-v2_default.cmake index 07c9e1f04552e17ef99a194a272abf4ad9e85816..c4697a132a47ba5916c9ee8d12f345e297c7c39f 100644 --- a/cmake/configs/nuttx_mindpx-v2_default.cmake +++ b/cmake/configs/nuttx_mindpx-v2_default.cmake @@ -31,7 +31,7 @@ set(config_module_list drivers/sf0x drivers/sf1xx drivers/ll40ls - drivers/trone + drivers/teraranger drivers/gps drivers/pwm_out_sim #drivers/hott diff --git a/cmake/configs/nuttx_px4fmu-v2_default.cmake b/cmake/configs/nuttx_px4fmu-v2_default.cmake index 40a7ab4dd79e2fd6ea6bffdb573e488ce08ba9fd..4774968bd05eb3a20f9abaef79d023918cb62bfb 100644 --- a/cmake/configs/nuttx_px4fmu-v2_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v2_default.cmake @@ -29,7 +29,7 @@ set(config_module_list #drivers/srf02 drivers/sf0x drivers/ll40ls - drivers/trone + drivers/teraranger drivers/gps drivers/pwm_out_sim #drivers/hott diff --git a/cmake/configs/nuttx_px4fmu-v2_test.cmake b/cmake/configs/nuttx_px4fmu-v2_test.cmake index 36f2bf3ae4f2e45b7210d59afdef35b414cc31a7..e0e0fbf40841d2e9858c03cc02255808217bb758 100644 --- a/cmake/configs/nuttx_px4fmu-v2_test.cmake +++ b/cmake/configs/nuttx_px4fmu-v2_test.cmake @@ -29,7 +29,7 @@ set(config_module_list #drivers/srf02 #drivers/sf0x #drivers/ll40ls - #drivers/trone + #drivers/teraranger drivers/gps #drivers/pwm_out_sim #drivers/hott diff --git a/cmake/configs/nuttx_px4fmu-v3_default.cmake b/cmake/configs/nuttx_px4fmu-v3_default.cmake index a2654535fd6f58cade4c0eec4946b73c846c8164..4f02678440fc176eb4ffac7b403603c603c8031c 100644 --- a/cmake/configs/nuttx_px4fmu-v3_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v3_default.cmake @@ -54,7 +54,7 @@ set(config_module_list drivers/stm32/adc drivers/stm32/tone_alarm drivers/tap_esc - drivers/trone + drivers/teraranger drivers/vmount modules/sensors diff --git a/cmake/configs/nuttx_px4fmu-v4_default.cmake b/cmake/configs/nuttx_px4fmu-v4_default.cmake index a7be2539427fc1c10bf3ced06589014de38688c3..33a03d7b9dbd9ef19af91a2b27a2c02e3f8f0ce9 100644 --- a/cmake/configs/nuttx_px4fmu-v4_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v4_default.cmake @@ -55,7 +55,7 @@ set(config_module_list drivers/stm32/adc drivers/stm32/tone_alarm drivers/tap_esc - drivers/trone + drivers/teraranger drivers/vmount modules/sensors diff --git a/cmake/configs/nuttx_px4fmu-v4pro_default.cmake b/cmake/configs/nuttx_px4fmu-v4pro_default.cmake index 1b61fa64c793911139f3d95b6a3fe4a7e68634d3..ba07fecb3c30015ff615915235a845d803175ec0 100644 --- a/cmake/configs/nuttx_px4fmu-v4pro_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v4pro_default.cmake @@ -55,7 +55,7 @@ set(config_module_list drivers/stm32/adc drivers/stm32/tone_alarm drivers/tap_esc - drivers/trone + drivers/teraranger drivers/vmount modules/sensors diff --git a/cmake/configs/nuttx_px4fmu-v5_default.cmake b/cmake/configs/nuttx_px4fmu-v5_default.cmake index c0ddb71c070def50c629a1a27fdfca5a50705183..36426f8ea3c920016c969b5e1154caf9038a4569 100644 --- a/cmake/configs/nuttx_px4fmu-v5_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v5_default.cmake @@ -55,7 +55,7 @@ set(config_module_list drivers/stm32/adc drivers/stm32/tone_alarm drivers/tap_esc - drivers/trone + drivers/teraranger drivers/vmount modules/sensors diff --git a/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake b/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake index 2f2a0ec34d71dc571aefc690d21d9f7c53b67b9e..158d043f6d36f466e53725b5b19e4cc42c6180e6 100644 --- a/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake +++ b/cmake/configs/nuttx_px4nucleoF767ZI-v1_default.cmake @@ -50,7 +50,7 @@ set(config_module_list drivers/stm32/adc drivers/stm32/tone_alarm drivers/tap_esc - drivers/trone + drivers/teraranger modules/sensors # diff --git a/src/drivers/trone/CMakeLists.txt b/src/drivers/teraranger/CMakeLists.txt similarity index 93% rename from src/drivers/trone/CMakeLists.txt rename to src/drivers/teraranger/CMakeLists.txt index 2c208b837272e920b9e21789e3a7cf3289c6d3e1..6d1e8cfc47d0aa2fae6658ed44a00b7362535889 100644 --- a/src/drivers/trone/CMakeLists.txt +++ b/src/drivers/teraranger/CMakeLists.txt @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (c) 2015 PX4 Development Team. All rights reserved. +# Copyright (c) 2017 PX4 Development Team. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -31,12 +31,12 @@ # ############################################################################ px4_add_module( - MODULE drivers__trone - MAIN trone + MODULE drivers__teraranger + MAIN teraranger STACK_MAIN 1200 COMPILE_FLAGS SRCS - trone.cpp + teraranger.cpp DEPENDS platforms__common ) diff --git a/src/drivers/trone/trone.cpp b/src/drivers/teraranger/teraranger.cpp similarity index 82% rename from src/drivers/trone/trone.cpp rename to src/drivers/teraranger/teraranger.cpp index a18a4bbe17636ad0ce80601b00283163e4b02cd9..6485015d344adb3a6626a99b776cfe33de2fcd8e 100644 --- a/src/drivers/trone/trone.cpp +++ b/src/drivers/teraranger/teraranger.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2013-2015 PX4 Development Team. All rights reserved. + * Copyright (c) 2013-2017 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,7 +32,7 @@ ****************************************************************************/ /** - * @file trone.cpp + * @file teraranger.cpp * @author Luis Rodrigues * * Driver for the TeraRanger One range finders connected via I2C. @@ -74,32 +74,35 @@ #include <board_config.h> /* Configuration Constants */ -#define TRONE_BUS PX4_I2C_BUS_EXPANSION +#define TERARANGER_BUS PX4_I2C_BUS_EXPANSION #define TRONE_BASEADDR 0x30 /* 7-bit address */ -#define TRONE_DEVICE_PATH "/dev/trone" +#define TREVO_BASEADDR 0x31 /* 7-bit address */ +#define TERARANGER_DEVICE_PATH "/dev/teraranger" -/* TRONE Registers addresses */ +/* TERARANGER Registers addresses */ -#define TRONE_MEASURE_REG 0x00 /* Measure range register */ -#define TRONE_WHO_AM_I_REG 0x01 /* Who am I test register */ -#define TRONE_WHO_AM_I_REG_VAL 0xA1 +#define TERARANGER_MEASURE_REG 0x00 /* Measure range register */ +#define TERARANGER_WHO_AM_I_REG 0x01 /* Who am I test register */ +#define TERARANGER_WHO_AM_I_REG_VAL 0xA1 /* Device limits */ #define TRONE_MIN_DISTANCE (0.20f) #define TRONE_MAX_DISTANCE (14.00f) +#define TREVO_MIN_DISTANCE (0.50f) +#define TREVO_MAX_DISTANCE (60.0f) -#define TRONE_CONVERSION_INTERVAL 50000 /* 50ms */ +#define TERARANGER_CONVERSION_INTERVAL 50000 /* 50ms */ #ifndef CONFIG_SCHED_WORKQUEUE # error This requires CONFIG_SCHED_WORKQUEUE. #endif -class TRONE : public device::I2C +class TERARANGER : public device::I2C { public: - TRONE(int bus = TRONE_BUS, int address = TRONE_BASEADDR); - virtual ~TRONE(); + TERARANGER(int bus = TERARANGER_BUS, int address = TRONE_BASEADDR); + virtual ~TERARANGER(); virtual int init(); @@ -222,12 +225,12 @@ static uint8_t crc8(uint8_t *p, uint8_t len) /* * Driver 'main' command. */ -extern "C" __EXPORT int trone_main(int argc, char *argv[]); +extern "C" __EXPORT int teraranger_main(int argc, char *argv[]); -TRONE::TRONE(int bus, int address) : - I2C("TRONE", TRONE_DEVICE_PATH, bus, address, 100000), - _min_distance(TRONE_MIN_DISTANCE), - _max_distance(TRONE_MAX_DISTANCE), +TERARANGER::TERARANGER(int bus, int address) : + I2C("TERARANGER", TERARANGER_DEVICE_PATH, bus, address, 100000), + _min_distance(-1.0f), + _max_distance(-1.0f), _reports(nullptr), _sensor_ok(false), _valid(0), @@ -249,7 +252,7 @@ TRONE::TRONE(int bus, int address) : memset(&_work, 0, sizeof(_work)); } -TRONE::~TRONE() +TERARANGER::~TERARANGER() { /* make sure we are truly inactive */ stop(); @@ -269,13 +272,60 @@ TRONE::~TRONE() } int -TRONE::init() +TERARANGER::init() { int ret = PX4_ERROR; + int hw_model; + param_get(param_find("SENS_EN_TRANGER"), &hw_model); + + switch(hw_model){ + case 0: /* Disabled */ + DEVICE_LOG("Disabled"); + return ret; + + case 1: /* Autodetect */ + /* Assume TROne */ + set_address(TRONE_BASEADDR); + if(I2C::init() != OK) + { + set_address(TREVO_BASEADDR); + if (I2C::init() != OK) + { + goto out; + } else { + _min_distance = TREVO_MIN_DISTANCE; + _max_distance = TREVO_MAX_DISTANCE; + } + } + else + { + _min_distance = TRONE_MIN_DISTANCE; + _max_distance = TRONE_MAX_DISTANCE; + } + break; - /* do I2C init (and probe) first */ - if (I2C::init() != OK) { - goto out; + case 2: /* TROne */ + set_address(TRONE_BASEADDR); + if (I2C::init() != OK) { + goto out; + } + _min_distance = TRONE_MIN_DISTANCE; + _max_distance = TRONE_MAX_DISTANCE; + break; + + case 3: /* TREvo */ + set_address(TREVO_BASEADDR); + /* do I2C init (and probe) first */ + if (I2C::init() != OK) { + goto out; + } + _min_distance = TREVO_MIN_DISTANCE; + _max_distance = TREVO_MAX_DISTANCE; + break; + + default: + DEVICE_LOG("invalid HW model %d.", hw_model); + return ret; } /* allocate basic report buffers */ @@ -309,56 +359,53 @@ out: } int -TRONE::probe() +TERARANGER::probe() { uint8_t who_am_i = 0; - const uint8_t cmd = TRONE_WHO_AM_I_REG; + const uint8_t cmd = TERARANGER_WHO_AM_I_REG; - // set the I2C bus address - set_address(TRONE_BASEADDR); - - // can't use a single transfer as TROne need a bit of time for internal processing + // can't use a single transfer as Teraranger needs a bit of time for internal processing if (transfer(&cmd, 1, nullptr, 0) == OK) { - if (transfer(nullptr, 0, &who_am_i, 1) == OK && who_am_i == TRONE_WHO_AM_I_REG_VAL) { + if (transfer(nullptr, 0, &who_am_i, 1) == OK && who_am_i == TERARANGER_WHO_AM_I_REG_VAL) { return measure(); } } DEVICE_DEBUG("WHO_AM_I byte mismatch 0x%02x should be 0x%02x\n", (unsigned)who_am_i, - TRONE_WHO_AM_I_REG_VAL); + TERARANGER_WHO_AM_I_REG_VAL); // not found on any address return -EIO; } void -TRONE::set_minimum_distance(float min) +TERARANGER::set_minimum_distance(float min) { _min_distance = min; } void -TRONE::set_maximum_distance(float max) +TERARANGER::set_maximum_distance(float max) { _max_distance = max; } float -TRONE::get_minimum_distance() +TERARANGER::get_minimum_distance() { return _min_distance; } float -TRONE::get_maximum_distance() +TERARANGER::get_maximum_distance() { return _max_distance; } int -TRONE::ioctl(struct file *filp, int cmd, unsigned long arg) +TERARANGER::ioctl(struct file *filp, int cmd, unsigned long arg) { switch (cmd) { @@ -385,7 +432,7 @@ TRONE::ioctl(struct file *filp, int cmd, unsigned long arg) bool want_start = (_measure_ticks == 0); /* set interval for next measurement to minimum legal value */ - _measure_ticks = USEC2TICK(TRONE_CONVERSION_INTERVAL); + _measure_ticks = USEC2TICK(TERARANGER_CONVERSION_INTERVAL); /* if we need to start the poll state machine, do it */ if (want_start) { @@ -404,7 +451,7 @@ TRONE::ioctl(struct file *filp, int cmd, unsigned long arg) unsigned ticks = USEC2TICK(1000000 / arg); /* check against maximum rate */ - if (ticks < USEC2TICK(TRONE_CONVERSION_INTERVAL)) { + if (ticks < USEC2TICK(TERARANGER_CONVERSION_INTERVAL)) { return -EINVAL; } @@ -472,7 +519,7 @@ TRONE::ioctl(struct file *filp, int cmd, unsigned long arg) } ssize_t -TRONE::read(struct file *filp, char *buffer, size_t buflen) +TERARANGER::read(struct file *filp, char *buffer, size_t buflen) { unsigned count = buflen / sizeof(struct distance_sensor_s); struct distance_sensor_s *rbuf = reinterpret_cast<struct distance_sensor_s *>(buffer); @@ -513,7 +560,7 @@ TRONE::read(struct file *filp, char *buffer, size_t buflen) } /* wait for it to complete */ - usleep(TRONE_CONVERSION_INTERVAL); + usleep(TERARANGER_CONVERSION_INTERVAL); /* run the collection phase */ if (OK != collect()) { @@ -532,14 +579,14 @@ TRONE::read(struct file *filp, char *buffer, size_t buflen) } int -TRONE::measure() +TERARANGER::measure() { int ret; - + /* * Send the command to begin a measurement. */ - const uint8_t cmd = TRONE_MEASURE_REG; + const uint8_t cmd = TERARANGER_MEASURE_REG; ret = transfer(&cmd, sizeof(cmd), nullptr, 0); if (OK != ret) { @@ -554,7 +601,7 @@ TRONE::measure() } int -TRONE::collect() +TERARANGER::collect() { int ret = -EIO; @@ -608,14 +655,14 @@ TRONE::collect() } void -TRONE::start() +TERARANGER::start() { /* reset the report ring and state machine */ _collect_phase = false; _reports->flush(); /* schedule a cycle to start things */ - work_queue(HPWORK, &_work, (worker_t)&TRONE::cycle_trampoline, this, 1); + work_queue(HPWORK, &_work, (worker_t)&TERARANGER::cycle_trampoline, this, 1); /* notify about state change */ struct subsystem_info_s info = {}; @@ -635,21 +682,21 @@ TRONE::start() } void -TRONE::stop() +TERARANGER::stop() { work_cancel(HPWORK, &_work); } void -TRONE::cycle_trampoline(void *arg) +TERARANGER::cycle_trampoline(void *arg) { - TRONE *dev = (TRONE *)arg; + TERARANGER *dev = (TERARANGER *)arg; dev->cycle(); } void -TRONE::cycle() +TERARANGER::cycle() { /* collection phase? */ if (_collect_phase) { @@ -668,13 +715,13 @@ TRONE::cycle() /* * Is there a collect->measure gap? */ - if (_measure_ticks > USEC2TICK(TRONE_CONVERSION_INTERVAL)) { + if (_measure_ticks > USEC2TICK(TERARANGER_CONVERSION_INTERVAL)) { /* schedule a fresh cycle call when we are ready to measure again */ work_queue(HPWORK, &_work, - (worker_t)&TRONE::cycle_trampoline, + (worker_t)&TERARANGER::cycle_trampoline, this, - _measure_ticks - USEC2TICK(TRONE_CONVERSION_INTERVAL)); + _measure_ticks - USEC2TICK(TERARANGER_CONVERSION_INTERVAL)); return; } @@ -691,13 +738,13 @@ TRONE::cycle() /* schedule a fresh cycle call when the measurement is done */ work_queue(HPWORK, &_work, - (worker_t)&TRONE::cycle_trampoline, + (worker_t)&TERARANGER::cycle_trampoline, this, - USEC2TICK(TRONE_CONVERSION_INTERVAL)); + USEC2TICK(TERARANGER_CONVERSION_INTERVAL)); } void -TRONE::print_info() +TERARANGER::print_info() { perf_print_counter(_sample_perf); perf_print_counter(_comms_errors); @@ -708,10 +755,10 @@ TRONE::print_info() /** * Local functions in support of the shell command. */ -namespace trone +namespace teraranger { -TRONE *g_dev; +TERARANGER *g_dev; void start(); void stop(); @@ -732,7 +779,7 @@ start() } /* create the driver */ - g_dev = new TRONE(TRONE_BUS); + g_dev = new TERARANGER(TERARANGER_BUS); if (g_dev == nullptr) { @@ -744,7 +791,7 @@ start() } /* set the poll rate to default, starts automatic data collection */ - fd = open(TRONE_DEVICE_PATH, O_RDONLY); + fd = open(TERARANGER_DEVICE_PATH, O_RDONLY); if (fd < 0) { goto fail; @@ -794,10 +841,10 @@ test() ssize_t sz; int ret; - int fd = open(TRONE_DEVICE_PATH, O_RDONLY); + int fd = open(TERARANGER_DEVICE_PATH, O_RDONLY); if (fd < 0) { - err(1, "%s open failed (try 'trone start' if the driver is not running", TRONE_DEVICE_PATH); + err(1, "%s open failed (try 'teraranger start' if the driver is not running", TERARANGER_DEVICE_PATH); } /* do a simple demand read */ @@ -855,7 +902,7 @@ test() void reset() { - int fd = open(TRONE_DEVICE_PATH, O_RDONLY); + int fd = open(TERARANGER_DEVICE_PATH, O_RDONLY); if (fd < 0) { err(1, "failed "); @@ -891,41 +938,41 @@ info() } // namespace int -trone_main(int argc, char *argv[]) +teraranger_main(int argc, char *argv[]) { /* * Start/load the driver. */ if (!strcmp(argv[1], "start")) { - trone::start(); + teraranger::start(); } /* * Stop the driver */ if (!strcmp(argv[1], "stop")) { - trone::stop(); + teraranger::stop(); } /* * Test the driver/device. */ if (!strcmp(argv[1], "test")) { - trone::test(); + teraranger::test(); } /* * Reset the driver. */ if (!strcmp(argv[1], "reset")) { - trone::reset(); + teraranger::reset(); } /* * Print driver information. */ if (!strcmp(argv[1], "info") || !strcmp(argv[1], "status")) { - trone::info(); + teraranger::info(); } errx(1, "unrecognized command, try 'start', 'test', 'reset' or 'info'"); diff --git a/src/modules/sensors/sensor_params.c b/src/modules/sensors/sensor_params.c index 03d48a598d9d0d3d88c3a27f95fe1544fc08bcec..7baffd06ace2fd1e65b5a9a08f93f3329fcbb06c 100644 --- a/src/modules/sensors/sensor_params.c +++ b/src/modules/sensors/sensor_params.c @@ -1088,14 +1088,18 @@ PARAM_DEFINE_INT32(SENS_EN_SF0X, 0); PARAM_DEFINE_INT32(SENS_EN_MB12XX, 0); /** - * TeraRanger One (trone) + * TeraRanger Rangefinder (i2c) * * @reboot_required true - * - * @boolean + * @min 0 + * @max 3 * @group Sensor Enable + * @value 0 Disabled + * @value 1 Autodetect + * @value 2 TROne + * @value 3 TREvo */ -PARAM_DEFINE_INT32(SENS_EN_TRONE, 0); +PARAM_DEFINE_INT32(SENS_EN_TRANGER, 0); /** * Lightware SF1xx/SF20/LW20 laser rangefinder (i2c)