<% {symbol_table_id, symbol_code} = AprsmeWeb.MapLive.PacketUtils.get_symbol_info(@packet || %{}) %> <% symbol_table = if symbol_table_id in ["/", "\\", "]"], do: symbol_table_id, else: "/" %> <% symbol_code = symbol_code || ">" %> <% symbol_table_num = case symbol_table do "/" -> 0 "\\" -> 1 "]" -> 2 _ -> 0 end %> <% symbol_code_ord = symbol_code |> String.to_charlist() |> List.first() |> (fn c -> if is_integer(c), do: c, else: 63 end).() %> <% _symbol_img = "/aprs-symbols/aprs-symbols-24-#{symbol_table_num}@2x.png" %> <% _symbol_index = symbol_code_ord - 33 %>

{gettext("APRS Station")}

{@callsign} <%= if @packet do %> <% {symbol_table_id, symbol_code} = AprsmeWeb.MapLive.PacketUtils.get_symbol_info(@packet) %> <% symbol_table = if symbol_table_id in ["/", "\\", "]"], do: symbol_table_id, else: "/" %> <% symbol_code = symbol_code || ">" %> <% table_id = if symbol_table == "/", do: "0", else: if(symbol_table == "]", do: "2", else: "1") %> <% symbol_code_ord = symbol_code |> String.to_charlist() |> List.first() |> (fn c -> if is_integer(c), do: c, else: 63 end).() %> <% index = symbol_code_ord - 33 %> <% safe_index = max(0, min(index, 93)) %> <% column = rem(safe_index, 16) %> <% row = div(safe_index, 16) %> <% x = -column * 128 %> <% y = -row * 128 %> <% symbol_img = "/aprs-symbols/aprs-symbols-128-#{table_id}@2x.png" %>
<% end %>
<.link navigate={~p"/packets/#{@callsign}"} class="btn btn-outline btn-sm"> {gettext("View packets")} <%= if @has_weather_packets do %> <.link navigate={~p"/weather/#{@callsign}"} class="btn btn-primary btn-sm"> {gettext("Weather charts")} <% end %>
<%= if @packet do %>

{gettext("Position Information")}

{gettext("Location")}
{@packet.lat || ""}, {@packet.lon || ""}
<%= if @packet.lat && @packet.lon do %>
{gettext("Grid Square")}
<%= case Gridsquare.encode(@packet.lon, @packet.lat) do %> <% %Gridsquare.EncodeResult{grid_reference: grid_ref} -> %> {grid_ref} <% _ -> %> - <% end %>
<% end %>
{gettext("Last Position")}
<%= if @packet.received_at do %>
{AprsmeWeb.TimeHelpers.time_ago_in_words(@packet.received_at)}
{Calendar.strftime(@packet.received_at, "%Y-%m-%d %H:%M:%S UTC")}
<% else %> {gettext("Unknown")} <% end %>
<%= if @packet.altitude do %>
{gettext("Altitude")}
{@packet.altitude} ft
<% end %> <%= if @packet.course do %>
{gettext("Course")}
{@packet.course}°
<% end %> <%= if @packet.speed do %>
{gettext("Speed")}
{@packet.speed} MPH
<% end %>

{gettext("Device Information")}

{gettext("Device")}
<%= if @packet.device_model || @packet.device_vendor do %> {[ @packet.device_model, @packet.device_vendor, @packet.device_contact ] |> Enum.reject(&is_nil/1) |> Enum.join(" ")} <%= if @packet.device_class do %> ({@packet.device_class}) <% end %> <% else %> {@packet.device_identifier || gettext("Unknown")} <% end %>
{gettext("Path")}
{@packet.path || ""}
<%= if @packet.path && @packet.path != "" do %>
{gettext("Decoded Path")}
{decode_aprs_path(@packet.path)}
<% end %>
{gettext("Raw Packet")}
<%= if is_binary(@packet.raw_packet) do %> {Aprsme.EncodingUtils.sanitize_string(@packet.raw_packet)} <% else %> {@packet.raw_packet || ""} <% end %>
<%= if length(@other_ssids) > 0 do %>

{gettext("Other SSIDs")}

<%= for ssid_info <- @other_ssids do %> <% end %>
{gettext("Callsign")} {gettext("Distance & Direction")} {gettext("Last Heard")}
<.link navigate={~p"/info/#{ssid_info.callsign}"} class="link link-primary" > {ssid_info.callsign} <%= if ssid_info.packet do %> <% {symbol_table_id, symbol_code} = AprsmeWeb.MapLive.PacketUtils.get_symbol_info(ssid_info.packet) %> <% symbol_table = if symbol_table_id in ["/", "\\", "]"], do: symbol_table_id, else: "/" %> <% symbol_code = symbol_code || ">" %> <% table_id = if symbol_table == "/", do: "0", else: if(symbol_table == "]", do: "2", else: "1") %> <% symbol_code_ord = symbol_code |> String.to_charlist() |> List.first() |> (fn c -> if is_integer(c), do: c, else: 63 end).() %> <% index = symbol_code_ord - 33 %> <% safe_index = max(0, min(index, 93)) %> <% column = rem(safe_index, 16) %> <% row = div(safe_index, 16) %> <% x = -column * 128 %> <% y = -row * 128 %> <% symbol_img = "/aprs-symbols/aprs-symbols-128-#{table_id}@2x.png" %>
<% end %>
<%= if ssid_info.packet && ssid_info.packet.lat && ssid_info.packet.lon && @packet && @packet.lat && @packet.lon do %> <% dist = haversine( @packet.lat, @packet.lon, ssid_info.packet.lat, ssid_info.packet.lon ) %> <% course = calculate_course( @packet.lat, @packet.lon, ssid_info.packet.lat, ssid_info.packet.lon ) %> <% locale = Map.get(assigns, :locale, "en") %> <%= if course do %> {format_distance(dist, locale)} @ {Float.round(course, 0)}° <% else %> {format_distance(dist, locale)} <% end %> <% else %> - <% end %> <%= if ssid_info.last_heard do %>
{ssid_info.last_heard.time_ago}
{ssid_info.last_heard.formatted}
<% else %> {gettext("Unknown")} <% end %>
<% end %>

{gettext("Stations Near Current Position")}

<%= for neighbor <- @neighbors do %> <% end %>
{gettext("Callsign")} {gettext("Distance & Course")} {gettext("Last Heard")}
<.link navigate={~p"/info/#{neighbor.callsign}"} class="link link-primary"> {neighbor.callsign} <%= if neighbor.packet do %> <% {symbol_table_id, symbol_code} = AprsmeWeb.MapLive.PacketUtils.get_symbol_info(neighbor.packet) %> <% symbol_table = if symbol_table_id in ["/", "\\", "]"], do: symbol_table_id, else: "/" %> <% symbol_code = symbol_code || ">" %> <% table_id = if symbol_table == "/", do: "0", else: if(symbol_table == "]", do: "2", else: "1") %> <% symbol_code_ord = symbol_code |> String.to_charlist() |> List.first() |> (fn c -> if is_integer(c), do: c, else: 63 end).() %> <% index = symbol_code_ord - 33 %> <% safe_index = max(0, min(index, 93)) %> <% column = rem(safe_index, 16) %> <% row = div(safe_index, 16) %> <% x = -column * 128 %> <% y = -row * 128 %> <% symbol_img = "/aprs-symbols/aprs-symbols-128-#{table_id}@2x.png" %>
<% end %>
<%= if neighbor.course do %> {neighbor.distance || ""} @ {Float.round(neighbor.course, 0)}° <% else %> {neighbor.distance || ""} <% end %> <%= if neighbor.last_heard do %>
{neighbor.last_heard.time_ago}
{neighbor.last_heard.formatted}
<% else %> {gettext("Unknown")} <% end %>
<% else %>

{gettext("No data available")}

{gettext("No recent packet data available for this callsign.")}

<% end %>