From cefe36f7b100da22d84792e70ca8332d569037df Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Thu, 26 Aug 2021 11:01:32 +0200 Subject: [PATCH 1/6] Add possibility to pass GenServer opts --- lib/lcd_display.ex | 4 ++-- lib/lcd_display/display_controller.ex | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/lcd_display.ex b/lib/lcd_display.ex index fd6fe99..a78fee5 100644 --- a/lib/lcd_display.ex +++ b/lib/lcd_display.ex @@ -14,10 +14,10 @@ defmodule LcdDisplay do Starts a display controller process for a specified. """ @spec start_link(config) :: {:ok, pid} | {:error, any} - def start_link(config) when is_map(config) do + def start_link(config, opts \\ []) when is_map(config) do {%{driver_module: driver_module}, other_config} = Map.split(config, [:driver_module]) display = initialize_display(driver_module, other_config) - LcdDisplay.DisplayController.start_link(display) + LcdDisplay.DisplayController.start_link(display, opts) end @doc """ diff --git a/lib/lcd_display/display_controller.ex b/lib/lcd_display/display_controller.ex index 152f26f..0489fd5 100644 --- a/lib/lcd_display/display_controller.ex +++ b/lib/lcd_display/display_controller.ex @@ -13,9 +13,9 @@ defmodule LcdDisplay.DisplayController do Starts a display driver process and registers the process with a composite key of driver module and display name. """ - @spec start_link(display_driver) :: {:ok, pid} | {:error, any} - def start_link(display_driver) do - GenServer.start_link(__MODULE__, display_driver) + @spec start_link(display_driver, keyword()) :: {:ok, pid} | {:error, any} + def start_link(display_driver, opts \\ []) do + GenServer.start_link(__MODULE__, display_driver, opts) end @doc """ From e4765c5917245b8cf656523623390264134fca17 Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Thu, 26 Aug 2021 13:57:24 +0200 Subject: [PATCH 2/6] Allow to pass atoms instead of just pids --- lib/lcd_display.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/lcd_display.ex b/lib/lcd_display.ex index a78fee5..ee5d692 100644 --- a/lib/lcd_display.ex +++ b/lib/lcd_display.ex @@ -13,7 +13,7 @@ defmodule LcdDisplay do @doc """ Starts a display controller process for a specified. """ - @spec start_link(config) :: {:ok, pid} | {:error, any} + @spec start_link(config, GenServer.options()) :: {:ok, pid} | {:error, any} def start_link(config, opts \\ []) when is_map(config) do {%{driver_module: driver_module}, other_config} = Map.split(config, [:driver_module]) display = initialize_display(driver_module, other_config) @@ -23,9 +23,9 @@ defmodule LcdDisplay do @doc """ Executes a supported command. """ - @spec execute(pid, display_command) :: {:ok, display_driver} | {:error, any} - def execute(pid, command) when is_pid(pid) do - LcdDisplay.DisplayController.execute(pid, command) + @spec execute(GenServer.server(), display_command) :: {:ok, display_driver} | {:error, any} + def execute(server, command) do + LcdDisplay.DisplayController.execute(server, command) end @spec initialize_display(atom, map) :: {:ok, display_driver} | {:error, any} From 0e98d8b9ea3541f634469129bdb113da4ea653da Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Thu, 26 Aug 2021 14:07:17 +0200 Subject: [PATCH 3/6] Implement child_spec to start this module under a supervisor. --- lib/lcd_display.ex | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/lcd_display.ex b/lib/lcd_display.ex index ee5d692..9494375 100644 --- a/lib/lcd_display.ex +++ b/lib/lcd_display.ex @@ -10,6 +10,17 @@ defmodule LcdDisplay do atom => any } + @doc """ + Returns a specification to start this module under a supervisor. + """ + @spec child_spec(config, GenServer.options()) :: Supervisor.child_spec() + def child_spec(config, opts \\ []) do + %{ + id: __MODULE__, + start: {__MODULE__, :start_link, [config, opts]} + } + end + @doc """ Starts a display controller process for a specified. """ From d44de28e3174ca86a9e88d0fce19e237d2bf75a3 Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Thu, 26 Aug 2021 14:17:22 +0200 Subject: [PATCH 4/6] child_spec actually just receives a list --- lib/lcd_display.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/lcd_display.ex b/lib/lcd_display.ex index 9494375..557677b 100644 --- a/lib/lcd_display.ex +++ b/lib/lcd_display.ex @@ -13,11 +13,11 @@ defmodule LcdDisplay do @doc """ Returns a specification to start this module under a supervisor. """ - @spec child_spec(config, GenServer.options()) :: Supervisor.child_spec() - def child_spec(config, opts \\ []) do + @spec child_spec(list()) :: Supervisor.child_spec() + def child_spec(arg) do %{ id: __MODULE__, - start: {__MODULE__, :start_link, [config, opts]} + start: {__MODULE__, :start_link, arg} } end From ed50f493890ce6de50f484f04183117d3f36ff78 Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Tue, 31 Aug 2021 14:09:39 +0200 Subject: [PATCH 5/6] Comment out logger as in i2c and spi --- lib/lcd_display/display_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lcd_display/display_controller.ex b/lib/lcd_display/display_controller.ex index 0489fd5..97ae7b7 100644 --- a/lib/lcd_display/display_controller.ex +++ b/lib/lcd_display/display_controller.ex @@ -32,7 +32,7 @@ defmodule LcdDisplay.DisplayController do @impl true def handle_call(command, _from, display) do - Logger.info(inspect(command)) + # Logger.info(inspect(command)) case result = execute_display_command(command, display) do {:ok, new_display} -> {:reply, result, Map.merge(display, new_display)} From d7a5bb89fe1d7442edf1fa2ddfa4c96ce502f721 Mon Sep 17 00:00:00 2001 From: Philip Giuliani Date: Tue, 21 Mar 2023 18:17:36 +0100 Subject: [PATCH 6/6] Ignore server if display not found --- lib/lcd_display.ex | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/lcd_display.ex b/lib/lcd_display.ex index 557677b..d0e8fd6 100644 --- a/lib/lcd_display.ex +++ b/lib/lcd_display.ex @@ -27,8 +27,14 @@ defmodule LcdDisplay do @spec start_link(config, GenServer.options()) :: {:ok, pid} | {:error, any} def start_link(config, opts \\ []) when is_map(config) do {%{driver_module: driver_module}, other_config} = Map.split(config, [:driver_module]) - display = initialize_display(driver_module, other_config) - LcdDisplay.DisplayController.start_link(display, opts) + + case initialize_display(driver_module, other_config) do + {:ok, display} -> + LcdDisplay.DisplayController.start_link(display, opts) + + {:error, _reason} -> + :ignore + end end @doc """ @@ -41,9 +47,6 @@ defmodule LcdDisplay do @spec initialize_display(atom, map) :: {:ok, display_driver} | {:error, any} defp initialize_display(driver_module, config) when is_atom(driver_module) and is_map(config) do - case driver_module.start(config) do - {:ok, display} -> display - {:error, reason} -> {:error, reason} - end + driver_module.start(config) end end