diff --git a/msg/CMakeLists.txt b/msg/CMakeLists.txt index a698de2a5e..e42c16b3e1 100644 --- a/msg/CMakeLists.txt +++ b/msg/CMakeLists.txt @@ -41,7 +41,7 @@ set(msg_files adc_report.msg airspeed.msg airspeed_validated.msg - analog_voltage_current.msg + analog_measurement.msg battery_status.msg camera_capture.msg camera_trigger.msg diff --git a/msg/analog_measurement.msg b/msg/analog_measurement.msg new file mode 100644 index 0000000000..6ade42abd0 --- /dev/null +++ b/msg/analog_measurement.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) + +uint8[4] unit_type # Units: mV, mA, Kelvin*10 +uint16[4] values # mV, mA, Kelvin*10 + +uint8 UNITS_NONE = 0 +uint8 UNITS_MV = 1 +uint8 UNITS_MA = 2 +uint8 UNITS_CK = 3 \ No newline at end of file diff --git a/msg/analog_voltage_current.msg b/msg/analog_voltage_current.msg deleted file mode 100644 index 09ebc0471f..0000000000 --- a/msg/analog_voltage_current.msg +++ /dev/null @@ -1,6 +0,0 @@ -uint64 timestamp # time since system start (microseconds) - -uint16[4] voltage # mV -uint16[4] current # mA -uint16[4] temperature # Kelvin * 100 - diff --git a/src/drivers/uavcan/CMakeLists.txt b/src/drivers/uavcan/CMakeLists.txt index 3e534ea0b1..113ca92af3 100644 --- a/src/drivers/uavcan/CMakeLists.txt +++ b/src/drivers/uavcan/CMakeLists.txt @@ -126,7 +126,7 @@ px4_add_module( actuators/hardpoint.cpp # Sensors - sensors/adc.cpp + sensors/analog_measurement.cpp sensors/airspeed.cpp sensors/baro.cpp sensors/battery.cpp diff --git a/src/drivers/uavcan/dsdl/com/volansi/equipment/adc/20201.Report.uavcan b/src/drivers/uavcan/dsdl/com/volansi/equipment/adc/20201.AnalogMeasurement.uavcan similarity index 100% rename from src/drivers/uavcan/dsdl/com/volansi/equipment/adc/20201.Report.uavcan rename to src/drivers/uavcan/dsdl/com/volansi/equipment/adc/20201.AnalogMeasurement.uavcan diff --git a/src/drivers/uavcan/sensors/adc.cpp b/src/drivers/uavcan/sensors/analog_measurement.cpp similarity index 68% rename from src/drivers/uavcan/sensors/adc.cpp rename to src/drivers/uavcan/sensors/analog_measurement.cpp index 830b0da189..e6b32ca781 100644 --- a/src/drivers/uavcan/sensors/adc.cpp +++ b/src/drivers/uavcan/sensors/analog_measurement.cpp @@ -32,16 +32,16 @@ ****************************************************************************/ #include -#include "adc.hpp" +#include "analog_measurement.hpp" -const char *const UavcanAdcBridge::NAME = "adc"; +const char *const UavcanAnalogMeasurementBridge::NAME = "analog_measurement"; -UavcanAdcBridge::UavcanAdcBridge(uavcan::INode &node) : - UavcanCDevSensorBridgeBase("uavcan_airspeed", "/dev/uavcan/adc", "/dev/adc", ORB_ID(analog_voltage_current)), - _sub_adc_data(node) +UavcanAnalogMeasurementBridge::UavcanAnalogMeasurementBridge(uavcan::INode &node) : + UavcanCDevSensorBridgeBase("uavcan_airspeed", "/dev/uavcan/analog_measurement", "/dev/analog_measurement", ORB_ID(analog_measurement)), + _sub_analog_data(node) { } -int UavcanAdcBridge::init() +int UavcanAnalogMeasurementBridge::init() { int res = device::CDev::init(); @@ -49,7 +49,7 @@ int UavcanAdcBridge::init() return res; } - res = _sub_adc_data.start(AdcCbBinder(this, &UavcanAdcBridge::adc_sub_cb)); + res = _sub_analog_data.start(AnalogCbBinder(this, &UavcanAnalogMeasurementBridge::analog_measurement_sub_cb)); if (res < 0) { DEVICE_LOG("failed to start uavcan sub: %d", res); @@ -60,27 +60,15 @@ int UavcanAdcBridge::init() } void -UavcanAdcBridge::adc_sub_cb(const - uavcan::ReceivedDataStructure &msg) +UavcanAnalogMeasurementBridge::analog_measurement_sub_cb(const + uavcan::ReceivedDataStructure &msg) { - analog_voltage_current_s report{}; - - static constexpr int numIndices = 4; - static constexpr uint16_t mV = com::volansi::equipment::adc::Report::UNITS_MV; - static constexpr uint16_t mA = com::volansi::equipment::adc::Report::UNITS_MA; - static constexpr uint16_t cK = com::volansi::equipment::adc::Report::UNITS_CK; + analog_measurement_s report{}; + int numIndices = msg.values.size(); for (int i = 0; i < numIndices; i++) { - - if (msg.unit_type[i] == mV) { - report.voltage[i] = msg.values[i]; - - } else if (msg.unit_type[i] == mA) { - report.current[i] = msg.values[i]; - - } else if (msg.unit_type[i] == cK) { - report.temperature[i] = msg.values[i]; - } + report.values[i] = msg.values[i]; + report.unit_type[i] = msg.unit_type[i]; } publish(msg.getSrcNodeID().get(), &report); diff --git a/src/drivers/uavcan/sensors/adc.hpp b/src/drivers/uavcan/sensors/analog_measurement.hpp similarity index 76% rename from src/drivers/uavcan/sensors/adc.hpp rename to src/drivers/uavcan/sensors/analog_measurement.hpp index 807ae14d1f..d0307ce620 100644 --- a/src/drivers/uavcan/sensors/adc.hpp +++ b/src/drivers/uavcan/sensors/analog_measurement.hpp @@ -38,16 +38,16 @@ #pragma once #include "sensor_bridge.hpp" -#include +#include -#include +#include -class UavcanAdcBridge : public UavcanCDevSensorBridgeBase +class UavcanAnalogMeasurementBridge : public UavcanCDevSensorBridgeBase { public: static const char *const NAME; - UavcanAdcBridge(uavcan::INode &node); + UavcanAnalogMeasurementBridge(uavcan::INode &node); const char *get_name() const override { return NAME; } @@ -55,12 +55,12 @@ public: private: - void adc_sub_cb(const uavcan::ReceivedDataStructure &msg); + void analog_measurement_sub_cb(const uavcan::ReceivedDataStructure &msg); - typedef uavcan::MethodBinder < UavcanAdcBridge *, - void (UavcanAdcBridge::*) - (const uavcan::ReceivedDataStructure &) > - AdcCbBinder; + typedef uavcan::MethodBinder < UavcanAnalogMeasurementBridge *, + void (UavcanAnalogMeasurementBridge::*) + (const uavcan::ReceivedDataStructure &) > + AnalogCbBinder; - uavcan::Subscriber _sub_adc_data; + uavcan::Subscriber _sub_analog_data; }; diff --git a/src/drivers/uavcan/sensors/sensor_bridge.cpp b/src/drivers/uavcan/sensors/sensor_bridge.cpp index 27cb18c41f..8593f37ac4 100644 --- a/src/drivers/uavcan/sensors/sensor_bridge.cpp +++ b/src/drivers/uavcan/sensors/sensor_bridge.cpp @@ -38,7 +38,7 @@ #include "sensor_bridge.hpp" #include -#include "adc.hpp" +#include "analog_measurement.hpp" #include "differential_pressure.hpp" #include "baro.hpp" #include "battery.hpp" @@ -59,7 +59,7 @@ void IUavcanSensorBridge::make_all(uavcan::INode &node, List uavcan::equipment::power::BatteryInfo if (_battery_status_sub.updated()) { - battery_status_s battery; + battery_status_s battery{}; if (_battery_status_sub.copy(&battery)) { uavcan::equipment::power::BatteryInfo battery_info{}; @@ -385,7 +385,7 @@ void UavcanNode::send_raw_air_data() { // differential_pressure -> uavcan::equipment::air_data::RawAirData if (_diff_pressure_sub.updated()) { - differential_pressure_s diff_press; + differential_pressure_s diff_press{}; if (_diff_pressure_sub.copy(&diff_press)) { @@ -407,7 +407,7 @@ void UavcanNode::send_range_sensor_measurement() { // distance_sensor[] -> uavcan::equipment::range_sensor::Measurement for (int i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) { - distance_sensor_s dist; + distance_sensor_s dist{}; if (_distance_sensor_sub[i].update(&dist)) { uavcan::equipment::range_sensor::Measurement range_sensor{}; @@ -459,7 +459,7 @@ void UavcanNode::send_static_pressure() { // sensor_baro -> uavcan::equipment::air_data::StaticTemperature if (_sensor_baro_sub.updated()) { - sensor_baro_s baro; + sensor_baro_s baro{}; if (_sensor_baro_sub.copy(&baro)) { uavcan::equipment::air_data::StaticPressure static_pressure{}; @@ -480,7 +480,7 @@ void UavcanNode::send_magnetic_field_strength2() { // sensor_mag -> uavcan::equipment::ahrs::MagneticFieldStrength2 if (_sensor_mag_sub.updated()) { - sensor_mag_s mag; + sensor_mag_s mag{}; if (_sensor_mag_sub.copy(&mag)) { uavcan::equipment::ahrs::MagneticFieldStrength2 magnetic_field{}; @@ -497,7 +497,7 @@ void UavcanNode::send_gnss_fix2() { // vehicle_gps_position -> uavcan::equipment::gnss::Fix2 if (_vehicle_gps_position_sub.updated()) { - vehicle_gps_position_s gps; + vehicle_gps_position_s gps{}; if (_vehicle_gps_position_sub.copy(&gps)) { uavcan::equipment::gnss::Fix2 fix2{}; @@ -531,50 +531,24 @@ void UavcanNode::send_gnss_fix2() } } -void UavcanNode::send_adc_measurements() +void UavcanNode::send_analog_measurements() { // vehicle_gps_position -> uavcan::equipment::gnss::Fix2 - if (_adc_report_sub.updated()) { - adc_report_s adc_report; + if (_analog_report_sub.updated()) { + analog_measurement_s measurement{}; - if (_adc_report_sub.copy(&adc_report)) { + if (_analog_report_sub.copy(&measurement)) { - // We could probably convince people an ADC uavcan data type - // would be useful to have in tree... - com::volansi::equipment::adc::Report report{}; + com::volansi::equipment::adc::AnalogMeasurement report{}; - int32_t adc1_units = 0; - int32_t adc2_units = 0; - int32_t adc3_units = 0; - int32_t adc4_units = 0; - - (void)param_get(param_find("ADC1_UNIT_TYPE"), &adc1_units); - (void)param_get(param_find("ADC2_UNIT_TYPE"), &adc2_units); - (void)param_get(param_find("ADC3_UNIT_TYPE"), &adc3_units); - (void)param_get(param_find("ADC4_UNIT_TYPE"), &adc4_units); - - report.unit_type[0] = (unsigned)adc1_units; - report.unit_type[1] = (unsigned)adc2_units; - report.unit_type[2] = (unsigned)adc3_units; - report.unit_type[3] = (unsigned)adc4_units; - - if (adc1_units != 0) { - report.values[0] = adc_report.raw_data[0]; + for (size_t i = 0; i < sizeof(measurement.values)/sizeof(values[0])) { + if (measurement.unit_type[i]) { + report.unit_type[i] = measurement.unit_type[i]; + report.values[i] = measurement.values[i]; + } } - if (adc2_units != 0) { - report.values[1] = adc_report.raw_data[1]; - } - - if (adc3_units != 0) { - report.values[2] = adc_report.raw_data[2]; - } - - if (adc4_units != 0) { - report.values[3] = adc_report.raw_data[3]; - } - - _adc_report_publisher.broadcast(report); + _analog_measurement_publisher.broadcast(report); } } } diff --git a/src/drivers/uavcannode/UavcanNode.hpp b/src/drivers/uavcannode/UavcanNode.hpp index 8303715828..b2bf4ab4e2 100644 --- a/src/drivers/uavcannode/UavcanNode.hpp +++ b/src/drivers/uavcannode/UavcanNode.hpp @@ -72,7 +72,7 @@ #include #include -#include +#include #include #include #include @@ -154,7 +154,7 @@ private: void send_magnetic_field_strength2(); void send_gnss_fix2(); void send_range_sensor_measurement(); - void send_adc_measurements(); + void send_analog_measurements(); px4::atomic_bool _task_should_exit{false}; ///< flag to indicate to tear down the CAN driver @@ -186,7 +186,7 @@ private: uavcan::Publisher _air_data_static_temperature_publisher; uavcan::Publisher _raw_air_data_publisher; uavcan::Publisher _range_sensor_measurement; - uavcan::Publisher _adc_report_publisher; + uavcan::Publisher _analog_measurement_publisher; hrt_abstime _last_static_temperature_publish{0}; @@ -204,7 +204,7 @@ private: uORB::SubscriptionCallbackWorkItem _sensor_baro_sub{this, ORB_ID(sensor_baro)}; uORB::SubscriptionCallbackWorkItem _sensor_mag_sub{this, ORB_ID(sensor_mag)}; uORB::SubscriptionCallbackWorkItem _vehicle_gps_position_sub{this, ORB_ID(vehicle_gps_position)}; - uORB::SubscriptionCallbackWorkItem _adc_report_sub{this, ORB_ID(adc_report)}; + uORB::SubscriptionCallbackWorkItem _analog_report_sub{this, ORB_ID(analog_measurement)}; perf_counter_t _cycle_perf;