From bddf1294f0ef1a0cbc51732ace0ba26ac991a990 Mon Sep 17 00:00:00 2001 From: connor rigby Date: Wed, 24 Jan 2018 09:28:17 -0800 Subject: [PATCH] Commit missing file --- lib/farmbot/firmware/estop_timer.ex | 74 +++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 lib/farmbot/firmware/estop_timer.ex diff --git a/lib/farmbot/firmware/estop_timer.ex b/lib/farmbot/firmware/estop_timer.ex new file mode 100644 index 00000000..e1593b0a --- /dev/null +++ b/lib/farmbot/firmware/estop_timer.ex @@ -0,0 +1,74 @@ +defmodule Farmbot.Firmware.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 do + GenServer.call(__MODULE__, :start_timer) + 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, _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