Move estop timer around so the timer starts on _every_ estop

This commit is contained in:
connor rigby 2018-01-24 09:27:19 -08:00
parent 6591218a34
commit 77b511c9c9
5 changed files with 14 additions and 92 deletions

View file

@ -125,7 +125,6 @@ defmodule Farmbot.Bootstrap.Supervisor do
children = [
worker(Farmbot.Bootstrap.AuthTask, []),
worker(Farmbot.CeleryScript.EstopTimer, []),
supervisor(Farmbot.Firmware.Supervisor, []),
supervisor(Farmbot.BotState.Supervisor, []),
supervisor(Farmbot.BotState.Transport.Supervisor, []),

View file

@ -3,7 +3,6 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
use Farmbot.CeleryScript.AST.Node
use Farmbot.Logger
import Farmbot.System.ConfigStorage, only: [get_config_value: 3]
alias Farmbot.CeleryScript.EstopTimer
allow_args [:version, :label, :locals, :is_outdated]
def execute(%{label: name}, body, env) do
@ -12,7 +11,6 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
end
env = mutate_env(env)
if Farmbot.BotState.locked? do
maybe_send_email("[#{name}] - Sequence failed. Bot is locked!")
{:error, :locked, env}
else
do_reduce(body, env, name)
@ -27,9 +25,7 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
{:ok, new_env} -> do_reduce(rest, new_env, name)
{:error, reason, env} ->
case Farmbot.Firmware.emergency_lock() do
:ok ->
maybe_send_email("[#{name}] - Sequence failed. Locking bot!")
:ok
:ok -> :ok
{:error, :emergency_lock} -> :ok
{:error, reason} ->
Logger.error 1, "Failed to lock the firmware! #{inspect reason}"
@ -44,14 +40,4 @@ defmodule Farmbot.CeleryScript.AST.Node.Sequence do
end
{:ok, env}
end
defp maybe_send_email(msg) do
Logger.error(1, msg)
if get_config_value(:bool, "settings", "email_on_estop") do
if !EstopTimer.timer_active? do
EstopTimer.start_timer(msg)
end
end
end
end

View file

@ -1,74 +0,0 @@
defmodule Farmbot.CeleryScript.EstopTimer do
@moduledoc """
Module responsible for timing emails about E stops.
"""
use GenServer
use Farmbot.Logger
@msg "Farmbot has been E-Stopped for more than 10 minutes."
# Ten minutes.
@timer_ms 600000
# fifteen seconds.
# @timer_ms 15000
@doc "Checks if the timer is active."
def timer_active? do
GenServer.call(__MODULE__, :timer_active?)
end
@doc "Starts a new timer if one isn't started."
def start_timer(msg) do
GenServer.call(__MODULE__, {:start_timer, msg})
end
@doc "Cancels a timer if it exists."
def cancel_timer do
GenServer.call(__MODULE__, :cancel_timer)
end
@doc false
def start_link do
GenServer.start_link(__MODULE__, [], [name: __MODULE__])
end
@doc false
def init([]) do
{:ok, %{timer: nil, already_sent: false}}
end
def handle_call(:timer_active?, _, state) do
{:reply, is_timer_active?(state.timer), state}
end
def handle_call({:start_timer, _msg}, _from, state) do
if !is_timer_active?(state.timer) do
{:reply, :ok, %{state | timer: do_start_timer(self())}}
else
{:reply, :ok, state}
end
end
def handle_call(:cancel_timer, _from, state) do
if is_timer_active?(state.timer) do
Process.cancel_timer(state.timer)
end
{:reply, :ok, %{state | timer: nil, already_sent: false}}
end
def handle_info(:timer, state) do
if state.already_sent do
{:noreply, %{state | timer: nil}}
else
Logger.warn 1, @msg, [channels: [:email]]
{:noreply, %{state | timer: nil, already_sent: true}}
end
end
defp is_timer_active?(timer) do
if timer, do: is_number(Process.read_timer(timer)), else: false
end
defp do_start_timer(pid) do
Process.send_after(pid, :timer, @timer_ms)
end
end

View file

@ -3,7 +3,7 @@ defmodule Farmbot.Firmware do
use GenStage
use Farmbot.Logger
alias Farmbot.Firmware.Vec3
alias Farmbot.Firmware.{Vec3, EstopTimer}
# If any command takes longer than this, exit.
@call_timeout 500_000
@ -423,6 +423,7 @@ defmodule Farmbot.Firmware do
defp handle_gcode(:report_emergency_lock, state) do
Farmbot.System.GPIO.Leds.led_status_err
maybe_send_email()
if state.current do
do_reply(state, {:error, :emergency_lock})
{:informational_settings, %{locked: true}, %{state | current: nil}}
@ -508,7 +509,7 @@ defmodule Farmbot.Firmware do
case state.current do
%Current{fun: :emergency_unlock, from: from} ->
# i really don't want this to be here..
Farmbot.CeleryScript.EstopTimer.cancel_timer()
EstopTimer.cancel_timer()
:ok = GenServer.reply from, reply
%Current{fun: :emergency_lock, from: from} ->
:ok = GenServer.reply from, {:error, :emergency_lock}
@ -520,4 +521,13 @@ defmodule Farmbot.Firmware do
:error
end
end
defp maybe_send_email do
import Farmbot.System.ConfigStorage, only: [get_config_value: 3]
if get_config_value(:bool, "settings", "email_on_estop") do
if !EstopTimer.timer_active? do
EstopTimer.start_timer()
end
end
end
end

View file

@ -9,6 +9,7 @@ defmodule Farmbot.Firmware.Supervisor do
def init([]) do
children = [
worker(Farmbot.Firmware.EstopTimer, []),
worker(Farmbot.Firmware, [])
]