Current section
Files
Jump to
Current section
Files
lib/waveshare.ex
defmodule Scenic.Driver.Nerves.Waveshare do
use Scenic.ViewPort.Driver
require Logger
@sku_config %{
sku138191: %{
name: "Waveshare 128x128, 1.44inch LCD display HAT",
input: Waveshare.Driver.Input.SKU138191,
display: Waveshare.Driver.Display.ST7735S,
lcd_x: 1,
lcd_y: 2
}
}
@impl true
def init(viewport, size, config) do
vp_supervisor = vp_supervisor(viewport)
Logger.info("Scenic.Driver.Nerves.Waveshare: initializing SKU '#{config[:device_sku]}'...")
Logger.info("Scenic.Driver.Nerves.Waveshare: config=#{inspect(config)}")
state =
%{
viewport: viewport
}
|> init_display(viewport, size, config, vp_supervisor)
|> init_input(viewport, size, config, vp_supervisor)
send(self(), :refresh)
{:ok, state}
end
@impl true
def handle_info(:refresh, state) do
state = state.display.refresh.(state)
Process.send_after(self(), :refresh, state.display.refresh_interval)
{:noreply, state}
end
defp init_display(state, viewport, size, config, vp_supervisor) do
init_driver(state, :display, viewport, size, config, vp_supervisor)
end
defp init_input(state, viewport, size, config, vp_supervisor) do
init_driver(state, :input, viewport, size, config, vp_supervisor)
end
defp init_driver(state, driver_type, viewport, size, config, vp_supervisor) do
sku = config[:device_sku]
sku_config = @sku_config[sku]
driver = Map.get(sku_config, driver_type, nil)
case driver do
nil -> state
_ -> driver.init(state, viewport, size, config, vp_supervisor, sku_config)
end
end
defp vp_supervisor(viewport) do
[supervisor_pid | _] =
viewport
|> Process.info()
|> get_in([:dictionary, :"$ancestors"])
supervisor_pid
end
end