farmbot_os/farmbot_core/lib/asset_storage/regimen.ex

51 lines
1.2 KiB
Elixir

defmodule Farmbot.Asset.Regimen do
@moduledoc """
A Regimen is a schedule to run sequences on.
"""
alias Farmbot.Asset.Regimen
alias Farmbot.EctoTypes.TermType
alias Farmbot.Regimen.NameProvider
alias Farmbot.Regimen.Supervisor, as: RegimenSupervisor
use Ecto.Schema
import Ecto.Changeset
@primary_key {:local_id, :binary_id, autogenerate: true}
schema "regimens" do
field(:id, :integer)
field(:name, :string)
field(:farm_event_id, :integer, virtual: true)
field(:regimen_items, TermType)
end
@type item :: %{
name: String.t(),
time_offset: integer,
sequence_id: integer
}
@type t :: %__MODULE__{
name: String.t(),
regimen_items: [item]
}
@required_fields [:id, :name, :regimen_items]
def changeset(%Regimen{} = regimen, params \\ %{}) do
regimen
|> cast(params, @required_fields)
|> validate_required(@required_fields)
|> unique_constraint(:id)
end
@behaviour Farmbot.Asset.FarmEvent
def schedule_event(%Regimen{} = regimen, now) do
name = NameProvider.via(regimen)
case GenServer.whereis(name) do
nil -> {:ok, _pid} = RegimenSupervisor.add_child(regimen, now)
pid -> {:ok, pid}
end
end
end