Current section
Files
Jump to
Current section
Files
lib/mavlink_util/param_set.ex
defmodule XMAVLink.Util.ParamSet do
@moduledoc false
@params :params
@param_retry_interval 3000
require Logger
alias XMAVLink.Router, as: MAV
alias Common.Message.ParamValue
alias Common.Message.ParamSet
import XMAVLink.Util.FocusManager, only: [focus: 0]
def param_set(param, new_value) do
with {:ok, {system_id, component_id, mavlink_version}} <- focus() do
param_set(system_id, component_id, mavlink_version, param, new_value)
end
end
def param_set(system_id, component_id, mavlink_version, param, new_value) when is_atom(param)do
param_set(system_id, component_id, mavlink_version, param |> Atom.to_string() |> String.upcase(), new_value)
end
def param_set(system_id, component_id, mavlink_version, param, new_value) do
with [{{^system_id, ^component_id, ^param}, {_time, %ParamValue{param_type: param_type}}}]
<- :ets.lookup(@params, {system_id, component_id, param}) do
MAV.subscribe message: ParamValue, source_system: system_id
MAV.pack_and_send(%ParamSet{
target_system: system_id,
target_component: component_id,
param_id: param,
param_value: new_value,
param_type: param_type,
}, mavlink_version)
receive do
%ParamValue{param_id: ^param, param_value: ^new_value} ->
MAV.unsubscribe()
Logger.info("Set #{param |> String.downcase()} to #{inspect new_value} for vehicle #{system_id}.#{component_id}")
after
@param_retry_interval ->
param_set(system_id, component_id, mavlink_version, param, new_value)
end
end
end
end