defmodule Fledex.LedStripDriver.Driver do use Fledex.Color.Types @callback init(module_init_args :: map) :: map @callback transfer(leds :: list(colorint), counter :: pos_integer, config :: map) :: map @callback terminate(reason, config :: map) :: :ok when reason: :normal | :shutdown | {:shutdown, term()} | term() @spec init(map, Fledex.LedDriver.t) :: Fledex.LedDriver.t def init(init_args, state) do configs = for module <- state.led_strip.driver_modules do module_init_args = init_args[:led_strip][:config][module] || %{} config = module.init(module_init_args) {module, config} end put_in(state.led_strip.config, Enum.into(configs, %{})) end @spec transfer(list(colorint), Fledex.LedDriver.t) :: Fledex.LedDriver.t def transfer(leds, state) do configs = for module <- state.led_strip.driver_modules do config = module.transfer(leds, state[:timer][:counter], state[:led_strip][:config][module]) {module, config} end put_in(state.led_strip.config, Enum.into(configs, %{})) end def terminate(reason, state) do for module <- state.led_strip.driver_modules do module.terminate(reason, state[:led_strip][:config][module]) end :ok end end