Fix Farmware Hanging sequences
parent
c25a6b9c53
commit
f4d48b9454
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue