- Add tests for store_packet/1 functionality including validation, MicE data, and error handling
- Add tests for store_bad_packet/2 with proper error type conversion
- Add tests for get_recent_packets/1 with time, bounds, and callsign filtering
- Add tests for get_nearby_stations/4 with distance ordering and exclusions
- Add tests for weather packet queries and cleanup functions
- Add tests for packet replay, streaming, and counting operations
- Fix MicE struct access to use Access behavior instead of dot notation
- Fix error_type conversion to string for BadPacket storage
- Ensure all tests are passing (437 tests, 0 failures)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The APRS parser returns telemetry sequence numbers as strings (e.g., "094"),
but the database schema expects integers. This was causing Ecto.ChangeError
in production when processing telemetry packets.
Changes:
- Updated put_telemetry_fields/2 to convert string seq values to integers
- Added comprehensive tests for telemetry_seq type conversion
- Handles nil, string, integer, and invalid seq values gracefully
Production deployment notes:
1. Check if migration 20250801215236 has run in production
2. If not, run pending migrations before deploying this fix
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The APRS parser sometimes returns :unknown as an atom for the format field,
but the database expects a string. This was causing Ecto.ChangeError when
inserting packets.
Added normalize_format_field/1 function to convert atom values to strings
before database insertion. This ensures compatibility between the parser
output and database schema requirements.
Fixes error: value `:unknown` for `Aprsme.Packet.format` in `insert_all`
does not match type :string
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 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>
- Added position_ambiguity field (integer, 0-4) to packets table
- Created migration to add the new database column
- Updated packet schema and processing to extract position ambiguity
- Position ambiguity levels indicate precision of reported coordinates:
- 0: No ambiguity (exact position)
- 1: ~0.1 mile ambiguity
- 2: ~1 mile ambiguity
- 3: ~10 mile ambiguity
- 4: ~60 mile ambiguity
- Automatically captures ambiguity level when parsing APRS packets
- All tests pass with no failures
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The :phg field was being added as a map to packet attributes, but it's
not a database field. PHG data should be split into individual fields
(phg_power, phg_height, phg_gain, phg_directivity) which are actual
database columns.
Removed the :phg map from being added to attributes. The put_phg_fields
function already handles extracting individual PHG components.
Updated tests to check for individual PHG fields instead of the map.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The APRS parser wasn't extracting altitude and PHG data from the comment
field. Added extraction functions to parse:
- Altitude from /A=XXXXXX format (converts to feet)
- PHG (Power-Height-Gain-Directivity) from PHGXXXX format
Also updated the comment cleaning to remove these technical details,
leaving only the human-readable station description.
Updated tests to properly use Packet.extract_additional_data() which
is where the parsing happens during packet processing.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>