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:
parent
82e97e5e31
commit
86d3837075
4 changed files with 50 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
%{}
|
||||
|
|
|
|||
|
|
@ -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
2
vendor/aprs
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 46ece8d819b6ceb67b55dfe689cab68c665c978b
|
||||
Subproject commit bbb397d6afb9c98933d096aae74e71181a02f62f
|
||||
Loading…
Add table
Reference in a new issue