From b5c93883994d6f29f3504803cfeff851429bc5fb Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sun, 22 Mar 2026 13:49:59 -0500 Subject: [PATCH] fix: add wind direction normalization in changeset Normalize wind direction values to valid range (0-359 degrees) during packet insertion. Invalid wind direction values (360 or > 360, or negative) are automatically set to 0, preventing bad data from entering the database. This complements the fix in the APRS parser and ensures data integrity at the application level as well. --- lib/aprsme/packet.ex | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/aprsme/packet.ex b/lib/aprsme/packet.ex index 49e16c4..1443236 100644 --- a/lib/aprsme/packet.ex +++ b/lib/aprsme/packet.ex @@ -149,6 +149,7 @@ defmodule Aprsme.Packet do |> maybe_set_has_position() |> normalize_symbols() |> normalize_course() + |> normalize_wind_direction() end defp normalize_symbols(changeset) do @@ -202,6 +203,29 @@ defmodule Aprsme.Packet do end end + defp normalize_wind_direction(changeset) do + wind_direction = get_field(changeset, :wind_direction) || get_change(changeset, :wind_direction) + + case wind_direction do + nil -> + changeset + + dir when is_integer(dir) and dir >= 0 and dir <= 359 -> + changeset + + 360 -> + # 360 degrees = 0 degrees (full circle) + put_change(changeset, :wind_direction, 0) + + dir when is_integer(dir) -> + # Invalid wind direction (negative or > 360), normalize to 0 + put_change(changeset, :wind_direction, 0) + + _ -> + changeset + end + end + @spec maybe_create_geometry_from_lat_lon(Ecto.Changeset.t()) :: Ecto.Changeset.t() defp maybe_create_geometry_from_lat_lon(changeset) do lat = get_field(changeset, :lat) || get_change(changeset, :lat)