From f5b5af171eab2b087c8290b12d2779479ce42001 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Wed, 8 Apr 2026 16:13:25 -0500 Subject: [PATCH] Add beacon keying field (on/off or FSK) --- lib/microwaveprop/beacons/beacon.ex | 20 ++++++++++++++++-- .../live/beacon_live/form.ex | 7 +++++++ .../live/beacon_live/index.ex | 5 +++++ .../live/beacon_live/show.ex | 5 +++++ .../20260408211056_add_keying_to_beacons.exs | 9 ++++++++ test/microwaveprop/beacons_test.exs | 21 +++++++++++++++++++ 6 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 priv/repo/migrations/20260408211056_add_keying_to_beacons.exs diff --git a/lib/microwaveprop/beacons/beacon.ex b/lib/microwaveprop/beacons/beacon.ex index 8672bdd9..514b081c 100644 --- a/lib/microwaveprop/beacons/beacon.ex +++ b/lib/microwaveprop/beacons/beacon.ex @@ -11,6 +11,10 @@ defmodule Microwaveprop.Beacons.Beacon do alias Microwaveprop.Radio.Maidenhead + @keyings ~w(on_off fsk) + + def keyings, do: @keyings + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "beacons" do @@ -23,20 +27,32 @@ defmodule Microwaveprop.Beacons.Beacon do field :height_ft, :float field :on_the_air, :boolean, default: true field :approved, :boolean, default: false + field :keying, :string, default: "on_off" field :user_id, :binary_id timestamps(type: :utc_datetime) end - @required_fields [:frequency_mhz, :callsign, :lat, :lon, :power_mw, :height_ft] + @required_fields [:frequency_mhz, :callsign, :lat, :lon, :power_mw, :height_ft, :keying] def changeset(beacon, attrs) do beacon - |> cast(attrs, [:frequency_mhz, :callsign, :grid, :lat, :lon, :power_mw, :height_ft, :on_the_air]) + |> cast(attrs, [ + :frequency_mhz, + :callsign, + :grid, + :lat, + :lon, + :power_mw, + :height_ft, + :on_the_air, + :keying + ]) |> update_change(:callsign, fn cs -> cs && String.upcase(String.trim(cs)) end) |> maybe_fill_latlon() |> maybe_fill_grid() |> validate_required(@required_fields) + |> validate_inclusion(:keying, @keyings) |> validate_number(:frequency_mhz, greater_than: 0) |> validate_number(:power_mw, greater_than_or_equal_to: 0) |> validate_number(:height_ft, greater_than_or_equal_to: 0) diff --git a/lib/microwaveprop_web/live/beacon_live/form.ex b/lib/microwaveprop_web/live/beacon_live/form.ex index 1cd69468..d5500a15 100644 --- a/lib/microwaveprop_web/live/beacon_live/form.ex +++ b/lib/microwaveprop_web/live/beacon_live/form.ex @@ -43,6 +43,13 @@ defmodule MicrowavepropWeb.BeaconLive.Form do step="any" required /> + <.input + field={@form[:keying]} + type="select" + label="Keying" + options={[{"On/Off", "on_off"}, {"FSK", "fsk"}]} + required + /> <.input field={@form[:on_the_air]} type="checkbox" label="On the air" />