Implement fbos sys_calls

pull/974/head
Connor Rigby 2019-04-15 16:04:50 -07:00
parent 2a1db21546
commit 3417870bb3
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
2 changed files with 52 additions and 3 deletions

View File

@ -4,9 +4,15 @@ defmodule FarmbotOS.SysCalls do
alias FarmbotCeleryScript.AST
alias FarmbotFirmware
alias FarmbotOS.SysCalls.{SendMessage, ExecuteScript, FlashFirmware}
alias FarmbotOS.SysCalls.{
SendMessage,
ExecuteScript,
FlashFirmware,
ChangeOwnership,
DumpInfo
}
alias FarmbotCore.{Asset, Asset.Repo, Asset.Sync, BotState}
alias FarmbotCore.{Asset, Asset.Repo, Asset.Private, Asset.Sync, BotState}
alias FarmbotExt.{API, API.Reconciler, API.SyncGroup}
alias Ecto.{Changeset, Multi}
@ -15,6 +21,49 @@ defmodule FarmbotOS.SysCalls do
defdelegate send_message(level, message, channels), to: SendMessage
defdelegate execute_script(name, env), to: ExecuteScript
defdelegate flash_firmware(package), to: FlashFirmware
defdelegate change_ownership(email, secret), to: ChangeOwnership
defdelegate dump_info(), to: DumpInfo
def reboot do
FarmbotOS.System.reboot("Reboot requested by sequence or frontend")
:ok
end
def power_off do
FarmbotOS.System.reboot("Shut down requested by sequence or frontend")
:ok
end
def factory_reset do
FarmbotOS.System.factory_reset("Factory reset requested by sequence or frontent")
:ok
end
def firmware_reboot do
GenServer.stop(FarmbotFirmware, :reboot)
end
def resource_update(kind, id, params) do
module = Module.concat(Asset, kind)
with true <- Code.ensure_loaded?(module),
%{} = orig <- Repo.get_by(module, [id: id], preload: [:local_meta]),
%{valid?: true} = change <- module.changeset(orig, params),
{:ok, new} <- Repo.update(change),
new <- Repo.preload(new, [:local_meta]) do
Private.mark_dirty!(new, %{})
:ok
else
false ->
{:error, "unknown asset kind: #{kind}"}
nil ->
{:error, "Could not find asset by kind: #{kind} and id: #{id}"}
%{valid?: false} = changeset ->
{:error, "failed to update #{kind}: #{inspect(changeset.errors)}"}
end
end
def read_status do
:ok = FarmbotExt.AMQP.BotStateNGChannel.force()

View File

@ -12,7 +12,7 @@ defmodule Mix.Tasks.Farmbot.Firmware.Reload do
farmbot_node = String.to_atom(farmbot_node)
mods = get_mods(opts)
{:ok, _} = Node.start(:console)
{:ok, _} = Node.start(:reload)
Node.set_cookie(:democookie)
true = Node.connect(farmbot_node)