diff --git a/CHANGELOG.md b/CHANGELOG.md index c17c584..b96bdba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `position_ambiguity` field to packets table (integer, 0-4) - Automatically captures position ambiguity level when parsing APRS packets - Supports ambiguity levels 0-4 as defined in APRS specification +- Enhanced APRS parser integration with latest improvements + - Added `posresolution` field showing position accuracy in meters (18.52m for uncompressed, 0.291m for compressed) + - Added `format` field indicating "compressed" or "uncompressed" position type + - Added telemetry fields (`telemetry_seq`, `telemetry_vals`, `telemetry_bits`) for telemetry packet support + - Improved coordinate handling with direct float support from parser + - Fixed compressed latitude divisor calculation for more accurate position decoding ### Changed - Query performance improved by 50-90% for common operations diff --git a/lib/aprsme/packet.ex b/lib/aprsme/packet.ex index 982a782..42df918 100644 --- a/lib/aprsme/packet.ex +++ b/lib/aprsme/packet.ex @@ -55,6 +55,10 @@ defmodule Aprsme.Packet do # Position ambiguity level (0-4) field(:position_ambiguity, :integer) + # Position resolution and format + field(:posresolution, :float) + field(:format, :string) + # PHG (Power-Height-Gain) fields field(:phg_power, :integer) field(:phg_height, :integer) @@ -66,6 +70,11 @@ defmodule Aprsme.Packet do field(:message_text, :string) field(:message_number, :string) + # Telemetry fields + field(:telemetry_seq, :integer) + field(:telemetry_vals, {:array, :integer}) + field(:telemetry_bits, :string) + field(:device_identifier, :string) embeds_one(:data_extended, DataExtended) @@ -119,6 +128,8 @@ defmodule Aprsme.Packet do :speed, :altitude, :position_ambiguity, + :posresolution, + :format, :phg_power, :phg_height, :phg_gain, @@ -126,6 +137,9 @@ defmodule Aprsme.Packet do :addressee, :message_text, :message_number, + :telemetry_seq, + :telemetry_vals, + :telemetry_bits, :device_identifier ]) |> validate_required([ @@ -324,6 +338,7 @@ defmodule Aprsme.Packet do |> put_weather_fields(combined_data) |> put_equipment_fields(combined_data) |> put_message_fields(combined_data) + |> put_telemetry_fields(combined_data) # Don't override data_type - trust the APRS parser's determination # The parser already correctly identifies weather packets by: @@ -351,6 +366,8 @@ defmodule Aprsme.Packet do data_extended[:aprs_messaging?] || data_extended["aprs_messaging?"] ) |> maybe_put(:position_ambiguity, data_extended[:position_ambiguity] || data_extended["position_ambiguity"]) + |> maybe_put(:posresolution, data_extended[:posresolution] || data_extended["posresolution"]) + |> maybe_put(:format, data_extended[:format] || data_extended["format"]) end defp put_weather_fields(map, data_extended) do @@ -414,6 +431,16 @@ defmodule Aprsme.Packet do ) end + defp put_telemetry_fields(map, data_extended) do + # Check for telemetry data in various locations + telemetry = data_extended[:telemetry] || data_extended["telemetry"] || data_extended + + map + |> maybe_put(:telemetry_seq, telemetry[:seq] || telemetry["seq"]) + |> maybe_put(:telemetry_vals, telemetry[:vals] || telemetry["vals"]) + |> maybe_put(:telemetry_bits, telemetry[:bits] || telemetry["bits"]) + end + # Extract data from MicE packets defp extract_from_mic_e(mic_e) do %{} diff --git a/priv/repo/migrations/20250801215236_add_parser_improvements.exs b/priv/repo/migrations/20250801215236_add_parser_improvements.exs new file mode 100644 index 0000000..033a8f7 --- /dev/null +++ b/priv/repo/migrations/20250801215236_add_parser_improvements.exs @@ -0,0 +1,16 @@ +defmodule Aprsme.Repo.Migrations.AddParserImprovements do + use Ecto.Migration + + def change do + alter table(:packets) do + # Position resolution and format + add :posresolution, :float + add :format, :string + + # Telemetry fields + add :telemetry_seq, :integer + add :telemetry_vals, {:array, :integer} + add :telemetry_bits, :string + end + end +end diff --git a/vendor/aprs b/vendor/aprs index 46ece8d..bbb397d 160000 --- a/vendor/aprs +++ b/vendor/aprs @@ -1 +1 @@ -Subproject commit 46ece8d819b6ceb67b55dfe689cab68c665c978b +Subproject commit bbb397d6afb9c98933d096aae74e71181a02f62f