Add new field to informational_settings: `idle`

pull/974/head
Connor Rigby 2019-04-09 13:25:24 -07:00
parent 3dcc8af3aa
commit 75c113227c
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
7 changed files with 57 additions and 3 deletions

View File

@ -1,6 +1,7 @@
defmodule FarmbotCore.BotState do
@moduledoc "Central State accumulator."
alias FarmbotCore.BotStateNG
require FarmbotCore.Logger
use GenServer
@doc "Subscribe to BotState changes"
@ -82,6 +83,10 @@ defmodule FarmbotCore.BotState do
GenServer.call(bot_state_server, {:set_firmware_busy, busy})
end
@doc "Sets informational_settings.idle"
def set_firmware_idle(bot_state_server \\ __MODULE__, idle) do
GenServer.call(bot_state_server, {:set_firmware_idle, idle})
end
@doc "Sets informational_settings.status"
def set_sync_status(bot_state_server \\ __MODULE__, s)
@ -145,6 +150,10 @@ defmodule FarmbotCore.BotState do
{:ok, %{tree: BotStateNG.new(), subscribers: []}}
end
def terminate(reason, _state) do
FarmbotCore.Logger.error 1, "BotState crashed! #{inspect(reason)}"
end
@doc false
def handle_call(:subscribe, {pid, _} = _from, state) do
Process.link(pid)
@ -285,6 +294,16 @@ defmodule FarmbotCore.BotState do
{:reply, reply, state}
end
def handle_call({:set_firmware_idle, idle}, _from, state) do
change = %{informational_settings: %{idle: idle}}
{reply, state} =
BotStateNG.changeset(state.tree, change)
|> dispatch_and_apply(state)
{:reply, reply, state}
end
def handle_call({:set_sync_status, status}, _from, state) do
change = %{informational_settings: %{sync_status: status}}

View File

@ -6,10 +6,10 @@ defmodule FarmbotCore.BotState.Supervisor do
end
def init([]) do
children = [
children = [
FarmbotCore.BotState,
FarmbotCore.BotState.FileSystem
]
Supervisor.init(children, [strategy: :one_for_one])
Supervisor.init(children, [strategy: :one_for_all])
end
end
end

View File

@ -26,6 +26,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
field(:last_status, :string)
field(:cache_bust, :integer)
field(:busy, :boolean)
field(:idle, :boolean)
field(:update_available, :boolean, default: false)
end
@ -54,6 +55,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
last_status: informational_settings.last_status,
cache_bust: informational_settings.cache_bust,
busy: informational_settings.busy,
idle: informational_settings.idle,
update_available: informational_settings.update_available
}
end
@ -78,6 +80,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
:last_status,
:cache_bust,
:busy,
:idle,
:update_available
])
end

View File

@ -6,38 +6,48 @@ defmodule FarmbotCore.FirmwareSideEffects do
alias FarmbotCore.{Asset, BotState}
alias FarmbotCore.FirmwareEstopTimer
@impl FarmbotFirmware.SideEffects
def handle_position(x: x, y: y, z: z) do
:ok = BotState.set_position(x, y, z)
end
@impl FarmbotFirmware.SideEffects
def handle_position_change([{_axis, _value}]) do
:noop
end
@impl FarmbotFirmware.SideEffects
def handle_axis_state([{_axis, _state}]) do
:noop
end
@impl FarmbotFirmware.SideEffects
def handle_calibration_state([{_axis, _state}]) do
:noop
end
@impl FarmbotFirmware.SideEffects
def handle_encoders_scaled(x: x, y: y, z: z) do
:ok = BotState.set_encoders_scaled(x, y, z)
end
@impl FarmbotFirmware.SideEffects
def handle_encoders_raw(x: x, y: y, z: z) do
:ok = BotState.set_encoders_raw(x, y, z)
end
@impl FarmbotFirmware.SideEffects
def handle_paramater_value([{param, value}]) do
:ok = BotState.set_firmware_config(param, value)
end
@impl FarmbotFirmware.SideEffects
def handle_pin_value(p: pin, v: value) do
:ok = BotState.set_pin_value(pin, value)
end
@impl FarmbotFirmware.SideEffects
def handle_software_version([version]) do
:ok = BotState.set_firmware_version(version)
case String.split(version, ".") do
@ -52,39 +62,53 @@ defmodule FarmbotCore.FirmwareSideEffects do
end
end
@impl FarmbotFirmware.SideEffects
def handle_end_stops(_) do
:noop
end
@impl FarmbotFirmware.SideEffects
def handle_busy(busy) do
:ok = BotState.set_firmware_busy(busy)
end
@impl FarmbotFirmware.SideEffects
def handle_idle(idle) do
:ok = BotState.set_firmware_idle(idle)
end
@impl FarmbotFirmware.SideEffects
def handle_emergency_lock() do
_ = FirmwareEstopTimer.start_timer()
:ok = BotState.set_firmware_locked()
end
@impl FarmbotFirmware.SideEffects
def handle_emergency_unlock() do
_ = FirmwareEstopTimer.cancel_timer()
:ok = BotState.set_firmware_unlocked()
end
@impl FarmbotFirmware.SideEffects
def handle_input_gcode(code) do
should_log? = Asset.fbos_config().firmware_input_log
should_log? && FarmbotCore.Logger.debug(3, inspect(code))
end
@impl FarmbotFirmware.SideEffects
def handle_output_gcode(code) do
should_log? = Asset.fbos_config().firmware_output_log
should_log? && FarmbotCore.Logger.debug(3, inspect(code))
end
@impl FarmbotFirmware.SideEffects
def handle_debug_message([message]) do
should_log? = Asset.fbos_config().firmware_debug_log
should_log? && FarmbotCore.Logger.debug(3, "Arduino debug message: " <> message)
end
@impl FarmbotFirmware.SideEffects
def load_params do
conf = Asset.firmware_config()

View File

@ -427,6 +427,7 @@ defmodule FarmbotFirmware do
# report_idle => goto(_, :idle)
def handle_report({:report_idle, []}, %{status: _} = state) do
side_effects(state, :handle_busy, [false])
side_effects(state, :handle_idle, [true])
{:noreply, goto(%{state | caller_pid: nil, current: nil}, :idle), 0}
end

View File

@ -1,4 +1,8 @@
defmodule FarmbotFirmware.SideEffects do
@moduledoc """
Callback functions that the firmware process will call on certain events.
"""
alias FarmbotFirmware.{GCODE, Param}
@type axis :: :x | :y | :z
@ -18,6 +22,7 @@ defmodule FarmbotFirmware.SideEffects do
@callback handle_pin_value(p: integer(), v: integer()) :: any()
@callback handle_software_version([String.t()]) :: any()
@callback handle_busy(boolean()) :: any()
@callback handle_idle(boolean()) :: any()
@type axis_state :: :stop | :idle | :begin | :crawl | :decelerate | :accelerate
@callback handle_axis_state([{axis(), axis_state}]) :: any()

View File

@ -120,6 +120,8 @@ defmodule FarmbotFirmware.StubSideEffects do
def handle_busy(_), do: :noop
def handle_idle(_), do: :noop
def handle_input_gcode(_), do: :noop
def handle_output_gcode(_), do: :noop