Browse Source

uavcan: update safety button

updated uavcannode/Publishers/SafetyButton.hpp
tested successfully
make format
revert cannode publishing
v1.13.0-BW
Jacob Dahl 3 years ago committed by Beat Küng
parent
commit
1f17a1470a
  1. 1
      src/drivers/uavcan/CMakeLists.txt
  2. 74
      src/drivers/uavcan/sensors/safety_button.cpp
  3. 39
      src/drivers/uavcan/sensors/safety_button.hpp
  4. 9
      src/drivers/uavcan/sensors/sensor_bridge.cpp
  5. 16
      src/drivers/uavcan/uavcan_params.c

1
src/drivers/uavcan/CMakeLists.txt

@ -166,6 +166,7 @@ px4_add_module(
sensors/gyro.cpp sensors/gyro.cpp
sensors/ice_status.cpp sensors/ice_status.cpp
sensors/hygrometer.cpp sensors/hygrometer.cpp
sensors/safety_button.cpp
MODULE_CONFIG MODULE_CONFIG
module.yaml module.yaml

74
src/drivers/uavcan/sensors/safetybutton.cpp → src/drivers/uavcan/sensors/safety_button.cpp

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
* *
* Copyright (c) 2019-2021 PX4 Development Team. All rights reserved. * Copyright (c) 2022 PX4 Development Team. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -31,67 +31,47 @@
* *
****************************************************************************/ ****************************************************************************/
/**
* @author CUAVcaijie <caijie@cuav.net>
*/
#include "safetybutton.hpp"
#include <cstdint>
#include <drivers/drv_hrt.h> #include <drivers/drv_hrt.h>
#include <systemlib/err.h> #include <parameters/param.h>
#include <mathlib/mathlib.h> #include "safety_button.hpp"
#include <math.h>
using namespace time_literals; const char *const UavcanSafetyButtonBridge::NAME = "safety_button";
const char *const UavcanSafetyBridge::NAME = "safety";
UavcanSafetyBridge::UavcanSafetyBridge(uavcan::INode &node) : UavcanSafetyButtonBridge::UavcanSafetyButtonBridge(uavcan::INode &node) :
_node(node), UavcanSensorBridgeBase("uavcan_safety_button",
_sub_safety(node), ORB_ID(safety)), // TODO: either multiple publishers or `button_event` uORB topic
_pub_safety(node) _sub_button(node)
{ { }
}
int UavcanSafetyBridge::init() int UavcanSafetyButtonBridge::init()
{ {
int res = _pub_safety.init(uavcan::TransferPriority::MiddleLower); int res = _sub_button.start(ButtonCbBinder(this, &UavcanSafetyButtonBridge::button_sub_cb));
if (res < 0) { if (res < 0) {
printf("safety pub failed %i", res); DEVICE_LOG("failed to start uavcan sub: %d", res);
return res;
}
res = _sub_safety.start(SafetyCommandCbBinder(this, &UavcanSafetyBridge::safety_sub_cb));
if (res < 0) {
printf("safety pub failed %i", res);
return res; return res;
} }
return 0; return 0;
} }
unsigned UavcanSafetyBridge::get_num_redundant_channels() const void UavcanSafetyButtonBridge::button_sub_cb(const
{ uavcan::ReceivedDataStructure<ardupilot::indication::Button> &msg)
return 0;
}
void UavcanSafetyBridge::print_status() const
{ {
bool is_safety = msg.button == ardupilot::indication::Button::BUTTON_SAFETY;
bool pressed = msg.press_time >= 10; // 0.1s increments
if (is_safety && pressed) {
safety_s safety = {};
safety.timestamp = hrt_absolute_time();
safety.safety_switch_available = true;
safety.safety_off = true;
publish(msg.getSrcNodeID().get(), &safety);
}
} }
void UavcanSafetyBridge::safety_sub_cb(const uavcan::ReceivedDataStructure<ardupilot::indication::Button> &msg) int UavcanSafetyButtonBridge::init_driver(uavcan_bridge::Channel *channel)
{ {
if (msg.press_time > 10 && msg.button == 1) { return PX4_OK;
if (_safety_disabled) { return; }
_safety_disabled = true;
} else {
_safety_disabled = false;
}
} }

39
src/drivers/uavcan/sensors/safetybutton.hpp → src/drivers/uavcan/sensors/safety_button.hpp

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
* *
* Copyright (c) 2020-2021 PX4 Development Team. All rights reserved. * Copyright (c) 2022 PX4 Development Team. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -31,49 +31,36 @@
* *
****************************************************************************/ ****************************************************************************/
/**
* @author CUAVcaijie <caijie@cuav.net>
*/
#pragma once #pragma once
#include <uORB/Subscription.hpp> #include "sensor_bridge.hpp"
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/safety.h> #include <uORB/topics/safety.h>
#include <uavcan/uavcan.hpp>
#include <ardupilot/indication/Button.hpp> #include <ardupilot/indication/Button.hpp>
#include "sensor_bridge.hpp"
class UavcanSafetyBridge : public IUavcanSensorBridge class UavcanSafetyButtonBridge : public UavcanSensorBridgeBase
{ {
public: public:
static const char *const NAME; static const char *const NAME;
UavcanSafetyBridge(uavcan::INode &node); UavcanSafetyButtonBridge(uavcan::INode &node);
~UavcanSafetyBridge() = default;
const char *get_name() const override { return NAME; } const char *get_name() const override { return NAME; }
int init() override; int init() override;
unsigned get_num_redundant_channels() const override;
void print_status() const override;
private: private:
safety_s _safety{}; //
bool _safety_disabled{false};
bool _safety_btn_off{false}; ///< State of the safety button read from the HW button int init_driver(uavcan_bridge::Channel *channel) override;
void safety_sub_cb(const uavcan::ReceivedDataStructure<ardupilot::indication::Button> &msg);
void button_sub_cb(const uavcan::ReceivedDataStructure<ardupilot::indication::Button> &msg);
typedef uavcan::MethodBinder < UavcanSafetyButtonBridge *,
void (UavcanSafetyButtonBridge::*)
(const uavcan::ReceivedDataStructure<ardupilot::indication::Button> &) >
ButtonCbBinder;
typedef uavcan::MethodBinder < UavcanSafetyBridge *, uavcan::Subscriber<ardupilot::indication::Button, ButtonCbBinder> _sub_button;
void (UavcanSafetyBridge::*)(const uavcan::ReceivedDataStructure<ardupilot::indication::Button> &) >
SafetyCommandCbBinder;
uavcan::INode &_node;
uavcan::Subscriber<ardupilot::indication::Button, SafetyCommandCbBinder> _sub_safety;
uavcan::Publisher<ardupilot::indication::Button> _pub_safety;
uORB::PublicationMulti<safety_s> _safety_pub{ORB_ID(safety)};
}; };

9
src/drivers/uavcan/sensors/sensor_bridge.cpp

@ -50,6 +50,7 @@
#include "ice_status.hpp" #include "ice_status.hpp"
#include "mag.hpp" #include "mag.hpp"
#include "rangefinder.hpp" #include "rangefinder.hpp"
#include "safety_button.hpp"
/* /*
* IUavcanSensorBridge * IUavcanSensorBridge
@ -144,6 +145,14 @@ void IUavcanSensorBridge::make_all(uavcan::INode &node, List<IUavcanSensorBridge
if (uavcan_sub_rng != 0) { if (uavcan_sub_rng != 0) {
list.add(new UavcanRangefinderBridge(node)); list.add(new UavcanRangefinderBridge(node));
} }
// safety button
int32_t uavcan_sub_button = 1;
param_get(param_find("UAVCAN_SUB_BTN"), &uavcan_sub_button);
if (uavcan_sub_button != 0) {
list.add(new UavcanSafetyButtonBridge(node));
}
} }
/* /*

16
src/drivers/uavcan/uavcan_params.c

@ -310,7 +310,7 @@ PARAM_DEFINE_INT32(UAVCAN_SUB_IMU, 0);
/** /**
* subscription magnetometer * subscription magnetometer
* *
* Enable UAVCAN GPS subscription. * Enable UAVCAN mag subscription.
* uavcan::equipment::ahrs::MagneticFieldStrength * uavcan::equipment::ahrs::MagneticFieldStrength
* uavcan::equipment::ahrs::MagneticFieldStrength2 * uavcan::equipment::ahrs::MagneticFieldStrength2
* *
@ -323,7 +323,7 @@ PARAM_DEFINE_INT32(UAVCAN_SUB_MAG, 1);
/** /**
* subscription range finder * subscription range finder
* *
* Enable UAVCAN GPS subscription. * Enable UAVCAN range finder subscription.
* uavcan::equipment::range_sensor::Measurement * uavcan::equipment::range_sensor::Measurement
* *
* @boolean * @boolean
@ -331,3 +331,15 @@ PARAM_DEFINE_INT32(UAVCAN_SUB_MAG, 1);
* @group UAVCAN * @group UAVCAN
*/ */
PARAM_DEFINE_INT32(UAVCAN_SUB_RNG, 0); PARAM_DEFINE_INT32(UAVCAN_SUB_RNG, 0);
/**
* subscription button
*
* Enable UAVCAN button subscription.
* ardupilot::indication::Button
*
* @boolean
* @reboot_required true
* @group UAVCAN
*/
PARAM_DEFINE_INT32(UAVCAN_SUB_BTN, 0);

Loading…
Cancel
Save