farmbot_os/farmbot_core/lib/firmware/uart_handler/auto_detector.ex

62 lines
1.6 KiB
Elixir

defmodule Farmbot.Firmware.UartHandler.AutoDetector do
@moduledoc """
Init module for configuring a UART handler. Here's what it does:
* Enumerates Serial devices
* Scrubs devices that should be ignored.
* If there is *ONE* device:
* Configures Farmbot.Behaviour.FirmwareHandler -> UartHandler
* Configures the device to be used.
* If there are zero or more than one device:
* Configures Farmbot.Behaviour.FirmwareHandler -> StubHandler
"""
alias Circuits.UART
alias Farmbot.Firmware.{UartHandler, StubHandler, Utils}
import Utils
require Logger
use GenServer
#TODO(Connor) - Maybe make this configurable?
case Farmbot.Project.target() do
:rpi3 ->
@ignore_devs ["ttyAMA0", "ttyS0", "ttyS3"]
:rpi ->
@ignore_devs ["ttyS0", "ttyS3"]
:rpi0 ->
@ignore_devs ["ttyS0", "ttyS3"]
:host ->
@ignore_devs ["ttyS0"]
end
@doc "Autodetect relevent UART Devs."
def auto_detect do
UART.enumerate() |> Map.keys() |> Kernel.--(@ignore_devs)
end
@doc false
def start_link(args) do
GenServer.start_link(__MODULE__, args, [name: __MODULE__])
end
def init([]) do
update_env()
:ignore
end
def update_env do
case auto_detect() do
[dev] ->
dev = "/dev/#{dev}"
Logger.debug "detected target UART: #{dev}"
replace_firmware_handler(UartHandler)
Application.put_env(:farmbot_core, :uart_handler, tty: dev)
dev
_ ->
Logger.debug "Could not detect a UART device."
replace_firmware_handler(StubHandler)
:error
end
end
end