mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-03 05:41:36 +08:00
UAVCAN: initializing all bridges by default
This commit is contained in:
@@ -56,17 +56,12 @@ _report_pub(-1)
|
|||||||
|
|
||||||
int UavcanGnssBridge::init()
|
int UavcanGnssBridge::init()
|
||||||
{
|
{
|
||||||
int res = -1;
|
int res = _sub_fix.start(FixCbBinder(this, &UavcanGnssBridge::gnss_fix_sub_cb));
|
||||||
|
|
||||||
// GNSS fix subscription
|
|
||||||
res = _sub_fix.start(FixCbBinder(this, &UavcanGnssBridge::gnss_fix_sub_cb));
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
warnx("GNSS fix sub failed %i", res);
|
warnx("GNSS fix sub failed %i", res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
warnx("gnss sensor bridge init ok");
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,27 +45,11 @@
|
|||||||
/*
|
/*
|
||||||
* IUavcanSensorBridge
|
* IUavcanSensorBridge
|
||||||
*/
|
*/
|
||||||
IUavcanSensorBridge* IUavcanSensorBridge::make(uavcan::INode &node, const char *bridge_name)
|
void IUavcanSensorBridge::make_all(uavcan::INode &node, List<IUavcanSensorBridge*> &list)
|
||||||
{
|
{
|
||||||
/*
|
list.add(new UavcanBarometerBridge(node));
|
||||||
* TODO: make a linked list of known implementations at startup?
|
list.add(new UavcanMagnetometerBridge(node));
|
||||||
*/
|
list.add(new UavcanGnssBridge(node));
|
||||||
if (!std::strncmp(UavcanGnssBridge::NAME, bridge_name, MAX_NAME_LEN)) {
|
|
||||||
return new UavcanGnssBridge(node);
|
|
||||||
} else if (!std::strncmp(UavcanMagnetometerBridge::NAME, bridge_name, MAX_NAME_LEN)) {
|
|
||||||
return new UavcanMagnetometerBridge(node);
|
|
||||||
} else if (!std::strncmp(UavcanBarometerBridge::NAME, bridge_name, MAX_NAME_LEN)) {
|
|
||||||
return new UavcanBarometerBridge(node);
|
|
||||||
} else {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IUavcanSensorBridge::print_known_names(const char *prefix)
|
|
||||||
{
|
|
||||||
printf("%s%s\n", prefix, UavcanGnssBridge::NAME);
|
|
||||||
printf("%s%s\n", prefix, UavcanMagnetometerBridge::NAME);
|
|
||||||
printf("%s%s\n", prefix, UavcanBarometerBridge::NAME);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -73,12 +73,7 @@ public:
|
|||||||
* Creates a bridge object by its ASCII name, e.g. "gnss", "mag".
|
* Creates a bridge object by its ASCII name, e.g. "gnss", "mag".
|
||||||
* @return nullptr if such bridge can't be created.
|
* @return nullptr if such bridge can't be created.
|
||||||
*/
|
*/
|
||||||
static IUavcanSensorBridge* make(uavcan::INode &node, const char *bridge_name);
|
static void make_all(uavcan::INode &node, List<IUavcanSensorBridge*> &list);
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints all valid bridge names into stdout via printf(), one name per line with prefix.
|
|
||||||
*/
|
|
||||||
static void print_known_names(const char *prefix);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -217,11 +217,12 @@ int UavcanNode::init(uavcan::NodeID node_id)
|
|||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
/* do regular cdev init */
|
// Do regular cdev init
|
||||||
ret = CDev::init();
|
ret = CDev::init();
|
||||||
|
|
||||||
if (ret != OK)
|
if (ret != OK) {
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
_node.setName("org.pixhawk.pixhawk");
|
_node.setName("org.pixhawk.pixhawk");
|
||||||
|
|
||||||
@@ -229,10 +230,24 @@ int UavcanNode::init(uavcan::NodeID node_id)
|
|||||||
|
|
||||||
fill_node_info();
|
fill_node_info();
|
||||||
|
|
||||||
/* initializing the bridges UAVCAN <--> uORB */
|
// Actuators
|
||||||
ret = _esc_controller.init();
|
ret = _esc_controller.init();
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sensor bridges
|
||||||
|
IUavcanSensorBridge::make_all(_node, _sensor_bridges);
|
||||||
|
auto br = _sensor_bridges.getHead();
|
||||||
|
while (br != nullptr) {
|
||||||
|
ret = br->init();
|
||||||
|
if (ret < 0) {
|
||||||
|
warnx("cannot init sensor bridge '%s' (%d)", br->get_name(), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
warnx("sensor bridge '%s' init ok", br->get_name());
|
||||||
|
br = br->getSibling();
|
||||||
|
}
|
||||||
|
|
||||||
return _node.start();
|
return _node.start();
|
||||||
}
|
}
|
||||||
@@ -522,62 +537,10 @@ UavcanNode::print_info()
|
|||||||
warnx("not running, start first");
|
warnx("not running, start first");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(void)pthread_mutex_lock(&_node_mutex);
|
||||||
|
|
||||||
warnx("actuators control groups: sub: %u / req: %u / fds: %u", (unsigned)_groups_subscribed, (unsigned)_groups_required, _poll_fds_num);
|
warnx("actuators control groups: sub: %u / req: %u / fds: %u", (unsigned)_groups_subscribed, (unsigned)_groups_required, _poll_fds_num);
|
||||||
warnx("mixer: %s", (_mixers == nullptr) ? "NONE" : "OK");
|
warnx("mixer: %s", (_mixers == nullptr) ? "NONE" : "OK");
|
||||||
}
|
|
||||||
|
|
||||||
int UavcanNode::sensor_enable(const char *bridge_name)
|
|
||||||
{
|
|
||||||
int retval = -1;
|
|
||||||
|
|
||||||
(void)pthread_mutex_lock(&_node_mutex);
|
|
||||||
|
|
||||||
// Checking if such bridge already exists
|
|
||||||
{
|
|
||||||
auto pos = _sensor_bridges.getHead();
|
|
||||||
while (pos != nullptr) {
|
|
||||||
if (!std::strncmp(pos->get_name(), bridge_name, IUavcanSensorBridge::MAX_NAME_LEN)) {
|
|
||||||
warnx("sensor bridge '%s' already exists", bridge_name);
|
|
||||||
retval = -1;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
pos = pos->getSibling();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creating and initing
|
|
||||||
{
|
|
||||||
auto bridge = IUavcanSensorBridge::make(get_node(), bridge_name);
|
|
||||||
if (bridge == nullptr) {
|
|
||||||
warnx("cannot create sensor bridge '%s'", bridge_name);
|
|
||||||
retval = -1;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!std::strncmp(bridge->get_name(), bridge_name, IUavcanSensorBridge::MAX_NAME_LEN));
|
|
||||||
|
|
||||||
retval = bridge->init();
|
|
||||||
if (retval >= 0) {
|
|
||||||
_sensor_bridges.add(bridge);
|
|
||||||
} else {
|
|
||||||
delete bridge;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
leave:
|
|
||||||
(void)pthread_mutex_unlock(&_node_mutex);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UavcanNode::sensor_print_enabled()
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_lock(&_node_mutex);
|
|
||||||
|
|
||||||
auto pos = _sensor_bridges.getHead();
|
|
||||||
while (pos != nullptr) {
|
|
||||||
warnx("%s", pos->get_name());
|
|
||||||
pos = pos->getSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)pthread_mutex_unlock(&_node_mutex);
|
(void)pthread_mutex_unlock(&_node_mutex);
|
||||||
}
|
}
|
||||||
@@ -588,12 +551,7 @@ void UavcanNode::sensor_print_enabled()
|
|||||||
static void print_usage()
|
static void print_usage()
|
||||||
{
|
{
|
||||||
warnx("usage: \n"
|
warnx("usage: \n"
|
||||||
"\tuavcan start\n"
|
"\tuavcan {start|status|stop}");
|
||||||
"\tuavcan sensor enable <sensor name>\n"
|
|
||||||
"\tuavcan sensor list");
|
|
||||||
|
|
||||||
warnx("known sensor bridges:");
|
|
||||||
IUavcanSensorBridge::print_known_names("\t");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" __EXPORT int uavcan_main(int argc, char *argv[]);
|
extern "C" __EXPORT int uavcan_main(int argc, char *argv[]);
|
||||||
@@ -645,31 +603,6 @@ int uavcan_main(int argc, char *argv[])
|
|||||||
::exit(0);
|
::exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!std::strcmp(argv[1], "sensor")) {
|
|
||||||
if (argc < 3) {
|
|
||||||
print_usage();
|
|
||||||
::exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::strcmp(argv[2], "list")) {
|
|
||||||
inst->sensor_print_enabled();
|
|
||||||
::exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (argc < 4) {
|
|
||||||
print_usage();
|
|
||||||
::exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::strcmp(argv[2], "enable")) {
|
|
||||||
const int res = inst->sensor_enable(argv[3]);
|
|
||||||
if (res < 0) {
|
|
||||||
warnx("failed to enable sensor '%s': error %d", argv[3], res);
|
|
||||||
}
|
|
||||||
::exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_usage();
|
print_usage();
|
||||||
::exit(1);
|
::exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,10 +89,6 @@ public:
|
|||||||
|
|
||||||
void print_info();
|
void print_info();
|
||||||
|
|
||||||
int sensor_enable(const char *bridge_name);
|
|
||||||
|
|
||||||
void sensor_print_enabled();
|
|
||||||
|
|
||||||
static UavcanNode* instance() { return _instance; }
|
static UavcanNode* instance() { return _instance; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -115,7 +111,7 @@ private:
|
|||||||
|
|
||||||
UavcanEscController _esc_controller;
|
UavcanEscController _esc_controller;
|
||||||
|
|
||||||
List<IUavcanSensorBridge*> _sensor_bridges; ///< Append-only list of active sensor bridges
|
List<IUavcanSensorBridge*> _sensor_bridges; ///< List of active sensor bridges
|
||||||
|
|
||||||
MixerGroup *_mixers = nullptr;
|
MixerGroup *_mixers = nullptr;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user