Fix Farmware Hanging sequences

pull/1004/head
Connor Rigby 2019-09-23 09:00:56 -07:00 committed by Connor Rigby
parent c25a6b9c53
commit f4d48b9454
2 changed files with 29 additions and 25 deletions

View File

@ -191,7 +191,7 @@ defmodule FarmbotCore.FarmwareRuntime do
# farmware exit
def handle_info({:DOWN, _ref, :process, _pid, _reason}, %{cmd: _cmd_pid} = state) do
Logger.debug("Farmware exit")
{:noreply, %{state | cmd: nil}}
{:stop, :normal, %{state | cmd: nil}}
end
# successful result of an io:read/2 in :get_header context

View File

@ -13,6 +13,20 @@ defmodule FarmbotOS.SysCalls.Farmware do
end
end
def lookup_manifest(farmware_name) do
case Asset.get_farmware_manifest(farmware_name) do
nil -> {:error, "#{farmware_name} farmware not installed"}
manifest -> {:ok, manifest}
end
end
def lookup_installation(farmware_name) do
case Asset.get_farmware_installation(farmware_name) do
nil -> {:error, "#{farmware_name} farmware not installed"}
farmware -> {:ok, farmware}
end
end
def execute_script(farmware_name, env) do
with {:ok, manifest} <- lookup_manifest(farmware_name),
{:ok, runtime} <- FarmwareRuntime.start_link(manifest, env),
@ -32,20 +46,6 @@ defmodule FarmbotOS.SysCalls.Farmware do
end
end
def lookup_manifest(farmware_name) do
case Asset.get_farmware_manifest(farmware_name) do
nil -> {:error, "#{farmware_name} farmware not installed"}
manifest -> {:ok, manifest}
end
end
def lookup_installation(farmware_name) do
case Asset.get_farmware_installation(farmware_name) do
nil -> {:error, "#{farmware_name} farmware not installed"}
farmware -> {:ok, farmware}
end
end
defp loop(farmware_name, runtime, monitor, {ref, label}) do
receive do
{:DOWN, ^monitor, :process, ^runtime, :normal} ->
@ -80,16 +80,7 @@ defmodule FarmbotOS.SysCalls.Farmware do
# check to see if it's alive just in case?
Process.alive?(runtime) ->
case FarmwareRuntime.process_rpc(runtime) do
{:ok, %{args: %{label: label}} = rpc} ->
ref = make_ref()
Logger.debug("executing rpc: #{inspect(rpc)}")
FarmbotCeleryScript.execute(rpc, ref)
loop(farmware_name, runtime, monitor, {ref, label})
{:error, :no_rpc} ->
loop(farmware_name, runtime, monitor, {ref, label})
end
process(farmware_name, runtime, monitor, {ref, label})
# No other conditions: Process stopped, but missed the message?
true ->
@ -98,4 +89,17 @@ defmodule FarmbotOS.SysCalls.Farmware do
end
end
end
defp process(farmware_name, runtime, monitor, {ref, label}) do
case FarmwareRuntime.process_rpc(runtime) do
{:ok, %{args: %{label: label}} = rpc} ->
ref = make_ref()
Logger.debug("executing rpc: #{inspect(rpc)}")
FarmbotCeleryScript.execute(rpc, ref)
loop(farmware_name, runtime, monitor, {ref, label})
{:error, :no_rpc} ->
loop(farmware_name, runtime, monitor, {ref, label})
end
end
end