Skip to content

Instantly share code, notes, and snippets.

@zenom
Created December 19, 2023 01:27
Show Gist options
  • Save zenom/2f4ae57ed3817feff693b080dfaa06e6 to your computer and use it in GitHub Desktop.
Save zenom/2f4ae57ed3817feff693b080dfaa06e6 to your computer and use it in GitHub Desktop.
defmodule UartListener do
use GenServer
@serial_port "/dev/cu.usbserial-2210" # e.g., "/dev/ttyUSB0"
@baud_rate 115200
# @ic7300_address "94" # Hexadecimal address of IC-7300
# @controller_address "E0" # Hexadecimal address of the controller (PC)
# Client
def start_link(args) do
GenServer.start_link(__MODULE__, args, name: __MODULE__)
end
def send_data(pid, data) do
GenServer.call(pid, {:send_data, data})
end
def init(%{} = _state) do
{:ok, pid} = Circuits.UART.start_link()
case Circuits.UART.open(pid, @serial_port, speed: @baud_rate) do
:ok ->
{:ok, %{pid: pid}}
{:error, reason} -> {:stop, reason}
end
end
def handle_info({:circuits_uart, _port, data}, state) do
process_uart_data(data)
{:noreply, state}
end
defp process_uart_data(data) do
data
|> :erlang.binary_to_list()
|> Enum.map(&Integer.to_string(&1, 16))
|> control_command()
end
# listen for frequency change
def control_command(["FE", "FE", "0", "94", "0" | rest]) do
IO.puts("FREQUENCY")
info = List.delete_at(rest, length(rest) - 1) |> Enum.reverse |> Enum.join
IO.puts("ORIGINAL: #{info} | NEW: #{format_frequency(info)}")
end
# listen for mode / filter change
def control_command(["FE", "FE", "0", "94", "1" | rest]) do
IO.puts("MODE")
IO.inspect(rest)
end
def parse_uart_data(data) do
[command | rest] = data
IO.puts("COMMAND #{command}")
IO.inspect(rest)
end
def handle_info(data, state) do
{:noreply, state}
end
def format_frequency(number) do
number
|> String.reverse()
|> String.graphemes()
|> Enum.chunk_every(3, 3, :discard)
|> Enum.map(&Enum.join(&1, ""))
|> Enum.join(".")
|> String.reverse()
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment