Skip to content

Commit 4a74551

Browse files
author
Elias Karakoulakis
committed
add genserver to handle wifi reset GPIO
update LV
1 parent 0d54c81 commit 4a74551

6 files changed

Lines changed: 129 additions & 4 deletions

File tree

drizzle_ui/config/config.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# This file is responsible for configuring your application
2+
# and its dependencies with the aid of the Mix.Config module.
3+
#
4+
# This configuration file is loaded before any dependency and
5+
# is restricted to this project.
6+
7+
# General application configuration
8+
use Mix.Config
9+
10+
config :phoenix, :json_library, Jason
11+
12+
# Import environment specific config. This must remain at the bottom
13+
# of this file so it overrides the configuration defined above.
14+
#import_config "#{Mix.Project.config()[:target]}.exs"

drizzle_ui/mix.exs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
defmodule DrizzleUi.MixProject do
2+
use Mix.Project
3+
4+
def project do
5+
[
6+
app: :drizzle_ui,
7+
version: "0.1.0",
8+
elixir: "~> 1.9",
9+
elixirc_paths: elixirc_paths(Mix.env()),
10+
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
11+
start_permanent: Mix.env() == :prod,
12+
aliases: aliases(),
13+
deps: deps()
14+
]
15+
end
16+
17+
# Configuration for the OTP application.
18+
#
19+
# Type `mix help compile.app` for more information.
20+
def application do
21+
[
22+
mod: {DrizzleUi.Application, []},
23+
extra_applications: [:logger, :runtime_tools]
24+
]
25+
end
26+
27+
# Specifies which paths to compile per environment.
28+
defp elixirc_paths(:test), do: ["lib", "test/support"]
29+
defp elixirc_paths(_), do: ["lib"]
30+
31+
# Specifies your project dependencies.
32+
#
33+
# Type `mix help deps` for examples and options.
34+
defp deps do
35+
[
36+
{:phoenix, "~> 1.5.3"},
37+
{:phoenix_live_view, "~> 0.13.3"},
38+
{:phoenix_pubsub, "~> 2.0.0"},
39+
{:floki, ">= 0.0.0", only: :test},
40+
{:phoenix_html, "~> 2.11"},
41+
{:phoenix_live_reload, "~> 1.2", only: :dev},
42+
{:phoenix_live_dashboard, "~> 0.2.0"},
43+
{:telemetry_metrics, "~> 0.4"},
44+
{:telemetry_poller, "~> 0.4"},
45+
{:gettext, "~> 0.11"},
46+
{:jason, "~> 1.0"},
47+
{:plug_cowboy, "~> 2.0"}
48+
]
49+
end
50+
51+
# Aliases are shortcuts or tasks specific to the current project.
52+
# For example, to install project dependencies and perform other setup tasks, run:
53+
#
54+
# $ mix setup
55+
#
56+
# See the documentation for `Mix` for more info on aliases.
57+
defp aliases do
58+
[
59+
setup: ["deps.get", "cmd npm install --prefix assets"]
60+
]
61+
end
62+
end

lib/drizzle/application.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ defmodule Drizzle.Application do
99

1010
def start(_type, _args) do
1111
prepare_network()
12+
13+
wifi_gpio_pin = Application.get_env(:vintage_net_wizard, :gpio_pin, 2)
14+
1215
# See https://hexdocs.pm/elixir/Supervisor.html
1316
# for other strategies and supported options
1417
opts = [strategy: :one_for_one, name: Drizzle.Supervisor]
@@ -24,6 +27,7 @@ defmodule Drizzle.Application do
2427
{Drizzle.Scheduler, %{}},
2528
{Drizzle.Forecaster, %{}},
2629
{Drizzle.TodaysEvents, []},
30+
{Drizzle.WifiWizardButton, wifi_gpio_pin}
2731
DrizzleWeb.Telemetry,
2832
{Phoenix.PubSub, [name: :drizzle_pubsub, adapter: Phoenix.PubSub.PG2]},
2933
DrizzleWeb.Endpoint

lib/drizzle/wifi_wizard_button.ex

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule Drizzle.WifiWizardButton do
2+
use GenServer
3+
4+
@moduledoc """
5+
This GenServer starts the wifi wizard if a button is depressed for long enough.
6+
"""
7+
8+
alias Circuits.GPIO
9+
10+
@doc """
11+
Start the button monitor
12+
13+
Pass an index to the GPIO that's connected to the button.
14+
"""
15+
@spec start_link(non_neg_integer()) :: GenServer.on_start()
16+
def start_link(gpio_pin) do
17+
GenServer.start_link(__MODULE__, gpio_pin)
18+
end
19+
20+
@impl true
21+
def init(gpio_pin) do
22+
{:ok, gpio} = GPIO.open(gpio_pin, :input)
23+
:ok = GPIO.set_interrupts(gpio, :both)
24+
{:ok, %{pin: gpio_pin, gpio: gpio}}
25+
end
26+
27+
@impl true
28+
def handle_info({:circuits_gpio, gpio_pin, _timestamp, 1}, %{pin: gpio_pin} = state) do
29+
# Button pressed. Start a timer to launch the wizard when it's long enough
30+
{:noreply, state, 5_000}
31+
end
32+
33+
@impl true
34+
def handle_info({:circuits_gpio, gpio_pin, _timestamp, 0}, %{pin: gpio_pin} = state) do
35+
# Button released. The GenServer timer is implicitly cancelled by receiving this message.
36+
{:noreply, state}
37+
end
38+
39+
@impl true
40+
def handle_info(:timeout, state) do
41+
IO.puts "VintageNetWizard triggered from pin #{state.pin}"
42+
:ok = VintageNetWizard.run_wizard()
43+
{:noreply, state}
44+
end
45+
end

mix.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ defmodule Drizzle.MixProject do
6666
{:ecto, "~> 3.0"},
6767
{:finch, "~> 0.2.0"},
6868
{:jason, "~> 1.2.1"},
69-
#{:drizzle_ui, path: "drizzle_ui", runtime: false},
70-
# {:drizzle_ui, path: "drizzle_ui"},
69+
{:drizzle_ui, path: "drizzle_ui"},
70+
7171
{:nerves, "~> 1.6", runtime: false},
7272
{:shoehorn, "~> 0.6"},
7373
{:toolshed, "~> 0.2"},

mix.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
"phoenix": {:hex, :phoenix, "1.5.3", "bfe0404e48ea03dfe17f141eff34e1e058a23f15f109885bbdcf62be303b49ff", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8e16febeb9640d8b33895a691a56481464b82836d338bb3a23125cd7b6157c25"},
4646
"phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "c5e666a341ff104d0399d8f0e4ff094559b2fde13a5985d4cb5023b2c2ac558b"},
4747
"phoenix_html": {:hex, :phoenix_html, "2.14.2", "b8a3899a72050f3f48a36430da507dd99caf0ac2d06c77529b1646964f3d563e", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "58061c8dfd25da5df1ea0ca47c972f161beb6c875cd293917045b92ffe1bf617"},
48-
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.2.4", "3080e8a89bab3ec08d4dd9a6858dfa24af9334464aae78c83e58a2db37c6f983", [:mix], [{:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.12.0 or ~> 0.13.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "1c89595ef60f1b76ac07705e73f001823af451491792a4b0d5b2b2a3789b0a00"},
4948
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.2", "38d94c30df5e2ef11000697a4fbe2b38d0fbf79239d492ff1be87bbc33bc3a84", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "a3dec3d28ddb5476c96a7c8a38ea8437923408bc88da43e5c45d97037b396280"},
49+
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.2.6", "1b4e1b7d797386b7f9d70d2af931dc9843a5f2f2423609d22cef1eec4e4dba7d", [:mix], [{:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.13.1", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "b20dcad98c4ca63d38a7f5e7a40936e1e8e9da983d3d722b88ae33afb866c9ca"},
5050
"phoenix_live_view": {:hex, :phoenix_live_view, "0.13.3", "2186c55cc7c54ca45b97c6f28cfd267d1c61b5f205f3c83533704cd991bdfdec", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.4.17 or ~> 1.5.2", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "c6309a7da2e779cb9cdf2fb603d75f38f49ef324bedc7a81825998bd1744ff8a"},
5151
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},
5252
"plug": {:hex, :plug, "1.10.1", "c56a6d9da7042d581159bcbaef873ba9d87f15dce85420b0d287bca19f40f9bd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "b5cd52259817eb8a31f2454912ba1cff4990bca7811918878091cb2ab9e52cb8"},
@@ -67,5 +67,5 @@
6767
"vintage_net_direct": {:hex, :vintage_net_direct, "0.7.0", "6a8d95432fc2fb9a9e0225bf1a6dbb7c1ba097bb509a989e947ad3f44d2b0f28", [:mix], [{:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "9c091687dccbc379ba3b8de01458a3e911321aa391e2c2ae3be7edadd0c51f76"},
6868
"vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.7.0", "b66a4da0846b4a55a471d15d8ab2bedbbef9c75c18f4e511c43777f7cfeffa09", [:mix], [{:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "bff0fa24b153b80dab959a0697777c4de7c3272c387ffa618f73805d66757c3f"},
6969
"vintage_net_wifi": {:hex, :vintage_net_wifi, "0.7.0", "be3d8275fa40ba357159033523606c74c8f612dbd60801840df60835453a6906", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.7.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "a9dfac64705f0b7cd7e0fc2338cf891eef091a49385805d0a42c22fb0aaa7c84"},
70-
"vintage_net_wizard": {:hex, :vintage_net_wizard, "0.2.3", "baba766d1b4445ed05c72be865623f9574f6d6f8dcf0092ebc7ba64c8a00807f", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.10", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:vintage_net_wifi, "~> 0.7.0", [hex: :vintage_net_wifi, repo: "hexpm", optional: false]}], "hexpm", "50a7c43d3d3c8360a41909950b6d5553a2457844603c872a33e5a0303bb4bced"},
70+
"vintage_net_wizard": {:hex, :vintage_net_wizard, "0.2.4", "5d578395adcfad5398e19848476100f867afc1f85201646c9cdbf01792ff80a6", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.10", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:vintage_net_wifi, "~> 0.7.0 or ~> 0.8.0", [hex: :vintage_net_wifi, repo: "hexpm", optional: false]}], "hexpm", "0a4c841c47f2eb583a7a09be63dd44b5abb5f78cb870459622be3817b65c0841"},
7171
}

0 commit comments

Comments
 (0)