dont parse images for titles

This commit is contained in:
Graham McIntire 2025-06-19 12:08:52 -05:00
parent c151c34857
commit 3fb11706d2
No known key found for this signature in database
6 changed files with 48 additions and 95 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8,12 +8,17 @@
{assigns[:page_title] || "Aprs"}
</.live_title>
<link phx-track-static rel="stylesheet" href={~p"/assets/app.css"} />
<link phx-track-static rel="stylesheet" href={~p"/assets/vendor/leaflet/leaflet.css"} />
<link
rel="stylesheet"
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""
/>
<script
defer
phx-track-static
type="text/javascript"
src={~p"/assets/vendor/leaflet/leaflet.js"}
src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
data-source-map="false"
>
</script>

View file

@ -12,8 +12,8 @@
<link
rel="stylesheet"
href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css"
integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI="
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""
/>
<link
@ -26,8 +26,8 @@
/>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script
src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"
integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM="
src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""
>
</script>

View file

@ -6,7 +6,6 @@ defmodule AprsWeb.MapLive.Index do
alias AprsWeb.Endpoint
alias AprsWeb.Helpers.AprsSymbols
alias Parser.Types.MicE
alias Phoenix.LiveView.Socket
@default_center %{lat: 39.8283, lng: -98.5795}
@ -357,23 +356,28 @@ defmodule AprsWeb.MapLive.Index do
handle_cleanup_old_packets(socket)
{:postgres_packet, packet} ->
# Only process packets with position data that are within current map bounds
if within_bounds?(packet, socket.assigns.map_bounds) do
# Add to buffer for debounced batch update
buffer = [packet | socket.assigns.packet_buffer]
socket = assign(socket, packet_buffer: buffer)
# If no timer, start one
socket =
if socket.assigns.buffer_timer == nil do
timer = Process.send_after(self(), :flush_packet_buffer, @debounce_interval)
assign(socket, buffer_timer: timer)
else
socket
end
{lat, lon, _data_extended} = get_coordinates(packet)
if is_nil(lat) or is_nil(lon) do
{:noreply, socket}
else
{:noreply, socket}
if within_bounds?(%{lat: lat, lon: lon}, socket.assigns.map_bounds) do
# Add to buffer for debounced batch update
buffer = [packet | socket.assigns.packet_buffer]
socket = assign(socket, packet_buffer: buffer)
# If no timer, start one
socket =
if socket.assigns.buffer_timer == nil do
timer = Process.send_after(self(), :flush_packet_buffer, @debounce_interval)
assign(socket, buffer_timer: timer)
else
socket
end
{:noreply, socket}
else
{:noreply, socket}
end
end
:flush_packet_buffer ->
@ -410,6 +414,9 @@ defmodule AprsWeb.MapLive.Index do
)
{:noreply, socket}
%Phoenix.Socket.Broadcast{topic: "aprs_messages", event: "packet", payload: packet} ->
handle_info({:postgres_packet, packet}, socket)
end
end
@ -780,10 +787,10 @@ defmodule AprsWeb.MapLive.Index do
@spec within_bounds?(map() | struct(), map()) :: boolean()
defp within_bounds?(packet, bounds) do
{lat, lng} = get_coordinates(packet)
{lat, lon, _data_extended} = get_coordinates(packet)
# Basic validation
if is_nil(lat) or is_nil(lng) do
if is_nil(lat) or is_nil(lon) do
false
else
# Check latitude bounds (straightforward)
@ -793,10 +800,10 @@ defmodule AprsWeb.MapLive.Index do
lng_in_bounds =
if bounds.west <= bounds.east do
# Normal case: bounds don't cross antimeridian
lng >= bounds.west && lng <= bounds.east
lon >= bounds.west && lon <= bounds.east
else
# Bounds cross antimeridian (e.g., west=170, east=-170)
lng >= bounds.west || lng <= bounds.east
lon >= bounds.west || lon <= bounds.east
end
lat_in_bounds && lng_in_bounds
@ -805,43 +812,24 @@ defmodule AprsWeb.MapLive.Index do
@spec get_coordinates(map() | struct()) :: {number() | nil, number() | nil}
defp get_coordinates(packet) do
case packet.data_extended do
%MicE{} = mic_e ->
# Convert MicE components to decimal degrees
lat = mic_e.lat_degrees + mic_e.lat_minutes / 60.0 + mic_e.lat_fractional / 6000.0
lat = if mic_e.lat_direction == :south, do: -lat, else: lat
lng = mic_e.lon_degrees + mic_e.lon_minutes / 60.0 + mic_e.lon_fractional / 6000.0
lng = if mic_e.lon_direction == :west, do: -lng, else: lng
# Validate coordinates are within valid ranges
if lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180 do
{lat, lng}
else
{nil, nil}
end
%{latitude: lat, longitude: lon} ->
{lat, lon}
_ ->
{nil, nil}
end
# Safely get data_extended for both atom and string keys
data_extended = Map.get(packet, :data_extended) || Map.get(packet, "data_extended")
lat = Map.get(packet, :lat) || Map.get(packet, "lat")
lon = Map.get(packet, :lon) || Map.get(packet, "lon")
{lat, lon, data_extended}
end
@spec build_packet_data(map() | struct()) :: map() | nil
defp build_packet_data(packet) do
data_extended = build_data_extended(packet.data_extended)
{lat, lng} = get_coordinates(packet)
{lat, lon, data_extended} = get_coordinates(packet)
# Only include packets with valid position data
if lat && lng do
build_packet_map(packet, lat, lng, data_extended)
if lat && lon do
build_packet_map(packet, lat, lon, data_extended)
end
end
@spec build_packet_map(map() | struct(), number(), number(), map() | nil) :: map()
defp build_packet_map(packet, lat, lng, data_extended) do
defp build_packet_map(packet, lat, lon, data_extended) do
{final_table_id, final_symbol_code} = get_validated_symbol(packet, data_extended)
callsign = generate_callsign(packet)
@ -851,7 +839,7 @@ defmodule AprsWeb.MapLive.Index do
"base_callsign" => packet.base_callsign || "",
"ssid" => packet.ssid || "",
"lat" => lat,
"lng" => lng,
"lng" => lon,
"symbol_table_id" => final_table_id,
"symbol_code" => final_symbol_code,
"symbol_description" => AprsSymbols.symbol_description(final_table_id, final_symbol_code),
@ -948,44 +936,6 @@ defmodule AprsWeb.MapLive.Index do
end
end
@spec build_data_extended(nil | MicE.t() | map()) :: nil | map()
defp build_data_extended(nil), do: nil
defp build_data_extended(%MicE{} = mic_e), do: build_mice_data_extended(mic_e)
defp build_data_extended(data_extended), do: build_map_data_extended(data_extended)
@spec build_mice_data_extended(MicE.t()) :: map()
defp build_mice_data_extended(mic_e) do
lat = mic_e.lat_degrees + mic_e.lat_minutes / 60.0 + mic_e.lat_fractional / 6000.0
lat = if mic_e.lat_direction == :south, do: -lat, else: lat
lng = mic_e.lon_degrees + mic_e.lon_minutes / 60.0 + mic_e.lon_fractional / 6000.0
lng = if mic_e.lon_direction == :west, do: -lng, else: lng
if lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180 do
%{
"latitude" => lat,
"longitude" => lng,
"comment" => mic_e.message || "",
"symbol_table_id" => "/",
"symbol_code" => ">",
"aprs_messaging" => false
}
end
end
@spec build_map_data_extended(map()) :: map()
defp build_map_data_extended(data_extended) do
%{
"latitude" => data_extended[:latitude],
"longitude" => data_extended[:longitude],
"comment" => data_extended[:comment] || "",
"symbol_table_id" => data_extended[:symbol_table_id] || "/",
"symbol_code" => data_extended[:symbol_code] || ">",
"aprs_messaging" => data_extended[:aprs_messaging] || false
}
end
# Helper function to convert string or float to float
@spec to_float(number() | String.t()) :: float()
defp to_float(value) when is_float(value), do: value

View file

@ -8,7 +8,7 @@ defmodule Parser.Position do
@doc """
Parse an uncompressed APRS position string. Returns a Position struct or nil.
"""
@spec parse(String.t()) :: Position.t() | nil
@spec parse(String.t()) :: Position | nil
def parse(position_str) do
# Example: "4903.50N/07201.75W>comment"
case position_str do