diff --git a/firmware/mix.lock b/firmware/mix.lock index 0c17b4b..6e5fd46 100644 --- a/firmware/mix.lock +++ b/firmware/mix.lock @@ -1,4 +1,5 @@ %{ + "circuits_gpio": {:hex, :circuits_gpio, "0.4.1", "344dd34f2517687fd28723e5552571babff5469db05b697181cab860fe7eff23", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, "cowboy": {:hex, :cowboy, "2.6.3", "99aa50e94e685557cad82e704457336a453d4abcb77839ad22dbe71f311fcc06", [:rebar3], [{:cowlib, "~> 2.7.3", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, "cowlib": {:hex, :cowlib, "2.7.3", "a7ffcd0917e6d50b4d5fb28e9e2085a0ceb3c97dea310505f7460ff5ed764ce9", [:rebar3], [], "hexpm"}, diff --git a/morse/lib/morse.ex b/morse/lib/morse.ex index 402a6c7..e921788 100644 --- a/morse/lib/morse.ex +++ b/morse/lib/morse.ex @@ -1,13 +1,67 @@ defmodule Morse do + alias Circuits.GPIO + @moduledoc """ Functions to control the signal lamp connected with GPIO. """ + @relay_pin 17 + @sleep_short 200 + @sleep_delay 400 + @sleep_long 700 + @sleep_pause 1000 + @sleep_start 3000 + + @on 0 + @off 1 + @doc """ - Takes a string composed of dots and dashes, and signals them with the - signal lamp. + Signal the provided symbols using GPIO. + Also setup the GPIO. """ - def signal(msg) do - IO.puts(msg) + + def signal do + case System.get_env("MORSE_MESSAGE") do + nil -> + # Signal for SOS if the env variable wasn't found :) + signal("...---...") + message -> signal(message) + end + end + + def signal(symbols) do + {:ok, gpio} = GPIO.open(@relay_pin, :output) + GPIO.write(gpio, @off) + Process.sleep(@sleep_start) + signal_sentence(gpio, String.graphemes(symbols)) + end + + # Signal a whole sentence of symbols with GPIO. + defp signal_sentence(gpio, []) do + GPIO.write(gpio, @off) + GPIO.close(gpio) + :ok + end + + defp signal_sentence(gpio, [symbol | rest]) when symbol in [".", "-"] do + GPIO.write(gpio, @on) + case symbol do + "." -> Process.sleep(@sleep_short) + "-" -> Process.sleep(@sleep_long) + end + GPIO.write(gpio, @off) + + Process.sleep(@sleep_delay) + signal_sentence(gpio, rest) + end + + defp signal_sentence(gpio, [" " | rest]) do + Process.sleep(@sleep_pause) + + signal_sentence(gpio, rest) + end + + defp signal_sentence(_gpio, [symbol | _rest]) do + {:error, "Undefined symbol: " <> symbol} end end diff --git a/morse/mix.exs b/morse/mix.exs index 05d2095..9232c4c 100644 --- a/morse/mix.exs +++ b/morse/mix.exs @@ -21,8 +21,7 @@ defmodule Morse.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - # {:dep_from_hexpm, "~> 0.3.0"}, - # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + {:circuits_gpio, "~> 0.4.1"} ] end end diff --git a/morse/mix.lock b/morse/mix.lock new file mode 100644 index 0000000..9d12430 --- /dev/null +++ b/morse/mix.lock @@ -0,0 +1,4 @@ +%{ + "circuits_gpio": {:hex, :circuits_gpio, "0.4.1", "344dd34f2517687fd28723e5552571babff5469db05b697181cab860fe7eff23", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, + "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, +} diff --git a/ui/lib/ui_web/controllers/page_controller.ex b/ui/lib/ui_web/controllers/page_controller.ex index 1e56767..c7be9ba 100644 --- a/ui/lib/ui_web/controllers/page_controller.ex +++ b/ui/lib/ui_web/controllers/page_controller.ex @@ -22,7 +22,7 @@ defmodule UiWeb.PageController do case get_start_time() do start_time when start_time + 35 <= now -> System.put_env("MORSE_START_TIME", Integer.to_string(now)) - Morse.signal("...---...") + Morse.signal() text(conn, "Done.") _ -> text(conn, "It is still in progress...") diff --git a/ui/mix.lock b/ui/mix.lock index 7244de7..6ff1088 100644 --- a/ui/mix.lock +++ b/ui/mix.lock @@ -1,6 +1,8 @@ %{ + "circuits_gpio": {:hex, :circuits_gpio, "0.4.1", "344dd34f2517687fd28723e5552571babff5469db05b697181cab860fe7eff23", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "cowboy": {:hex, :cowboy, "2.6.3", "99aa50e94e685557cad82e704457336a453d4abcb77839ad22dbe71f311fcc06", [:rebar3], [{:cowlib, "~> 2.7.3", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, "cowlib": {:hex, :cowlib, "2.7.3", "a7ffcd0917e6d50b4d5fb28e9e2085a0ceb3c97dea310505f7460ff5ed764ce9", [:rebar3], [], "hexpm"}, + "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "file_system": {:hex, :file_system, "0.2.7", "e6f7f155970975789f26e77b8b8d8ab084c59844d8ecfaf58cbda31c494d14aa", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.0", "abe21542c831887a2b16f4c94556db9c421ab301aee417b7c4fbde7fbdbe01ec", [:mix], [], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},