feat: Add support for enhanced APRS parser features

- Added position resolution field (posresolution) showing accuracy in meters
  - 18.52m for uncompressed positions
  - 0.291m for compressed positions
- Added format field indicating "compressed" or "uncompressed" position type
- Added telemetry support with three new fields:
  - telemetry_seq: sequence number
  - telemetry_vals: array of telemetry values
  - telemetry_bits: binary telemetry bits
- Updated packet schema and database migration
- Enhanced packet extraction logic to handle new fields
- All tests pass successfully

These improvements provide better position accuracy information and
enable telemetry packet processing from APRS stations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Graham McIntire 2025-08-01 16:57:28 -05:00
parent 82e97e5e31
commit 86d3837075
No known key found for this signature in database
4 changed files with 50 additions and 1 deletions

View file

@ -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

View file

@ -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
%{}

View file

@ -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

2
vendor/aprs vendored

@ -1 +1 @@
Subproject commit 46ece8d819b6ceb67b55dfe689cab68c665c978b
Subproject commit bbb397d6afb9c98933d096aae74e71181a02f62f