Add new field to informational_settings: `idle`
parent
3dcc8af3aa
commit
75c113227c
|
@ -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}}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue