2020-05-18 22:22:14 +12:00
|
|
|
defmodule AugieWeb.ServoLive do
|
|
|
|
use Phoenix.LiveView
|
2020-05-20 22:06:27 +12:00
|
|
|
alias Augie.Firmata
|
2020-05-18 22:22:14 +12:00
|
|
|
alias Augie.Firmata.Commands
|
|
|
|
alias Phoenix.PubSub
|
|
|
|
|
|
|
|
@moduledoc false
|
|
|
|
|
|
|
|
def mount(_params, %{"driver" => driver}, socket) do
|
|
|
|
driver_name = String.capitalize(driver)
|
2020-05-20 22:06:27 +12:00
|
|
|
driver = String.to_atom(driver)
|
|
|
|
firmata_connected = Firmata.connected?()
|
2020-05-18 22:22:14 +12:00
|
|
|
|
|
|
|
if connected?(socket) do
|
2020-05-20 22:06:27 +12:00
|
|
|
PubSub.subscribe(Augie.PubSub, "command.servo_driver_enabled")
|
|
|
|
PubSub.subscribe(Augie.PubSub, "command.servo_channel_enabled")
|
|
|
|
PubSub.subscribe(Augie.PubSub, "command.servo_channel_position")
|
|
|
|
PubSub.subscribe(Augie.PubSub, "serial_telemetry")
|
|
|
|
|
|
|
|
if firmata_connected do
|
|
|
|
Commands.servo_driver_enabled?(driver)
|
|
|
|
|
|
|
|
for i <- 0..15 do
|
|
|
|
Commands.servo_channel_enabled?(driver, i)
|
|
|
|
Commands.servo_channel_position?(driver, i)
|
|
|
|
end
|
|
|
|
end
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
servos =
|
|
|
|
0..15
|
|
|
|
|> Enum.map(fn i ->
|
|
|
|
{i,
|
|
|
|
%{
|
|
|
|
id: i,
|
|
|
|
name: "Servo #{i + 1}",
|
|
|
|
enabled: false,
|
|
|
|
value: 0
|
|
|
|
}}
|
|
|
|
end)
|
|
|
|
|> Enum.into(%{})
|
|
|
|
|
2020-05-18 22:22:14 +12:00
|
|
|
{:ok,
|
|
|
|
assign(socket,
|
2020-05-20 22:06:27 +12:00
|
|
|
driver: driver,
|
2020-05-18 22:22:14 +12:00
|
|
|
driver_name: driver_name,
|
|
|
|
switch_id: "#{driver}",
|
|
|
|
state_known: false,
|
2020-05-20 22:06:27 +12:00
|
|
|
enabled: false,
|
|
|
|
servos: servos,
|
|
|
|
connected: firmata_connected
|
2020-05-18 22:22:14 +12:00
|
|
|
)}
|
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
def handle_info({:connected, false}, socket), do: {:noreply, assign(socket, connected: false)}
|
|
|
|
|
|
|
|
def handle_info({:connected, _}, %{assigns: %{driver: driver}} = socket) do
|
|
|
|
Commands.servo_driver_enabled?(driver)
|
|
|
|
|
|
|
|
for i <- 0..15 do
|
|
|
|
Commands.servo_channel_enabled?(driver, i)
|
|
|
|
Commands.servo_channel_position?(driver, i)
|
|
|
|
end
|
|
|
|
|
|
|
|
{:noreply, assign(socket, connected: true)}
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
def handle_info(
|
|
|
|
{:servo_driver_enabled, {driver, value}},
|
|
|
|
%{assigns: %{driver: driver}} = socket
|
|
|
|
) do
|
|
|
|
{:noreply, assign(socket, state_known: true, enabled: value)}
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
def handle_info({:servo_driver_enabled, _}, socket), do: {:noreply, socket}
|
|
|
|
|
|
|
|
def handle_info(
|
|
|
|
{:servo_channel_enabled, {driver, channel, value}},
|
|
|
|
%{assigns: %{servos: servos, driver: driver}} = socket
|
|
|
|
) do
|
|
|
|
servo =
|
|
|
|
servos
|
|
|
|
|> Map.get(channel)
|
|
|
|
|> Map.put(:enabled, value)
|
|
|
|
|
|
|
|
servos =
|
|
|
|
servos
|
|
|
|
|> Map.put(channel, servo)
|
|
|
|
|
|
|
|
{:noreply, assign(socket, servos: servos)}
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
def handle_info({:servo_channel_enabled, _}, socket), do: {:noreply, socket}
|
|
|
|
|
|
|
|
def handle_info(
|
|
|
|
{:servo_channel_position, {driver, channel, value}},
|
|
|
|
%{assigns: %{servos: servos, driver: driver}} = socket
|
|
|
|
) do
|
|
|
|
servo =
|
|
|
|
servos
|
|
|
|
|> Map.get(channel)
|
|
|
|
|> Map.put(:value, value)
|
|
|
|
|
|
|
|
servos =
|
|
|
|
servos
|
|
|
|
|> Map.put(channel, servo)
|
|
|
|
|
|
|
|
{:noreply, assign(socket, servos: servos)}
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|
|
|
|
|
2020-05-20 22:06:27 +12:00
|
|
|
def handle_info({:servo_channel_position, _}, socket), do: {:noreply, socket}
|
|
|
|
|
2020-05-18 22:22:14 +12:00
|
|
|
def handle_event("enable-servos", _, %{assigns: %{driver: driver}} = socket) do
|
2020-05-20 22:06:27 +12:00
|
|
|
Commands.servo_driver_enabled(driver, true)
|
2020-05-18 22:22:14 +12:00
|
|
|
{:noreply, socket}
|
|
|
|
end
|
|
|
|
|
|
|
|
def handle_event("disable-servos", _, %{assigns: %{driver: driver}} = socket) do
|
2020-05-20 22:06:27 +12:00
|
|
|
Commands.servo_driver_enabled(driver, false)
|
2020-05-18 22:22:14 +12:00
|
|
|
{:noreply, socket}
|
|
|
|
end
|
2020-05-20 22:06:27 +12:00
|
|
|
|
|
|
|
def handle_event(
|
|
|
|
"toggle-servo",
|
|
|
|
%{"servo-id" => servo_no},
|
|
|
|
%{assigns: %{servos: servos, driver: driver}} = socket
|
|
|
|
) do
|
|
|
|
servo_no =
|
|
|
|
servo_no
|
|
|
|
|> String.to_integer()
|
|
|
|
|
|
|
|
servo =
|
|
|
|
servos
|
|
|
|
|> Map.get(servo_no)
|
|
|
|
|
|
|
|
Commands.servo_channel_enabled(driver, servo_no, !servo.enabled)
|
|
|
|
|
|
|
|
{:noreply, assign(socket, servos: servos)}
|
|
|
|
end
|
|
|
|
|
|
|
|
def handle_event(
|
|
|
|
"set-servo",
|
|
|
|
%{"servo-value" => degrees, "servo-id" => servo_no},
|
2020-07-05 12:56:32 +12:00
|
|
|
%{assigns: %{driver: driver}} = socket
|
2020-05-20 22:06:27 +12:00
|
|
|
) do
|
|
|
|
degrees =
|
|
|
|
degrees
|
|
|
|
|> String.to_integer()
|
|
|
|
|
|
|
|
servo_no =
|
|
|
|
servo_no
|
|
|
|
|> String.to_integer()
|
|
|
|
|
|
|
|
Commands.servo_channel_position(driver, servo_no, degrees)
|
|
|
|
|
|
|
|
{:noreply, socket}
|
|
|
|
end
|
|
|
|
|
|
|
|
def handle_event("set-servo", _, socket), do: {:noreply, socket}
|
2020-05-18 22:22:14 +12:00
|
|
|
end
|