59 lines
1.1 KiB
Elixir
59 lines
1.1 KiB
Elixir
defmodule Parser.TelemetryHelpers do
|
|
@moduledoc """
|
|
Telemetry helpers for APRS.
|
|
"""
|
|
|
|
@spec parse_telemetry_sequence(String.t()) :: integer() | nil
|
|
def parse_telemetry_sequence(seq) do
|
|
case Integer.parse(seq) do
|
|
{num, _} -> num
|
|
:error -> nil
|
|
end
|
|
end
|
|
|
|
def parse_analog_values(values) do
|
|
Enum.map(values, &parse_analog_value/1)
|
|
end
|
|
|
|
defp parse_analog_value("") do
|
|
nil
|
|
end
|
|
|
|
defp parse_analog_value(value) do
|
|
case Float.parse(value) do
|
|
{float_val, _} -> float_val
|
|
:error -> nil
|
|
end
|
|
end
|
|
|
|
def parse_digital_values(values) do
|
|
Enum.flat_map(values, &parse_digital_value/1)
|
|
end
|
|
|
|
defp parse_digital_value("1"), do: [true]
|
|
|
|
defp parse_digital_value(value) when is_binary(value) do
|
|
value
|
|
|> String.graphemes()
|
|
|> Enum.map(fn
|
|
"1" -> true
|
|
"0" -> false
|
|
_ -> nil
|
|
end)
|
|
end
|
|
|
|
defp parse_digital_value(_), do: [nil]
|
|
|
|
def parse_coefficient(coeff) do
|
|
case Float.parse(coeff) do
|
|
{float_val, _} ->
|
|
float_val
|
|
|
|
:error ->
|
|
case Integer.parse(coeff) do
|
|
{int_val, _} -> int_val
|
|
:error -> coeff
|
|
end
|
|
end
|
|
end
|
|
end
|