Use sockets to broadcast morse progress.

This commit is contained in:
Pim Kunis 2019-07-31 00:20:09 +02:00
parent 78af9da586
commit 5bb6584286
7 changed files with 54 additions and 62 deletions

View file

@ -8,27 +8,41 @@ defmodule MorseServer do
end
def start_link do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
GenServer.start_link(__MODULE__, {nil, 0}, name: __MODULE__)
end
def start_morse do
GenServer.call(__MODULE__, :start)
end
def update_progress(progress) do
GenServer.cast(__MODULE__, {:progress, progress})
end
@impl true
def init(state) do
{:ok, state}
end
@impl true
def handle_call(:start, _from, pid) do
def handle_call(:start, _from, {pid, _progress} = state) do
cond do
pid == nil or not Process.alive?(pid) ->
pid = spawn(&MorseSignaler.signal/0)
{:reply, :ok, pid}
{:reply, :ok, {pid, 0}}
true ->
{:reply, {:error, :already_started}, pid}
{:reply, {:error, :already_started}, state}
end
end
@impl true
def handle_cast({:progress, new_progress}, {pid, progress}) do
broadcast_progress(new_progress)
{:noreply, {pid, new_progress}}
end
defp broadcast_progress(progress) do
UiWeb.Endpoint.broadcast("morse:progress", "update", %{value: progress})
end
end

View file

@ -23,13 +23,23 @@ defmodule MorseSignaler do
{:ok, gpio} = GPIO.open(relay_pin(), :output)
GPIO.write(gpio, @off)
Process.sleep(@sleep_start)
signal_sentence(gpio, String.graphemes(secret_code()))
update_progress(gpio, String.graphemes(secret_code()))
end
# Update progress for clients, and signals the rest of the sentence.
defp update_progress(gpio, symbols) do
100 - length(symbols) / String.length(secret_code()) * 100
|> MorseServer.update_progress()
if symbols != [] do
signal_sentence(gpio, symbols)
end
end
# Signal a whole sentence of symbols with GPIO.
defp signal_sentence(gpio, []) do
GPIO.write(gpio, @off)
GPIO.close(gpio)
update_progress(gpio, [])
:ok
end
@ -50,7 +60,7 @@ defmodule MorseSignaler do
defp signal_sentence(gpio, [" " | rest]) do
Process.sleep(@sleep_pause)
signal_sentence(gpio, rest)
update_progress(gpio, rest)
end
defp signal_sentence(_gpio, [symbol | _rest]) do