Make sequence errors lock bot, don't start sequence if bot is locked.

This commit is contained in:
connor rigby 2017-11-21 12:20:10 -08:00
parent abbdc7d813
commit aa056a7a29
4 changed files with 18 additions and 4 deletions

View file

@ -151,6 +151,10 @@ defmodule Farmbot.BotState do
end
end
def locked? do
GenStage.call(__MODULE__, :locked?)
end
@doc "Set job progress."
def set_job_progress(name, progress) do
GenServer.call(__MODULE__, {:set_job_progress, name, progress})
@ -234,6 +238,10 @@ defmodule Farmbot.BotState do
{:noreply, [state], state}
end
def handle_call(:locked?, _from, state) do
{:reply, state.informational_settings.sync_status == :locked, [], state}
end
def handle_call({:get_pin_value, pin}, _from, state) do
case state.pins[pin] do
nil ->

View file

@ -55,7 +55,7 @@ defmodule Farmbot.BotState.Transport.GenMQTT.Client do
def on_connect(state) do
GenMQTT.subscribe(self(), [{bot_topic(state.device), 0}])
GenMQTT.subscribe(self(), [{sync_topic(state.device), 0}])
Logger.info(3, "Connected to real time services.")
Logger.success(3, "Connected to real time services.")
if state.cache do
GenMQTT.publish(self(), status_topic(state.device), Poison.encode!(state.cache), 0, false)

View file

@ -7,7 +7,12 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
def execute(%{version: _, is_outdated: _, label: name}, body, env) do
Logger.busy 2, "[#{name}] - Sequence init."
env = mutate_env(env)
do_reduce(body, env, name)
if Farmbot.BotState.locked? do
Logger.error 1, "[#{name}] - Sequence failed. Bot is locked!"
{:error, :locked, env}
else
do_reduce(body, env, name)
end
end
defp do_reduce([ast | rest], env, name) do
@ -15,9 +20,10 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
case Farmbot.CeleryScript.execute(ast, env) do
{:ok, new_env} -> do_reduce(rest, new_env, name)
{:error, reason, env} ->
Logger.warn 3, "[#{name}] - Sequence failed. Locking bot!"
Logger.warn 1, "[#{name}] - Sequence failed. Locking bot!"
case Farmbot.Firmware.emergency_lock() do
:ok -> :ok
{:error, :emergency_lock} -> :ok
{:error, reason} -> Logger.error 1, "Failed to lock the firmware! #{inspect reason}"
end
{:error, reason, env}

View file

@ -285,7 +285,7 @@ defmodule Farmbot.Firmware do
maybe_cancel_timer(state.timer)
Farmbot.BotState.set_busy(false)
if state.current do
GenServer.reply(state.current.from, {:error, :timeout})
GenStage.reply(state.current.from, {:error, :timeout})
{:informational_settings, %{busy: false}, %{state | current: nil, idle: true}}
else
{:informational_settings, %{busy: false}, %{state | idle: true}}