farmbot_os/farmbot_core/lib/farmbot_core/asset_workers/firmware_config_worker.ex

63 lines
2.3 KiB
Elixir

defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FirmwareConfig do
@moduledoc """
This asset worker does not get restarted. It inistead responds to GenServer
calls.
"""
use GenServer
require FarmbotCore.Logger
alias FarmbotFirmware
alias FarmbotCore.{Asset.FirmwareConfig, FirmwareSideEffects}
def preload(%FirmwareConfig{}), do: []
def tracks_changes?(%FirmwareConfig{}), do: true
def start_link(%FirmwareConfig{} = fw_config, _args) do
GenServer.start_link(__MODULE__, %FirmwareConfig{} = fw_config)
end
def init(%FirmwareConfig{} = fw_config) do
{:ok, %FirmwareConfig{} = fw_config}
end
def handle_cast({:new_data, new_fw_config}, old_fw_config) do
# Generate the changes between the old config and the new one.
%{changes: changes} = FirmwareConfig.changeset(old_fw_config, Map.from_struct(new_fw_config))
# Extract only the needed values.
changes = FirmwareSideEffects.known_params(changes)
# write each changed parameter, and read it back to set it on the state.
for {param, value} <- changes, do: do_write_read(param, value)
# save the new config on the state.
{:noreply, new_fw_config}
end
defp do_write_read(calib_param, value)
when calib_param in [:movement_axis_nr_steps_z, :movement_axis_nr_steps_y, :movement_axis_nr_steps_z]
do
case FarmbotFirmware.command({:parameter_write, [{calib_param, value}]}) do
{:error, :configuration} ->
FarmbotCore.Logger.warn 3, "Firmware parameter edge case (calibration): #{calib_param}: #{value}"
:ok
:ok ->
FarmbotCore.Logger.success 1, "Firmware parameter updated: #{calib_param} #{value}"
:ok
end
end
defp do_write_read(param, value) do
with :ok <- FarmbotFirmware.command({:parameter_write, [{param, value}]}),
{:ok, {_, {:report_parameter_value, [{^param, ^value}]}}} <- FarmbotFirmware.request({:parameter_read, [param]}) do
FarmbotCore.Logger.success 1, "Firmware parameter updated: #{param} #{value}"
:ok
else
{:error, reason} ->
FarmbotCore.Logger.error 1, "Error writing firmware parameter: #{param}: #{inspect(reason)}"
{:ok, {_, {:report_parameter_value, [{param, value}]}}} ->
FarmbotCore.Logger.error 1, "Error writing firmware parameter #{param}: incorrect data reply: #{value}"
end
end
end