Rename FarmbotOS namespace

pull/974/head
Connor Rigby 2019-03-05 11:35:09 -08:00
parent 08cec79db6
commit 95bd827518
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
47 changed files with 324 additions and 389 deletions

View File

@ -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:

View File

@ -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")

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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: [

View File

@ -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"]

View File

@ -1,2 +1,2 @@
use Mix.Config
config :farmbot, Farmbot.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]
config :farmbot, FarmbotOS.TTYDetector, expected_names: ["ttyUSB0", "ttyACM0"]

View File

@ -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"]

View File

@ -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

View File

@ -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__]

View File

@ -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()

View File

@ -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"
""")

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -1,4 +1,4 @@
defmodule Farmbot.Platform.Supervisor do
defmodule FarmbotOS.Platform.Supervisor do
@moduledoc false
use Supervisor

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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__)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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,

View File

@ -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}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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} ->

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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