187 lines
4.9 KiB
Elixir
187 lines
4.9 KiB
Elixir
alias Farmbot.BotState.Hardware, as: Hardware
|
|
alias Farmbot.BotState.Configuration, as: Configuration
|
|
alias Farmbot.BotState.Authorization, as: Authorization
|
|
|
|
defmodule Farmbot.BotState do
|
|
require Logger
|
|
@moduledoc """
|
|
Functions to modifying Farmbot's state
|
|
all in one convenient (and easy to spell) location.
|
|
"""
|
|
|
|
@doc """
|
|
Gets the current position of the bot. Returns [x,y,z]
|
|
"""
|
|
@spec get_current_pos() :: [integer, ...]
|
|
def get_current_pos do
|
|
GenServer.call(Hardware, :get_current_pos)
|
|
end
|
|
|
|
@doc """
|
|
Sets the position to givin position.
|
|
"""
|
|
@spec set_pos(integer,integer,integer) :: :ok
|
|
def set_pos(x, y, z)
|
|
when is_integer(x) and is_integer(y) and is_integer(z) do
|
|
GenServer.cast(Hardware, {:set_pos, {x, y, z}})
|
|
end
|
|
|
|
@doc """
|
|
Sets a pin under the given value
|
|
"""
|
|
@spec set_pin_value(integer, integer) :: :ok
|
|
def set_pin_value(pin, value) when is_integer(pin) and is_integer(value) do
|
|
GenServer.cast(Hardware, {:set_pin_value, {pin, value}})
|
|
end
|
|
|
|
@doc """
|
|
Sets a mode for a particular pin.
|
|
This should happen before setting the value if possible.
|
|
"""
|
|
@spec set_pin_mode(integer,0 | 1) :: :ok
|
|
def set_pin_mode(pin, mode)
|
|
when is_integer(pin) and is_integer(mode) do
|
|
GenServer.cast(Hardware, {:set_pin_mode, {pin, mode}})
|
|
end
|
|
|
|
@doc """
|
|
Sets a param to a particular value.
|
|
This should be the human readable atom version of the param.
|
|
"""
|
|
@spec set_param(atom, integer) :: :ok
|
|
def set_param(param, value) when is_atom(param) do
|
|
GenServer.cast(Hardware, {:set_param, {param, value}})
|
|
end
|
|
|
|
@doc """
|
|
Sets the current end stops
|
|
"""
|
|
@spec set_end_stops(Hardware.State.end_stops) :: :ok
|
|
def set_end_stops({xa,xb,ya,yb,za,zc}) do
|
|
GenServer.cast(Hardware, {:set_end_stops, {xa,xb,ya,yb,za,zc}})
|
|
end
|
|
|
|
@doc """
|
|
Gets the map of every param.
|
|
Useful for resetting params if the arduino flops
|
|
"""
|
|
@spec get_all_mcu_params :: Hardware.State.mcu_params
|
|
def get_all_mcu_params do
|
|
GenServer.call(Hardware, :get_all_mcu_params)
|
|
end
|
|
|
|
@doc """
|
|
gets the value of a pin.
|
|
"""
|
|
@spec get_pin(integer) :: %{mode: 0 | 1, value: number}
|
|
def get_pin(pin_number) when is_integer(pin_number) do
|
|
GenServer.call(Hardware, {:get_pin, pin_number})
|
|
end
|
|
|
|
@doc """
|
|
Gets the current firmware version
|
|
This is just a shortcut
|
|
"""
|
|
@spec get_fw_version :: String.t
|
|
def get_fw_version, do: get_param(:param_version)
|
|
|
|
@doc """
|
|
Gets the value of a param
|
|
"""
|
|
@spec get_param(atom) :: integer | nil
|
|
def get_param(param), do: GenServer.call(Hardware, {:get_param, param})
|
|
|
|
@doc """
|
|
Gets the most recent token
|
|
"""
|
|
@spec get_token :: Token.t
|
|
def get_token do
|
|
GenServer.call(Authorization, :get_token)
|
|
end
|
|
|
|
@doc """
|
|
Gets the server that Configuratior sent over.
|
|
"""
|
|
@spec get_server :: String.t | nil
|
|
def get_server do
|
|
GenServer.call(Authorization, :get_server)
|
|
end
|
|
|
|
@doc """
|
|
Adds credentials.
|
|
TODO: FIX THIS DONT STORE PASS IN PLAIN TEXT YOU NOOB
|
|
"""
|
|
@spec add_creds({String.t, String.t, String.t}) :: :ok
|
|
def add_creds({email, pass, server}) do
|
|
GenServer.cast(Authorization, {:creds, {email, pass, server}})
|
|
end
|
|
|
|
@doc """
|
|
Gets the current controller version
|
|
"""
|
|
@spec get_os_version :: String.t
|
|
def get_os_version do
|
|
GenServer.call(Configuration, :get_version)
|
|
end
|
|
|
|
@doc """
|
|
Update a config under key
|
|
"""
|
|
@spec update_config(String.t, any) :: :ok | {:error, atom}
|
|
def update_config(config_key, value)
|
|
when is_bitstring(config_key) do
|
|
GenServer.call(Configuration, {:update_config, config_key, value})
|
|
end
|
|
|
|
@doc """
|
|
Gets the value stored under key.
|
|
"""
|
|
@spec get_config(atom) :: nil | any
|
|
def get_config(config_key) when is_atom(config_key) do
|
|
GenServer.call(Configuration, {:get_config, config_key})
|
|
end
|
|
|
|
@spec get_lock(String.t) :: integer | nil
|
|
def get_lock(string) when is_bitstring(string) do
|
|
GenServer.call(Configuration, {:get_lock, string})
|
|
end
|
|
|
|
@spec add_lock(String.t) :: :ok
|
|
def add_lock(string) when is_bitstring(string) do
|
|
GenServer.cast(Configuration, {:add_lock, string})
|
|
end
|
|
|
|
@spec remove_lock(String.t) :: :ok | {:error, atom}
|
|
def remove_lock(string) when is_bitstring(string) do
|
|
GenServer.call(Configuration, {:remove_lock, string})
|
|
end
|
|
|
|
def set_end_stop(_something) do
|
|
#TODO
|
|
nil
|
|
end
|
|
|
|
@doc """
|
|
This might be more suited for somewhere else maybe?
|
|
"""
|
|
@spec set_time() :: :ok
|
|
def set_time do
|
|
Logger.debug ">> is getting time from NTP."
|
|
System.cmd("ntpd", ["-q",
|
|
"-p", "0.pool.ntp.org",
|
|
"-p", "1.pool.ntp.org",
|
|
"-p", "2.pool.ntp.org",
|
|
"-p", "3.pool.ntp.org"])
|
|
check_time_set
|
|
Logger.debug ">> now has proper time!"
|
|
:ok
|
|
end
|
|
|
|
defp check_time_set do
|
|
if :os.system_time(:seconds) < 1_474_929 do
|
|
# prize to whoever finds what this date is!
|
|
check_time_set # wait until time is set
|
|
end
|
|
end
|
|
end
|