Rename FarmbotOS namespace
parent
08cec79db6
commit
95bd827518
|
@ -2,23 +2,13 @@ version: 2.0
|
|||
defaults: &defaults
|
||||
working_directory: /nerves/build
|
||||
docker:
|
||||
<<<<<<< HEAD
|
||||
- image: nervesproject/nerves_system_br:1.6.8
|
||||
environment:
|
||||
ELIXIR_VERSION: 1.8.1
|
||||
=======
|
||||
- image: nervesproject/nerves_system_br:1.6.1
|
||||
>>>>>>> 69c76945... Update to Elixir 1.8!!
|
||||
|
||||
install_elixir: &install_elixir
|
||||
run:
|
||||
name: Install Elixir
|
||||
command: |
|
||||
<<<<<<< HEAD
|
||||
wget https://github.com/elixir-lang/elixir/releases/download/v1.8.1/Precompiled.zip
|
||||
=======
|
||||
wget https://github.com/elixir-lang/elixir/releases/download/v1.8.0/Precompiled.zip
|
||||
>>>>>>> 69c76945... Update to Elixir 1.8!!
|
||||
unzip -d /usr/local/elixir Precompiled.zip
|
||||
echo 'export PATH=/usr/local/elixir/bin:$PATH' >> $BASH_ENV
|
||||
|
||||
|
@ -423,11 +413,7 @@ jobs:
|
|||
<<: *defaults
|
||||
environment:
|
||||
MIX_ENV: prod
|
||||
<<<<<<< HEAD
|
||||
ELIXIR_VERSION: 1.8.1
|
||||
=======
|
||||
ELIXIR_VERSION: 1.8.0
|
||||
>>>>>>> 69c76945... Update to Elixir 1.8!!
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
|
@ -483,11 +469,7 @@ jobs:
|
|||
<<: *defaults
|
||||
environment:
|
||||
MIX_ENV: prod
|
||||
<<<<<<< HEAD
|
||||
ELIXIR_VERSION: 1.8.1
|
||||
=======
|
||||
ELIXIR_VERSION: 1.8.0
|
||||
>>>>>>> 69c76945... Update to Elixir 1.8!!
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
|
|
|
@ -1,19 +1,21 @@
|
|||
use Mix.Config
|
||||
|
||||
config :farmbot_core, Farmbot.AssetWorker.Farmbot.Asset.FarmEvent, checkup_time_ms: 10_000
|
||||
config :farmbot_core, Farmbot.AssetWorker.Farmbot.Asset.PersistentRegimen, checkup_time_ms: 10_000
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmEvent, checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, Farmbot.AssetWorker.Farmbot.Asset.FarmwareInstallation,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen,
|
||||
checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmwareInstallation,
|
||||
error_retry_time_ms: 30_000,
|
||||
install_dir: "/tmp/farmware"
|
||||
|
||||
config :farmbot_core, Elixir.Farmbot.AssetWorker.Farmbot.Asset.PinBinding,
|
||||
gpio_handler: Farmbot.PinBindingWorker.StubGPIOHandler,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding,
|
||||
gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler,
|
||||
error_retry_time_ms: 30_000
|
||||
|
||||
config :farmbot_core, Farmbot.Leds, gpio_handler: Farmbot.Leds.StubHandler
|
||||
config :farmbot_core, FarmbotCore.Leds, gpio_handler: FarmbotCore.Leds.StubHandler
|
||||
|
||||
config :farmbot_core, Farmbot.JSON, json_parser: Farmbot.JSON.JasonParser
|
||||
config :farmbot_core, FarmbotCore.JSON, json_parser: FarmbotCore.JSON.JasonParser
|
||||
|
||||
# Customize non-Elixir parts of the firmware. See
|
||||
# https://hexdocs.pm/nerves/advanced-configuration.html for details.
|
||||
|
@ -21,33 +23,36 @@ config :nerves, :firmware,
|
|||
rootfs_overlay: "rootfs_overlay",
|
||||
provisioning: :nerves_hub
|
||||
|
||||
config :farmbot_core, Farmbot.AssetMonitor, checkup_time_ms: 30_000
|
||||
config :farmbot_core, FarmbotCore.AssetMonitor, checkup_time_ms: 30_000
|
||||
|
||||
config :farmbot_core, Farmbot.EctoMigrator,
|
||||
config :farmbot_core, FarmbotCore.EctoMigrator,
|
||||
default_firmware_io_logs: false,
|
||||
default_server: "https://my.farm.bot",
|
||||
default_ntp_server_1: "0.pool.ntp.org",
|
||||
default_ntp_server_2: "1.pool.ntp.org",
|
||||
default_dns_name: "my.farm.bot",
|
||||
default_currently_on_beta:
|
||||
String.contains?(to_string(:os.cmd('git rev-parse --abbrev-ref HEAD')), "beta")
|
||||
|
||||
config :farmbot_celery_script, Farmbot.CeleryScript.SysCalls, sys_calls: Farmbot.System.SysCalls
|
||||
config :farmbot_celery_script, FarmbotCeleryScript.SysCalls, sys_calls: FarmbotOS.SysCalls
|
||||
|
||||
config :farmbot_core, Farmbot.BotState.FileSystem,
|
||||
config :farmbot_core, FarmbotCore.BotState.FileSystem,
|
||||
root_dir: "/tmp/farmbot_state",
|
||||
sleep_time: 200
|
||||
|
||||
config :farmbot_core, Farmbot.FarmwareRuntime, runtime_dir: "/tmp/farmware_runtime"
|
||||
config :farmbot_core, FarmbotCore.FarmwareRuntime, runtime_dir: "/tmp/farmware_runtime"
|
||||
|
||||
config :ecto, json_library: Farmbot.JSON
|
||||
config :ecto, json_library: FarmbotCore.JSON
|
||||
|
||||
config :farmbot_core,
|
||||
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo]
|
||||
ecto_repos: [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo]
|
||||
|
||||
config :farmbot, Farmbot.OS.FileSystem, data_path: "/tmp/farmbot"
|
||||
config :farmbot, Farmbot.System, system_tasks: Farmbot.Host.SystemTasks
|
||||
config :farmbot, FarmbotOS.FileSystem, data_path: "/tmp/farmbot"
|
||||
config :farmbot, FarmbotOS.System, system_tasks: FarmbotOS.Platform.Host.SystemTasks
|
||||
|
||||
config :farmbot, Farmbot.Platform.Supervisor,
|
||||
config :farmbot, FarmbotOS.Platform.Supervisor,
|
||||
platform_children: [
|
||||
Farmbot.Host.Configurator
|
||||
FarmbotOS.Platform.Host.Configurator
|
||||
]
|
||||
|
||||
import_config("lagger.exs")
|
||||
|
|
|
@ -6,37 +6,37 @@ File.mkdir_p(data_path)
|
|||
config :farmbot_ext,
|
||||
data_path: data_path
|
||||
|
||||
config :farmbot_core, Farmbot.Config.Repo,
|
||||
config :farmbot_core, FarmbotCore.Config.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "config-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Logger.Repo,
|
||||
config :farmbot_core, FarmbotCore.Logger.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Asset.Repo,
|
||||
config :farmbot_core, FarmbotCore.Asset.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot, Farmbot.System.Init.Supervisor,
|
||||
config :farmbot, FarmbotOS.Init.Supervisor,
|
||||
init_children: [
|
||||
Farmbot.TTYDetector,
|
||||
Farmbot.Host.Configurator
|
||||
FarmbotOS.TTYDetector,
|
||||
FarmbotOS.Platform.Host.Configurator
|
||||
]
|
||||
|
||||
config :farmbot,
|
||||
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo]
|
||||
ecto_repos: [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo]
|
||||
|
||||
config :farmbot, Farmbot.TTYDetector,
|
||||
config :farmbot, FarmbotOS.TTYDetector,
|
||||
expected_names: [
|
||||
System.get_env("FARMBOT_TTY")
|
||||
]
|
||||
|
||||
config :farmbot_ext, Farmbot.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: Farmbot.System.NervesHub
|
||||
config :farmbot_ext, FarmbotExt.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: FarmbotOS.NervesHub
|
||||
|
||||
config :farmbot, Farmbot.System.NervesHub,
|
||||
farmbot_nerves_hub_handler: Farmbot.Host.NervesHubHandler
|
||||
config :farmbot, FarmbotOS.NervesHub,
|
||||
farmbot_nerves_hub_handler: FarmbotOS.Platform.Host.NervesHubHandler
|
||||
|
|
|
@ -10,33 +10,33 @@ config :logger_backend_ecto, LoggerBackendEcto.Repo,
|
|||
adapter: Sqlite.Ecto2,
|
||||
database: Path.join(data_path, "logs.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Config.Repo,
|
||||
config :farmbot_core, FarmbotCore.Config.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "config-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Logger.Repo,
|
||||
config :farmbot_core, FarmbotCore.Logger.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Asset.Repo,
|
||||
config :farmbot_core, FarmbotCore.Asset.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot,
|
||||
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo],
|
||||
ecto_repos: [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo],
|
||||
platform_children: [
|
||||
{Farmbot.Host.Configurator, []}
|
||||
{Farmbot.Platform.Host.Configurator, []}
|
||||
]
|
||||
|
||||
config :farmbot, Farmbot.TTYDetector, expected_names: []
|
||||
config :farmbot, FarmbotOS.TTYDetector, expected_names: []
|
||||
|
||||
config :farmbot_ext, Farmbot.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: Farmbot.System.NervesHub
|
||||
config :farmbot_ext, FarmbotExt.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: FarmbotOS.NervesHub
|
||||
|
||||
config :farmbot, Farmbot.System.NervesHub,
|
||||
farmbot_nerves_hub_handler: Farmbot.Host.NervesHubHandler
|
||||
config :farmbot, FarmbotOS.NervesHub,
|
||||
farmbot_nerves_hub_handler: FarmbotOS.Platform.Host.NervesHubHandler
|
||||
|
||||
config :farmbot_core, :uart_handler, tty: "/dev/ttyACM0"
|
||||
|
|
|
@ -20,66 +20,64 @@ config :shoehorn,
|
|||
|
||||
config :tzdata, :autoupdate, :disabled
|
||||
|
||||
config :farmbot_core, Elixir.Farmbot.AssetWorker.Farmbot.Asset.PinBinding,
|
||||
gpio_handler: Farmbot.PinBindingWorker.CircuitsGPIOHandler,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding,
|
||||
gpio_handler: FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler,
|
||||
error_retry_time_ms: 30_000
|
||||
|
||||
config :farmbot_core, Farmbot.Leds, gpio_handler: Farmbot.Target.Leds.CircuitsHandler
|
||||
|
||||
config :farmbot_core, :behaviour, celery_script_io_layer: Farmbot.OS.IOLayer
|
||||
config :farmbot_core, FarmbotCore.Leds, gpio_handler: Farmbot.Platform.Target.Leds.CircuitsHandler
|
||||
|
||||
data_path = Path.join("/", "root")
|
||||
|
||||
config :farmbot, Farmbot.OS.FileSystem, data_path: data_path
|
||||
config :farmbot, FarmbotOS.FileSystem, data_path: data_path
|
||||
|
||||
config :logger_backend_ecto, LoggerBackendEcto.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
database: Path.join(data_path, "debug_logs.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Config.Repo,
|
||||
config :farmbot_core, FarmbotCore.Config.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "config-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Logger.Repo,
|
||||
config :farmbot_core, FarmbotCore.Logger.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Asset.Repo,
|
||||
config :farmbot_core, FarmbotCore.Asset.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot,
|
||||
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo]
|
||||
ecto_repos: [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo]
|
||||
|
||||
config :farmbot, Farmbot.System.Init.Supervisor,
|
||||
config :farmbot, FarmbotOS.Init.Supervisor,
|
||||
init_children: [
|
||||
Farmbot.Target.Leds.CircuitsHandler
|
||||
FarmbotOS.Platform.Target.Leds.CircuitsHandler
|
||||
]
|
||||
|
||||
config :farmbot, Farmbot.Platform.Supervisor,
|
||||
config :farmbot, FarmbotOS.Platform.Supervisor,
|
||||
platform_children: [
|
||||
Farmbot.System.NervesHub,
|
||||
Farmbot.Target.Network.Supervisor,
|
||||
Farmbot.Target.Configurator.Supervisor,
|
||||
Farmbot.Target.SSHConsole,
|
||||
Farmbot.Target.Uevent.Supervisor,
|
||||
Farmbot.Target.InfoWorker.Supervisor,
|
||||
Farmbot.TTYDetector
|
||||
FarmbotOS.NervesHub,
|
||||
FarmbotOS.Platform.Target.Network.Supervisor,
|
||||
FarmbotOS.Platform.Target.Configurator.Supervisor,
|
||||
FarmbotOS.Platform.Target.SSHConsole,
|
||||
FarmbotOS.Platform.Target.Uevent.Supervisor,
|
||||
FarmbotOS.Platform.Target.InfoWorker.Supervisor,
|
||||
FarmbotOS.TTYDetector
|
||||
]
|
||||
|
||||
config :farmbot_ext, Farmbot.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: Farmbot.System.NervesHub
|
||||
config :farmbot_ext, FarmbotExt.AMQP.NervesHubTransport,
|
||||
handle_nerves_hub_msg: FarmbotOS.NervesHub
|
||||
|
||||
config :farmbot, Farmbot.System.NervesHub,
|
||||
farmbot_nerves_hub_handler: Farmbot.System.NervesHubClient
|
||||
config :farmbot, FarmbotOS.NervesHub,
|
||||
farmbot_nerves_hub_handler: FarmbotOS.Platform.Target.NervesHubClient
|
||||
|
||||
config :farmbot, Farmbot.System, system_tasks: Farmbot.Target.SystemTasks
|
||||
config :farmbot, FarmbotOS.System, system_tasks: FarmbotOS.Platform.Target.SystemTasks
|
||||
|
||||
config :nerves_hub,
|
||||
client: Farmbot.System.NervesHubClient,
|
||||
client: FarmbotOS.Platform.Target.NervesHubClient,
|
||||
public_keys: [File.read!("priv/staging.pub"), File.read!("priv/prod.pub")]
|
||||
|
||||
config :nerves_hub, NervesHub.Socket, reconnect_interval: 5_000
|
||||
config :nerves_hub, NervesHub.Socket, reconnect_interval: 30_000
|
||||
|
|
|
@ -29,7 +29,7 @@ config :farmbot_core, Farmbot.Config.Repo,
|
|||
loggers: [],
|
||||
database: Path.join(data_path, "config-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot_core, Farmbot.Logger.Repo,
|
||||
config :farmbot_core, FarmbotCore.Logger.Repo,
|
||||
adapter: Sqlite.Ecto2,
|
||||
loggers: [],
|
||||
database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3")
|
||||
|
@ -40,7 +40,7 @@ config :farmbot_core, Farmbot.Asset.Repo,
|
|||
database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3")
|
||||
|
||||
config :farmbot,
|
||||
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo]
|
||||
ecto_repos: [Farmbot.Config.Repo, FarmbotCore.Logger.Repo, Farmbot.Asset.Repo]
|
||||
|
||||
config :farmbot, Farmbot.System.Init.Supervisor,
|
||||
init_children: [
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
use Mix.Config
|
||||
|
||||
config :farmbot, Farmbot.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0", "ttyS0"]
|
||||
config :farmbot, FarmbotOS.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0", "ttyS0"]
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
use Mix.Config
|
||||
config :farmbot, Farmbot.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]
|
||||
config :farmbot, FarmbotOS.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use Mix.Config
|
||||
config :farmbot, :captive_portal_address, "192.168.24.1"
|
||||
|
||||
config :farmbot, Farmbot.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]
|
||||
config :farmbot, FarmbotOS.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
defmodule Farmbot.BootState do
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@state_file Path.join(@data_path, "boot_state")
|
||||
|
||||
def read do
|
||||
case File.read(@state_file) do
|
||||
{:error, :enoent} -> write(:NEEDS_CONFIGURATION)
|
||||
{:error, _} = er -> er
|
||||
{:ok, data} -> data |> String.trim() |> String.to_atom()
|
||||
end
|
||||
end
|
||||
|
||||
def write(status)
|
||||
when status in [:NEEDS_CONFIGURATION, :CONFIGURATIONFAIL, :UPANDRUNNING] do
|
||||
File.write(@state_file, to_string(status) <> "\r\n")
|
||||
status
|
||||
end
|
||||
end
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.OS do
|
||||
defmodule FarmbotOS do
|
||||
# See https://hexdocs.pm/elixir/Application.html
|
||||
# for more information on OTP Applications
|
||||
@moduledoc false
|
||||
|
@ -7,9 +7,9 @@ defmodule Farmbot.OS do
|
|||
|
||||
def start(_type, _args) do
|
||||
children = [
|
||||
{Farmbot.System.Init.Supervisor, []},
|
||||
{Farmbot.Platform.Supervisor, []},
|
||||
{Farmbot.EasterEggs, []}
|
||||
{FarmbotOS.Init.Supervisor, []},
|
||||
{FarmbotOS.Platform.Supervisor, []},
|
||||
{FarmbotOS.EasterEggs, []}
|
||||
]
|
||||
|
||||
opts = [strategy: :one_for_one, name: __MODULE__]
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
defmodule Farmbot.EasterEggs do
|
||||
defmodule FarmbotOS.EasterEggs do
|
||||
@moduledoc false
|
||||
use GenServer
|
||||
require Farmbot.Logger
|
||||
alias FarmbotCore.{Asset, JSON}
|
||||
require FarmbotCore.Logger
|
||||
|
||||
@doc false
|
||||
def start_link(args) do
|
||||
|
@ -29,8 +30,8 @@ defmodule Farmbot.EasterEggs do
|
|||
end)
|
||||
|
||||
message = EEx.eval_string(verb, nouns)
|
||||
bot_name = Farmbot.Asset.device().name
|
||||
Farmbot.Logger.fun(3, Enum.join([bot_name, message], " "))
|
||||
bot_name = Asset.device().name
|
||||
FarmbotCore.Logger.fun(3, Enum.join([bot_name, message], " "))
|
||||
{:noreply, %{state | timer: timer}}
|
||||
end
|
||||
|
||||
|
@ -43,7 +44,7 @@ defmodule Farmbot.EasterEggs do
|
|||
defp load_data do
|
||||
Path.join(:code.priv_dir(:farmbot), "easter_eggs.json")
|
||||
|> File.read!()
|
||||
|> Farmbot.JSON.decode!()
|
||||
|> JSON.decode!()
|
||||
end
|
||||
|
||||
@ms_in_one_hour 3.6e+6 |> round()
|
|
@ -1,8 +1,8 @@
|
|||
defmodule Farmbot.OS.FileSystem do
|
||||
defmodule FarmbotOS.FileSystem do
|
||||
@data_path Application.get_env(:farmbot, __MODULE__)[:data_path]
|
||||
@data_path ||
|
||||
Mix.raise("""
|
||||
config :farmbot, Farmbot.OS.Filesystem,
|
||||
config :farmbot, FarmbotOS.Filesystem,
|
||||
data_path: "/path/to/folder"
|
||||
""")
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
defmodule Farmbot.System.Init.FSCheckup do
|
||||
defmodule FarmbotOS.Init.FSCheckup do
|
||||
@moduledoc false
|
||||
use Supervisor
|
||||
require Logger
|
||||
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
|
||||
@ref Farmbot.Project.commit()
|
||||
@version Farmbot.Project.version()
|
||||
@target Farmbot.Project.target()
|
||||
@env Farmbot.Project.env()
|
||||
@ref FarmbotCore.Project.commit()
|
||||
@version FarmbotCore.Project.version()
|
||||
@target FarmbotCore.Project.target()
|
||||
@env FarmbotCore.Project.env()
|
||||
System.put_env("NERVES_FW_VCS_IDENTIFIER", @ref)
|
||||
|
||||
@doc false
|
||||
|
@ -29,9 +29,6 @@ defmodule Farmbot.System.Init.FSCheckup do
|
|||
File.mkdir(@data_path)
|
||||
end
|
||||
|
||||
setup_boot_state_file()
|
||||
setup_multi_user()
|
||||
|
||||
Logger.debug("Checking #{check_file}")
|
||||
|
||||
msg = """
|
||||
|
@ -60,14 +57,6 @@ defmodule Farmbot.System.Init.FSCheckup do
|
|||
end
|
||||
end
|
||||
|
||||
defp setup_multi_user do
|
||||
multiuser_dir = Path.join([@data_path, "users", "default"])
|
||||
|
||||
unless File.exists?(multiuser_dir) do
|
||||
File.mkdir_p(multiuser_dir)
|
||||
end
|
||||
end
|
||||
|
||||
defp init_logger_backend_ecto do
|
||||
Logger.flush()
|
||||
|
||||
|
@ -80,12 +69,4 @@ defmodule Farmbot.System.Init.FSCheckup do
|
|||
File.rm(Path.join([@data_path, "root", "debug_logs.sqlite3"]))
|
||||
end
|
||||
end
|
||||
|
||||
defp setup_boot_state_file do
|
||||
file = Path.join(@data_path, "boot_state")
|
||||
|
||||
unless File.exists?(file) do
|
||||
Farmbot.BootState.write(:NEEDS_CONFIGURATION)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.System.Init.Supervisor do
|
||||
defmodule FarmbotOS.Init.Supervisor do
|
||||
use Supervisor
|
||||
|
||||
def start_link(args) do
|
||||
|
@ -11,7 +11,7 @@ defmodule Farmbot.System.Init.Supervisor do
|
|||
children =
|
||||
(config[:init_children] || []) ++
|
||||
[
|
||||
{Farmbot.System.Init.FSCheckup, []}
|
||||
{FarmbotOS.Init.FSCheckup, []}
|
||||
]
|
||||
|
||||
Supervisor.init(children, strategy: :one_for_all)
|
|
@ -1,10 +1,10 @@
|
|||
defmodule Farmbot.System.NervesHub do
|
||||
defmodule FarmbotOS.NervesHub do
|
||||
@moduledoc """
|
||||
Wrapper for NervesHub that can support both host and target environments.
|
||||
|
||||
Some things can be configured via Mix.Config:
|
||||
|
||||
config :farmfarmbot_osbot, Farmbot.System.NervesHub, [
|
||||
config :farmbot, Farmbot.NervesHub, [
|
||||
farmbot_nerves_hub_handler: SomeModule,
|
||||
app_env: "application:some_other_tag",
|
||||
extra_tags: ["some", "more", "tags"]
|
||||
|
@ -18,13 +18,11 @@ defmodule Farmbot.System.NervesHub do
|
|||
## On host.
|
||||
Just return :ok to everything.
|
||||
"""
|
||||
import Farmbot.Config,
|
||||
only: [
|
||||
get_config_value: 3,
|
||||
update_config_value: 4
|
||||
]
|
||||
alias FarmbotCore.Project
|
||||
alias FarmbotCore.Asset.{Repo, DeviceCert}
|
||||
import FarmbotCore.Config, only: [get_config_value: 3]
|
||||
|
||||
@behaviour Farmbot.AMQP.NervesHubTransport
|
||||
@behaviour FarmbotExt.AMQP.NervesHubTransport
|
||||
|
||||
@handler Application.get_env(:farmbot, __MODULE__)[:farmbot_nerves_hub_handler] ||
|
||||
Mix.raise("missing :farmbot_nerves_hub_handler module")
|
||||
|
@ -54,7 +52,7 @@ defmodule Farmbot.System.NervesHub do
|
|||
@callback uuid :: String.t()
|
||||
|
||||
use GenServer
|
||||
require Farmbot.Logger
|
||||
require FarmbotCore.Logger
|
||||
|
||||
def start_link(args \\ []) do
|
||||
GenServer.start_link(__MODULE__, args, name: __MODULE__)
|
||||
|
@ -65,7 +63,7 @@ defmodule Farmbot.System.NervesHub do
|
|||
end
|
||||
|
||||
def terminate(reason, state) do
|
||||
Farmbot.Logger.warn(
|
||||
FarmbotCore.Logger.warn(
|
||||
1,
|
||||
"OTA Service crash: #{inspect(reason)} when in state: #{inspect(state)}"
|
||||
)
|
||||
|
@ -75,11 +73,13 @@ defmodule Farmbot.System.NervesHub do
|
|||
channel = detect_channel()
|
||||
app_config = Application.get_env(:farmbot, __MODULE__, [])
|
||||
|
||||
"application:" <> _ = app_env = app_config[:app_env] || "application:#{Farmbot.Project.env()}"
|
||||
"application:" <> _ =
|
||||
app_env = app_config[:app_env] || "application:#{FarmbotCore.Project.env()}"
|
||||
|
||||
extra_tags = app_config[:extra_tags] || []
|
||||
|
||||
if nil in get_config() do
|
||||
Farmbot.Logger.debug(1, "Doing initial NervesHub provision.")
|
||||
FarmbotCore.Logger.debug(1, "Doing initial NervesHub provision.")
|
||||
:ok = deconfigure()
|
||||
:ok = provision()
|
||||
|
||||
|
@ -89,7 +89,7 @@ defmodule Farmbot.System.NervesHub do
|
|||
{:noreply, :configured}
|
||||
|
||||
{:error, reason} ->
|
||||
Farmbot.Logger.error(3, "OTA Service provision failed: #{inspect(reason)}")
|
||||
FarmbotCore.Logger.error(3, "OTA Service provision failed: #{inspect(reason)}")
|
||||
{:noreply, :not_configured, 10_000}
|
||||
end
|
||||
|
||||
|
@ -102,25 +102,13 @@ defmodule Farmbot.System.NervesHub do
|
|||
end
|
||||
|
||||
def detect_channel do
|
||||
<<<<<<< HEAD
|
||||
channel_from_branch = case Farmbot.Project.branch() do
|
||||
"master" -> "stable"
|
||||
"beta" -> "beta"
|
||||
"staging" -> "staging"
|
||||
branch -> branch
|
||||
end
|
||||
|
||||
channel_from_config = get_config_value(:string, "settings", "update_channel")
|
||||
"channel:#{channel_from_config || channel_from_branch}"
|
||||
=======
|
||||
get_config_value(:string, "settings", "update_channel") ||
|
||||
case Farmbot.Project.branch() do
|
||||
case Project.branch() do
|
||||
"master" -> "channel:stable"
|
||||
"beta" -> "channel:beta"
|
||||
"staging" -> "channel:staging"
|
||||
branch -> "channel:#{branch}"
|
||||
end
|
||||
>>>>>>> 6208022c... Format
|
||||
end
|
||||
|
||||
def get_config do
|
||||
|
@ -131,7 +119,7 @@ defmodule Farmbot.System.NervesHub do
|
|||
end
|
||||
|
||||
def connect do
|
||||
Farmbot.Logger.debug(1, "Connecting to OTA Service")
|
||||
FarmbotCore.Logger.debug(1, "Connecting to OTA Service")
|
||||
@handler.connect()
|
||||
end
|
||||
|
||||
|
@ -142,15 +130,14 @@ defmodule Farmbot.System.NervesHub do
|
|||
|
||||
# Sets Serial number in environment.
|
||||
def provision do
|
||||
Farmbot.Logger.debug(1, "Provisioning OTA Service")
|
||||
FarmbotCore.Logger.debug(1, "Provisioning OTA Service")
|
||||
:ok = @handler.provision(serial())
|
||||
end
|
||||
|
||||
# Creates a device in NervesHub
|
||||
# or updates it if one exists.
|
||||
def configure(tags) when is_list(tags) do
|
||||
alias Farmbot.Asset.{Repo, DeviceCert}
|
||||
Farmbot.Logger.debug(1, "Configuring OTA Service DeviceCert: #{inspect(tags)}")
|
||||
FarmbotCore.Logger.debug(1, "Configuring OTA Service DeviceCert: #{inspect(tags)}")
|
||||
serial = serial()
|
||||
old = Repo.get_by(DeviceCert, serial_number: serial) || %DeviceCert{}
|
||||
|
||||
|
@ -169,19 +156,19 @@ defmodule Farmbot.System.NervesHub do
|
|||
"-----BEGIN CERTIFICATE-----" <> _ = cert,
|
||||
"-----BEGIN EC PRIVATE KEY-----" <> _ = key
|
||||
) do
|
||||
Farmbot.Logger.debug(1, "Configuring certs for OTA Service")
|
||||
FarmbotCore.Logger.debug(1, "Configuring certs for OTA Service")
|
||||
:ok = @handler.configure_certs(cert, key)
|
||||
:ok
|
||||
end
|
||||
|
||||
def deconfigure do
|
||||
Farmbot.Logger.debug(1, "Deconfiguring OTA Service")
|
||||
FarmbotCore.Logger.debug(1, "Deconfiguring OTA Service")
|
||||
:ok = @handler.deconfigure()
|
||||
:ok
|
||||
end
|
||||
|
||||
def check_update do
|
||||
Farmbot.Logger.debug(1, "Check update OTA Service")
|
||||
FarmbotCore.Logger.debug(1, "Check update OTA Service")
|
||||
@handler.check_update()
|
||||
end
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.Platform.Supervisor do
|
||||
defmodule FarmbotOS.Platform.Supervisor do
|
||||
@moduledoc false
|
||||
|
||||
use Supervisor
|
|
@ -1,17 +1,25 @@
|
|||
defmodule Farmbot.System.SysCalls do
|
||||
alias Farmbot.CeleryScript.AST
|
||||
alias Farmbot.System.SysCalls.SendMessage
|
||||
alias Farmbot.Firmware
|
||||
@behaviour Farmbot.CeleryScript.SysCalls
|
||||
defmodule FarmbotOS.SysCalls do
|
||||
require FarmbotCore.Logger
|
||||
|
||||
alias FarmbotCeleryScript.AST
|
||||
alias FarmbotFirmware
|
||||
|
||||
alias FarmbotOS.SysCalls.SendMessage
|
||||
|
||||
alias FarmbotCore.{Asset, Asset.Repo, Asset.Sync, BotState}
|
||||
alias FarmbotExt.{API, API.Reconciler, API.SyncGroup}
|
||||
alias Ecto.{Changeset, Multi}
|
||||
|
||||
@behaviour FarmbotCeleryScript.SysCalls
|
||||
|
||||
defdelegate send_message(level, message, channels), to: SendMessage
|
||||
|
||||
def read_status do
|
||||
:ok = Farmbot.AMQP.BotStateNGTransport.force()
|
||||
:ok = FarmbotExt.AMQP.BotStateNGTransport.force()
|
||||
end
|
||||
|
||||
def set_user_env(key, value) do
|
||||
Farmbot.BotState.set_user_env(key, value)
|
||||
FarmbotCore.BotState.set_user_env(key, value)
|
||||
end
|
||||
|
||||
def get_current_x do
|
||||
|
@ -27,7 +35,7 @@ defmodule Farmbot.System.SysCalls do
|
|||
end
|
||||
|
||||
def read_pin(pin_number, mode) do
|
||||
case Firmware.request({nil, {:pin_read, [p: pin_number, m: mode]}}) do
|
||||
case FarmbotFirmware.request({nil, {:pin_read, [p: pin_number, m: mode]}}) do
|
||||
{:ok, {_, {:report_pin_value, [p: _, v: val]}}} ->
|
||||
val
|
||||
|
||||
|
@ -37,21 +45,21 @@ defmodule Farmbot.System.SysCalls do
|
|||
end
|
||||
|
||||
def write_pin(pin_number, mode, value) do
|
||||
case Farmbot.Firmware.command({:pin_write, [p: pin_number, v: value, m: mode]}) do
|
||||
case FarmbotFirmware.command({:pin_write, [p: pin_number, v: value, m: mode]}) do
|
||||
:ok -> :ok
|
||||
{:error, reason} -> {:error, reason}
|
||||
end
|
||||
end
|
||||
|
||||
def point(kind, id) do
|
||||
case Farmbot.Asset.get_point(id: id) do
|
||||
case Asset.get_point(id: id) do
|
||||
nil -> {:error, "#{kind} not found"}
|
||||
%{x: x, y: y, z: z} -> %{x: x, y: y, z: z}
|
||||
end
|
||||
end
|
||||
|
||||
defp get_position(axis) do
|
||||
case Farmbot.Firmware.request({nil, {:position_read, []}}) do
|
||||
case FarmbotFirmware.request({nil, {:position_read, []}}) do
|
||||
{:ok, {_, {:report_position, params}}} ->
|
||||
Keyword.fetch!(params, axis)
|
||||
|
||||
|
@ -63,7 +71,7 @@ defmodule Farmbot.System.SysCalls do
|
|||
def move_absolute(x, y, z, speed) do
|
||||
params = [x: x / 1.0, y: y / 1.0, z: z / 1.0, s: speed / 1.0]
|
||||
|
||||
case Firmware.command({nil, {:command_movement, params}}) do
|
||||
case FarmbotFirmware.command({nil, {:command_movement, params}}) do
|
||||
:ok ->
|
||||
:ok
|
||||
|
||||
|
@ -73,7 +81,7 @@ defmodule Farmbot.System.SysCalls do
|
|||
end
|
||||
|
||||
def calibrate(axis) do
|
||||
case Firmware.command({:command_movement_calibrate, axis}) do
|
||||
case FarmbotFirmware.command({:command_movement_calibrate, axis}) do
|
||||
:ok ->
|
||||
:ok
|
||||
|
||||
|
@ -83,24 +91,19 @@ defmodule Farmbot.System.SysCalls do
|
|||
end
|
||||
|
||||
def get_sequence(id) do
|
||||
case Farmbot.Asset.get_sequence(id: id) do
|
||||
case Asset.get_sequence(id: id) do
|
||||
nil -> {:error, "sequence not found"}
|
||||
%{} = sequence -> AST.decode(sequence)
|
||||
end
|
||||
end
|
||||
|
||||
require Farmbot.Logger
|
||||
alias Farmbot.{Asset.Repo, Asset.Sync, API}
|
||||
alias API.{Reconciler, SyncGroup}
|
||||
alias Ecto.{Changeset, Multi}
|
||||
|
||||
def sync() do
|
||||
Farmbot.Logger.busy(3, "Syncing")
|
||||
FarmbotCore.Logger.busy(3, "Syncing")
|
||||
sync_changeset = API.get_changeset(Sync)
|
||||
sync = Changeset.apply_changes(sync_changeset)
|
||||
multi = Multi.new()
|
||||
|
||||
:ok = Farmbot.BotState.set_sync_status("syncing")
|
||||
:ok = BotState.set_sync_status("syncing")
|
||||
|
||||
with {:ok, multi} <- Reconciler.sync_group(multi, sync, SyncGroup.group_1()),
|
||||
{:ok, multi} <- Reconciler.sync_group(multi, sync, SyncGroup.group_2()),
|
||||
|
@ -109,12 +112,12 @@ defmodule Farmbot.System.SysCalls do
|
|||
Multi.insert(multi, :syncs, sync_changeset)
|
||||
|> Repo.transaction()
|
||||
|
||||
Farmbot.Logger.success(3, "Synced")
|
||||
:ok = Farmbot.BotState.set_sync_status("synced")
|
||||
FarmbotCore.Logger.success(3, "Synced")
|
||||
:ok = BotState.set_sync_status("synced")
|
||||
:ok
|
||||
else
|
||||
error ->
|
||||
:ok = Farmbot.BotState.set_sync_status("sync_error")
|
||||
:ok = BotState.set_sync_status("sync_error")
|
||||
{:error, inspect(error)}
|
||||
end
|
||||
end
|
|
@ -1,5 +1,5 @@
|
|||
defmodule Farmbot.System.SysCalls.SendMessage do
|
||||
alias Farmbot.Firmware
|
||||
defmodule FarmbotOS.SysCalls.SendMessage do
|
||||
alias FarmbotFirmware
|
||||
@root_regex ~r/{{\s*[\w\.]+\s*}}/
|
||||
@extract_reg ~r/[\w\.]+/
|
||||
|
||||
|
@ -12,7 +12,7 @@ defmodule Farmbot.System.SysCalls.SendMessage do
|
|||
|
||||
case render(templ) do
|
||||
{:ok, message} ->
|
||||
Farmbot.Logger.dispatch_log(__ENV__, type, 1, message, meta)
|
||||
FarmbotCore.Logger.dispatch_log(__ENV__, type, 1, message, meta)
|
||||
:ok
|
||||
|
||||
er ->
|
||||
|
@ -21,7 +21,7 @@ defmodule Farmbot.System.SysCalls.SendMessage do
|
|||
end
|
||||
|
||||
def render(templ) do
|
||||
with {:ok, {_, {:report_position, pos}}} <- Firmware.request({:position_read, []}),
|
||||
with {:ok, {_, {:report_position, pos}}} <- FarmbotFirmware.request({:position_read, []}),
|
||||
{:ok, pins} <- pins(Enum.to_list(0..69)),
|
||||
env <- Keyword.merge(pos, pins) do
|
||||
env = Map.new(env, fn {k, v} -> {to_string(k), to_string(v)} end)
|
||||
|
@ -46,7 +46,7 @@ defmodule Farmbot.System.SysCalls.SendMessage do
|
|||
def pins(nums, acc \\ [])
|
||||
|
||||
def pins([p | rest], acc) do
|
||||
case Firmware.request({:pin_read, [p: p]}) do
|
||||
case FarmbotFirmware.request({:pin_read, [p: p]}) do
|
||||
{:ok, {_, {:report_pin_value, [p: ^p, v: v]}}} ->
|
||||
acc = Keyword.put(acc, :"pin#{p}", v)
|
||||
pins(rest, acc)
|
|
@ -1,8 +1,9 @@
|
|||
defmodule Farmbot.System do
|
||||
defmodule FarmbotOS.System do
|
||||
@moduledoc """
|
||||
Common functionality that should be implemented by a system
|
||||
"""
|
||||
require Farmbot.Logger
|
||||
require FarmbotCore.Logger
|
||||
alias FarmbotCore.{Asset, Project}
|
||||
|
||||
error_msg = """
|
||||
Please configure `:system_tasks`!
|
||||
|
@ -11,7 +12,7 @@ defmodule Farmbot.System do
|
|||
@system_tasks Application.get_env(:farmbot, __MODULE__)[:system_tasks]
|
||||
@system_tasks || Mix.raise(error_msg)
|
||||
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
|
||||
@doc "Restarts the machine."
|
||||
@callback reboot() :: any
|
||||
|
@ -30,25 +31,25 @@ defmodule Farmbot.System do
|
|||
end
|
||||
|
||||
defp try_lock_fw do
|
||||
if Process.whereis(Farmbot.Firmware) do
|
||||
Farmbot.Logger.warn(1, "Trying to emergency lock firmware before powerdown")
|
||||
Farmbot.Firmware.command({:command_emergency_lock, []})
|
||||
if Process.whereis(FarmbotFirmware) do
|
||||
FarmbotCore.Logger.warn(1, "Trying to emergency lock firmware before powerdown")
|
||||
FarmbotFirmware.command({:command_emergency_lock, []})
|
||||
else
|
||||
Farmbot.Logger.error(1, "Firmware unavailable. Can't emergency_lock")
|
||||
FarmbotCore.Logger.error(1, "Firmware unavailable. Can't emergency_lock")
|
||||
end
|
||||
end
|
||||
|
||||
@doc "Remove all configuration data, and reboot."
|
||||
@spec factory_reset(any) :: no_return
|
||||
def factory_reset(reason) do
|
||||
if Farmbot.Project.env() == :dev do
|
||||
if Project.env() == :dev do
|
||||
# credo:disable-for-next-line
|
||||
require IEx
|
||||
IEx.pry()
|
||||
end
|
||||
|
||||
if Process.whereis(Farmbot.Core) do
|
||||
if Farmbot.Asset.fbos_config().disable_factory_reset do
|
||||
if Process.whereis(FarmbotCore) do
|
||||
if Asset.fbos_config().disable_factory_reset do
|
||||
reboot(reason)
|
||||
else
|
||||
do_reset(reason)
|
||||
|
@ -66,7 +67,6 @@ defmodule Farmbot.System do
|
|||
File.rm_rf!(p)
|
||||
end
|
||||
|
||||
Farmbot.BootState.write(:NEEDS_CONFIGURATION)
|
||||
reboot(reason)
|
||||
end
|
||||
|
|
@ -1,11 +1,15 @@
|
|||
defmodule Farmbot.TTYDetector do
|
||||
defmodule FarmbotOS.TTYDetector do
|
||||
use GenServer
|
||||
require Logger
|
||||
require Farmbot.Logger
|
||||
require FarmbotCore.Logger
|
||||
alias Circuits.UART
|
||||
alias Farmbot.Core.FirmwareSupervisor
|
||||
|
||||
import Farmbot.Config, only: [get_config_value: 3, update_config_value: 4]
|
||||
alias FarmbotFirmware.UARTTransport
|
||||
alias FarmbotCore.FirmwareSupervisor
|
||||
alias FarmbotCore.FirmwareSideEffects
|
||||
alias FarmbotCore.{Asset, BotState}
|
||||
|
||||
import FarmbotCore.Config, only: [get_config_value: 3, update_config_value: 4]
|
||||
|
||||
@expected_names Application.get_env(:farmbot, __MODULE__)[:expected_names]
|
||||
@expected_names ||
|
||||
|
@ -49,7 +53,7 @@ defmodule Farmbot.TTYDetector do
|
|||
end
|
||||
|
||||
def handle_info(:timeout, %{device: _device, open: true, version: nil} = state) do
|
||||
case Farmbot.Firmware.request({:software_version_read, []}) do
|
||||
case FarmbotFirmware.request({:software_version_read, []}) do
|
||||
{:ok, {_, {:report_software_version, [version]}}} ->
|
||||
{:noreply, %{state | version: version}}
|
||||
|
||||
|
@ -64,12 +68,12 @@ defmodule Farmbot.TTYDetector do
|
|||
|
||||
def handle_continue([{name, _} | _rest], %{device: nil} = state)
|
||||
when name in @expected_names do
|
||||
Farmbot.Logger.debug(3, "Found tty: #{name}")
|
||||
FarmbotCore.Logger.debug(3, "Found tty: #{name}")
|
||||
{:noreply, %{state | device: name}, 0}
|
||||
end
|
||||
|
||||
def handle_continue([{name, _} | rest], %{device: nil} = state) do
|
||||
Farmbot.Logger.debug(3, "#{name} not a valid Farmbot tty")
|
||||
FarmbotCore.Logger.debug(3, "#{name} not a valid Farmbot tty")
|
||||
{:noreply, state, {:continue, rest}}
|
||||
end
|
||||
|
||||
|
@ -102,8 +106,8 @@ defmodule Farmbot.TTYDetector do
|
|||
defp handle_open(state) do
|
||||
opts = [
|
||||
device: state.device,
|
||||
transport: Farmbot.Firmware.UARTTransport,
|
||||
side_effects: Farmbot.Core.FirmwareSideEffects
|
||||
transport: UARTTransport,
|
||||
side_effects: FirmwareSideEffects
|
||||
]
|
||||
|
||||
child_spec = {Farmbot.Firmware, opts}
|
||||
|
@ -113,12 +117,12 @@ defmodule Farmbot.TTYDetector do
|
|||
# This might cause some sort of race condition.
|
||||
hw = get_config_value(:string, "settings", "firmware_hardware")
|
||||
|
||||
Farmbot.Asset.update_fbos_config!(%{
|
||||
Asset.update_fbos_config!(%{
|
||||
firmware_path: state.device,
|
||||
firmware_hardware: hw
|
||||
})
|
||||
|
||||
:ok = Farmbot.BotState.set_config_value(:firmware_hardware, hw)
|
||||
:ok = BotState.set_config_value(:firmware_hardware, hw)
|
||||
Process.monitor(pid)
|
||||
{:noreply, %{state | open: true, version: nil}, 5000}
|
||||
|
|
@ -34,16 +34,16 @@ defmodule Mix.Tasks.Farmbot.Env do
|
|||
end
|
||||
|
||||
def version do
|
||||
Farmbot.Project.version()
|
||||
FarmbotCore.Project.version()
|
||||
end
|
||||
|
||||
def commit do
|
||||
Farmbot.Project.commit()
|
||||
FarmbotCore.Project.commit()
|
||||
end
|
||||
|
||||
@doc false
|
||||
def env do
|
||||
to_string(Farmbot.Project.env())
|
||||
to_string(FarmbotCore.Project.env())
|
||||
end
|
||||
|
||||
@doc false
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.OS.MixProject do
|
||||
defmodule FarmbotOS.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
@all_targets [:rpi3, :rpi0, :rpi]
|
||||
|
@ -37,7 +37,7 @@ defmodule Farmbot.OS.MixProject do
|
|||
# Run "mix help compile.app" to learn about applications.
|
||||
def application do
|
||||
[
|
||||
mod: {Farmbot.OS, []},
|
||||
mod: {FarmbotOS, []},
|
||||
extra_applications: [:logger, :runtime_tools, :eex]
|
||||
]
|
||||
end
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
defmodule Farmbot.Host.Configurator do
|
||||
defmodule FarmbotOS.Platform.Host.Configurator do
|
||||
@moduledoc false
|
||||
use Supervisor
|
||||
|
||||
import Farmbot.Config,
|
||||
import FarmbotCore.Config,
|
||||
only: [update_config_value: 4]
|
||||
|
||||
@doc false
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
defmodule Farmbot.Host.NervesHubHandler do
|
||||
@behaviour Farmbot.System.NervesHub
|
||||
defmodule FarmbotOS.Platform.Host.NervesHubHandler do
|
||||
@behaviour FarmbotOS.NervesHub
|
||||
|
||||
def serial_number do
|
||||
{:ok, [_ | [{_ifname, info} | _]]} = :inet.getifaddrs()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Host.SystemTasks do
|
||||
defmodule FarmbotOS.Platform.Host.SystemTasks do
|
||||
@moduledoc "Host implementation for Farmbot.System."
|
||||
|
||||
@behaviour Farmbot.System
|
||||
@behaviour FarmbotOS.System
|
||||
|
||||
def reboot() do
|
||||
shutdown()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.Target.Configurator.Router do
|
||||
defmodule FarmbotOS.Platform.Target.Configurator.Router do
|
||||
@moduledoc "Routes web connections."
|
||||
|
||||
use Plug.Router
|
||||
|
@ -9,10 +9,10 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
plug(:match)
|
||||
plug(:dispatch)
|
||||
|
||||
require Farmbot.Logger
|
||||
require FarmbotCore.Logger
|
||||
import Phoenix.HTML
|
||||
alias Farmbot.Config
|
||||
alias Farmbot.Target.Network
|
||||
alias FarmbotCore.Config
|
||||
alias FarmbotOS.Platform.Target.Network
|
||||
|
||||
import Config,
|
||||
only: [
|
||||
|
@ -24,8 +24,8 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
defexception [:message, :field, :redir]
|
||||
end
|
||||
|
||||
@version Farmbot.Project.version()
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@version FarmbotCore.Project.version()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
|
||||
get "/generate_204" do
|
||||
send_resp(conn, 204, "")
|
||||
|
@ -107,7 +107,7 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
render_page(conn, "config_wired", ifname: ifname, advanced_network: advanced_network())
|
||||
rescue
|
||||
e in MissingField ->
|
||||
Farmbot.Logger.error(1, Exception.message(e))
|
||||
FarmbotCore.Logger.error(1, Exception.message(e))
|
||||
redir(conn, e.redir)
|
||||
end
|
||||
end
|
||||
|
@ -184,7 +184,7 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
end
|
||||
rescue
|
||||
e in MissingField ->
|
||||
Farmbot.Logger.error(1, Exception.message(e))
|
||||
FarmbotCore.Logger.error(1, Exception.message(e))
|
||||
redir(conn, e.redir)
|
||||
end
|
||||
end
|
||||
|
@ -259,16 +259,16 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
redir(conn, "/firmware")
|
||||
|
||||
{:error, %{errors: r}} when type == "wireless" ->
|
||||
Farmbot.Logger.error(1, "Network error: #{inspect(r)}")
|
||||
FarmbotCore.Logger.error(1, "Network error: #{inspect(r)}")
|
||||
redir(conn, "/config_wireless?ifname=#{ifname}")
|
||||
|
||||
{:error, %{errors: r}} when type == "wired" ->
|
||||
Farmbot.Logger.error(1, "Network error: #{inspect(r)}")
|
||||
FarmbotCore.Logger.error(1, "Network error: #{inspect(r)}")
|
||||
redir(conn, "/config_wired?ifname=#{ifname}")
|
||||
end
|
||||
rescue
|
||||
e in MissingField ->
|
||||
Farmbot.Logger.error(1, Exception.message(e))
|
||||
FarmbotCore.Logger.error(1, Exception.message(e))
|
||||
redir(conn, e.redir)
|
||||
end
|
||||
end
|
||||
|
@ -287,8 +287,8 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
update_config_value(:string, "settings", "firmware_hardware", hw)
|
||||
|
||||
if Application.get_env(:farmbot, :behaviour)[:firmware_handler] ==
|
||||
Farmbot.Firmware.UartHandler do
|
||||
Farmbot.Logger.warn(1, "Updating #{hw} firmware is broke!!!!!!")
|
||||
FarmbotFirmware.UartHandler do
|
||||
FarmbotCore.Logger.warn(1, "Updating #{hw} firmware is broke!!!!!!")
|
||||
# /shrug?
|
||||
# Farmbot.Firmware.UartHandler.Update.force_update_firmware(hw)
|
||||
end
|
||||
|
@ -354,7 +354,7 @@ defmodule Farmbot.Target.Configurator.Router do
|
|||
Network.reload()
|
||||
render_page(conn, "finish")
|
||||
else
|
||||
Farmbot.Logger.warn(3, "Not configured yet. Restarting configuration.")
|
||||
FarmbotCore.Logger.warn(3, "Not configured yet. Restarting configuration.")
|
||||
redir(conn, "/")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
defmodule Farmbot.Target.Configurator.Supervisor do
|
||||
defmodule FarmbotOS.Platform.Target.Configurator.Supervisor do
|
||||
use Supervisor
|
||||
alias Farmbot.Target.Configurator.{Router, Validator}
|
||||
alias FarmbotOS.Platform.Target.Configurator.{Router, Validator}
|
||||
|
||||
def start_link(args) do
|
||||
Supervisor.start_link(__MODULE__, args, name: __MODULE__)
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
defmodule Farmbot.Target.Configurator.Validator do
|
||||
defmodule FarmbotOS.Platform.Target.Configurator.Validator do
|
||||
use GenServer
|
||||
require Logger
|
||||
import Farmbot.Config, only: [get_config_value: 3, update_config_value: 4]
|
||||
alias Farmbot.Target.Network
|
||||
import Farmbot.Target.Network.Utils
|
||||
alias Farmbot.Bootstrap.Authorization
|
||||
import FarmbotCore.Config, only: [get_config_value: 3, update_config_value: 4]
|
||||
alias FarmbotOS.Platform.Target.Network
|
||||
import FarmbotOS.Platform.Target.Network.Utils
|
||||
alias FarmbotExt.Bootstrap.Authorization
|
||||
alias FarmbotCore.JSON
|
||||
|
||||
@steps [
|
||||
:ntp,
|
||||
|
@ -76,11 +77,11 @@ defmodule Farmbot.Target.Configurator.Validator do
|
|||
secret <- Authorization.build_secret(email, password, rsa_key),
|
||||
{:ok, payload} <- Authorization.build_payload(secret),
|
||||
{:ok, resp} <- Authorization.request_token(server, payload),
|
||||
{:ok, %{"token" => %{"encoded" => tkn}}} <- Farmbot.JSON.decode(resp) do
|
||||
{:ok, %{"token" => %{"encoded" => tkn}}} <- JSON.decode(resp) do
|
||||
update_config_value(:string, "authorization", "token", tkn)
|
||||
update_config_value(:string, "authorization", "secret", secret)
|
||||
update_config_value(:string, "authorization", "password", nil)
|
||||
Farmbot.Target.Network.hostap_down()
|
||||
Network.hostap_down()
|
||||
Network.validate()
|
||||
{:noreply, -1, @success_time_ms}
|
||||
else
|
||||
|
@ -93,10 +94,10 @@ defmodule Farmbot.Target.Configurator.Validator do
|
|||
defp authorize_with_secret(_email, secret, server) do
|
||||
with {:ok, payload} <- Authorization.build_payload(secret),
|
||||
{:ok, resp} <- Authorization.request_token(server, payload),
|
||||
{:ok, %{"token" => %{"encoded" => tkn}}} <- Farmbot.JSON.decode(resp) do
|
||||
{:ok, %{"token" => %{"encoded" => tkn}}} <- JSON.decode(resp) do
|
||||
update_config_value(:string, "authorization", "token", tkn)
|
||||
update_config_value(:string, "authorization", "password", nil)
|
||||
Farmbot.Target.Network.hostap_down()
|
||||
Network.hostap_down()
|
||||
Network.validate()
|
||||
{:noreply, -1, @success_time_ms}
|
||||
else
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
defmodule Farmbot.PinBindingWorker.CircuitsGPIOHandler do
|
||||
defmodule FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler do
|
||||
@moduledoc "Circuits gpio handler for PinBindings"
|
||||
@behaviour Farmbot.AssetWorker.Farmbot.Asset.PinBinding
|
||||
@behaviour FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding
|
||||
require Logger
|
||||
use GenServer
|
||||
alias Circuits.GPIO
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
defmodule Farmbot.Target.Leds.CircuitsHandler do
|
||||
defmodule FarmbotOS.Platform.Target.Leds.CircuitsHandler do
|
||||
alias Circuits.GPIO
|
||||
@behaviour Farmbot.Leds.Handler
|
||||
@behaviour FarmbotCore.Leds.Handler
|
||||
|
||||
@slow_blink_speed 200
|
||||
@fast_blink_speed 50
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
defmodule Farmbot.Target.InfoWorker.DiskUsage do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.DiskUsage do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
@default_timeout_ms 60_000
|
||||
@error_timeout_ms 5_000
|
||||
|
||||
alias FarmbotCore.BotState
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args)
|
||||
end
|
||||
|
@ -17,8 +19,8 @@ defmodule Farmbot.Target.InfoWorker.DiskUsage do
|
|||
def handle_info(:timeout, state) do
|
||||
usage = collect_report()
|
||||
|
||||
if GenServer.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.report_disk_usage(usage)
|
||||
if GenServer.whereis(BotState) do
|
||||
BotState.report_disk_usage(usage)
|
||||
{:noreply, state, @default_timeout_ms}
|
||||
else
|
||||
{:noreply, state, @error_timeout_ms}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
defmodule Farmbot.Target.InfoWorker.MemoryUsage do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.MemoryUsage do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
@default_timeout_ms 60_000
|
||||
@error_timeout_ms 5_000
|
||||
alias FarmbotCore.BotState
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args)
|
||||
|
@ -16,8 +17,8 @@ defmodule Farmbot.Target.InfoWorker.MemoryUsage do
|
|||
def handle_info(:timeout, state) do
|
||||
usage = collect_report()
|
||||
|
||||
if GenServer.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.report_memory_usage(usage)
|
||||
if GenServer.whereis(BotState) do
|
||||
BotState.report_memory_usage(usage)
|
||||
{:noreply, state, @default_timeout_ms}
|
||||
else
|
||||
{:noreply, state, @error_timeout_ms}
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
defmodule Farmbot.Target.InfoWorker.SocTemp do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.SocTemp do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
@default_timeout_ms 60_000
|
||||
@error_timeout_ms 5_000
|
||||
|
||||
alias FarmbotCore.BotState
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args)
|
||||
end
|
||||
|
@ -24,8 +26,8 @@ defmodule Farmbot.Target.InfoWorker.SocTemp do
|
|||
|> Integer.parse()
|
||||
|> elem(0)
|
||||
|
||||
if GenServer.whereis(Farmbot.BotState) do
|
||||
:ok = Farmbot.BotState.report_soc_temp(temp)
|
||||
if GenServer.whereis(BotState) do
|
||||
:ok = BotState.report_soc_temp(temp)
|
||||
{:noreply, state, @default_timeout_ms}
|
||||
else
|
||||
{:noreply, state, @error_timeout_ms}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
defmodule Farmbot.Target.InfoWorker.Supervisor do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.Supervisor do
|
||||
@moduledoc false
|
||||
use Supervisor
|
||||
|
||||
alias Farmbot.Target.InfoWorker.{
|
||||
alias FarmbotOS.Platform.Target.InfoWorker.{
|
||||
DiskUsage,
|
||||
MemoryUsage,
|
||||
SocTemp,
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
defmodule Farmbot.Target.InfoWorker.Uptime do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.Uptime do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
@default_timeout_ms 60_000
|
||||
@error_timeout_ms 5_000
|
||||
|
||||
alias FarmbotCore.BotState
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args)
|
||||
end
|
||||
|
@ -16,8 +18,8 @@ defmodule Farmbot.Target.InfoWorker.Uptime do
|
|||
def handle_info(:timeout, state) do
|
||||
usage = collect_report()
|
||||
|
||||
if GenServer.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.report_uptime(usage)
|
||||
if GenServer.whereis(BotState) do
|
||||
BotState.report_uptime(usage)
|
||||
{:noreply, state, @default_timeout_ms}
|
||||
else
|
||||
{:noreply, state, @error_timeout_ms}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Target.InfoWorker.WifiLevel do
|
||||
defmodule FarmbotOS.Platform.Target.InfoWorker.WifiLevel do
|
||||
use GenServer
|
||||
alias Farmbot.Config
|
||||
import Farmbot.Target.Network.Utils
|
||||
alias FarmbotCore.{Config, BotState}
|
||||
import FarmbotOS.Platform.Target.Network.Utils
|
||||
|
||||
@checkup_time_ms 15_000
|
||||
@error_time_ms 60_000
|
||||
|
@ -35,7 +35,7 @@ defmodule Farmbot.Target.InfoWorker.WifiLevel do
|
|||
{:noreply, ifname, @error_time_ms}
|
||||
|
||||
%{level: level} ->
|
||||
Farmbot.BotState.report_wifi_level(level)
|
||||
BotState.report_wifi_level(level)
|
||||
{:noreply, ifname, @checkup_time_ms}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,21 +1,19 @@
|
|||
defmodule Farmbot.System.NervesHubClient do
|
||||
defmodule FarmbotOS.Platform.Target.NervesHubClient do
|
||||
@moduledoc """
|
||||
Client that decides when an update should be done.
|
||||
"""
|
||||
|
||||
use GenServer
|
||||
require Farmbot.Logger
|
||||
alias Farmbot.BotState.JobProgress
|
||||
require FarmbotCore.Logger
|
||||
alias FarmbotCore.{Asset, BotState, BotState.JobProgress.Percent, Project}
|
||||
|
||||
@behaviour NervesHub.Client
|
||||
@behaviour Farmbot.System.NervesHub
|
||||
@behaviour FarmbotOS.NervesHub
|
||||
|
||||
@current_version Farmbot.Project.version()
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@current_version Project.version()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
@data_path || Mix.raise("Please configure data_path in application env")
|
||||
|
||||
import Farmbot.Config, only: [get_config_value: 3]
|
||||
|
||||
def serial_number(:rpi0), do: serial_number("rpi")
|
||||
def serial_number(:rpi3), do: serial_number("rpi")
|
||||
|
||||
|
@ -31,14 +29,14 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
|
||||
def uuid, do: Nerves.Runtime.KV.get_active("nerves_fw_uuid")
|
||||
|
||||
def serial_number, do: serial_number(Farmbot.Project.target())
|
||||
def serial_number, do: serial_number(Project.target())
|
||||
|
||||
def connect do
|
||||
Farmbot.Logger.debug(3, "Starting OTA Service")
|
||||
FarmbotCore.Logger.debug(3, "Starting OTA Service")
|
||||
# NervesHub replaces it's own env on startup. Reset it.
|
||||
Application.put_env(:nerves_hub, NervesHub.Socket, reconnect_interval: 5000)
|
||||
|
||||
supervisor = Farmbot.System.Supervisor
|
||||
supervisor = FarmbotOS
|
||||
# Stop Nerves Hub if it is running.
|
||||
_ = Supervisor.terminate_child(supervisor, NervesHub.Supervisor)
|
||||
_ = Supervisor.delete_child(supervisor, NervesHub.Supervisor)
|
||||
|
@ -51,7 +49,7 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
|
||||
# Start the connection again.
|
||||
{:ok, _pid} = Supervisor.start_child(supervisor, NervesHub.Supervisor)
|
||||
Farmbot.Logger.debug(3, "OTA Service started")
|
||||
FarmbotCore.Logger.debug(3, "OTA Service started")
|
||||
:ok
|
||||
end
|
||||
|
||||
|
@ -89,18 +87,18 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
case GenServer.call(__MODULE__, :check_update) do
|
||||
# If updates were disabled, and an update is queued
|
||||
{:ignore, _url} ->
|
||||
Farmbot.Logger.info(1, "Applying OTA update")
|
||||
FarmbotCore.Logger.info(1, "Applying OTA update")
|
||||
NervesHub.update()
|
||||
|
||||
_ ->
|
||||
Farmbot.Logger.debug(1, "No update cached. Checking for tag changes.")
|
||||
FarmbotCore.Logger.debug(1, "No update cached. Checking for tag changes.")
|
||||
|
||||
case NervesHub.HTTPClient.update() do
|
||||
{:ok, %{"data" => %{"update_available" => false}}} ->
|
||||
nil
|
||||
|
||||
_ ->
|
||||
Farmbot.Logger.info(1, "Applying OTA update")
|
||||
FarmbotCore.Logger.info(1, "Applying OTA update")
|
||||
NervesHub.update()
|
||||
end
|
||||
end
|
||||
|
@ -112,54 +110,54 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
end
|
||||
|
||||
def handle_error(args) do
|
||||
Farmbot.Logger.error(1, "OTA failed to download: #{inspect(args)}")
|
||||
prog = %JobProgress.Percent{status: :error}
|
||||
FarmbotCore.Logger.error(1, "OTA failed to download: #{inspect(args)}")
|
||||
prog = %Percent{status: :error}
|
||||
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_job_progress("FBOS_OTA", prog)
|
||||
end
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
def handle_fwup_message({:ok, _, _info}) do
|
||||
Farmbot.Logger.success(1, "OTA Complete Going down for reboot")
|
||||
prog = %JobProgress.Percent{percent: 100, status: :complete}
|
||||
FarmbotCore.Logger.success(1, "OTA Complete Going down for reboot")
|
||||
prog = %Percent{percent: 100, status: :complete}
|
||||
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_job_progress("FBOS_OTA", prog)
|
||||
end
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
def handle_fwup_message({:progress, 100}) do
|
||||
Farmbot.Logger.success(1, "OTA Complete. Going down for reboot")
|
||||
prog = %JobProgress.Percent{percent: 100, status: :complete}
|
||||
FarmbotCore.Logger.success(1, "OTA Complete. Going down for reboot")
|
||||
prog = %Percent{percent: 100, status: :complete}
|
||||
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_job_progress("FBOS_OTA", prog)
|
||||
end
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
def handle_fwup_message({:progress, percent}) when rem(percent, 5) == 0 do
|
||||
prog = %JobProgress.Percent{percent: percent}
|
||||
prog = %Percent{percent: percent}
|
||||
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_job_progress("FBOS_OTA", prog)
|
||||
end
|
||||
|
||||
:ok
|
||||
end
|
||||
|
||||
def handle_fwup_message({:error, _, reason}) do
|
||||
Farmbot.Logger.error(1, "OTA failed to apply: #{inspect(reason)}")
|
||||
prog = %JobProgress.Percent{status: :error}
|
||||
FarmbotCore.Logger.error(1, "OTA failed to apply: #{inspect(reason)}")
|
||||
prog = %Percent{status: :error}
|
||||
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_job_progress("FBOS_OTA", prog)
|
||||
end
|
||||
|
||||
:ok
|
||||
|
@ -179,17 +177,17 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
end
|
||||
|
||||
def handle_call({:update_available, %{"firmware_url" => url}}, _, _state) do
|
||||
if Process.whereis(Farmbot.BotState) do
|
||||
Farmbot.BotState.set_update_available(true)
|
||||
if Process.whereis(BotState) do
|
||||
BotState.set_update_available(true)
|
||||
end
|
||||
|
||||
case Farmbot.Asset.fbos_config(:os_auto_update) do
|
||||
case Asset.fbos_config(:os_auto_update) do
|
||||
true ->
|
||||
Farmbot.Logger.success(1, "Applying OTA update")
|
||||
FarmbotCore.Logger.success(1, "Applying OTA update")
|
||||
{:reply, :apply, {:apply, url}}
|
||||
|
||||
false ->
|
||||
Farmbot.Logger.info(1, "New Farmbot OS is available!")
|
||||
FarmbotCore.Logger.info(1, "New Farmbot OS is available!")
|
||||
{:reply, :ignore, {:ignore, url}}
|
||||
end
|
||||
end
|
||||
|
@ -204,11 +202,15 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
:ok
|
||||
|
||||
{:ok, old_version} ->
|
||||
Farmbot.Logger.info(1, "Updating FarmbotOS from #{old_version} to #{@current_version}")
|
||||
FarmbotCore.Logger.info(
|
||||
1,
|
||||
"Updating FarmbotOS from #{old_version} to #{@current_version}"
|
||||
)
|
||||
|
||||
do_post_update()
|
||||
|
||||
{:error, :enoent} ->
|
||||
Farmbot.Logger.info(1, "Setting up FarmbotOS #{@current_version}")
|
||||
FarmbotCore.Logger.info(1, "Setting up FarmbotOS #{@current_version}")
|
||||
|
||||
{:error, err} ->
|
||||
raise err
|
||||
|
@ -218,16 +220,7 @@ defmodule Farmbot.System.NervesHubClient do
|
|||
end
|
||||
|
||||
defp do_post_update do
|
||||
alias Farmbot.Firmware.UartHandler.Update
|
||||
hw = get_config_value(:string, "settings", "firmware_hardware")
|
||||
is_beta? = Farmbot.Project.branch() in ["beta", "staging"]
|
||||
|
||||
if is_beta? do
|
||||
Farmbot.Logger.debug(1, "Forcing beta image arduino firmware flash.")
|
||||
Update.force_update_firmware(hw)
|
||||
else
|
||||
Update.maybe_update_firmware(hw)
|
||||
end
|
||||
raise("flash firmware at this point i guess?")
|
||||
end
|
||||
|
||||
defp before_update, do: File.write!(update_file(), @current_version)
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
defmodule Farmbot.Target.Network do
|
||||
defmodule FarmbotOS.Platform.Target.Network do
|
||||
@moduledoc "Manages Network Connections"
|
||||
use GenServer
|
||||
require Logger
|
||||
|
||||
alias Nerves.NetworkInterface
|
||||
import Farmbot.Target.Network.Utils
|
||||
alias Farmbot.Config
|
||||
import FarmbotOS.Platform.Target.Network.Utils
|
||||
alias FarmbotCore.Config
|
||||
|
||||
@validation_ms 30_000
|
||||
|
||||
|
@ -19,7 +19,7 @@ defmodule Farmbot.Target.Network do
|
|||
end
|
||||
|
||||
def reload do
|
||||
for %{name: ifname} = settings <- Config.Repo.all(Config.NetworkInterface) do
|
||||
for %{name: ifname} = settings <- Config.get_all_network_configs() do
|
||||
settings = validate_settings(settings)
|
||||
Logger.warn("Trying to configure #{ifname}: #{inspect(settings)}")
|
||||
setup(ifname, settings)
|
||||
|
@ -83,7 +83,7 @@ defmodule Farmbot.Target.Network do
|
|||
ifnames()
|
||||
|> List.delete("lo")
|
||||
|> Enum.map(fn ifname ->
|
||||
{:ok, settings} = Nerves.NetworkInterface.settings(ifname)
|
||||
{:ok, settings} = NetworkInterface.settings(ifname)
|
||||
{ifname, settings}
|
||||
end)
|
||||
end
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
defmodule Farmbot.Target.Network.Distribution do
|
||||
defmodule FarmbotOS.Platform.Target.Network.Distribution do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
require Logger
|
||||
alias FarmbotCore.BotState
|
||||
|
||||
defmodule State do
|
||||
@moduledoc false
|
||||
|
@ -119,7 +120,7 @@ defmodule Farmbot.Target.Network.Distribution do
|
|||
|
||||
case :net_kernel.start([new_name]) do
|
||||
{:ok, _} ->
|
||||
:ok = Farmbot.BotState.set_node_name(to_string(new_name))
|
||||
:ok = BotState.set_node_name(to_string(new_name))
|
||||
Logger.debug("Restarted Erlang distribution as node #{inspect(new_name)}")
|
||||
|
||||
{:error, reason} ->
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Target.Network.ScanResult do
|
||||
defmodule FarmbotOS.Platform.Target.Network.ScanResult do
|
||||
@moduledoc "Decoded from Nerves.Network scanning."
|
||||
|
||||
alias Farmbot.Target.Network.ScanResult
|
||||
alias FarmbotOS.Platform.Target.Network.ScanResult
|
||||
|
||||
defstruct [
|
||||
# ssid name
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
defmodule Farmbot.Target.Network.Supervisor do
|
||||
defmodule FarmbotOS.Platform.Target.Network.Supervisor do
|
||||
use Supervisor
|
||||
alias FarmbotCore.Config
|
||||
alias FarmbotOS.Platform.Target.{Network, Network.Distribution}
|
||||
|
||||
def start_link(args) do
|
||||
Supervisor.start_link(__MODULE__, args, name: __MODULE__)
|
||||
|
@ -7,11 +9,11 @@ defmodule Farmbot.Target.Network.Supervisor do
|
|||
|
||||
def init([]) do
|
||||
{:ok, hostname} = :inet.gethostname()
|
||||
confs = Farmbot.Config.Repo.all(Farmbot.Config.NetworkInterface)
|
||||
confs = Config.get_all_network_configs()
|
||||
|
||||
config =
|
||||
Map.new(confs, fn %{name: ifname} = settings ->
|
||||
{ifname, Farmbot.Target.Network.validate_settings(settings)}
|
||||
{ifname, Network.validate_settings(settings)}
|
||||
end)
|
||||
|
||||
distribution_children =
|
||||
|
@ -23,11 +25,11 @@ defmodule Farmbot.Target.Network.Supervisor do
|
|||
node_host: :mdns_domain
|
||||
}
|
||||
|
||||
{Farmbot.Target.Network.Distribution, opts}
|
||||
{Distribution, opts}
|
||||
end)
|
||||
|
||||
children = [
|
||||
{Farmbot.Target.Network, config: config} | distribution_children
|
||||
{Network, config: config} | distribution_children
|
||||
]
|
||||
|
||||
Supervisor.init(children, strategy: :one_for_one)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Target.Network.Utils do
|
||||
import Farmbot.Config, only: [get_config_value: 3]
|
||||
require Farmbot.Logger
|
||||
alias Farmbot.Target.Network.ScanResult
|
||||
defmodule FarmbotOS.Platform.Target.Network.Utils do
|
||||
import FarmbotCore.Config, only: [get_config_value: 3]
|
||||
require FarmbotCore.Logger
|
||||
alias FarmbotOS.Platform.Target.Network.ScanResult
|
||||
|
||||
def build_hostap_ssid do
|
||||
{:ok, hostname} = :inet.gethostname()
|
||||
|
@ -119,7 +119,7 @@ defmodule Farmbot.Target.Network.Utils do
|
|||
end
|
||||
end
|
||||
|
||||
@fb_data_dir Farmbot.OS.FileSystem.data_path()
|
||||
@fb_data_dir FarmbotOS.FileSystem.data_path()
|
||||
@tzdata_dir Application.app_dir(:tzdata, "priv")
|
||||
def maybe_hack_tzdata do
|
||||
case Tzdata.Util.data_dir() do
|
||||
|
@ -127,7 +127,7 @@ defmodule Farmbot.Target.Network.Utils do
|
|||
:ok
|
||||
|
||||
_ ->
|
||||
Farmbot.Logger.debug(3, "Hacking tzdata.")
|
||||
FarmbotCore.Logger.debug(3, "Hacking tzdata.")
|
||||
objs_to_cp = Path.wildcard(Path.join(@tzdata_dir, "*"))
|
||||
|
||||
for obj <- objs_to_cp do
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
defmodule Farmbot.Target.SSHConsole do
|
||||
defmodule FarmbotOS.Platform.Target.SSHConsole do
|
||||
@moduledoc """
|
||||
SSH IEx console.
|
||||
"""
|
||||
use GenServer
|
||||
import Farmbot.Config, only: [get_config_value: 3]
|
||||
require Farmbot.Logger
|
||||
import FarmbotCore.Config, only: [get_config_value: 3]
|
||||
require FarmbotCore.Logger
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args, name: __MODULE__)
|
||||
|
@ -20,7 +20,7 @@ defmodule Farmbot.Target.SSHConsole do
|
|||
{:ok, %{ssh: ssh}}
|
||||
|
||||
_ ->
|
||||
Farmbot.Logger.warn(1, "Could not start SSH.")
|
||||
FarmbotCore.Logger.warn(1, "Could not start SSH.")
|
||||
:ignore
|
||||
end
|
||||
end
|
||||
|
@ -58,7 +58,7 @@ defmodule Farmbot.Target.SSHConsole do
|
|||
:public_key.ssh_decode(authorized_key, :auth_keys)
|
||||
rescue
|
||||
_err ->
|
||||
Farmbot.Logger.warn(3, "Could not decode ssh keys.")
|
||||
FarmbotCore.Logger.warn(3, "Could not decode ssh keys.")
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Target.SystemTasks do
|
||||
defmodule FarmbotOS.Platform.Target.SystemTasks do
|
||||
@moduledoc "Target implementation for System Tasks."
|
||||
|
||||
@behaviour Farmbot.System
|
||||
@behaviour FarmbotOS.System
|
||||
|
||||
def reboot() do
|
||||
Nerves.Runtime.reboot()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
defmodule Farmbot.Target.TzdataTask do
|
||||
defmodule FarmbotOS.Platform.Target.TzdataTask do
|
||||
use GenServer
|
||||
|
||||
@data_path Farmbot.OS.FileSystem.data_path()
|
||||
@data_path FarmbotOS.FileSystem.data_path()
|
||||
# 20 minutes
|
||||
@default_timeout_ms round(1.2e+6)
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
defmodule Farmbot.Target.Uevent.Supervisor do
|
||||
defmodule FarmbotOS.Platform.Target.Uevent.Supervisor do
|
||||
@moduledoc false
|
||||
use Supervisor
|
||||
|
||||
|
@ -7,16 +7,16 @@ defmodule Farmbot.Target.Uevent.Supervisor do
|
|||
end
|
||||
|
||||
def init([]) do
|
||||
children = [{Farmbot.Target.Uevent, []}]
|
||||
children = [{FarmbotOS.Platform.Target.Uevent, []}]
|
||||
Supervisor.init(children, strategy: :one_for_one)
|
||||
end
|
||||
end
|
||||
|
||||
defmodule Farmbot.Target.Uevent do
|
||||
defmodule FarmbotOS.Platform.Target.Uevent do
|
||||
@moduledoc false
|
||||
|
||||
use GenServer
|
||||
require Farmbot.Logger
|
||||
require FarmbotCore.Logger
|
||||
|
||||
def start_link(args) do
|
||||
GenServer.start_link(__MODULE__, args, name: __MODULE__)
|
||||
|
@ -33,7 +33,7 @@ defmodule Farmbot.Target.Uevent do
|
|||
|
||||
case new_ttys -- old_ttys do
|
||||
[new] -> new |> List.last() |> maybe_new_tty()
|
||||
[_ | _] -> Farmbot.Logger.warn(3, "Multiple new tty devices detected. Ignoring.")
|
||||
[_ | _] -> FarmbotCore.Logger.warn(3, "Multiple new tty devices detected. Ignoring.")
|
||||
[] -> :ok
|
||||
end
|
||||
|
||||
|
@ -50,22 +50,10 @@ defmodule Farmbot.Target.Uevent do
|
|||
def maybe_new_tty("tty" <> _), do: :ok
|
||||
|
||||
def maybe_new_tty(unknown) do
|
||||
Farmbot.Logger.warn(1, "Unknown tty: #{inspect(unknown)}")
|
||||
FarmbotCore.Logger.warn(1, "Unknown tty: #{inspect(unknown)}")
|
||||
end
|
||||
|
||||
def new_tty(tty) do
|
||||
raise("FIXME")
|
||||
Farmbot.Logger.busy(3, "Detected new UART Device: #{tty}")
|
||||
Application.put_env(:farmbot_core, :uart_handler, tty: "/dev/" <> tty)
|
||||
old_env = Application.get_env(:farmbot_core, :behaviour)
|
||||
|
||||
if old_env[:firmware_handler] == Farmbot.Firmware.StubHandler do
|
||||
new_env = Keyword.put(old_env, :firmware_handler, Farmbot.Firmware.UartHandler)
|
||||
Application.put_env(:farmbot_core, :behaviour, new_env)
|
||||
|
||||
if Process.whereis(Farmbot.Firmware) do
|
||||
GenServer.stop(Farmbot.Firmware, :shutdown)
|
||||
end
|
||||
end
|
||||
raise("FIXME: #{tty}")
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue