概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。
練習問題
Livebookで、GPIOを操作したフリをせよ。
方針
- Agent使う。
- Kino.listen使う。
setup
Mix.install([
{:kino, "~> 0.10.0"}
])
サンプルコード
defmodule Pin do
use Agent
def start_link() do
Agent.start_link(fn ->
%{"GPIO15": 0, "GPIO16": 0, "GPIO17": 0, "GPIO18": 0}
end, name: __MODULE__)
end
def get() do
Agent.get(__MODULE__, fn v ->
"GPIO15 #{v["GPIO15"]}<br>GPIO16 #{v["GPIO16"]}<br>GPIO17 #{v["GPIO17"]}<br>GPIO18 #{v["GPIO18"]}<br>"
end)
end
def toggle5() do
Agent.update(__MODULE__, fn v ->
if v["GPIO15"] == 1, do: Map.put(v, "GPIO15", 0) , else: Map.put(v, "GPIO15", 1)
end)
end
def toggle6() do
Agent.update(__MODULE__, fn v ->
if v["GPIO16"] == 1, do: Map.put(v, "GPIO16", 0) , else: Map.put(v, "GPIO16", 1)
end)
end
def toggle7() do
Agent.update(__MODULE__, fn v ->
if v["GPIO17"] == 1, do: Map.put(v, "GPIO17", 0) , else: Map.put(v, "GPIO17", 1)
end)
end
def toggle8() do
Agent.update(__MODULE__, fn v ->
if v["GPIO18"] == 1, do: Map.put(v, "GPIO18", 0) , else: Map.put(v, "GPIO18", 1)
end)
end
def start(x) do
Agent.update(__MODULE__, fn v ->
Map.put(v, x, 1)
end)
end
def stop(x) do
Agent.update(__MODULE__, fn v ->
Map.put(v, x, 0)
end)
end
end
Pin.start_link()
frame =
Kino.Frame.new()
|> Kino.render()
Kino.listen(1000, fn i ->
content = Kino.Markdown.new(Pin.get())
Kino.Frame.render(frame, content)
i + 1
end)
Pin.start("GPIO15")
Process.sleep(3000)
Pin.start("GPIO16")
Process.sleep(3000)
Pin.toggle7()
Process.sleep(3000)
Pin.toggle7()
写真
以上。