Add new field to bot state

bot_state.location_data.axis_states now contains a vec3 of strings of
current axis states
pull/974/head
Connor Rigby 2019-09-13 11:16:27 -07:00
parent 4a8689f206
commit 4dcc20fda7
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
5 changed files with 97 additions and 41 deletions

View File

@ -34,16 +34,20 @@ defmodule FarmbotCore.BotState do
GenServer.call(bot_state_server, {:set_encoders_scaled, x, y, z})
end
@doc "Sets pins.pin.value"
def set_pin_value(bot_state_server \\ __MODULE__, pin, value) do
GenServer.call(bot_state_server, {:set_pin_value, pin, value})
end
@doc "Sets the location_data.encoders_raw"
def set_encoders_raw(bot_state_server \\ __MODULE__, x, y, z) do
GenServer.call(bot_state_server, {:set_encoders_raw, x, y, z})
end
def set_axis_state(bot_state_server \\ __MODULE__, axis, state) do
GenServer.call(bot_state_server, {:set_axis_state, axis, state})
end
@doc "Sets pins.pin.value"
def set_pin_value(bot_state_server \\ __MODULE__, pin, value) do
GenServer.call(bot_state_server, {:set_pin_value, pin, value})
end
@doc "Sets mcu_params[param] = value"
def set_firmware_config(bot_state_server \\ __MODULE__, param, value) do
GenServer.call(bot_state_server, {:set_firmware_config, param, value})
@ -220,6 +224,22 @@ defmodule FarmbotCore.BotState do
{:reply, reply, state}
end
def handle_call({:set_axis_state, axis, axis_state}, _from, state) do
change = %{
location_data: %{
axis_states: %{
state.location_data.axis_states | axis => to_string(axis_state)
}
}
}
{reply, state} =
BotStateNG.changeset(state.tree, change)
|> dispatch_and_apply(state)
{:reply, reply, state}
end
def handle_call({:set_pin_value, pin, value}, _from, state) do
{reply, state} =
BotStateNG.add_or_update_pin(state.tree, pin, -1, value)

View File

@ -1,48 +1,17 @@
defmodule FarmbotCore.BotStateNG.LocationData do
@moduledoc false
alias FarmbotCore.BotStateNG.LocationData
alias LocationData.{Vec3, Vec3String}
use Ecto.Schema
import Ecto.Changeset
@primary_key false
defmodule Vec3 do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
@primary_key false
embedded_schema do
field(:x, :float)
field(:y, :float)
field(:z, :float)
end
def new do
%__MODULE__{}
|> changeset(%{x: -1, y: -1, z: -1})
|> apply_changes()
end
def view(vec3) do
%{
x: vec3.x,
y: vec3.y,
z: vec3.z
}
end
def changeset(vec3, params \\ %{}) do
vec3
|> cast(params, [:x, :y, :z])
end
end
embedded_schema do
embeds_one(:scaled_encoders, Vec3, on_replace: :update)
embeds_one(:raw_encoders, Vec3, on_replace: :update)
embeds_one(:position, Vec3, on_replace: :update)
embeds_one(:axis_states, Vec3String, on_replace: :update)
end
def new do
@ -51,6 +20,7 @@ defmodule FarmbotCore.BotStateNG.LocationData do
|> put_embed(:scaled_encoders, Vec3.new(), [])
|> put_embed(:raw_encoders, Vec3.new(), [])
|> put_embed(:position, Vec3.new(), [])
|> put_embed(:axis_states, Vec3String.new(), [])
|> apply_changes()
end
@ -58,7 +28,8 @@ defmodule FarmbotCore.BotStateNG.LocationData do
%{
scaled_encoders: Vec3.view(location_data.scaled_encoders),
raw_encoders: Vec3.view(location_data.raw_encoders),
position: Vec3.view(location_data.position)
position: Vec3.view(location_data.position),
axis_states: Vec3String.view(location_data.axis_states)
}
end
@ -68,5 +39,6 @@ defmodule FarmbotCore.BotStateNG.LocationData do
|> cast_embed(:scaled_encoders)
|> cast_embed(:raw_encoders)
|> cast_embed(:position)
|> cast_embed(:axis_states)
end
end

View File

@ -0,0 +1,32 @@
defmodule FarmbotCore.BotStateNG.LocationData.Vec3 do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
@primary_key false
embedded_schema do
field(:x, :float)
field(:y, :float)
field(:z, :float)
end
def new do
%__MODULE__{}
|> changeset(%{x: -1, y: -1, z: -1})
|> apply_changes()
end
def view(vec3) do
%{
x: vec3.x,
y: vec3.y,
z: vec3.z
}
end
def changeset(vec3, params \\ %{}) do
vec3
|> cast(params, [:x, :y, :z])
end
end

View File

@ -0,0 +1,32 @@
defmodule FarmbotCore.BotStateNG.LocationData.Vec3String do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
@primary_key false
embedded_schema do
field(:x, :string)
field(:y, :string)
field(:z, :string)
end
def new do
%__MODULE__{}
|> changeset(%{x: "unknown", y: "unknown", z: "unknown"})
|> apply_changes()
end
def view(vec3) do
%{
x: vec3.x,
y: vec3.y,
z: vec3.z
}
end
def changeset(vec3, params \\ %{}) do
vec3
|> cast(params, [:x, :y, :z])
end
end

View File

@ -16,8 +16,8 @@ defmodule FarmbotCore.FirmwareSideEffects do
end
@impl FarmbotFirmware.SideEffects
def handle_axis_state([{_axis, _state}]) do
:noop
def handle_axis_state([{axis, state}]) do
BotState.set_axis_state(axis, state)
end
@impl FarmbotFirmware.SideEffects