Browse Source

UAVCAN: initializing all bridges by default

sbg
Pavel Kirienko 11 years ago
parent
commit
e9da830316
  1. 7
      src/modules/uavcan/sensors/gnss.cpp
  2. 24
      src/modules/uavcan/sensors/sensor_bridge.cpp
  3. 7
      src/modules/uavcan/sensors/sensor_bridge.hpp
  4. 111
      src/modules/uavcan/uavcan_main.cpp
  5. 6
      src/modules/uavcan/uavcan_main.hpp

7
src/modules/uavcan/sensors/gnss.cpp

@ -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;
} }

24
src/modules/uavcan/sensors/sensor_bridge.cpp

@ -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);
} }
/* /*

7
src/modules/uavcan/sensors/sensor_bridge.hpp

@ -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);
}; };
/** /**

111
src/modules/uavcan/uavcan_main.cpp

@ -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");
} }
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");
}
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); (void)pthread_mutex_lock(&_node_mutex);
auto pos = _sensor_bridges.getHead(); warnx("actuators control groups: sub: %u / req: %u / fds: %u", (unsigned)_groups_subscribed, (unsigned)_groups_required, _poll_fds_num);
while (pos != nullptr) { warnx("mixer: %s", (_mixers == nullptr) ? "NONE" : "OK");
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);
} }

6
src/modules/uavcan/uavcan_main.hpp

@ -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;

Loading…
Cancel
Save