68 lines
1.5 KiB
Elixir
68 lines
1.5 KiB
Elixir
defmodule AugieWeb.GpsLive do
|
|
use Phoenix.LiveView
|
|
alias Augie.Sensor.GPS
|
|
alias Phoenix.PubSub
|
|
|
|
@moduledoc """
|
|
A LiveView with displaus the data from the GPS.
|
|
"""
|
|
|
|
@empty_sample %{
|
|
status: nil,
|
|
latitude: nil,
|
|
longitude: nil,
|
|
altitude: nil,
|
|
heading: nil,
|
|
speed: nil,
|
|
satellites: nil
|
|
}
|
|
@map_base_uri "https://maps.googleapis.com/maps/api/staticmap"
|
|
@map_opts [size: "640x320", key: "AIzaSyBibH_1Yibm3gshxsQDUKw7mjaH9SyMrgw", maptype: "hybrid"]
|
|
|
|
def mount(_params, _context, socket) do
|
|
if connected?(socket), do: PubSub.subscribe(Augie.PubSub, "GPS")
|
|
|
|
socket =
|
|
socket
|
|
|> assign(sample_to_assigns(@empty_sample))
|
|
|> assign(map_src: map_url(zoom: 1))
|
|
|
|
{:ok, socket}
|
|
end
|
|
|
|
def handle_info(%GPS{} = sample, socket) do
|
|
socket =
|
|
socket
|
|
|> assign(sample_to_assigns(Map.from_struct(sample)))
|
|
|> assign(map_src: map_url(sample_to_map_opts(sample)))
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
defp sample_to_assigns(sample) do
|
|
sample
|
|
|> Enum.map(fn
|
|
{key, value} when is_float(value) -> {key, Float.round(value, 2)}
|
|
{key, value} -> {key, value}
|
|
end)
|
|
end
|
|
|
|
defp sample_to_map_opts(sample) do
|
|
location = "#{sample.latitude},#{sample.longitude}"
|
|
|
|
[
|
|
center: location,
|
|
markers: "color:red|#{location}",
|
|
zoom: 19
|
|
]
|
|
end
|
|
|
|
defp map_url(opts) do
|
|
query =
|
|
@map_opts
|
|
|> Keyword.merge(opts)
|
|
|> URI.encode_query()
|
|
|
|
"#{@map_base_uri}?#{query}"
|
|
end
|
|
end
|