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