scape/rocker forms, maybe ci will login to DH

a2b10db · gmorell · 2023-01-03 05:51

14 files +343 -39

Files changed

modified .gitlab-ci.yml
+2 −1
@@ -10,7 +10,8 @@ build-master:
10 10 - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
11 11 - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE --registry-mirror eu0.regi.kube.gmp.io
12 12
13 − - echo "{\"auths\":{\"$CI_REGISTRY_DH\":{\"username\":\"$CI_REGISTRY_USER_DH\",\"password\":\"$CI_REGISTRY_PASSWORD_DH\"}}}" > /kaniko/.docker/config.json
13 + - DHAUTH=`"${CI_REGISTRY_USER_DH}:${$CI_REGISTRY_PASSWORD_DH}" | openssl base64 -A`
14 + - echo "{\"auths\":{\"$CI_REGISTRY_DH\":{\"auth\":\"DHAUTH\"}}}" > /kaniko/.docker/config.json
14 15 - cat /kaniko/.docker/config.json
15 16 - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE_DH:latest
16 17
modified README.md
+1 −0
@@ -9,6 +9,7 @@ A Reimplementation of Lambent Aether 4, in Elixir
9 9 - Device implementation is 100x more robust in device discovery on-net
10 10 - ~Devices can be virtually grouped~
11 11 - Individual Machine Brightness Controls
12 +- Machine Persistence / ~TODO Link Persistence~
12 13 - ~Links can target groups~
13 14
14 15 ### Device Support
modified lib/lambent_ex/schema/machines.ex
+21 −9
@@ -8,18 +8,20 @@ defmodule LambentEx.Schema.Machines do
8 8 alias LambentEx.Schema.Machines
9 9
10 10 @values %{
11 − gen_solid: "Solid",
12 − gen_solid_h: "Solid (HSV)",
13 − gen_color_cycle: "Color Cycler",
14 − gen_chaser: "Chaser",
15 − gen_chaser_h: "Chaser (HSV)",
11 + gen_solid: "Solid", #
12 + gen_solid_h: "Solid (HSV)", #
13 + gen_color_cycle: "Color Cycler", #
14 + gen_chaser: "Chaser", #
15 + gen_chaser_h: "Chaser (HSV)", #
16 16 gen_chaser_m: "Multi-Chaser",
17 17 gen_chaser_mh: "Multi-Chaser (HSV)",
18 18 gen_growth: "Growth",
19 − gen_rocker: "Rocker",
20 − gen_rainbow: "Rainbow",
21 − gen_rainbow_s: "Rainbow (Solid)",
22 − gen_scape: "Scape",
19 + gen_rocker: "Rocker", #
20 + gen_rocker_s: "Rocker (Solid)", #
21 + gen_rainbow: "Rainbow", #
22 + gen_rainbow_s: "Rainbow (Solid)", #
23 + gen_scape: "Scape", #
24 + gen_scape_s: "Scape (Solid)", #
23 25 gen_twinkler: "LA3PortTwinler",
24 26 rcv_fft: "FFT Receiver",
25 27 rcv_gsi: "GSI Receiver",
@@ -34,6 +36,10 @@ defmodule LambentEx.Schema.Machines do
34 36 gen_chaser_h: LambentEx.Machine.Steps.Chase,
35 37 gen_rainbow: LambentEx.Machine.Steps.Rainbow,
36 38 gen_rainbow_s: LambentEx.Machine.Steps.Rainbow,
39 + gen_rocker: LambentEx.Machine.Steps.Rocker,
40 + gen_rocker_s: LambentEx.Machine.Steps.Rocker,
41 + gen_scape: LambentEx.Machine.Steps.Scape,
42 + gen_scape_s: LambentEx.Machine.Steps.Scape,
37 43 }
38 44
39 45 embedded_schema do
@@ -47,6 +53,10 @@ defmodule LambentEx.Schema.Machines do
47 53 gen_solid_h: LambentEx.Schema.Steps.Solid,
48 54 gen_chaser: LambentEx.Schema.Steps.Chase,
49 55 gen_chaser_h: LambentEx.Schema.Steps.Chase,
56 + gen_rocker: LambentEx.Schema.Steps.Rocker,
57 + gen_rocker_s: LambentEx.Schema.Steps.Rocker,
58 + gen_scape: LambentEx.Schema.Steps.Scape,
59 + gen_scape_s: LambentEx.Schema.Steps.Scape,
50 60 gen_rainbow: LambentEx.Schema.Steps.Rainbow,
51 61 gen_rainbow_s: LambentEx.Schema.Steps.Rainbow
52 62 ],
@@ -79,6 +89,8 @@ defmodule LambentEx.Schema.Machines do
79 89 :gen_solid -> [single: true]
80 90 :gen_solid_h -> [single: true]
81 91 :gen_rainbow_s -> [single: true]
92 + :gen_rocker_s -> [single: true]
93 + :gen_scape_s -> [single: true]
82 94 _otherwise -> []
83 95 end |> IO.inspect()
84 96
added lib/lambent_ex/schema/steps/rocker.ex
+21 −0
@@ -0,0 +1,21 @@
1 +defmodule LambentEx.Schema.Steps.Rocker do
2 + use Ecto.Schema
3 + import Ecto.Changeset
4 +
5 + @primary_key false
6 +
7 + embedded_schema do
8 + field :h, {:array, :integer}, default: []
9 + field :h_sel, :integer
10 + field :s, :integer, default: 255
11 + field :v, :integer, default: 255
12 + field :linger, :integer, default: 1000
13 + field :dark, :boolean, default: true
14 + end
15 +
16 + def changeset(source, params) do
17 + source
18 + |> cast(params, ~w(h h_sel s v linger dark)a)
19 + |> validate_required([:h, :h_sel, :s, :v, :linger, :dark])
20 + end
21 +end
added lib/lambent_ex/schema/steps/scapes.ex
+21 −0
@@ -0,0 +1,21 @@
1 +defmodule LambentEx.Schema.Steps.Scape do
2 + use Ecto.Schema
3 + import Ecto.Changeset
4 +
5 + @primary_key false
6 +
7 + embedded_schema do
8 + field :h_h, :integer
9 + field :h_l, :integer
10 + field :s, :integer, default: 255
11 + field :v, :integer, default: 255
12 + field :linger, :integer, default: 1000
13 + field :dark, :boolean, default: true
14 + end
15 +
16 + def changeset(source, params) do
17 + source
18 + |> cast(params, ~w(h_h h_l s v linger dark)a)
19 + |> validate_required([:h_h, :h_l, :s, :v, :linger, :dark])
20 + end
21 +end
modified lib/lambent_ex_web/live/machines/form_component.ex
+108 −28
@@ -9,37 +9,82 @@ defmodule LambentEx.MachinesLive.FormComponent do
9 9 changeset = Machines.change_machine(machine)
10 10
11 11 {:ok,
12 − socket
13 − |> assign(assigns)
14 − |> assign(:changeset, changeset)
15 − |> assign(:rgb, nil)
16 − |> assign(:h, nil)
17 − |> assign(:s, nil)
18 − |> assign(:v, nil)
19 − |> assign(:r, nil)
20 − |> assign(:g, nil)
21 − |> assign(:b, nil)
22 − }
12 + socket
13 + |> assign(assigns)
14 + |> assign(:changeset, changeset)
15 + |> assign(:rgb, nil)
16 + |> assign(:rgbs, [])
17 + |> assign(:hs, [])
18 + |> assign(:h, nil)
19 + |> assign(:s, nil)
20 + |> assign(:v, nil)
21 + |> assign(:r, nil)
22 + |> assign(:g, nil)
23 + |> assign(:b, nil)}
24 + end
25 +
26 + defp rocker_params(%{"name" => name, "type" => type}), do: %{"name" => name, "type" => type}
27 +
28 + defp rocker_params(params) do
29 + IO.inspect(params)
30 + currhs = Kernel.get_in(params, ["class", "h"]) || []
31 +
32 + case params |> Map.get("h_sel") do
33 + nil -> params |> Kernel.put_in(["class", "h"], currhs) |> IO.inspect()
34 + val -> params |> Kernel.put_in(["class", "h"], currhs + [val]) |> IO.inspect()
35 + end
23 36 end
24 37
25 38 @impl true
26 39 def handle_event("validate", %{"machines" => machine_params}, socket) do
40 + # machine_params = case machine_params["type"] do
41 + # "gen_rocker" -> rocker_params(machine_params)
42 + # "gen_rocker_s" -> rocker_params(machine_params)
43 + # _otherwise -> machine_params
44 + # end
45 +
27 46 changeset =
28 47 socket.assigns.machine
29 48 |> Machines.change_machine(machine_params)
49 + |> IO.inspect()
30 50 |> Map.put(:action, :validate)
31 51
32 − keys = case changeset.changes[:type] do
33 − :gen_chaser_h -> changeset.changes[:class] |> hue_keys
34 − :gen_solid_h -> changeset.changes[:class] |> hue_keys
35 − _otherwise -> []
36 − end
52 + IO.inspect({changeset.changes[:type], changeset.changes[:class]})
37 53
38 − socket = case keys do
39 − [r: r, g: g, b: b] -> socket |> assign(:rgb, "rgb(#{r}, #{g}, #{b})")
40 − [r: r, g: g, b: b, h: h] -> socket |> assign(:rgb, "rgb(#{r}, #{g}, #{b})") |> assign(:h, h)
41 − [] -> socket
42 − end
54 + keys =
55 + case changeset.changes[:type] do
56 + :gen_chaser_h -> changeset.changes[:class] |> hue_keys
57 + :gen_solid_h -> changeset.changes[:class] |> hue_keys
58 + :gen_rocker -> changeset.changes[:class] |> rocker_keys
59 + :gen_rocker_s -> changeset.changes[:class] |> rocker_keys
60 + :gen_scape -> changeset.changes[:class] |> scape_keys
61 + :gen_scape_s -> changeset.changes[:class] |> scape_keys
62 + _otherwise -> []
63 + end
64 + |> IO.inspect()
65 +
66 + socket =
67 + case keys do
68 + [r: r, g: g, b: b, h: h, hs: hs] ->
69 + IO.puts("qqq")
70 +
71 + socket
72 + |> assign(:rgb, rgb(r, g, b))
73 + |> assign(:rgbs, hs |> Enum.map(fn [r_, g_, b_] -> rgb(r_, g_, b_) end))
74 + |> assign(:h, h)
75 +
76 + [r: r, g: g, b: b] ->
77 + socket |> assign(:rgb, rgb(r, g, b))
78 +
79 + [r: r, g: g, b: b, h: h] ->
80 + socket |> assign(:rgb, rgb(r, g, b)) |> assign(:h, h)
81 +
82 + [rh: rh, gh: gh, bh: bh, rl: rl, gl: gl, bl: bl, h_h: h_h, h_l: h_l] ->
83 + socket |> assign(:rgbs, [rgb(rh, gh, bh), rgb(rl, gl, bl)]) |> assign(:hs, [h_h, h_l])
84 +
85 + [] ->
86 + socket
87 + end
43 88
44 89 {:noreply, assign(socket, :changeset, changeset)}
45 90 end
@@ -48,9 +93,9 @@ defmodule LambentEx.MachinesLive.FormComponent do
48 93 case Machines.update_machines(socket.assigns.machine, machines_params) do
49 94 {:ok, _machine} ->
50 95 {:noreply,
51 − socket
52 − |> put_flash(:info, "Machine Created Successfully")
53 − |> push_navigate(to: socket.assigns.navigate)}
96 + socket
97 + |> put_flash(:info, "Machine Created Successfully")
98 + |> push_navigate(to: socket.assigns.navigate)}
54 99
55 100 {:error, %Ecto.Changeset{} = changeset} ->
56 101 {:noreply, assign(socket, :changeset, changeset)}
@@ -62,13 +107,48 @@ defmodule LambentEx.MachinesLive.FormComponent do
62 107 {:noreply, assign(socket, :changeset, changeset)}
63 108 end
64 109
65 − defp values, do: LambentEx.Schema.Machines.values |> Enum.map(fn {k,v} -> {v,k} end) |> Map.new
110 + def handle_event("add-sel", %{"data" => data}, socket) do
111 + curr_h = Ecto.Changeset.get_change(socket.assigns.changeset, :h) || []
112 + changeset = socket.assigns.changeset |> Ecto.Changeset.change(h: curr_h ++ [data])
113 + {:noreply, socket}
114 + end
115 +
116 + defp values,
117 + do: LambentEx.Schema.Machines.values() |> Enum.map(fn {k, v} -> {v, k} end) |> Map.new()
118 +
66 119 defp expand(int) do
67 120 (int / 255 * 360) |> round
68 121 end
122 +
69 123 defp hue_keys(nil), do: []
70 − defp hue_keys(%{h: h, s: s, v: v}) do
71 − [r,g,b] = LambentEx.Utils.Color.hsv2rgb([h,s,v])
124 +
125 + defp hue_keys(%{h: h, s: s, v: v, h_sel: h_sel}) do
126 + [r, g, b] = LambentEx.Utils.Color.hsv2rgb([h, s, v])
72 127 [r: r, g: g, b: b, h: h]
73 128 end
74 −end
129 +
130 + defp rocker_keys(nil), do: [] |> IO.inspect()
131 +
132 + defp rocker_keys(%{h_sel: h_sel, h: h, s: s, v: v}) do
133 + [r, g, b] = LambentEx.Utils.Color.hsv2rgb([h_sel, s, v])
134 +
135 + [
136 + r: r,
137 + g: g,
138 + b: b,
139 + h: h_sel,
140 + hs: h |> Enum.map(fn hh -> LambentEx.Utils.Color.hsv2rgb([hh, s, v]) end)
141 + ]
142 + |> IO.inspect()
143 + end
144 +
145 + defp scape_keys(nil), do: []
146 +
147 + defp scape_keys(%{h_h: h_h, h_l: h_l, s: s, v: v}) do
148 + [rh, gh, bh] = LambentEx.Utils.Color.hsv2rgb([h_h, s, v])
149 + [rl, gl, bl] = LambentEx.Utils.Color.hsv2rgb([h_l, s, v])
150 + [rh: rh, gh: gh, bh: bh, rl: rl, gl: gl, bl: bl, h_h: h_h, h_l: h_l]
151 + end
152 +
153 + defp rgb(r, g, b), do: "rgb(#{r}, #{g}, #{b})"
154 +end
modified lib/lambent_ex_web/live/machines/form_component.html.heex
+170 −2
@@ -96,7 +96,7 @@
96 96 </div>
97 97 <div class="collapse-content">
98 98 <p>
99 − <.input field={{gr, :modulo}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
99 + <.input field={{gr, :modulo}} type="range" min="0" max="255" label="Modulo" class="range range-priamry range-lg" />
100 100 </p>
101 101 </div>
102 102 </div>
@@ -111,7 +111,175 @@
111 111 </div>
112 112 <div class="collapse-content">
113 113 <p>
114 − <.input field={{grs, :modulo}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
114 + <.input field={{grs, :modulo}} type="range" min="0" max="255" label="Modulo" class="range range-priamry range-lg" />
115 + </p>
116 + </div>
117 + </div>
118 + <% end %>
119 +
120 +
121 + <%= :gen_rocker -> %>
122 + <%= polymorphic_embed_inputs_for f, :class, :gen_rocker, fn grr -> %>
123 + <div class="flex">
124 + <div class="flex-auto">
125 + <.input field={{grr, :h}} type="hidden" value={[]} />
126 + <.input field={{grr, :h_sel}} type="range" min="0" max="255" label="Hue (Selecting)" class="range range-priamry range-lg" />
127 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgb}"}>
128 + <span>&#9608;</span>
129 + <span>&#9608;</span>
130 + <span>&#9608;</span>
131 + <span>&#9608;</span>
132 + <span>&#9608;</span>
133 + <span>&#9608;</span>
134 + <span>&#9608;</span>
135 + </div>
136 + </div>
137 + <div class="flex-none text-5xl p-8"><%= @h %></div>
138 + <div class="flex-none py-10">
139 + <btn class="btn btn-accent btn-lg" phx-click="add-sel" phx-target={@myself} phx-value-data={grr.data.h_sel}>
140 + <i class="fa-solid fa-plus"></i>
141 + </btn>
142 + </div>
143 + </div>
144 + <div tabindex="0" class="collapse collapse-arrow border border-base-300 bg-base-100 rounded-box">
145 + <div class="collapse-title text-xl font-medium">
146 + Extra Configuration Values
147 + </div>
148 + <div class="collapse-content">
149 + <p>
150 + <.input field={{grr, :dark}} type="checkbox" label="Linger" class="range range-priamry range-lg" />
151 + <.input field={{grr, :linger}} type="number" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
152 + <.input field={{grr, :s}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
153 + <.input field={{grr, :v}} type="range" min="0" max="255" label="Value" class="range range-priamry range-lg" />
154 + </p>
155 + </div>
156 + </div>
157 + <% end %>
158 +
159 + <%= :gen_rocker_s -> %>
160 + <%= polymorphic_embed_inputs_for f, :class, :gen_rocker_s, fn grrs -> %>
161 + <div class="flex">
162 + <div class="flex-auto">
163 + <.input field={{grrs, :h}} type="hidden" value={[]} />
164 + <.input field={{grrs, :h_sel}} type="range" min="0" max="255" label="Hue (Selecting)" class="range range-priamry range-lg" />
165 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgbs}"}>
166 + <span>&#9608;</span>
167 + <span>&#9608;</span>
168 + <span>&#9608;</span>
169 + <span>&#9608;</span>
170 + <span>&#9608;</span>
171 + <span>&#9608;</span>
172 + <span>&#9608;</span>
173 + </div>
174 + </div>
175 + <div class="flex-none text-5xl p-8"><%= @h %></div>
176 + </div>
177 + <div tabindex="0" class="collapse collapse-arrow border border-base-300 bg-base-100 rounded-box">
178 + <div class="collapse-title text-xl font-medium">
179 + Extra Configuration Values
180 + </div>
181 + <div class="collapse-content">
182 + <p>
183 + <.input field={{grrs, :dark}} type="checkbox" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
184 + <.input field={{grrs, :linger}} type="number" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
185 + <.input field={{grrs, :s}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
186 + <.input field={{grrs, :v}} type="range" min="0" max="255" label="Value" class="range range-priamry range-lg" />
187 + </p>
188 + </div>
189 + </div>
190 + <% end %>
191 +
192 +
193 + <%= :gen_scape -> %>
194 + <%= polymorphic_embed_inputs_for f, :class, :gen_scape, fn gsc -> %>
195 + <div class="flex">
196 + <div class="flex-auto">
197 + <.input field={{gsc, :h_sel}} type="range" min="0" max="255" label="Hue (Low)" class="range range-priamry range-lg" />
198 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgbs |> Enum.at(1)}"}>
199 + <span>&#9608;</span>
200 + <span>&#9608;</span>
201 + <span>&#9608;</span>
202 + <span>&#9608;</span>
203 + <span>&#9608;</span>
204 + <span>&#9608;</span>
205 + <span>&#9608;</span>
206 + </div>
207 + </div>
208 + <div class="flex-none text-5xl p-8"><%= @hs |> Enum.at(1) %></div>
209 + </div>
210 + <div class="flex">
211 + <div class="flex-auto">
212 + <.input field={{gsc, :h_h}} type="range" min="0" max="255" label="Hue (High)" class="range range-priamry range-lg" />
213 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgbs |> Enum.at(0)}"}>
214 + <span>&#9608;</span>
215 + <span>&#9608;</span>
216 + <span>&#9608;</span>
217 + <span>&#9608;</span>
218 + <span>&#9608;</span>
219 + <span>&#9608;</span>
220 + <span>&#9608;</span>
221 + </div>
222 + </div>
223 + <div class="flex-none text-5xl p-8"><%= @hs |> Enum.at(0) %></div>
224 + </div>
225 + <div tabindex="0" class="collapse collapse-arrow border border-base-300 bg-base-100 rounded-box">
226 + <div class="collapse-title text-xl font-medium">
227 + Extra Configuration Values
228 + </div>
229 + <div class="collapse-content">
230 + <p>
231 + <.input field={{gsc, :dark}} type="checkbox" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
232 + <.input field={{gsc, :linger}} type="number" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
233 + <.input field={{gsc, :s}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
234 + <.input field={{gsc, :v}} type="range" min="0" max="255" label="Value" class="range range-priamry range-lg" />
235 + </p>
236 + </div>
237 + </div>
238 + <% end %>
239 +
240 +
241 + <%= :gen_scape_s -> %>
242 + <%= polymorphic_embed_inputs_for f, :class, :gen_scape_s, fn gscs -> %>
243 + <div class="flex">
244 + <div class="flex-auto">
245 + <.input field={{gscs, :h_l}} type="range" min="0" max="255" label="Hue (Low)" class="range range-priamry range-lg" />
246 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgbs |> Enum.at(1)}"}>
247 + <span>&#9608;</span>
248 + <span>&#9608;</span>
249 + <span>&#9608;</span>
250 + <span>&#9608;</span>
251 + <span>&#9608;</span>
252 + <span>&#9608;</span>
253 + <span>&#9608;</span>
254 + </div>
255 + </div>
256 + <div class="flex-none text-5xl p-8"><%= @hs |> Enum.at(1) %></div>
257 + </div>
258 + <div class="flex">
259 + <div class="flex-auto">
260 + <.input field={{gscs, :h_h}} type="range" min="0" max="255" label="Hue (High)" class="range range-priamry range-lg" />
261 + <div class="w-full flex justify-between text-xs px-2 mb-4" style={"color: #{@rgbs |> Enum.at(0)}"}>
262 + <span>&#9608;</span>
263 + <span>&#9608;</span>
264 + <span>&#9608;</span>
265 + <span>&#9608;</span>
266 + <span>&#9608;</span>
267 + <span>&#9608;</span>
268 + <span>&#9608;</span>
269 + </div>
270 + </div>
271 + <div class="flex-none text-5xl p-8"><%= @hs |> Enum.at(0) %></div>
272 + </div>
273 + <div tabindex="0" class="collapse collapse-arrow border border-base-300 bg-base-100 rounded-box">
274 + <div class="collapse-title text-xl font-medium">
275 + Extra Configuration Values
276 + </div>
277 + <div class="collapse-content">
278 + <p>
279 + <.input field={{gscs, :dark}} type="checkbox" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
280 + <.input field={{gscs, :linger}} type="number" min="0" max="20000" label="Linger" class="range range-priamry range-lg" />
281 + <.input field={{gscs, :s}} type="range" min="0" max="255" label="Saturation" class="range range-priamry range-lg" />
282 + <.input field={{gscs, :v}} type="range" min="0" max="255" label="Value" class="range range-priamry range-lg" />
115 283 </p>
116 284 </div>
117 285 </div>

Parents: 67ff785