61 lines
1.4 KiB
Elixir
61 lines
1.4 KiB
Elixir
defmodule FarmbotOS.SysCalls.SendMessage do
|
|
alias FarmbotFirmware
|
|
@root_regex ~r/{{\s*[\w\.]+\s*}}/
|
|
@extract_reg ~r/[\w\.]+/
|
|
|
|
def send_message(type, templ, channels) do
|
|
type = String.to_existing_atom(type)
|
|
|
|
meta = [
|
|
channels: channels
|
|
]
|
|
|
|
case render(templ) do
|
|
{:ok, message} ->
|
|
FarmbotCore.Logger.dispatch_log(__ENV__, type, 1, message, meta)
|
|
:ok
|
|
|
|
er ->
|
|
er
|
|
end
|
|
end
|
|
|
|
def render(templ) do
|
|
with {:ok, {_, {:report_position, pos}}} <- FarmbotFirmware.request({:position_read, []}),
|
|
{:ok, pins} <- pins(Enum.to_list(0..69)),
|
|
env <- Keyword.merge(pos, pins) do
|
|
env = Map.new(env, fn {k, v} -> {to_string(k), to_string(v)} end)
|
|
|
|
# Mini Mustache parser
|
|
data =
|
|
Regex.scan(@root_regex, templ)
|
|
|> Map.new(fn [itm] ->
|
|
[indx] = Regex.run(@extract_reg, itm)
|
|
{itm, env[indx]}
|
|
end)
|
|
|
|
rendered =
|
|
Regex.replace(@root_regex, templ, fn d ->
|
|
Map.get(data, d) || ""
|
|
end)
|
|
|
|
{:ok, rendered}
|
|
end
|
|
end
|
|
|
|
def pins(nums, acc \\ [])
|
|
|
|
def pins([p | rest], acc) do
|
|
case FarmbotFirmware.request({:pin_read, [p: p]}) do
|
|
{:ok, {_, {:report_pin_value, [p: ^p, v: v]}}} ->
|
|
acc = Keyword.put(acc, :"pin#{p}", v)
|
|
pins(rest, acc)
|
|
|
|
er ->
|
|
er
|
|
end
|
|
end
|
|
|
|
def pins([], acc), do: {:ok, acc}
|
|
end
|