Skip to content

Commit 354017a

Browse files
committed
step7: Add img_effect and snap features
1 parent 4b0d90b commit 354017a

File tree

9 files changed

+93
-2
lines changed

9 files changed

+93
-2
lines changed

eye/lib/eye/camera.ex

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ defmodule Eye.Camera do
1111
GenServer.call(__MODULE__, {:set_size, width, height})
1212
end
1313

14+
def set_img_effect(effect) do
15+
GenServer.call(__MODULE__, {:set_img_effect, effect})
16+
end
17+
1418
defdelegate next_frame(), to: Picam
1519

1620
# GenServer API
@@ -23,6 +27,7 @@ defmodule Eye.Camera do
2327
Logger.info("Configuring camera")
2428
conf = %Configuration{}
2529
Picam.set_size(conf.size.width, conf.size.height)
30+
Picam.set_img_effect(conf.img_effect)
2631
{:ok, conf}
2732
end
2833

@@ -39,4 +44,15 @@ defmodule Eye.Camera do
3944
end
4045
end
4146

47+
def handle_call({:set_img_effect, effect}, _from, conf) do
48+
case Picam.set_img_effect(effect) do
49+
:ok ->
50+
conf = %{conf | img_effect: effect}
51+
{:reply, :ok, conf}
52+
53+
err ->
54+
{:reply, err, conf}
55+
end
56+
end
57+
4258
end

eye/lib/eye/configuration.ex

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,23 @@ defmodule Eye.Configuration do
77
"""
88

99
defstruct [
10-
size: %{width: 1280, height: 720}
10+
size: %{width: 1280, height: 720},
11+
img_effect: :normal
1112
]
1213

1314
@typedoc @moduledoc
1415
@type t ::
1516
%__MODULE__{
16-
size: dimensions()
17+
size: dimensions(),
18+
img_effect: img_effect()
1719
}
1820

1921
@type dimensions ::
2022
%{width: non_neg_integer(), height: non_neg_integer()}
2123

24+
@type img_effect ::
25+
:normal
26+
| :sketch
27+
| :oilpaint
28+
2229
end

eye_ui/assets/js/app.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,30 @@ document.getElementById("1920x1080").onclick = (event) => {
111111
event.preventDefault();
112112
setResolution(absintheSocket, 1920, 1080);
113113
};
114+
115+
// Image Mode Buttons
116+
117+
const setImageMode = (socket, effect) => {
118+
AbsintheSocket.send(socket, {
119+
operation: `mutation {
120+
imgEffect(effect: ${effect}) {
121+
imgEffect
122+
}
123+
}`
124+
});
125+
};
126+
127+
document.getElementById("normal").onclick = (event) => {
128+
event.preventDefault();
129+
setImageMode(absintheSocket, "NORMAL");
130+
};
131+
132+
document.getElementById("sketch").onclick = (event) => {
133+
event.preventDefault();
134+
setImageMode(absintheSocket, "SKETCH");
135+
};
136+
137+
document.getElementById("oilpaint").onclick = (event) => {
138+
event.preventDefault();
139+
setImageMode(absintheSocket, "OILPAINT");
140+
};

eye_ui/lib/eye_ui/resolvers/camera.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,9 @@ defmodule EyeUi.Resolvers.Camera do
99
{:ok, Eye.Camera.get_config()}
1010
end
1111

12+
def set_img_effect(_parent, args, _resolution) do
13+
Eye.Camera.set_img_effect(args[:effect])
14+
{:ok, Eye.Camera.get_config()}
15+
end
16+
1217
end

eye_ui/lib/eye_ui/schema.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ defmodule EyeUi.Schema do
3030
resolve &Resolvers.Camera.set_size/3
3131
end
3232

33+
@desc "Set image effect"
34+
field :img_effect, :camera_config do
35+
arg :effect, :img_effect
36+
resolve &Resolvers.Camera.set_img_effect/3
37+
end
38+
3339
end
3440

3541
subscription name: "Subscription" do

eye_ui/lib/eye_ui/schema/camera.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@ defmodule EyeUi.Schema.CameraTypes do
44
@desc "Camera configuration"
55
object :camera_config do
66
field :size, :dimensions
7+
field :img_effect, :img_effect
78
end
89

910
@desc "Image dimensions"
1011
object :dimensions do
1112
field :width, :integer
1213
field :height, :integer
1314
end
15+
16+
@desc "Image Effects"
17+
enum :img_effect do
18+
value :normal, as: :none, description: "No special effects"
19+
value :sketch, as: :sketch, description: "Just like at the amusement park"
20+
value :oilpaint, as: :oilpaint, description: "Just like Van Gogh"
21+
end
1422
end

eye_ui/lib/eye_ui_web/router.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ defmodule EyeUiWeb.Router do
2323
socket: EyeUiWeb.UserSocket,
2424
interface: :simple
2525

26+
forward "/snap", EyeUiWeb.SnapPlug
27+
2628
scope "/", EyeUiWeb do
2729
pipe_through :browser
2830

eye_ui/lib/eye_ui_web/snap_plug.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule EyeUiWeb.SnapPlug do
2+
import Plug.Conn
3+
4+
def init(opts), do: opts
5+
def call(conn, _opts) do
6+
conn
7+
|> put_resp_header("Age", "0")
8+
|> put_resp_header("Cache-Control", "no-cache, private")
9+
|> put_resp_header("Pragma", "no-cache")
10+
|> put_resp_header("Content-Type", "image/jpeg")
11+
|> send_resp(200, Eye.Camera.next_frame())
12+
end
13+
14+
end

eye_ui/lib/eye_ui_web/templates/page/index.html.eex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
<a class="btn btn-secondary" href="#" role="button" id="1280x720">1280 x 720</a>
77
<a class="btn btn-secondary" href="#" role="button" id="1920x1080">1920 x 1080</a>
88
</div>
9+
<a href="/snap" class="btn btn-secondary mr-2" role="group" aria-label="Snap">Snap</a>
10+
<div class="btn-group mr-2" role="group" aria-label="Image Effects">
11+
<a class="btn btn-secondary" href="#" role="button" id="normal">Normal</a>
12+
<a class="btn btn-secondary" href="#" role="button" id="sketch">Sketch</a>
13+
<a class="btn btn-secondary" href="#" role="button" id="oilpaint">Oil Paint</a>
14+
</div>
915
</div> <!-- toolbar -->
1016

1117
<svg id="canvas" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" style="background-image: url('video.mjpg');"/>

0 commit comments

Comments
 (0)