diff --git a/config/config.exs b/config/config.exs index 5a271a5..9e4461a 100644 --- a/config/config.exs +++ b/config/config.exs @@ -30,7 +30,11 @@ device_setup_url = System.get_env("DEVICE_SETUP_URL") || raise "System environment variable `DEVICE_SETUP_URL` was not set. Use value `goatmire.fly.dev`, or set up your own server from the repo at https://github.com/protolux-electronics/goatmire" +## For local development is useful by default is false +device_setup_insecure = System.get_env("DEVICE_SETUP_INSECURE") == "true" + config :name_badge, :device_setup_url, device_setup_url +config :name_badge, :device_setup_insecure, device_setup_insecure # Optional: Calendar sync via iCal secret address (read-only) # Set CALENDAR_URL to your Google Calendar secret iCal address before building. diff --git a/lib/name_badge/battery.ex b/lib/name_badge/battery.ex index 6ad18d3..9a856a1 100644 --- a/lib/name_badge/battery.ex +++ b/lib/name_badge/battery.ex @@ -18,10 +18,11 @@ defmodule NameBadge.Battery do min_voltage = 3.0 max_voltage = 4.2 - percentage = ((v - min_voltage) / (max_voltage - min_voltage) * 100) - |> max(0) - |> min(100) - |> round() + percentage = + ((v - min_voltage) / (max_voltage - min_voltage) * 100) + |> max(0) + |> min(100) + |> round() percentage end diff --git a/lib/name_badge/mocks/battery_mock.ex b/lib/name_badge/mocks/battery_mock.ex index 741ff5c..fa74f9a 100644 --- a/lib/name_badge/mocks/battery_mock.ex +++ b/lib/name_badge/mocks/battery_mock.ex @@ -21,10 +21,11 @@ defmodule NameBadge.BatteryMock do min_voltage = 3.0 max_voltage = 4.2 - percentage = ((v - min_voltage) / (max_voltage - min_voltage) * 100) - |> max(0) - |> min(100) - |> round() + percentage = + ((v - min_voltage) / (max_voltage - min_voltage) * 100) + |> max(0) + |> min(100) + |> round() percentage end diff --git a/lib/name_badge/screen/name_badge.ex b/lib/name_badge/screen/name_badge.ex index 42f92cb..537decc 100644 --- a/lib/name_badge/screen/name_badge.ex +++ b/lib/name_badge/screen/name_badge.ex @@ -8,6 +8,27 @@ defmodule NameBadge.Screen.NameBadge do @name_size_default 36 @company_size_default 24 + @impl NameBadge.Screen + def render(%{show_qr: true, qr_code: qr_code}) do + case qr_code do + nil -> + """ + #align(center + horizon)[ + #text(font: "New Amsterdam", size: 24pt)[No QR code available] + ] + """ + + qr -> + """ + #align(center + horizon)[ + #image(height: 80%, format: "svg", bytes("#{qr}")) + + Scan to reach me ! + ] + """ + end + end + @impl NameBadge.Screen def render(%{valid?: false}) do """ @@ -59,10 +80,41 @@ defmodule NameBadge.Screen.NameBadge do case config do %{"first_name" => _first_name, "last_name" => _last_name} -> - {:ok, assign(screen, config: config, valid?: true)} + qr_code = generate_qr_code(config) + + {:ok, + assign(screen, + config: config, + valid?: true, + qr_code: qr_code, + show_qr: false, + button_hints: %{b: "Show QR"} + )} _config -> - {:ok, assign(screen, valid?: false, button_hints: %{a: "Set up WiFi", b: "View QR code"})} + {:ok, + assign(screen, + valid?: false, + show_qr: false, + button_hints: %{a: "Set up WiFi", b: "View QR code"} + )} + end + end + + defp generate_qr_code(config) do + Map.get(config, "qr_link") + |> qr_code_for_url() + end + + defp qr_code_for_url(nil), do: nil + defp qr_code_for_url(""), do: nil + + defp qr_code_for_url(url) do + with {:ok, _code} = result <- QRCode.create(url), + {:ok, qr_code_svg} <- QRCode.render(result) do + qr_code_svg + |> String.replace("\\", "\\\\") + |> String.replace("\"", "\\\"") end end @@ -80,7 +132,8 @@ defmodule NameBadge.Screen.NameBadge do def handle_button(:button_2, :single_press, screen) do cond do screen.assigns.valid? -> - {:noreply, screen} + new_show_qr = !screen.assigns.show_qr + {:noreply, assign(screen, :show_qr, new_show_qr)} true -> {:noreply, navigate(screen, NameBadge.Screen.Settings.QrCode)} diff --git a/lib/name_badge/screen/settings/qr_code.ex b/lib/name_badge/screen/settings/qr_code.ex index d350660..1daffe7 100644 --- a/lib/name_badge/screen/settings/qr_code.ex +++ b/lib/name_badge/screen/settings/qr_code.ex @@ -54,7 +54,12 @@ defmodule NameBadge.Screen.Settings.QrCode do end defp qr_code_for_token(token) do - url = "https://#{device_setup_url()}/device/#{token}/config" + scheme = + if Application.get_env(:name_badge, :device_setup_insecure, false), + do: "http", + else: "https" + + url = "#{scheme}://#{device_setup_url()}/device/#{token}/config" {:ok, qr_code_svg} = url diff --git a/lib/name_badge/socket.ex b/lib/name_badge/socket.ex index 3097dad..6136255 100644 --- a/lib/name_badge/socket.ex +++ b/lib/name_badge/socket.ex @@ -68,6 +68,12 @@ defmodule NameBadge.Socket do @impl Slipstream def handle_call(:connected?, _from, socket), do: {:reply, connected?(socket), socket} - defp config, - do: [uri: "wss://#{Application.get_env(:name_badge, :device_setup_url)}/device/websocket"] + defp config do + url = Application.get_env(:name_badge, :device_setup_url) + + ws_scheme = + if Application.get_env(:name_badge, :device_setup_insecure, false), do: "ws", else: "wss" + + [uri: "#{ws_scheme}://#{url}/device/websocket"] + end end