diff --git a/.tool-versions b/.tool-versions index 68bfb342..6489cf3a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ erlang 20.0 -elixir 1.5.0 +elixir 1.5.2 diff --git a/config/host/dev.exs b/config/host/dev.exs index 003eb547..ccbd7e76 100644 --- a/config/host/dev.exs +++ b/config/host/dev.exs @@ -49,7 +49,7 @@ config :farmbot, Farmbot.System.ConfigStorage, config :farmbot, :behaviour, authorization: Farmbot.Bootstrap.Authorization, system_tasks: Farmbot.Host.SystemTasks, - update_handler: Farmbot.Host.UpdateHandler, - firmware_handler: Farmbot.Firmware.UartHandler + update_handler: Farmbot.Host.UpdateHandler + # firmware_handler: Farmbot.Firmware.UartHandler config :farmbot, :uart_handler, tty: "/dev/ttyACM0" diff --git a/lib/farmbot/celery_script/ast/node/execute_script.ex b/lib/farmbot/celery_script/ast/node/execute_script.ex index f4eff7fb..6def41c6 100644 --- a/lib/farmbot/celery_script/ast/node/execute_script.ex +++ b/lib/farmbot/celery_script/ast/node/execute_script.ex @@ -3,18 +3,24 @@ defmodule Farmbot.CeleryScript.AST.Node.ExecuteScript do use Farmbot.CeleryScript.AST.Node allow_args [:label] - def execute(%{label: label}, _, env) do + def execute(%{label: label}, pairs, env) do env = mutate_env(env) case Farmbot.Farmware.lookup(label) do - {:ok, fw} -> do_execute(fw, env) + {:ok, fw} -> do_execute(fw, pairs, env) {:error, reason} -> {:error, reason, env} end end - defp do_execute(%Farmbot.Farmware{} = fw, env) do - case Farmbot.Farmware.execute(fw) do + defp do_execute(%Farmbot.Farmware{} = fw, pairs, env) do + case Farmbot.Farmware.execute(fw, to_fw_env(pairs)) do %Farmbot.Farmware.Runtime{exit_status: 0} -> {:ok, env} %Farmbot.Farmware.Runtime{} -> {:error, "Farmware failed", env} end end + + defp to_fw_env(pairs, acc \\ []) + defp to_fw_env([], acc), do: acc + defp to_fw_env([%{args: %{label: key, value: value}} | rest], acc) do + to_fw_env(rest, [{key, value} | acc]) + end end diff --git a/lib/farmbot/farmware/farmware.ex b/lib/farmbot/farmware/farmware.ex index a6949f26..04644429 100644 --- a/lib/farmbot/farmware/farmware.ex +++ b/lib/farmbot/farmware/farmware.ex @@ -124,7 +124,7 @@ defmodule Farmbot.Farmware do :meta, ] - defdelegate execute(fw), to: Farmbot.Farmware.Runtime + defdelegate execute(fw, env), to: Farmbot.Farmware.Runtime @doc "Lookup a farmware by it's name." def lookup(name) do diff --git a/lib/farmbot/farmware/runtime.ex b/lib/farmbot/farmware/runtime.ex index 0fb9ddec..be98baa5 100644 --- a/lib/farmbot/farmware/runtime.ex +++ b/lib/farmbot/farmware/runtime.ex @@ -10,12 +10,12 @@ defmodule Farmbot.Farmware.Runtime do defstruct [:farmware, :env, :port, :exit_status, :working_dir, :return_dir] @doc "Execute a Farmware struct." - def execute(%Farmware{} = farmware) do + def execute(%Farmware{} = farmware, env) when is_list(env) do Logger.busy(2, "Beginning execution of #{inspect(farmware)}") fw_path = Installer.install_path(farmware) |> Path.absname("#{:code.priv_dir(:farmbot)}/..") cwd = File.cwd!() with :ok <- File.cd(fw_path), - env <- build_env(farmware) do + env <- build_env(farmware, env) do exec = farmware.executable opts = [ @@ -75,7 +75,7 @@ defmodule Farmbot.Farmware.Runtime do end end - defp build_env(%Farmware{config: config, name: fw_name} = _farmware) do + def build_env(%Farmware{config: config, name: fw_name} = _farmware, env) do token = Farmbot.System.ConfigStorage.get_config_value(:string, "authorization", "token") images_dir = "/tmp/images" @@ -88,6 +88,7 @@ defmodule Farmbot.Farmware.Runtime do |> Map.put("FARMWARE_URL", "http://localhost:27347/") |> Map.put("FARMBOT_OS_VERSION", @fbos_version) |> Map.merge(Farmbot.BotState.get_user_env()) + |> Map.merge(Map.new(env)) |> Enum.map(fn {key, val} -> {to_erl_safe(key), to_erl_safe(val)} end) end diff --git a/lib/farmbot/firmware/uart_handler/uart_handler.ex b/lib/farmbot/firmware/uart_handler/uart_handler.ex index 47c2926b..8a9583ff 100644 --- a/lib/farmbot/firmware/uart_handler/uart_handler.ex +++ b/lib/farmbot/firmware/uart_handler/uart_handler.ex @@ -105,7 +105,7 @@ defmodule Farmbot.Firmware.UartHandler do {:noreply, [], state} end - defp handle_config({:config, "settings", key, val}, state) + defp handle_config({:config, "settings", key, _val}, state) when key in ["firmware_input_log", "firmware_output_log"] do # Restart the framing to pick up new changes.