Misc celeryscript fixes.

* reenable `find_home` checks.
* add mech for only logging an error once.
* fix `read_pin` bad pattern.
* fix `send_message` pin pattern.
* fix _if execution of `nothing`
This commit is contained in:
connor rigby 2017-11-17 09:09:24 -08:00
parent d36116eb3d
commit 0d20d2a5b9
7 changed files with 43 additions and 13 deletions

View file

@ -161,10 +161,16 @@ defmodule Farmbot.BotState do
GenStage.call(__MODULE__, {:get_pin_value, num})
end
@doc "Get the bot's current position."
def get_current_pos do
GenStage.call(__MODULE__, :get_current_pos)
end
@doc "Get a arduino param."
def get_param(param) do
GenStage.call(__MODULE__, {:get_param, param})
end
@doc false
def set_busy(bool) do
GenStage.call(__MODULE__, {:set_busy, bool})
@ -271,6 +277,10 @@ defmodule Farmbot.BotState do
{:reply, state.location_data.position, [], state}
end
def handle_call({:get_param, param}, _from, state) do
{:reply, state.mcu_params[param], [], state}
end
def handle_call({:set_job_progress, name, progress}, _from, state) do
jobs = Map.put(state.jobs, name, progress)
new_state = %{state | jobs: jobs}

View file

@ -6,7 +6,7 @@ defmodule Farmbot.CeleryScript.AST.Arg.Lhs do
def decode("y"), do: {:ok, :y}
def decode("z"), do: {:ok, :z}
def decode("pin" <> num), do: {:pin, String.to_integer(num)}
def decode("pin" <> num), do: {:ok, {:pin, String.to_integer(num)}}
def decode(other), do: {:error, "unknown left hand side: #{inspect other}"}

View file

@ -70,7 +70,6 @@ defmodule Farmbot.CeleryScript.AST do
args = Map.new(str_args, &str_to_atom(&1))
case decode(str_map["body"] || []) do
{:ok, body} ->
IO.puts ""
%{kind: kind,
args: args,
body: body,

View file

@ -10,10 +10,9 @@ defmodule Farmbot.CeleryScript.AST.Node.FindHome do
def execute(%{speed: speed, axis: axis}, _, env) do
env = mutate_env(env)
case Farmbot.Firmware.find_home(axis, speed) do
:ok -> {:ok, env}
{:error, reason} -> {:error, reason, env}
end
ep = Farmbot.BotState.get_param(:"movement_enable_endpoints_#{axis}")
ec = Farmbot.BotState.get_param(:"encoder_enabled_#{axis}")
do_find_home(ep, ec, axis, speed, env)
end
defp do_reduce([axis | rest], speed, env) do
@ -26,4 +25,15 @@ defmodule Farmbot.CeleryScript.AST.Node.FindHome do
defp do_reduce([], _, env) do
{:ok, env}
end
defp do_find_home(ep, ec, axis, speed, env)
defp do_find_home(ep, ec, axis, _, env) when (ep == 0) or (ep == nil) or (ec == 0) or (ec == nil) do
{:error, "Could not find home on #{axis} axis because endpoints and encoders are disabled.", env}
end
defp do_find_home(ep, ec, axis, speed, env) when ep == 1 or ec == 1 do
case Farmbot.Firmware.find_home(axis, speed) do
:ok -> {:ok, env}
{:error, reason} -> {:error, reason, env}
end
end
end

View file

@ -6,7 +6,7 @@ defmodule Farmbot.CeleryScript.AST.Node.ReadPin do
def execute(%{pin_number: pin_num, pin_mode: mode}, _, env) do
env = mutate_env(env)
case Farmbot.Firmware.read_pin(pin_num, mode) do
{:ok, _} -> {:ok, env}
:ok -> {:ok, env}
{:error, reason} -> {:error, reason, env}
end
end

View file

@ -90,7 +90,7 @@ defmodule Farmbot.CeleryScript.AST.Node.SendMessage do
defp fetch_bindings do
bot_state = Farmbot.BotState.force_state_push()
pins = Enum.map(bot_state.pins, fn({pin, %{value: value}}) -> {:"pin_#{pin}", value} end)
pins = Enum.map(bot_state.pins, fn({pin, %{value: value}}) -> {:"pin#{pin}", value} end)
location = Enum.map(bot_state.location_data.position, fn({axis, val}) -> {axis, val} end)
pins ++ location
end

View file

@ -14,16 +14,27 @@ defmodule Farmbot.CeleryScript do
maybe_log_comment(ast)
case kind.execute(args, body, env) do
{:ok, %Macro.Env{} = _env} = res -> res
{:ok, %AST{}, %Macro.Env{} = env} -> {:ok, env}
{:ok, %AST{} = ast} -> execute(ast, env)
{:error, reason, env} ->
Logger.error 2, "CS Failed: #{env.module} - #{inspect reason}"
{:error, reason, env}
# this stops messages from logging more than once in
# sequences, rpc_request, etc.
unless env.vars[:__errors__][env.module] do
Logger.error 2, "CS Failed: [#{fe_kind(env.module)}] - #{inspect reason}"
end
new_env = %{env | vars: [{:__errors__, [{env.module, reason}| env.vars[:__errors__] || []]} | env.vars]}
{:error, reason, new_env}
end
end
defp maybe_log_comment(%{comment: nil}), do: :ok
defp maybe_log_comment(%AST{comment: comment} = _ast) do
Logger.info 2, "[#{comment.kind}] - #{comment}"
defp maybe_log_comment(%AST{comment: nil}), do: :ok
defp maybe_log_comment(%AST{comment: comment} = ast) do
Logger.info 2, "[#{fe_kind(ast.kind)}] - #{comment}"
end
@doc "Get the more friendly name of this node."
def fe_kind(kind) when is_atom(kind) do
Module.split(kind) |> List.last() |> Macro.underscore()
end
end