Main APRS packet parsing library
@type packet() :: %{ id: String.t(), sender: String.t(), path: String.t(), destination: String.t(), information_field: String.t(), data_type: atom(), base_callsign: String.t(), ssid: String.t(), data_extended: map() | nil, received_at: DateTime.t() }
@type parse_result() :: {:ok, packet()} | {:error, atom() | String.t()}
@type position_ambiguity() :: 0..4
@spec convert_compressed_cs(binary()) :: map()
@spec convert_compressed_lat(binary()) :: float()
@spec convert_compressed_lon(binary()) :: float()
@spec convert_to_base91(binary()) :: integer()
@spec decode_compressed_position(binary()) :: map()
@spec parse(String.t()) :: parse_result()
@spec parse_callsign(String.t()) :: {:ok, [String.t()]} | {:error, String.t()}
@spec parse_data(atom(), String.t(), String.t()) :: map() | nil
@spec parse_datatype(String.t()) :: atom()
@spec parse_datatype_safe(String.t()) :: {:ok, atom()} | {:error, String.t()}
@spec parse_position_with_datetime_and_weather( boolean(), binary(), binary(), binary(), binary(), binary(), binary() ) :: map()
@spec parse_position_with_message_without_timestamp(String.t()) :: map()
@spec parse_position_with_timestamp(boolean(), binary(), atom()) :: map()
@spec parse_position_without_timestamp(String.t()) :: map()
@spec parse_query(String.t()) :: map()
@spec parse_station_capabilities(String.t()) :: map()
@spec parse_status(String.t()) :: map()
@spec parse_user_defined(String.t()) :: map()
@spec split_packet(String.t()) :: {:ok, [String.t()]} | {:error, String.t()}
@spec split_path(String.t()) :: {:ok, [String.t()]} | {:error, String.t()}