forked from Archive/PX4-Autopilot
refactor atxxxx: use driver base class
and increase update rate to 20Hz
This commit is contained in:
parent
20db735d77
commit
8f3ba81c4a
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
if ! param compare OSD_ATXXXX_CFG 0
|
if ! param compare OSD_ATXXXX_CFG 0
|
||||||
then
|
then
|
||||||
atxxxx start
|
atxxxx start -s
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DShot telemetry is always on UART7
|
# DShot telemetry is always on UART7
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
if ! param compare OSD_ATXXXX_CFG 0
|
if ! param compare OSD_ATXXXX_CFG 0
|
||||||
then
|
then
|
||||||
atxxxx start
|
atxxxx start -s
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,56 +44,15 @@
|
||||||
|
|
||||||
using namespace time_literals;
|
using namespace time_literals;
|
||||||
|
|
||||||
static constexpr uint32_t OSD_UPDATE_RATE{500_ms}; // 2 Hz
|
static constexpr uint32_t OSD_UPDATE_RATE{50_ms}; // 20 Hz
|
||||||
|
|
||||||
OSDatxxxx::OSDatxxxx(int bus) :
|
OSDatxxxx::OSDatxxxx(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode) :
|
||||||
SPI("OSD", nullptr, bus, PX4_MK_SPI_SEL(bus, OSD_SPIDEV), SPIDEV_MODE0, OSD_SPI_BUS_SPEED),
|
SPI("OSD", nullptr, bus, devid, spi_mode, bus_frequency),
|
||||||
ModuleParams(nullptr),
|
ModuleParams(nullptr),
|
||||||
ScheduledWorkItem(MODULE_NAME, px4::device_bus_to_wq(get_device_id()))
|
I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
OSDatxxxx::~OSDatxxxx()
|
|
||||||
{
|
|
||||||
ScheduleClear();
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
OSDatxxxx::task_spawn(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int ch;
|
|
||||||
int myoptind = 1;
|
|
||||||
const char *myoptarg = nullptr;
|
|
||||||
int spi_bus = OSD_BUS;
|
|
||||||
|
|
||||||
while ((ch = px4_getopt(argc, argv, "b:", &myoptind, &myoptarg)) != EOF) {
|
|
||||||
switch (ch) {
|
|
||||||
case 'b':
|
|
||||||
spi_bus = (uint8_t)atoi(myoptarg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OSDatxxxx *osd = new OSDatxxxx(spi_bus);
|
|
||||||
|
|
||||||
if (!osd) {
|
|
||||||
PX4_ERR("alloc failed");
|
|
||||||
return PX4_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (osd->init() != PX4_OK) {
|
|
||||||
delete osd;
|
|
||||||
return PX4_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
_object.store(osd);
|
|
||||||
_task_id = task_id_is_work_queue;
|
|
||||||
|
|
||||||
osd->start();
|
|
||||||
|
|
||||||
return PX4_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
OSDatxxxx::init()
|
OSDatxxxx::init()
|
||||||
{
|
{
|
||||||
|
@ -519,7 +478,7 @@ OSDatxxxx::reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
OSDatxxxx::Run()
|
OSDatxxxx::RunImpl()
|
||||||
{
|
{
|
||||||
if (should_exit()) {
|
if (should_exit()) {
|
||||||
exit_and_cleanup();
|
exit_and_cleanup();
|
||||||
|
@ -531,13 +490,9 @@ OSDatxxxx::Run()
|
||||||
update_screen();
|
update_screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
OSDatxxxx::print_usage(const char *reason)
|
OSDatxxxx::print_usage()
|
||||||
{
|
{
|
||||||
if (reason) {
|
|
||||||
printf("%s\n\n", reason);
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_MODULE_DESCRIPTION(
|
PRINT_MODULE_DESCRIPTION(
|
||||||
R"DESCR_STR(
|
R"DESCR_STR(
|
||||||
### Description
|
### Description
|
||||||
|
@ -547,21 +502,61 @@ It can be enabled with the OSD_ATXXXX_CFG parameter.
|
||||||
)DESCR_STR");
|
)DESCR_STR");
|
||||||
|
|
||||||
PRINT_MODULE_USAGE_NAME("atxxxx", "driver");
|
PRINT_MODULE_USAGE_NAME("atxxxx", "driver");
|
||||||
PRINT_MODULE_USAGE_COMMAND_DESCR("start", "Start the driver");
|
PRINT_MODULE_USAGE_COMMAND("start");
|
||||||
PRINT_MODULE_USAGE_PARAM_INT('b', -1, 0, 100, "SPI bus (default: use board-specific bus)", true);
|
PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(false, true);
|
||||||
PRINT_MODULE_USAGE_DEFAULT_COMMANDS();
|
PRINT_MODULE_USAGE_DEFAULT_COMMANDS();
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
I2CSPIDriverBase *OSDatxxxx::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator,
|
||||||
OSDatxxxx::custom_command(int argc, char *argv[])
|
int runtime_instance)
|
||||||
{
|
{
|
||||||
return print_usage("unrecognized command");
|
OSDatxxxx *instance = new OSDatxxxx(iterator.configuredBusOption(), iterator.bus(), iterator.devid(),
|
||||||
|
cli.bus_frequency, cli.spi_mode);
|
||||||
|
|
||||||
|
if (!instance) {
|
||||||
|
PX4_ERR("alloc failed");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OK != instance->init()) {
|
||||||
|
delete instance;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
instance->start();
|
||||||
|
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
atxxxx_main(int argc, char *argv[])
|
atxxxx_main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
return OSDatxxxx::main(argc, argv);
|
using ThisDriver = OSDatxxxx;
|
||||||
|
BusCLIArguments cli{false, true};
|
||||||
|
cli.spi_mode = SPIDEV_MODE0;
|
||||||
|
cli.default_spi_frequency = OSD_SPI_BUS_SPEED;
|
||||||
|
|
||||||
|
const char *verb = cli.parseDefaultArguments(argc, argv);
|
||||||
|
|
||||||
|
if (!verb) {
|
||||||
|
ThisDriver::print_usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
BusInstanceIterator iterator(MODULE_NAME, cli, DRV_OSD_DEVTYPE_ATXXXX);
|
||||||
|
|
||||||
|
if (!strcmp(verb, "start")) {
|
||||||
|
return ThisDriver::module_start(cli, iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(verb, "stop")) {
|
||||||
|
return ThisDriver::module_stop(iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(verb, "status")) {
|
||||||
|
return ThisDriver::module_status(iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
ThisDriver::print_usage();
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,25 +46,12 @@
|
||||||
#include <px4_platform_common/getopt.h>
|
#include <px4_platform_common/getopt.h>
|
||||||
#include <px4_platform_common/module.h>
|
#include <px4_platform_common/module.h>
|
||||||
#include <px4_platform_common/module_params.h>
|
#include <px4_platform_common/module_params.h>
|
||||||
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
|
#include <px4_platform_common/i2c_spi_buses.h>
|
||||||
#include <uORB/Subscription.hpp>
|
#include <uORB/Subscription.hpp>
|
||||||
#include <uORB/topics/battery_status.h>
|
#include <uORB/topics/battery_status.h>
|
||||||
#include <uORB/topics/vehicle_local_position.h>
|
#include <uORB/topics/vehicle_local_position.h>
|
||||||
#include <uORB/topics/vehicle_status.h>
|
#include <uORB/topics/vehicle_status.h>
|
||||||
|
|
||||||
/* Configuration Constants */
|
|
||||||
#ifdef PX4_SPI_BUS_OSD
|
|
||||||
#define OSD_BUS PX4_SPI_BUS_OSD
|
|
||||||
#else
|
|
||||||
#error "add the required spi bus from board_config.h here"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PX4_SPIDEV_OSD
|
|
||||||
#define OSD_SPIDEV PX4_SPIDEV_OSD
|
|
||||||
#else
|
|
||||||
#error "add the required spi device from board_config.h here"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define OSD_SPI_BUS_SPEED (2000000L) /* 2 MHz */
|
#define OSD_SPI_BUS_SPEED (2000000L) /* 2 MHz */
|
||||||
|
|
||||||
#define DIR_READ(a) ((a) | (1 << 7))
|
#define DIR_READ(a) ((a) | (1 << 7))
|
||||||
|
@ -78,36 +65,24 @@
|
||||||
|
|
||||||
extern "C" __EXPORT int atxxxx_main(int argc, char *argv[]);
|
extern "C" __EXPORT int atxxxx_main(int argc, char *argv[]);
|
||||||
|
|
||||||
class OSDatxxxx : public device::SPI, public ModuleBase<OSDatxxxx>, public ModuleParams, public px4::ScheduledWorkItem
|
class OSDatxxxx : public device::SPI, public ModuleParams, public I2CSPIDriver<OSDatxxxx>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSDatxxxx(int bus = OSD_BUS);
|
OSDatxxxx(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode);
|
||||||
|
virtual ~OSDatxxxx() = default;
|
||||||
|
|
||||||
~OSDatxxxx();
|
static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator,
|
||||||
|
int runtime_instance);
|
||||||
|
static void print_usage();
|
||||||
|
|
||||||
virtual int init();
|
int init() override;
|
||||||
|
|
||||||
/**
|
void RunImpl();
|
||||||
* @see ModuleBase::custom_command
|
|
||||||
*/
|
|
||||||
static int custom_command(int argc, char *argv[]);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ModuleBase::print_usage
|
|
||||||
*/
|
|
||||||
static int print_usage(const char *reason = nullptr);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ModuleBase::task_spawn
|
|
||||||
*/
|
|
||||||
static int task_spawn(int argc, char *argv[]);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int probe();
|
int probe() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Run() override;
|
|
||||||
|
|
||||||
int start();
|
int start();
|
||||||
|
|
||||||
int reset();
|
int reset();
|
||||||
|
|
Loading…
Reference in New Issue