51 lines
1.2 KiB
Elixir
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
|