defmodule AugieWeb.GPSSensorLive do use Phoenix.LiveView alias Augie.Sensor.GPS @moduledoc """ A LiveView with displaus the data from the GPS. """ @sample_count 60 def render(assigns) do ~L"""

GPS

<%= if @data_ready do %>
Status
<%= @status %>
Latitude
<%= Float.round(CircularBuffer.newest(@latitude), 4) %>º
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @latitude, sample_count: 60, fill: false, min: -90, max: 90) %>
Longitude
<%= Float.round(CircularBuffer.newest(@longitude), 4) %>º
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @longitude, sample_count: 60, fill: false, min: 0, max: 180) %>
Altitude
<%= Float.round(CircularBuffer.newest(@altitude), 4) %>m
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @altitude, sample_count: 60, fill: false, min: 0) %>
Heading
<%= Float.round(CircularBuffer.newest(@heading), 4) %>º
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @heading, sample_count: 60, fill: false, min: 0, max: 360) %>
Speed
<%= Float.round(CircularBuffer.newest(@speed), 4) %>m/s
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @speed, sample_count: 60, fill: false, min: 0) %>
Satellites
<%= CircularBuffer.newest(@satellites) %>
<%= live_component(@socket, AugieWeb.SparklineComponent, data: @satellites, sample_count: 60, fill: false, min: 0) %>
<% else %>
No data available.
<% end %>
""" end def mount(_params, _context, socket) do if connected?(socket), do: CommunityTheatre.subscribe(GPS, 1) socket = socket |> assign( data_ready: false, latitude: CircularBuffer.new(@sample_count), longitude: CircularBuffer.new(@sample_count), altitude: CircularBuffer.new(@sample_count), heading: CircularBuffer.new(@sample_count), speed: CircularBuffer.new(@sample_count), satellites: CircularBuffer.new(@sample_count), status: :none ) {:ok, socket} end def handle_info( {CommunityTheatre, %{topic: GPS, payload: sample}}, %{ assigns: %{ latitude: latitude, longitude: longitude, altitude: altitude, heading: heading, speed: speed, satellites: satellites } } = socket ) do socket = socket |> assign( data_ready: true, latitude: CircularBuffer.insert(latitude, sample.latitude), longitude: CircularBuffer.insert(longitude, sample.longitude), altitude: CircularBuffer.insert(altitude, sample.altitude), heading: CircularBuffer.insert(heading, sample.heading), speed: CircularBuffer.insert(speed, sample.speed), satellites: CircularBuffer.insert(satellites, sample.satellites), status: sample.status ) {:noreply, socket} end end