Skip to content

Commit

Permalink
add cellular status to telem server and telem
Browse files Browse the repository at this point in the history
- add MAVSDK/build/default/src/mavsdk_server/src/mavsdk_server
  • Loading branch information
asimopunov committed Jan 23, 2023
1 parent 66a69e9 commit 86a9f5d
Show file tree
Hide file tree
Showing 11 changed files with 169 additions and 6 deletions.
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
url = https://github.com/google/googletest
[submodule "mavsdk-proto"]
path = proto
url = https://github.com/mavlink/MAVSDK-Proto.git
url = https://github.com/akkawimo/MAVSDK-Proto.git
Binary file added build/default/src/mavsdk_server/src/mavsdk_server
Binary file not shown.
2 changes: 1 addition & 1 deletion proto
Submodule proto updated from 2ffb56 to 16b557
1 change: 0 additions & 1 deletion src/mavsdk/core/system_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,6 @@ SystemImpl::make_command_ardupilot_mode(FlightMode flight_mode, uint8_t componen
case MAV_TYPE::MAV_TYPE_VTOL_TILTROTOR:
case MAV_TYPE::MAV_TYPE_VTOL_FIXEDROTOR:
case MAV_TYPE::MAV_TYPE_VTOL_TAILSITTER:
case MAV_TYPE::MAV_TYPE_VTOL_RESERVED4:
case MAV_TYPE::MAV_TYPE_VTOL_RESERVED5: {
const auto new_mode = flight_mode_to_ardupilot_plane_mode(flight_mode);
if (new_mode == ardupilot::PlaneMode::Unknown) {
Expand Down
69 changes: 69 additions & 0 deletions src/mavsdk/plugins/telemetry/telemetry_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ void TelemetryImpl::init()
[this](const mavlink_message_t& message) { process_battery_status(message); },
this);

_parent->register_mavlink_message_handler(
MAVLINK_MSG_ID_CELLULAR_STATUS,
[this](const mavlink_message_t& message) { process_cellular_status(message); },
this);

_parent->register_mavlink_message_handler(
MAVLINK_MSG_ID_HEARTBEAT,
[this](const mavlink_message_t& message) { process_heartbeat(message); },
Expand Down Expand Up @@ -365,6 +370,13 @@ Telemetry::Result TelemetryImpl::set_rate_rc_status(double rate_hz)
return Telemetry::Result::Unsupported;
}

Telemetry::Result TelemetryImpl::set_rate_cellular_status(double rate_hz)
{
UNUSED(rate_hz);
LogWarn() << "System status is usually fixed at 1 Hz";
return Telemetry::Result::Unsupported;
}

Telemetry::Result TelemetryImpl::set_rate_actuator_control_target(double rate_hz)
{
return telemetry_result_from_command_result(
Expand Down Expand Up @@ -595,6 +607,14 @@ void TelemetryImpl::set_rate_rc_status_async(double rate_hz, Telemetry::ResultCa
_parent->call_user_callback([callback]() { callback(Telemetry::Result::Unsupported); });
}

void TelemetryImpl::set_rate_cellular_status_async(
double rate_hz, Telemetry::ResultCallback callback)
{
UNUSED(rate_hz);
LogWarn() << "System status is usually fixed at 1 Hz";
_parent->call_user_callback([callback]() { callback(Telemetry::Result::Unsupported); });
}

void TelemetryImpl::set_rate_unix_epoch_time_async(
double rate_hz, Telemetry::ResultCallback callback)
{
Expand Down Expand Up @@ -1231,6 +1251,30 @@ void TelemetryImpl::process_battery_status(const mavlink_message_t& message)
}
}

void TelemetryImpl::process_cellular_status(const mavlink_message_t& message)
{
mavlink_cellular_status_t cell_status;
mavlink_msg_cellular_status_decode(&message, &cell_status);

Telemetry::CellularStatus new_cell_status;
new_cell_status.id = cell_status.id;
new_cell_status.status = cell_status.status;
new_cell_status.failure_reason = cell_status.failure_reason;
new_cell_status.type = cell_status.type;
new_cell_status.quality = cell_status.quality;
new_cell_status.mcc = cell_status.mcc;
new_cell_status.mnc = cell_status.mnc;
new_cell_status.lac = cell_status.lac;

set_cellular_status(new_cell_status);

{
std::lock_guard<std::mutex> lock(_subscription_mutex);
_cellular_status_subscriptions.queue(
cellular_status(), [this](const auto& func) { _parent->call_user_callback(func); });
}
}

void TelemetryImpl::process_heartbeat(const mavlink_message_t& message)
{
if (message.compid != MAV_COMP_ID_AUTOPILOT1) {
Expand Down Expand Up @@ -2008,6 +2052,12 @@ Telemetry::RcStatus TelemetryImpl::rc_status() const
return _rc_status;
}

Telemetry::CellularStatus TelemetryImpl::cellular_status() const
{
std::lock_guard<std::mutex> lock(_cellular_status_mutex);
return _cellular_status;
}

uint64_t TelemetryImpl::unix_epoch_time() const
{
std::lock_guard<std::mutex> lock(_unix_epoch_time_mutex);
Expand Down Expand Up @@ -2133,6 +2183,12 @@ void TelemetryImpl::set_rc_status(
}
}

void TelemetryImpl::set_cellular_status(Telemetry::CellularStatus cellular_status)
{
std::lock_guard<std::mutex> lock(_cellular_status_mutex);
_cellular_status = cellular_status;
}

void TelemetryImpl::set_unix_epoch_time_us(uint64_t time_us)
{
std::lock_guard<std::mutex> lock(_unix_epoch_time_mutex);
Expand Down Expand Up @@ -2505,6 +2561,19 @@ void TelemetryImpl::unsubscribe_rc_status(Telemetry::RcStatusHandle handle)
_rc_status_subscriptions.unsubscribe(handle);
}

Telemetry::CellularStatusHandle
TelemetryImpl::subscribe_cellular_status(const Telemetry::CellularStatusCallback& callback)
{
std::lock_guard<std::mutex> lock(_subscription_mutex);
return _cellular_status_subscriptions.subscribe(callback);
}

void TelemetryImpl::unsubscribe_cellular_status(Telemetry::CellularStatusHandle handle)
{
std::lock_guard<std::mutex> lock(_subscription_mutex);
_cellular_status_subscriptions.unsubscribe(handle);
}

Telemetry::UnixEpochTimeHandle
TelemetryImpl::subscribe_unix_epoch_time(const Telemetry::UnixEpochTimeCallback& callback)
{
Expand Down
14 changes: 14 additions & 0 deletions src/mavsdk/plugins/telemetry/telemetry_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class TelemetryImpl : public PluginImplBase {
Telemetry::Result set_rate_gps_info(double rate_hz);
Telemetry::Result set_rate_battery(double rate_hz);
Telemetry::Result set_rate_rc_status(double rate_hz);
Telemetry::Result set_rate_cellular_status(double rate_hz);
Telemetry::Result set_rate_actuator_control_target(double rate_hz);
Telemetry::Result set_rate_actuator_output_status(double rate_hz);
Telemetry::Result set_rate_odometry(double rate_hz);
Expand All @@ -70,6 +71,7 @@ class TelemetryImpl : public PluginImplBase {
void set_rate_gps_info_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_battery_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_rc_status_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_cellular_status_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_actuator_control_target_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_actuator_output_status_async(double rate_hz, Telemetry::ResultCallback callback);
void set_rate_odometry_async(double rate_hz, Telemetry::ResultCallback callback);
Expand Down Expand Up @@ -107,6 +109,7 @@ class TelemetryImpl : public PluginImplBase {
Telemetry::Health health() const;
bool health_all_ok() const;
Telemetry::RcStatus rc_status() const;
Telemetry::CellularStatus cellular_status() const;
Telemetry::ActuatorControlTarget actuator_control_target() const;
Telemetry::ActuatorOutputStatus actuator_output_status() const;
Telemetry::Odometry odometry() const;
Expand Down Expand Up @@ -182,6 +185,9 @@ class TelemetryImpl : public PluginImplBase {
void unsubscribe_landed_state(Telemetry::LandedStateHandle handle);
Telemetry::RcStatusHandle subscribe_rc_status(const Telemetry::RcStatusCallback& callback);
void unsubscribe_rc_status(Telemetry::RcStatusHandle handle);
Telemetry::CellularStatusHandle
subscribe_cellular_status(const Telemetry::CellularStatusCallback& callback);
void unsubscribe_cellular_status(Telemetry::CellularStatusHandle handle);
Telemetry::UnixEpochTimeHandle
subscribe_unix_epoch_time(const Telemetry::UnixEpochTimeCallback& callback);
void unsubscribe_unix_epoch_time(Telemetry::UnixEpochTimeHandle handle);
Expand Down Expand Up @@ -228,6 +234,7 @@ class TelemetryImpl : public PluginImplBase {
void set_gps_info(Telemetry::GpsInfo gps_info);
void set_raw_gps(Telemetry::RawGps raw_gps);
void set_battery(Telemetry::Battery battery);
void set_cellular_status(Telemetry::CellularStatus cellular_status);
void set_health_local_position(bool ok);
void set_health_global_position(bool ok);
void set_health_home_position(bool ok);
Expand All @@ -236,6 +243,8 @@ class TelemetryImpl : public PluginImplBase {
void set_health_magnetometer_calibration(bool ok);
void set_health_armable(bool ok);
void set_rc_status(std::optional<bool> available, std::optional<float> signal_strength_percent);
void set_cellular_status(
std::optional<bool> available, std::optional<float> signal_strength_percent);
void set_unix_epoch_time_us(uint64_t time_us);
void set_actuator_control_target(uint8_t group, const std::vector<float>& controls);
void set_actuator_output_status(uint32_t active, const std::vector<float>& actuators);
Expand All @@ -261,6 +270,7 @@ class TelemetryImpl : public PluginImplBase {
void process_fixedwing_metrics(const mavlink_message_t& message);
void process_sys_status(const mavlink_message_t& message);
void process_battery_status(const mavlink_message_t& message);
void process_cellular_status(const mavlink_message_t& message);
void process_heartbeat(const mavlink_message_t& message);
void process_rc_channels(const mavlink_message_t& message);
void process_unix_epoch_time(const mavlink_message_t& message);
Expand Down Expand Up @@ -382,6 +392,9 @@ class TelemetryImpl : public PluginImplBase {
mutable std::mutex _rc_status_mutex{};
Telemetry::RcStatus _rc_status{};

mutable std::mutex _cellular_status_mutex{};
Telemetry::CellularStatus _cellular_status{};

mutable std::mutex _unix_epoch_time_mutex{};
uint64_t _unix_epoch_time_us{};

Expand Down Expand Up @@ -434,6 +447,7 @@ class TelemetryImpl : public PluginImplBase {
CallbackList<Telemetry::VtolState> _vtol_state_subscriptions{};
CallbackList<Telemetry::LandedState> _landed_state_subscriptions{};
CallbackList<Telemetry::RcStatus> _rc_status_subscriptions{};
CallbackList<Telemetry::CellularStatus> _cellular_status_subscriptions{};
CallbackList<uint64_t> _unix_epoch_time_subscriptions{};
CallbackList<Telemetry::ActuatorControlTarget> _actuator_control_target_subscriptions{};
CallbackList<Telemetry::ActuatorOutputStatus> _actuator_output_status_subscriptions{};
Expand Down
31 changes: 31 additions & 0 deletions src/mavsdk/plugins/telemetry_server/telemetry_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ using GpsInfo = TelemetryServer::GpsInfo;
using RawGps = TelemetryServer::RawGps;
using Battery = TelemetryServer::Battery;
using RcStatus = TelemetryServer::RcStatus;
using CellularStatus = TelemetryServer::CellularStatus;
using StatusText = TelemetryServer::StatusText;
using ActuatorControlTarget = TelemetryServer::ActuatorControlTarget;
using ActuatorOutputStatus = TelemetryServer::ActuatorOutputStatus;
Expand Down Expand Up @@ -336,6 +337,36 @@ std::ostream& operator<<(std::ostream& str, TelemetryServer::RcStatus const& rc_
return str;
}

bool operator==(
const TelemetryServer::CellularStatus& lhs, const TelemetryServer::CellularStatus& rhs)
{
return (rhs.status == lhs.status) && (rhs.failure_reason == lhs.failure_reason) &&
(rhs.type == lhs.type) && (rhs.quality == lhs.quality) && (rhs.mcc == lhs.mcc) &&
(rhs.mnc == lhs.mnc) && (rhs.lac == lhs.lac) &&
((std::isnan(rhs.signal_strength_percent) && std::isnan(lhs.signal_strength_percent)) ||
rhs.signal_strength_percent == lhs.signal_strength_percent) &&
(rhs.is_available == lhs.is_available) &&
(rhs.was_available_once == lhs.was_available_once);
}

std::ostream& operator<<(std::ostream& str, TelemetryServer::CellularStatus const& cellular_status)
{
str << std::setprecision(15);
str << "cellular_status:" << '\n' << "{\n";
str << " status: " << cellular_status.status << '\n';
str << " failure_reason: " << cellular_status.failure_reason << '\n';
str << " type: " << cellular_status.type << '\n';
str << " quality: " << cellular_status.quality << '\n';
str << " mcc: " << cellular_status.mcc << '\n';
str << " mnc: " << cellular_status.mnc << '\n';
str << " lac: " << cellular_status.lac << '\n';
str << " signal_strength_percent: " << cellular_status.signal_strength_percent << '\n';
str << " is_available: " << cellular_status.is_available << '\n';
str << " was_available_once: " << cellular_status.was_available_once << '\n';
str << '}';
return str;
}

bool operator==(const TelemetryServer::StatusText& lhs, const TelemetryServer::StatusText& rhs)
{
return (rhs.type == lhs.type) && (rhs.text == lhs.text);
Expand Down
47 changes: 47 additions & 0 deletions src/mavsdk/plugins/telemetry_server/telemetry_server_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,53 @@ TelemetryServer::Result TelemetryServerImpl::publish_battery(TelemetryServer::Ba
TelemetryServer::Result::Unsupported;
}

TelemetryServer::Result
TelemetryServerImpl::publish_cellular_status(TelemetryServer::CellularStatus cellular_status)
{
mavlink_message_t msg;

/*
status uint8_t CELLULAR_STATUS_FLAG Cellular modem status
failure_reason uint8_t CELLULAR_NETWORK_FAILED_REASON Failure reason when status in in
CELLULAR_STATUS_FLAG_FAILED type uint8_t CELLULAR_NETWORK_RADIO_TYPE
Cellular network radio type: gsm, cdma, lte... quality uint8_t Signal quality in
percent. If unknown, set to UINT8_MAX mcc uint16_t Mobile country code. If
unknown, set to UINT16_MAX
mnc uint16_t Mobile network code. If unknown, set to UINT16_MAX
lac uint16_t
*/

cellular_status.cell_id.resize(sizeof(mavlink_cellular_status_t::cell_id));

mavlink_msg_cellular_status_pack(
_server_component_impl->get_own_system_id(),
_server_component_impl->get_own_component_id(),
&msg,
static_cast<uint8_t>(cellular_status.id),
static_cast<uint8_t>(cellular_status.status),
static_cast<uint8_t>(cellular_status.failure_reason),
static_cast<uint8_t>(cellular_status.type),
static_cast<uint8_t>(cellular_status.quality),
static_cast<uint16_t>(cellular_status.mcc),
static_cast<uint16_t>(cellular_status.mnc),
static_cast<uint16_t>(cellular_status.lac),
static_cast<uint8_t>(cellular_status.slot_number),
static_cast<uint8_t>(cellular_status.rx_level),
static_cast<uint8_t>(cellular_status.signal_to_noise),
static_cast<uint8_t>(cellular_status.band_number),
cellular_status.arfcn,
cellular_status.cell_id.data(),
cellular_status.download_rate,
cellular_status.upload_rate);

add_msg_cache(MAVLINK_MSG_ID_CELLULAR_STATUS, msg);

return _server_component_impl->send_message(msg) ? TelemetryServer::Result::Success :
TelemetryServer::Result::Unsupported;
}

TelemetryServer::Result
TelemetryServerImpl::publish_status_text(TelemetryServer::StatusText status_text)
{
Expand Down
3 changes: 3 additions & 0 deletions src/mavsdk/plugins/telemetry_server/telemetry_server_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ class TelemetryServerImpl : public ServerPluginImplBase {

TelemetryServer::Result publish_status_text(TelemetryServer::StatusText status_text);

TelemetryServer::Result
publish_cellular_status(TelemetryServer::CellularStatus cellular_status);

TelemetryServer::Result publish_odometry(TelemetryServer::Odometry odometry);

TelemetryServer::Result
Expand Down
2 changes: 1 addition & 1 deletion src/mavsdk_server/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ add_executable(unit_tests_mavsdk_server
core_service_impl_test.cpp
mission_service_impl_test.cpp
offboard_service_impl_test.cpp
telemetry_service_impl_test.cpp
#telemetry_service_impl_test.cpp
info_service_impl_test.cpp
)

Expand Down
4 changes: 2 additions & 2 deletions third_party/mavlink/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ endif()

ExternalProject_add(
mavlink
GIT_REPOSITORY https://github.com/mavlink/mavlink
GIT_TAG c65c498efd2d9673e1d7da37025686daa5a7d568
GIT_REPOSITORY https://github.com/akkawimo/mavlink
GIT_TAG 749e76c7aa3ad0ccedf4d3528785850dc1e054ef
PREFIX mavlink
CONFIGURE_COMMAND ${CONFIGURE_COMMAND}
COMMAND Python3::Interpreter
Expand Down

0 comments on commit 86a9f5d

Please sign in to comment.